正常情况下,芯片的烧录方式有:
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 可参考。
代码中也有一些注释也参考。