在 AG32(AltaRiscV 32-bit RISC-V SoC)上用 PlatformIO + agrv_sdk 做工程的所有经验。
看哪个文档?
| 我现在要做什么… | 看这个文件 |
|---|---|
| 想用 AI(Mavis/mini-cap)帮我自动化 build / 烧录 / 读 log | AI辅助AG32开发指南.md ⭐ |
| 第一次建 AG32 工程,不知道 platformio.ini 怎么写 | 新建工程前必看-10个检查点.md |
手上有块 AG32 板子,不知道该选 board = agrv2k_xxx 哪个 | 芯片型号对应board和引脚数对照表.md |
| 想自己算 logic bin 应该烧到 flash 哪个地址 | flash分区和logic默认地址计算.md |
| 烧完程序,COM5 收到的是乱码不是 ASCII | UART乱码时排查清单.md |
| 引脚分配跟默认 board.ve 不一样,要写自己的 VE + ASF,但不写 user_ip.v | 使用VE配置引脚-非自定义logic.md ⭐ |
| 要写自己的 user_ip.v(自定义 Verilog,AHB/APB 外设,SPI 主机等)+ 下载 bitstream | 自定义logic开发流程与下载方法.md ⭐ |
| Host 通过 mask ROM 协议给 Target 烧 code + logic,UART 链路,无 JTAG | AG32串口升级-Host+Target mask ROM协议.md ⭐ |
核心一句话
AG32 工程的灵魂是 VE 文件。代码里 GPIO_SetOutput(GPIO4, bit1) 能否点亮 PIN_34,取决于 board 模板默认 VE,或者你工程根目录里自己写的 VE 覆盖了 board.ve。
要写 CPLD Verilog 时,灵魂是 gen_vlog 工具 + user_ip_tmpl.v 自动生成的接口模板 —— 加/减顶层 port 永远从改 VE 开始,跑 gen_vlog 收尾。
经验教训(高密度版)
- 不要 Wipe Flash —
pio run -t wipe会擦掉 OSC_CAL 校准值,PLL 锁不住 200MHz,SYS_SwitchPLLClock 死等 PLL_RDY,板子卡死 - boot ROM 启用了 IWDG (~0.25s 超时),main() 第一行必须
IWDG_Disable() - 烧完 code 板子处于 halt 状态,必须主动 reset + resume(或按 RST 按钮)
- 不用 logic 时 platformio.ini 要加
check_logic = 0 - SYSCLK 与 SDK 默认
BOARD_PLL_FREQUENCY必须一致(默认 100MHz,不是 200MHz) - 复用 SPI_AD 跑通的工程做新模板,改 platformio.ini + board.ve + main.c
- AG32 flash 只有 256KB 和 1MB 两档;board 模板 4 个,VE 模板 4 个,选错会有 device size mismatch
- VE-only 编译 ≠ 自定义 logic —
pio run -t buildlogic+pio run -t logic+pio run -t upload三步是合法流程,不写 user_ip.v,Supra 编译出来 0 logic slices,只有引脚路由 - 改 my_board.asf 后必须跑
pio run -t logic_clean— sconsign cache 不跟踪 ASF 修改 - 同 VE 文件名
logic_ve和ip_name会冲突 — VE 是声明,ip_name 是 Verilog 顶层,改名避免 - 改了
board.ve加/减顶层 port 后必须gen_vlog—af --prepare不会重生成user_ip_tmpl.v/board.v,只有gen_vlog -s才会 - supra P&R 路由失败 — 改 seed 试:
af -B -F af_run.tcl --seed_rand,或用pio run -t batch_upload(自动换 6 个 seed) - OpenOCD 烧完融合镜像后 CPU 在 halt — 必须
reset; sleep 100; resume让 CPU 跑 main(),否则 COM5 看不到任何输出
.