让 AI 先抽出时钟、复位和封装,再生成一份可以上板核对的例程。
flash 地址布局(0x80000000 起始)
| 区段 | 256KB 起始 | 256KB 结束 | 1MB 起始 | 1MB 结束 | 大小 |
|---|---|---|---|---|---|
| MCU code | 0x80000000 | (随工程) | 0x80000000 | (随工程) | 0~156KB(256K) / 0~870KB(1M) |
| Logic (压缩) | 0x80034000 | 0x800E7000 | 0x800F4000 | 0x80100000 | 48KB(0xC000) |
| Logic (非压缩) | 0x80027000 | 0x800E7000 | 0x800E7000 | 0x80100000 | 100KB(0x19000) |
| Option bytes | 0x81000000 | 0x81000080 | 0x81000000 | 0x81000080 | 128B |
MCU code 永远在 0x80000000 起始(除非自定义 board_build.boot_addr)。
Logic 默认在 flash 末尾往前推:
– 压缩 logic ~48KB,放最后 48K
– 非压缩 logic ~100KB,放最后 100K
Option bytes 在 0x81000000(独立区段,不在 flash 0x80000000 范围)。
核心公式
logic 起始 = 0x80000000 + flash_size - logic_size
| 常量 | 字节数 | 十六进制 |
|---|---|---|
| 256KB | 262144 | 0x40000 |
| 1MB | 1048576 | 0x100000 |
| 48KB | 49152 | 0xC000 |
| 100KB | 102400 | 0x19000 |
详细计算
| Flash | 压缩 | 计算 | 起始地址 | 结束地址 |
|---|---|---|---|---|
| 256KB | 否 (-100K) | 0x80000000 + 0x40000 – 0x19000 = 0x80000000 + 0x27000 | 0x80027000 | 0x800E7000 |
| 256KB | 是 (-48K) | 0x80000000 + 0x40000 – 0xC000 = 0x80000000 + 0x34000 | 0x80034000 | 0x800E7000 |
| 1MB | 否 (-100K) | 0x80000000 + 0x100000 – 0x19000 = 0x80000000 + 0xE7000 | 0x800E7000 | 0x80100000 |
| 1MB | 是 (-48K) | 0x80000000 + 0x100000 – 0xC000 = 0x80000000 + 0xF4000 | 0x800F4000 | 0x80100000 |
口算技巧:用 hex 算更清楚,不要用十进制脑算。
例:256KB – 48K = 0x40000 – 0xC000 = 0x34000,起始 0x80000000 + 0x34000 = 0x80034000 ✓
logic_compress = true 行为
- 默认
false,不开 - 开 = Quartus 输出的 bitstream 走 LZW 压缩,boot 时多 30~50ms 解压
- 解压在 RAM 临时放,需要
FCB_BUF宏控制(RAM 占用) - 节省 50KB flash 空间(100K → 48K)
- 不是必须的,根据 flash 空间和启动时间要求决定
显式指定 board_upload.logic_address
如果默认地址不合适,在 platformio.ini 显式覆盖:
[setup_logic]
logic_ve = my_board.ve
logic_device = AGRV2KL100
logic_compress = true
board_upload.logic_address = 0x80034000 ; 显式覆盖
不用 logic 时,这个参数被忽略。
batch 烧录文件结构
pio run -t batch 会生成 <program>_<env>_batch.bin,内部按顺序:
- Option bytes(128B)→ 0x81000000
- Logic bin → 0x80034000(256K 压缩)或 0x800F4000(1M 压缩)
- MCU code → 0x80000000
pio run -t batch_upload 一次烧完整 batch。
pio run -t upload 只烧 MCU code 到 0x80000000,不烧 logic 也不烧 option bytes。所以 Wipe Flash 之后再用 upload 烧 code,option bytes 是擦除状态(boot ROM 用默认)。
注意
- 0x80000000 + 0x27000 = 0x80027000,不是 0x80E7000(256K 末尾 100K)
- 0x80000000 + 0xF4000 = 0x800F4000,不是 0x80F40000(1M 末尾 48K)
- 不要再凭印象算 hex 地址,老老实实按字节加
.