AG32 芯片初始烧录参考

2 min read CPLD

正常情况下,芯片的烧录方式有:

1. 开发状态下,通过 VSCODE 直接烧录;

2. 在线烧录时(连接 PC),用 downloader 工具来烧录(二合一的 batch.bin);

3. 出厂烧录时,可使用 AGM 官方的 Dap-Link 来脱机烧录。

这里的“脱机烧录 ”是指:先通过 downloader 工具先把 bin 从 PC 存储到 Daplink 上,然后再单独使用 Daplink就可以对目标芯片进行烧录(可以省掉 PC)。

这 里 的 downloader.exe 工 具 , 就 是 SDK 安装后 目 录里 自 带 的那个( 也可 以从 网盘里 下 载单独 的downloader.exe)

如果开发者希望在出厂烧录环节,不使用 dap-link ,而是通过自己的其他单片机来对目标板进行烧录,那么可以参考本文的方案。

这里使用的样例,是从SDK 下的examples\uart_master 稍作调整的。烧录机是用100pin 的407 开发板, 目标板也是100pin 的407 开发板。

烧录机的源码开放的,可移植到自己的单片机上。

具体使用uart_master 时,请根据自己的需求进行相应调整。

使用限制:

这种方案下,不支持对 bin 的加密(但支持 flash_lock 保护)。

基础信息

1. 在对芯片出厂烧录时,其实需要烧录 3 部分内容:

code 的 bin 、logic 的 bin 、optionFlash 部分的信息

其中“optionFlash 部分的信息 ”是默认的。而 code.bin 和 logic.bin ,需要事先准备好。如果是纯粹的 cpld 程序,那 code.bin 也用默认的即可。

2. 烧录工作是由两部分配合完成的:

烧录机、 目标芯片

其中目标板在运行 ROM 程序时(BOOT0 拉高) ,会进入“烧录模式 ”。这种模式下,就是在 while(1)等待烧录机发送不同的命令(烧录过程中的各种子命令)。

而烧录机,首先会控制目标芯片进入烧录模式,然后再把准备好的 code.bin 和 logic.bin分成两次烧录进去。

3. 开发者只需要关注“烧录机 ”部分的控制逻辑。

目标芯片端的 ROM 程序已经固化在芯片中,开发者不用关注。

4. 这个样例是从 SDK 下的 examples/uart_master ,改动少许而来。

主要是对“烧录机 ”代码的说明和使用的示范。

开发者可参考说明,在理解的基础上,根据自己的需求继续调整。

“烧录机”的使用逻辑(参照代码)

1. 烧录机和目标板之间的连线:

烧录机在 VE 里定义出来 4 根连线:UART0_TX 、UART0_RX 、TO_RESET 、TO_BOOT0;

其中 UART0_TX 、UART0_RX ,是连接到目标板的 Uart0 的 RX 和 TX;

TO_RESET ,连接目标板的 reset 引脚;

TO_BOOT0 ,连接目标板的 boot0 引脚;

除了以上 4 根线,还需要两块板子共地的连线。(共 5 根线)

上边的 TO_RESET 和 TO_BOOT0 ,用于控制目标板进入烧录状态。如果自己的治具里已经能让目标板进入烧录状态,这两根线可以忽略。

另外,注意, 串口烧录时, 目标板的boot1 必须是接地的。

【串口烧录要求:只能通过 uart0 烧录,同时要 boot0 拉高、boot1 置低】

2. 烧录机上电后,在 main 函数中只是进行了 board_init 和按键中断初始化。

然后等待按键消息。

3. 烧录机根据按键,分别烧录准备好的 bin。

这部分参考 main.c 的 Button_isr 函数。

样例中,按键 SW_23 ,会烧录目标板的 code.bin 和 logic.bin(非压缩格式);

按键 SW_24 ,会烧录目标板的 logic.bin(压缩格式);

4. 烧录时,会按照配置,烧录必要的信息;

这部分信息,请参考代码。

5. 烧录完成后重新 lock 芯片。

控制机(uart_master)代码简要说明

1. Main.c:

两个函数:

main():仅完成初始化,

Button_isr():烧录入口。根据按键不同,来确定要烧录的内容,并启动烧录。

这部分使用到 3 个测试 bin:example.inc 、config.inc 、config_compress.inc。

其中:

example.inc:是目标芯片最终要烧录的 code.bin

config.inc:是目标芯片最终要烧录的 logic.bin(非压缩)

config_compress.inc:是目标芯片的压缩格式的 logic.bin(压缩格式)

如果开发者要使用这个框架,只需要替换 config.inc 和 example.inc 这两个 bin 即可。

不管目标板是多少 pin 的,功能是什么,对于烧录机来说,也就是两个 bin 。在这里替换掉即可。

2. uartMaster.c:

该.c 中是对整个烧录过程交互的函数封装。

主要的对外接口是:装载 ram 程序、烧录 code.bin 、烧录 logic.bin 、启动及结束烧录。实现细节可不用太关注。

这部分用到的几个 bin:sram_decomp.inc 、dfu_uart.inc 、agrv32_fpga_decomp.inc。

这部分的 3 个 bin ,都使用 demo 中自带的即可。开发者不要更换。

注意:这个.c 的封装支持对 logic 压缩和非压缩的自动判别。如果 logic 没有压缩,默认是烧录到芯片的最后 100K 开始的地方,如果 logic 有压缩,则烧录到最后 48K 开始的地方。如果期望 logic烧录到其他地址,这里请自行修改。

如果是整片烧录,这里 logic 的地址还会记录到 option 区域去。

3. Port.c:

这个.c 较为简单,是方便移植到其他芯片时的串口对接部分。

几个主要函数:

1. uart_init_flash

整片烧录时,必须调用。

会写入默认的 option 信息,写入默认的 code.bin(纯 cpld 应用时用的)。

2. uart_update_program

烧录程序 code.bin。

3. uart_update_logic

烧录 logic.bin 。会自动区分压缩和非压缩。

必要的话,会重写 option 区域的信心。

更多信息,参考代码中的注释(以及工程 readme.md 的说明)。

如果验证的目标板是 407 开发板,使用样例工程(不必更换 code.bin 和 logic.bin)可直接看到烧录后的闪灯变化。

升级流程简述

1. 初始化串口后,先发探测包:0x7F

探测包,最多尝试 10 次。这个阶段, 目标芯片中会自动适配波特率。

探测包收到回应 0x79 后,探测完成。

注意:这里是由超时限制的。收到 0x79 后要尽快发接下来的指令。

2. 发 0x00 指令;

该指令为查询指令,以获取目标芯片的一些参数。

从这个指令开始,指令加入反码。

比如:发 00 指令,真实会发送 00 FF; 发 11 指令,真实会发送 11 EE;

指令发出后,等待目标板的回应 0x79 。等到回应后,再发后续内容。

一条完整指令的格式:

Tx [ cmd ~cmd] + rx [0x79] + tx [param1] + rx [0x79] + tx [param2] + rx [0x79] …

3. 发 0x11 指令:

读指令。

能到这里进行正常的指令收发,基本就正常了。

中间就是不停的写操作。

直到最后全部写完。

4. 最后发送 0x82 指令,lock flash。

以上使用到的命令列表,可以从 uart_smart.c 里看到。

另外,上述使用到的 code.bin 和 logic.bin ,都是通过.inc 内嵌进来的。

bin 转换到 inc ,可使用 bin2char.exe 工具来转换。

同级目录下,有控制机测试的 log 可参考。

代码中也有一些注释也参考。

这篇文档有帮助吗?