固件升级跳转测试(基于32B1H和MCAL)
-
Boot代码由App代码做一定删减后所得。保留必要的Gpt,Uart,Can,Fls等模块。
假设考虑给Boot代码预留128K字节空间。使用IAR,
Boot代码做如下设置:
-
YT-LINK不需要任何改动。
-
IAR设置下载空间
-
跳转代码如下:
void JumpToApp(uint32_t addr)
{
// 1-关闭外设
// Gpt_DeInit();
// Can_DeInit();
// CddDma_DeInit();
// CddUart_Deinit();// 2-关闭中断
__disable_irq();// 3-开始跳转
uint32_t sp = *((volatile uint32_t *)(addr));
uint32_t pc = *((volatile uint32_t *)(addr + 4));typedef void (*Func_void_void)(void);
Func_void_void ResetHandler = (Func_void_void)pc;SCB->VTOR = addr;
__set_MSP(sp);
__set_PSP(sp);ResetHandler();
while(1) Wdg_180_Inst0_Service();
}
App代码作如下设置
-
偏移Code地址,增加一个BOOT占位空间,大小为0x20000
-
IAR设置下载空间, code起始地址为0x2020000;
测试现象:
1- Boot和App之间跳转正常,如果后续完善Boot代码,可以方便地实现Boot代码的加密以及App代码的固件升级。仅对Boot代码加密应该就可以了。2- Boot代码和App代码对时钟的设置是一样的,App代码一定不要重复初始化MCU和时钟,不然会有意想不到的问题。
3- Boot代码在跳转前是否需要关闭已注册的外设,感觉这个不是必须的,一方面已经关闭全局中断了,另外,有些MCAL外设也没有对应的DeInit函数,不知道这样理解对不对。
4- 关闭中断后,看门狗仍然是有效的,不至于造成Boot代码成为mcu软件中的不安全因素。
-
-
串口升级完美解决,展示一下:
波特率固定为230400,165K的BIN文件,下载时间=10s。文件被分割为同pflash扇区大小的子包(2048字节),顺序发送。每一个子包尾缀CRC校验;上位机在收到成功接收应答信号后,才会发送编号连续的下一帧子包,保证下载过程的有序性。
下位机BOOT代码会涉及到串口收发和Fls的读写擦操作。有几个坑点一定需要注意:
-
坑点1:BOOT跳转代码不支持OS,OS线程中做跳转的话,就不知道跳那儿了;裸机跳转正常;
-
坑点2:fls扇区擦除/写操作不能使能异步模式。
-
坑点3:上位机在发送2048字节子包时,发送buff一定要先赋值0xff,之后再赋新值。这点是考虑最后一帧不满2048字节时,要以0xff填充;不然也会有问题。
-
坑点4:几个关键地址
1 - APP代码偏移地址=0x020000;
2 - BOOT跳转地址=0x02020800;即跳转到APP的IVT;
3 - 固件BIN文件需要拷贝到Pflash的物理地址=0x020000;
4 - fls设置地址序号 = Pflash-S64开始;
5 - IAR下的烧录地址=0x02020000
注意以上坑点后,APP固件即支持串口烧录,也支持IAR在线仿真。
-
发帖前请查看
帮助没办法联网的电脑使用YCT
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...