问题现象:UART0 输出在 COM5 看起来是乱码(固定 32 字节 pattern 重复,或随机字节)。
根因排查顺序——按从最常见到最罕见:
1. baud rate 错(最常见,~50%)
症状:COM5 收到固定 pattern(每 N 字节循环一次),没 ASCII 字符。
根因 1.1:SYSCLK 与 SDK 默认 BOARD_PLL_FREQUENCY 不一致
- SDK 默认
BOARD_PLL_FREQUENCY = 100000000(100MHz,见framework-agrv_sdk/src/system.h:25-27) - VE 写
SYSCLK 100→ 一切正常 - VE 写
SYSCLK 200但没传-DBOARD_PLL_FREQUENCY=200000000: SYS_Clocks.PLL_FREQUENCY变量 = 100MHz(link init 默认)- 但实际 PLL 锁 200MHz
- IBRD = 100M/115200/16 = 54
- 实际 PCLK = 200MHz,实际 baud = 200M/54/16 = 231481
- 2 倍期望值,COM5 decode 失败
- 修复:保持
SYSCLK 100,或显式 build 加-DBOARD_PLL_FREQUENCY=200000000
根因 1.2:PLL 没锁住
- 症状:CLK_CNTL bit 6 (PLL_RDY) = 0,CPU 死在
SYS_SwitchPLLClock等待里 - 根因:option bytes 里 OSC_CAL 校准值被擦,PLL 锁不住
- 不要 Wipe Flash!
pio run -t wipe会擦 option bytes,OSC_CAL 校准值没了 - 修复:重烧 SPI_AD batch(option+logic+code)恢复 OSC_CAL
2. IWDG 复位(很常见,~30%)
症状:COM5 看到固定 32 字节 pattern 循环(像 board 启动时输出一半被复位)。
根因:boot ROM 启用了 IWDG,默认 0.25s 超时。main() 跑超过 0.25s 没喂狗,被 IWDG 复位。
修复:main() 第一行:
int main(void) {
volatile uint16_t *iwdg = (volatile uint16_t *)(0x40000000 + 0x34);
*iwdg = 0x0000;
IWDG_Disable();
board_init();
// ...
}
3. 烧完没 reset,板子 halt 中(~10%)
症状:COM5 完全没数据(0 字节)。
根因:pio run -t upload 最后是 reset halt,CPU 在 halt 状态,main 没跑。
修复 1:openocd 命令脚本主动 reset:
source [find agrv2k.cfg]
reset
sleep 200
resume
sleep 200
shutdown
修复 2:按板子 RST 按钮。
4. 串口桥接的不是 COM5(~5%)
症状:完全 0 字节,但程序在跑(openocd halt 看 PC 在 main loop)。
检查:
– Get-PnpDevice -Class Ports -ErrorAction SilentlyContinue | Where-Object Status -eq OK 看哪些 COM
– AGM DAP-LINK(USB VID:PID=CAFE:1001)通常是 COM5,但可能被分配到其他 COM
– 改 monitor_port = COMx 匹配实际 COM
5. logic 检查失败,烧录没真烧(~5%)
症状:pio run -t upload 报 No valid logic configuration address is found 失败。
根因:不用 logic 时,PIO 默认烧录前调 check_logic 找 option bytes 里的 logic 指针。Wipe Flash 之后 option bytes 擦了,check_logic 失败。
修复:platformio.ini 加 check_logic = 0 跳过。
6. UART 引脚没绑到 VE(~2%)
症状:编译烧录都成功,PC 跑 main loop 调 UART_Send,但 COM5 0 字节。
根因:VE 没把 UART0_UARTTXD 绑到物理引脚(PIN_68/69)。代码写 UART 寄存器没物理效果。
修复:
– 检查 board = agrv2k_xxx 对应的默认 VE
– 确认 VE 里有 UART0_UARTRXD PIN_69 和 UART0_UARTTXD PIN_68
7. GPIO_AF_ENABLE 没调,~1%
症状:UART 寄存器配了,但引脚还在 GPIO 模式不是 AF 模式,无输出。
修复:确保 board_init() 调 GPIO_AF_ENABLE 设 AF 模式。SDK board.c 默认会调,自己写的工程要手动:
GPIO_AF_ENABLE(GPIO_AF_PIN(UART, LOGGER_UART, UARTRXD));
GPIO_AF_ENABLE(GPIO_AF_PIN(UART, LOGGER_UART, UARTTXD));
排查套路(实战版)
- 先验证 SPI_AD 能跑通 — 这是基线,排除硬件/DAP-LINK/COM5 问题
- 再跑官方 example 工程(只调 TestGpio) — 验证 SDK 编译+烧录流程
- 最后跑自己的工程 — 在已知能跑的基础上改
不要:
– 上来就 Wipe Flash(擦 OSC_CAL 校准值,板子 PLL 锁不住)
– 反复改 platformio.ini 但不验证每一步
– 用 pio run -t upload 烧完就以为跑起来(实际 halt 状态)
.