新闻详情

新闻详情

首页 / 资讯中心 / 详情

Keil软件仿真逻辑分析仪与STM32串口调试实战指南

发布时间:2026/9/28 1:52:07来源:尧图网络
Keil软件仿真逻辑分析仪与STM32串口调试实战指南
在嵌入式开发里Keil的软件仿真功能经常被忽略很多人一上来就接开发板、烧程序、接逻辑分析仪总觉得“仿真不如实跑”。但等你真正需要调一个GPIO翻转时序、验证PWM输出频率、或者排查串口数据死活不对的时候才发现手边没有示波器、逻辑分析仪又没到货整个人卡在原地。其实Keil自带的逻辑分析仪窗口就是一套内置的“软件示波器”不花一分钱、不接一根线就能直接观察STM32管脚的波形变化配合串口仿真调试很多问题在电脑上就能定位清楚。这篇内容我想把Keil软件仿真逻辑分析仪的完整用法拆开讲透从环境配置、信号添加到波形解读再到串口调试里那些容易踩的坑尽量按我在实际项目中摸索出来的流程走一遍。适合刚接触STM32开发不久、手上硬件工具还不齐全的朋友也适合想提高调试效率、少折腾硬件的开发者参考。1. 为什么优先用软件仿真它能帮你解决什么问题很多人对软件仿真有个误解觉得“软件仿真只是跑马灯没法看真实的管脚响应”实际上Keil的模拟仿真能力比大多数人的预期强得多。它不仅能执行代码、观察变量还能模拟GPIO输出的实时状态配合逻辑分析仪窗口可以把管脚电平变化以波形形式展示出来。这意味着在没有硬件的情况下你就能验证一段PWM代码的周期是否准确、某个引脚的电平翻转时机是否符合预期甚至能提前发现逻辑漏洞。1.1 软件仿真和硬件调试的适用边界先说清楚软件仿真替代不了硬件调试但它非常适合处理“逻辑层面”的问题。举个例子如果你调一个I2C时序硬件上接线错误、上拉电阻没焊、从设备地址不对这些问题软件仿真根本看不出来因为它模拟的是芯片内部行为不涉及真实电气特性。但如果你怀疑的是“代码里GPIO翻转顺序对不对”“延时时长是否导致时序超限”“PWM占空比计算是否有误”这类问题用软件仿真反而比硬件调试更高效。我的习惯是这样的拿到一个功能模块先在Keil软件仿真下把代码逻辑跑通确认波形、时序、数据流都符合预期然后再烧到板子上用硬件工具去做信号完整性和电气层面的验证。这样能省掉大量“改代码、烧录、看现象、再改”的循环时间。因为软件仿真改了代码立刻能重新跑硬件烧录一次还要插拔、复位、等启动效率差好几倍。1.2 逻辑分析仪窗口在Keil里的定位Keil的Logic Analyzer窗口简单说就是把调试过程中目标芯片的引脚电平变化、外设状态变化画成时间轴波形。它本身不依赖任何外部硬件数据来源是模拟仿真时CPU执行指令所产生的信号状态变化。你不需要额外安装驱动也不需要购买设备只要工程配置正确、代码能编译通过就能打开它观察波形。要注意的是这个窗口在Debug模式下才有而且必须在配置对话框里启用“Use Simulator”选项不能选成硬件调试器比如ST-Link否则逻辑分析仪窗口里什么信号都加不进去这是很多新手卡住的第一道门槛。后面第2节我会详细讲配置步骤。2. 仿真前的关键准备工程配置、时钟参数和初始化代码软件仿真不是打开软件就能直接点“运行”那么无脑还需要做一些前置配置尤其是时钟参数的设置。STM32的很多外设时序都依赖系统时钟如果仿真时的时钟配置和真实芯片不一致那么仿真出来的PWM频率、定时器计数周期、波特率全都是错的后面看波形就没有意义了。2.1 打开软件仿真模式构建一个虚拟的STM32环境第一步是在Keil工程里进入Options for Target设置页切换到Debug标签页在右上角的Use栏里勾选“Simulator”同时下面的Dialog DLL参数需要保持默认值。这里有个容易被忽略的细节Simulator下方的Parameter参数框里对于STM32系列通常要填“-pSTM32F103C8”芯片不同替换型号不填的话仿真器可能无法正确识别到目标芯片的寄存器映射。配置好以后点击进入Debug模式的按钮也就是那个字母“D”的图标Keil会启动一个虚拟的STM32运行环境。在这个环境里程序计数器从复位向量开始执行外设寄存器也会被模拟出来。我没有刻意去手动初始化仿真环境因为Keil对Cortex-M内核的模拟已经比较完整启动文件里的SystemInit和时钟初始化代码会正常执行。需要注意Debug标签页里如果选了“Use ST-Link”之类的硬件调试器逻辑分析仪窗口是无法添加信号的。另外有些低功耗模式、Flash擦写操作在软件仿真下是无法完整模拟的这类功能只能硬件调试。2.2 时钟配置为什么你的PWM仿真频率总是不对我见过很多人在软件仿真下看到的PWM频率和理论值对不上查来查去最后发现是时钟树没配对。真实芯片上STM32F103默认外部8MHz晶振经过PLL倍频到72MHz作为系统时钟。但Keil的软件仿真器并不会自动模拟外部晶振起振如果你代码里PLL相关配置没有执行成功或者延时不够仿真环境会以内部HSI时钟作为默认时钟源最终外设时钟就变成8MHz甚至更低。所以做仿真前建议在初始化代码的前期加入适当的延时等待时钟稳定并确保RCC配置函数正常执行。可以在调试时先查看RCC-CFGR寄存器的值确认系统时钟切换到了PLL输出再看APB1、APB2的分频系数是否符合预期。这些寄存器值在Watch窗口里都能看到比盲猜高效得多。另外一个实用的技巧是把所有外设时钟配置写成一个独立的初始化函数在仿真和硬件调试时共用。这样你只需要在仿真环境里单步执行一遍这个函数确认几个关键寄存器的值正确后续的波形分析结果才可信。2.3 准备一个简单的演示工程GPIO翻转和PWM输出为了讲解方便我建议建一个精简的测试工程。用STM32F103C8作为目标芯片代码里做两件事一个GPIO引脚做周期性电平翻转可以直接看方波另一个定时器通道输出PWM可以看占空比和频率。GPIO翻转那段代码最好用一个简单的延时函数控制周期不要用中断和复杂逻辑方便观察波形。PWM部分直接用定时器的PWM模式设置好预分频和自动重载值然后在逻辑分析仪里看输出引脚的波形。我自己的测试工程代码大致是这样的void GPIO_Config(void) { GPIO_InitTypeDef gpio; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); gpio.GPIO_Pin GPIO_Pin_0; gpio.GPIO_Mode GPIO_Mode_Out_PP; gpio.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, gpio); gpio.GPIO_Pin GPIO_Pin_1; gpio.GPIO_Mode GPIO_Mode_AF_PP; GPIO_Init(GPIOB, gpio); } void Timer_PWM_Config(void) { TIM_TimeBaseInitTypeDef tim; TIM_OCInitTypeDef oc; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); tim.TIM_Prescaler 72 - 1; tim.TIM_CounterMode TIM_CounterMode_Up; tim.TIM_Period 1000 - 1; tim.TIM_ClockDivision TIM_CKD_DIV1; TIM_TimeBaseInit(TIM3, tim); oc.TIM_OCMode TIM_OCMode_PWM1; oc.TIM_OutputState TIM_OutputState_Enable; oc.TIM_Pulse 500; oc.TIM_OCPolarity TIM_OCPolarity_High; TIM_OC1Init(TIM3, oc); TIM_Cmd(TIM3, ENABLE); }配合主循环里的GPIO翻转逻辑分析仪里就能同时看到方波和PWM两种典型波形足够用来演示核心操作了。3. 逻辑分析仪上手从添加信号到波形解读的完整流程配置完工程接下来就是核心部分——打开逻辑分析仪窗口把要观察的引脚信号加进去然后运行仿真看波形。这里面的每一步都有对应的技巧和坑我按实际操作顺序过一遍。3.1 打开逻辑分析仪窗口并正确添加信号进入Debug模式后在菜单栏找到View菜单下拉列表里选择Analyzer Windows再点开Logic Analyzer就能打开波形窗口。这个窗口的左边是信号列表区右边是波形显示区初始状态下信号列表是空的。往列表里添加信号需要点工具栏上的“Setup”按钮一个带扳手图标的按钮弹出一个对话框在左侧的文本框里输入要观察的信号表达式。这里有个很关键的语法点如果要观察GPIO引脚必须写“PORTx.PINy”的形式比如“PORTA.0”表示PA0引脚而不是直接写“GPIOA”或者“PA0”写错了信号根本添加不进去。我还试过直接输入寄存器名称来观察比如“TIM3-CNT”这样可以看到定时器计数器的实时值曲线对分析PWM周期非常有帮助。其他外设寄存器也可以照葫芦画瓢语法就是“外设名-寄存器名”。不过这种方式观察的是数值曲线和引脚波形的表现形式不同需要根据需求选择。3.2 设置显示格式让波形符合直觉信号添加成功后默认可能显示为“Bit”格式也就是直接显示高低电平这对观察GPIO翻转已经够了。但如果添加的是寄存器数值类型的信号比如定时器计数器、ADC转换值默认的Bit格式就完全没法看需要右键信号名在Signal Type里改成“Analog”或者“Unsigned Decimal”。我常用的组合是GPIO引脚信号用Bit格式看高低电平PWM输出引脚用Bit格式看占空比而定时器CNT寄存器用Analog格式看锯齿波。这样不同信号用不同显示方式波形窗口里的信息层次就非常清晰。另外在显示波形之前记得把窗口底部的缩放工具调整好。逻辑分析仪窗口支持鼠标滚轮缩放、拖拽平移仿真运行后如果波形超出窗口范围可以按一下工具栏里的“Fit”按钮自动缩放以适应全部波形。3.3 运行仿真全速运行、单步执行和周期设置逻辑分析仪窗口本身不采集波形它的数据来自仿真执行过程。所以打开窗口并加好信号后需要点击全速运行按钮F5让程序跑起来波形才会随之绘制。如果你只是单步执行几条指令波形区域只会画出非常短的一小段很难看出完整的周期特征。全速运行时有一个性能问题需要提醒如果代码里存在大量无延时的高速循环仿真器可能会跑得很慢波形刷新也会卡顿。解决办法是在关键循环里加一些延时或者在Debug选项里调整仿真速度。Keil的状态栏会显示模拟执行时间比如0.5秒模拟时间这和真实时间不同别混淆。对于PWM波形验证我建议在运行前先把“Breakpoint”设在一个合适的断点位置比如PWM初始化完成的下一行运行到断点后再用全速运行配合时间缩放观察几个完整周期的波形。这样更容易保证观察窗口内包含完整的PWM周期数据。3.4 波形解读从方波频率到占空比测量很多人辛辛苦苦调出波形却不知道怎么测量频率和占空比。实际上逻辑分析仪窗口提供了一个测量辅助机制将鼠标光标放在波形上下方状态栏会显示当前时间值和分析仪内部测量的信号频率。另外波形窗口自带两个垂直光标Cursor A和Cursor B拖动它们可以测量两点之间的时间差从而计算频率。以我前面给的代码为例GPIO翻转的延时大约设置为500ms翻转一次那么一个完整周期就是1s对应频率应该是1Hz。PWM部分配置的是72分频、1000计数周期、Pulse500所以PWM频率 72MHz / 72 / 1000 1kHz占空比 500/1000 50%。如果仿真波形里看到的频率和这两个理论值差异很大优先检查时钟配置是否生效。3.5 添加多个引脚同时观察对比相位关系逻辑分析仪最大的优势是可以同时观察多路信号的时序关系。比如SPI通信时同时观察SCK、MOSI、CS三个引脚的波形能直观看到片选信号拉低后时钟是否正常翻转、数据位是否在时钟边沿稳定。添加多个信号的方法和单个信号完全一样在Setup对话框里逐一输入表达式就行。如果想删除信号在信号列表里选中按Delete键。多信号观察时波形颜色会自动区分不同信号我习惯在Signal Type设置里调整颜色对比度让时序关系更容易分辨。4. 提高仿真效率观察多路信号、模拟UART数据除了基本引脚波形软件仿真还有不少进阶用法。UART串口调试在没有真实硬件的情况下也能跑通这对学习协议、验证发送接收逻辑特别有用。而这部分内容恰恰是很多教程里讲得最粗略、也最容易出错的地方。4.1 UART串口调试的底层逻辑虚拟串口和重定向STM32在Keil软件仿真下UART外设的发送逻辑同样会被模拟执行。也就是说你调用USART_SendData往数据寄存器里写数据然后检查发送完成标志位这些操作在软件仿真下流程和真实芯片一致。区别在于数据最终不会从某个真实串口引脚发出去而是可以重定向到PC端的串口调试助手。实现这个效果最常用的方式是使用Keil的虚拟串口功能。在Debug模式下打开View菜单里的Serial Windows选择UART #1这个窗口就能显示通过串口发送出来的字符数据。同时你还需要在工程配置里勾选“Use Simulator”下的“UART”相关选项或者在代码里用微库的fputc函数重定向printf输出。我自己的做法是给工程加上fputc函数int fputc(int ch, FILE *f) { while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) RESET); USART_SendData(USART1, (uint8_t)ch); return ch; }然后在串口配置函数里使能USART1就能在UART #1窗口里看到printf输出的文本了。4.2 结合串口调试助手的“仿真联动”方案如果想把仿真里的串口输出导到PC上的串口调试助手软件里看可以用Keil自带的“Command (Debugger)”窗口配合重定向或者借助虚拟串口工具桥接。不过说实话在纯软件仿真阶段直接用UART窗口看输出已经足够没必要硬接外部工具。真正需要外部串口调试助手的是硬件调试阶段。把程序通过ST-Link烧进板子串口接到USB转TTL模块然后在电脑上用串口调试助手查看数据。这个阶段最常出现的坑是波特率不匹配、引脚复用没配置、以及串口助手软件本身设置了错误的数据位或停止位。5. 串口调试的避坑指南从硬件到配置逐一排查串口调试看起来简单实际折腾起来问题一堆。这里我把反复遇到过的坑集中整理一下按“硬件接线 – 参数配置 – 数据收发”三个层面来梳理并给出排查手段。5.1 硬件接线最容易出问题的三个位置第一个位置是TX和RX交叉连接。STM32的TX要接USB转TTL模块的RXSTM32的RX要接模块的TX。老手都懂但电路板设计不直观时很容易接反尤其是用排针扩展的时候。我的习惯是接好线后用万用表量一下两端对应引脚连通性再上电测试。第二个位置是共地。USB转TTL模块、STM32开发板、外部电源如果供电来源不同一定要把GND连在一起否则串口通信会出现乱码甚至完全没反应。这个问题在电池供电的手持设备上尤其常见我碰到过不少次因为共地缺失导致串口调试助手收不到任何数据的情况。第三个位置是电平匹配。STM32是3.3V逻辑电平有些古老的USB转串口模块是5V电平直接用可能烧毁GPIO或者导致逻辑电平不正确。现在大部分模块都支持跳线选择3.3V/5V接STM32务必确认跳线在3.3V侧。5.2 参数配置波特率、数据位、停止位和校验位串口通信双方必须使用完全一致的参数。最常见的是9600或115200波特率8位数据位1位停止位无校验位。任何一个参数不一样接收到的数据都是乱码。我在调试时有个习惯先用115200-8-N-1这种最常见配置跑通如果通信异常就在软件里主动发送一串ASCII字符比如“Hello”同时在串口助手的HEX显示模式下观察原始数据。如果HEX数据完全正确但文本显示乱码那就是编码问题如果HEX本身就是错误字节那就是波特率偏移或者接线问题。另外STM32的USART波特率寄存器是整数分频如果外部晶振频率不是标准的整数倍关系实际波特率会有偏差。比如使用22.1184MHz晶振计算115200波特率时分频结果可能不是整数导致实际波特率和理论值有百分之几的偏差。在长时间连续传输大量数据时这种偏差会造成偶发乱码。解决办法是使用整数分频值更接近目标波特率的晶振频率或者适当降低波特率。5.3 代码配置串口初始化遗漏的几个细节USART初始化时不仅要配置USART本身还必须开启对应GPIO引脚的复用时钟并把TX引脚配置为复用推挽输出RX引脚配置为浮空输入或上拉输入。很多人忘了开GPIO时钟导致USART初始化后完全收不到数据。另外一个常见坑是使能了USART但忘了使能中断优先级分组或者NVIC配置不正确导致串口中断进不去。如果用中断方式接收数据记得在NVIC里使能对应串口中断通道并正确设置抢占优先级。实际调试中还有一种情况发送函数里检查发送完成标志位TC和发送数据寄存器空标志位TXE搞混。如果只等TXE数据可能还没真正发送完毕就进入下一轮发送造成数据覆盖。我的习惯是发送单字节前检查TXE等全部数据发完后再检查一下TC确保整个数据帧发送完毕。5.4 串口调试助手选择不同工具的区别和使用建议串口调试助手类工具有很多常见的有SSCOM、XCOM、野火串口助手等。功能上大同小异但有些细节区别值得注意。SSCOM的优点是支持定时发送、文件发送、多种显示格式切换对批量测试很方便。XCOM的界面更简洁数据接收显示稳定适合日常调试。我特别提醒一点如果调试的是二进制协议数据一定要在串口助手里开启HEX显示和HEX发送否则你看到的是一堆乱码字符。即使配置正确纯文本模式下二进制数据也可能显示为不可见字符容易误判。调试的时候不要贪波特率很多调试问题都是因为波特率太高导致数据线过长、干扰增强。推荐先用9600跑通协议再根据需求逐步提高速度。这个习惯帮我省过很多时间串口通信调不通时降速永远是最快的排查手段。6. 实际项目场景复盘一个完整案例的调试过程理论讲完了我分享一个实际案例。之前做一个小项目需要STM32采集温度数据然后通过串口把数据输出到上位机显示同时用PWM控制一个加热执行器。因为在最初阶段硬件还没完全准备好我就先在Keil软件仿真下完成大部分代码逻辑验证。6.1 问题描述串口数据输出乱码PWM控制效果不对当时我遇到两个问题。第一上位机通过串口调试助手收到的温度数据总是乱码偶尔能出现一个正确数字但无法稳定解析。第二PWM控制加热器时输出波形周期比预期慢很多导致系统反应迟钝。这两个问题一个在串口通信链路上一个在PWM初始化上恰好覆盖了前面讲过的两个典型坑。我决定用软件仿真的逻辑分析仪和UART窗口分别排查。6.2 排查过程软件仿真如何帮我锁定根因先处理串口乱码问题。我在代码里临时加了一行printf输出固定字符串“1234”然后进入软件仿真打开UART #1窗口运行。结果发现UART窗口显示的正是“1234”说明代码层面的发送逻辑本身没有大问题。问题大概率出现在硬件层面。于是切换到硬件调试模式用示波器测量TX引脚的信号波形对比实际波特率。最终发现是板上晶振和Boot引脚配置导致的问题这块板子的焊接过程中我为了调试方便把Boot0拉高了导致芯片从系统存储器启动用户程序里配置的时钟树没有正常执行系统时钟跑在了内部RC振荡器8MHz而我的程序是按72MHz主频配置的波特率自然对不上。PWM周期问题也同样通过软件仿真定位。我在逻辑分析仪里观察定时器通道引脚波形发现周期确实明显大于理论值。查看RCC_CFGR寄存器的值后确定PLL没有正常锁定系统时钟停在了HSI。修复办法是在初始化时钟后增加一段超时检测如果PLL锁定失败则报错防止后续代码在错误时钟下运行。6.3 修复与验证这个坑如何举一反三修复了Boot0和时钟配置问题后又重新用软件仿真验证一遍逻辑分析仪里PWM波形周期恢复为1kHzUART窗口里printf输出正常再切换到硬件调试串口助手输出的温度数据也能稳定解析了。这个案例最大的收获是软件仿真虽然不能直接看到真实硬件电气特性和启动模式但可以通过寄存器值、波形、UART窗口快速区分“代码问题”还是“硬件问题”。一旦锁定根因方向修复效率就会高很多。7. 常见问题与排查技巧汇总针对Keil软件仿真和串口调试的高频问题我整理了一个速查表格方便在实际调试时快速对照定位。问题现象可能原因排查方法逻辑分析仪窗口无法添加信号没有启用Simulator模式或者参数填错检查Debug标签页确认选择Simulator并填写正确的芯片型号参数仿真波形频率和理论值不一致时钟配置未生效PLL没锁定查看RCC_CFGR寄存器确认系统时钟源和分频系数波形区域全空没有数据没有全速运行或者信号表达式写错确认信号表达式为PORTx.PINy格式点击全速运行按钮多路信号波形重叠难区分信号类型设置不合理或颜色相近右键信号设置Signal Type和颜色UART#1窗口不显示输出没有重定向printf或者串口时钟没开添加fputc函数检查USART和GPIO时钟串口助手收不到数据接线错误、共地缺失、波特率不匹配用万用表量接线检查GND连接降低波特率测试串口数据乱码但HEX部分正确波特率偏移或晶振频率不匹配用示波器测实际波形调整分频系数发送数据偶尔丢失只检查TXE未检查TC标志发送完成后等待TC置位程序进不了main函数启动配置或中断向量表异常检查Boot引脚确认启动文件被编译包含几个实操心得第一进入软件仿真前最好在代码里加个led翻转或者串口输出之类的最小功能标志仿真后先确认这个标志生效再添加逻辑分析仪信号避免“仿真是否正常启动”和“信号是否配置正确”两个问题混在一起。第二逻辑分析仪波形窗口里右键信号名可以修改信号显示名称。建议把信号改成有实际含义的命名比如PWM_Out、UART_TX这样波形多起来以后不会看花眼。第三时钟配置永远是仿真的前置条件。我强烈建议在初始化函数里把RCC_GetClocksFreq函数调用一次把获取到的时钟频率值记录下来在Watch窗口确认是否等于预期值。这一步排查了很多莫名奇怪的仿真问题。第四用定时器延时做GPIO翻转时仿真执行时间和真实时间不同。软件仿真的延时准确度依赖于指令周期模拟的精度Cortex-M内核模拟通常比较准确但如果涉及外部中断、DMA传输仿真器不一定完全模拟波形结果只能做逻辑验证不能作为精确的时间性能基准。第五串口调试助手里如果遇到“能发不能收”或者“能收不能发”优先检查代码里串口收发使能是否打开以及中断是否注册。很多情况是发送轮询能工作、接收中断却忘了开导致上位机发数据过来单片机毫无反应。最后再分享一个小技巧。用逻辑分析仪观察PWM波形的占空比时除了看波形形状还可以在Signal Type设置里把信号类型从Bit改为Analog这样波形会以模拟电压形式显示高低电平之间的过渡更直观占空比测量也更容易。虽然本质还是数字信号但显示效果确实更友好。这个流程我用过很多次已经成为个人开发习惯的一部分。每次拿到新模块代码先在Keil软件仿真下跑通逻辑波形再下载到硬件板子上做实测验证整个开发节奏稳定了很多。希望这篇内容也能帮你在STM32调试路上少踩几个坑。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

