首页 / 用AI开发

AG32 UART 调试踩坑清单

2026年11月4日

问题现象: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));

排查套路(实战版)

  1. 先验证 SPI_AD 能跑通 — 这是基线,排除硬件/DAP-LINK/COM5 问题
  2. 再跑官方 example 工程(只调 TestGpio) — 验证 SDK 编译+烧录流程
  3. 最后跑自己的工程 — 在已知能跑的基础上改

不要:
– 上来就 Wipe Flash(擦 OSC_CAL 校准值,板子 PLL 锁不住)
– 反复改 platformio.ini 但不验证每一步
– 用 pio run -t upload 烧完就以为跑起来(实际 halt 状态)

.

返回用AI开发