Skip to content

v2.4.4 — 不再把环境问题当成代码问题;新增时基自检与 HAL 一键启用

Choose a tag to compare

@TaoCosmo-Dev TaoCosmo-Dev released this 30 Sep 11:58
· 2 commits to main since this release

本版的问题全部来自第一份真实硬件上的使用报告(STM32F103C8T6 + 板载 ST-Link V2-1,Keil AC5 5.06u3)。报告里的问题大多有一个共同点:环境出了问题(没接线、没装包),套件却把它报成了固件问题,于是 AI 去改了本来正确的代码。

不再误导 AI 改正确的代码

问题 以前 现在
源码一行没改,重跑后失败相同 判为「卡住了,上次修改没生效,请换思路」(退出码 5) 标记 source_unchanged,不计入卡住判定;报告明确说「根因不在代码,先查接线、探针、串口链路、芯片支持包」
串口一个字节都没收到 4 条建议全部指向固件 签名改为 TIMEOUT|no bytes,建议先查物理链路;识别出是 ST-Link 虚拟串口(VID 0483)时,直接提醒「很多板子没把它接到 MCU」

源码是否改动,按文件内容判断,并在编译之后计算。Keil 每次编译都会用相同内容重写生成的头文件,这不会被误判为改动。

新增:时基自检

通过令牌只能说明测试跑完了,不能说明时间是对的。报告里的真实案例:FreeRTOSConfig.h 里多写了一行 configSYSTICK_CLOCK_HZ,SysTick 被切到 HCLK/8,所有延时慢 8 倍,而闭环照样判定通过。

现在收到通过令牌后,套件会通过 SWD 读两次 uwTick(HAL)与 xTickCount(FreeRTOS),与电脑时钟对比:

  • 偏差超过 5%,判 TIMEBASE_SKEW(退出码 3)。报告附上 SYST_CSR / SYST_RVR / SystemCoreClock,以及据此推算出的 SysTick 频率。
  • 实测正好差 8 倍时,报告直接点名 configSYSTICK_CLOCK_HZ 这个陷阱。
  • 读内存不会暂停内核,整个检查约 0.5 秒。计数器完全不动的情况(固件测试完后关了中断)不判失败。
  • 可用 loop.timebase_check: false 关闭。

新增:--enable-hal

HAL 工程要用新外设(ADC、I2C 等)时,原来会连环报错:模块宏没打开、驱动文件不在、没注册进工程。现在一条命令解决:

python run_autodebug.py --project MDK-ARM/App.uvprojx --enable-hal adc i2c
  • 驱动文件先从工程里找,找不到再从本机 CubeMX 仓库拷贝,优先使用 .ioc 记录的固件版本。
  • 任何一个模块有问题,就一个文件都不改;重复执行不会重复修改。
  • 编译报 stm32f1xx_hal_adc.h 找不到、ADC_HandleTypeDef 未定义、HAL_ADC_Init 未解析时,诊断报告会直接给出这条命令。

配套的 HAL 模板 v1.1 自带全部 HAL 驱动,没装 CubeMX 的电脑上也能直接用这条命令。

芯片支持包自动安装

以前缺芯片支持包时,只打印一条命令让用户自己去执行。现在闭环开始前会自动安装(需联网),装完后会再确认一次 pyOCD 已经认识这颗芯片,而不是只看安装命令的退出码。

无法联网时,把 .pack 文件的路径写进 debugger.pack_files 即可离线使用,每次调试会话和兜底烧录都会带上它。报告里提到的 populate_targets_from_pack 方法只在当前进程内有效,下次运行就失效了,因此没有采用。

其他修复

  • --add-include A --add-include B 只有 B 生效:参数解析的缺陷,--add-source 和 --add-define 同样受影响。现在同一个参数可以写多次,执行后会回显当前完整的包含路径和宏定义列表。
  • Git Bash 里 tar -xf 解压 zip 失败:文档中的解压命令统一改为 python -m zipfile -e template.zip .,任何终端都能用。
  • 诊断报告位置写错:文档写的是「工程根目录」,实际在 .uvprojx 所在目录(CubeMX 工程中即 MDK-ARM/)。文档已改正,失败时也会把两个路径都打印出来。
  • pip 在 Windows 上装坏包却不报错:setup_env 装完依赖后会清理 ~ 开头的残留目录、逐个检查能否导入,失败的包会自动强制重装。
  • FreeRTOS configASSERT 类型冲突:cm_backtrace_lite.h 里给出了可以直接照抄的接法。
  • AGENTS.md 新增第 9 条:测量时间用板子上的 tick,不要用串口的行间距。

报告中未采纳的建议

建议 原因
模板打印令牌前先检查 USART 的 UE 位 报告中 UE=0 是读错了位:F1 的 UE 在第 13 位,读回的 0x200C 中 UE=1。而且链路不通时,这条失败信息同样送不到电脑
模板加 setvbuf(stdout, NULL, _IONBF, 0) MicroLIB 本身不做缓冲,加上后只多 16 字节,基本是空函数。报告里的 0.00 s 间隔来自电脑按收到时间打的时间戳

升级

git pull 后重新运行一次 setup_env.bat,也可以只运行 python install_skill.py。离线测试:133 → 168 项。