使用 ng-zorro-antd Skeleton 搭建“头像 + 多段落“复杂组合骨架屏 2026/9/28 2:44:27

使用 ng-zorro-antd Skeleton 搭建“头像 + 多段落“复杂组合骨架屏

UI组件前端 【免费下载链接】ng-zorro-antd Angular UI Component Library based on Ant Design 项目地址: https://gitcode.com/gh_mirrors/ng/ng-zorro-antd 点击查看 免费下载 导读:本文围绕 ng-zorro-antd(基于 Ant Design 的 Angular U…

阅读更多 →
Python+朴素贝叶斯实现中文垃圾邮件分类:原理、流程与避坑指南 2026/9/28 2:44:21

Python+朴素贝叶斯实现中文垃圾邮件分类:原理、流程与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
中科蓝讯RISC-V开发环境搭建:CodeBlocks与RV32工具链配置指南 2026/9/28 2:44:14

中科蓝讯RISC-V开发环境搭建:CodeBlocks与RV32工具链配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
【双机位A卷】华为OD笔试之【固定滑窗】双机位A-字符串计数匹配【Py/Java/C++/C/JS/Go六种语言】【欧弟算法】全网注释最详细分类最全的华子OD真题题解 2026/9/28 2:44:14

【双机位A卷】华为OD笔试之【固定滑窗】双机位A-字符串计数匹配【Py/Java/C++/C/JS/Go六种语言】【欧弟算法】全网注释最详细分类最全的华子OD真题题解

文章目录相关推荐阅读题目描述与示例题目描述输入描述输出描述示例输入输出解题思路滑窗三问滑窗三答代码PythonJavaCCNode JavaScriptGo时空复杂度华为OD算法/大厂面试高频题算法练习冲刺训练相关推荐阅读 【华为OD机考正在更新】2025年双机位A卷真题【完全原创题解 | 详细考…

阅读更多 →
用CommandMenu源码打造macOS菜单栏工具:从NSStatusItem到动态菜单的完整实践 2026/9/28 2:44:08

用CommandMenu源码打造macOS菜单栏工具:从NSStatusItem到动态菜单的完整实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
基于DUT-OMRON的Unet二值分割实战:从数据处理到训练避坑 2026/9/28 2:44:07

基于DUT-OMRON的Unet二值分割实战:从数据处理到训练避坑

简介:面向深度学习图像分割初学者与研究者的Unet实战项目,配套DUT-OMRON二值图像分割数据集,可直接用于训练、验证与二次开发。压缩包内共2000个文件,以PNG图像与掩码为主(1979个),另含Python脚…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