HC32F460串口iap升级(踩坑篇)
文章目录
1. 串口IAP升级
mcu的串口iap升级,其实就是通过串口升级程序的一种方式,现在基本上都是仿照linux的启动模式来实现的,总体上最少要有两个程序,一个叫bootloader程序,一个是app程序,具体的实现原理方法多种多样,但是本质上是一样的,只是有的做了安全方面的考量。这节只说基于HC32F460最简单的iap升级的实现。
2. APP程序的实现
2.1 确定app在flash的存储位置
首先大家要知道,任何的mcu启动都会在addr为0x00的地方开始读程序运行,一般mcu地址为0x00的地方是芯片flash的起始地址,所以可以说mcu上电都会从flash的0x00地址开始启动。只不过有些芯片厂商会做内部地址映射,将其它地方的地址映射到地址0x00,这样的目的是可以灵活的配置不一样的启动模式。
我们在学stm32的时候都知道,当配置为flash启动的时候,就会将0x8000000地址映射到0x00,stm32在启动的时候,从0x00启动就变成了0x8000000地址启动,那么当程序下载到0x8000000为起始地址后的一片区域,程序就会运行。
而HC32F460不支持多种启动模式,所以没有做映射,而是上电直接读0x00地址的代码运行。
2.2 正常app的实现
正常的mcu制作app程序都只需要两个步骤:
-
在程序中添加修改中断向量表位置,
代码:
//要声明两个宏 //华大mcu是默认从地址为0x00开始执行程序 #define FLASH_BASE 0x00 //地址偏移量,要通过boot loader和app所占空间大小自己估量,但值一般要求是flash页的整数倍 #define VECT_TAB_OFFSET 0x020000
//在main函数添加一句 int main() { //在main函数的第一句执行 SCB->VTOR = FLASH_BASE + VECT_TAB_OFFSET; //重定位中断向量表 //其他程序。。。。 }
-
修改编译的链接脚本。对于用keil编译可直接在界面修改,将IROM起始地址加上程序设置的地址偏移量,大小参考芯片flash的大小算一下。IRAM也要改,参照程序编译后那个
例如将:
修改为下图:
2.3 华大hc32f460特有的坑
正常的app程序,有上面两部分就可以了,可是hc32f460编译会报一个错误:
Error: Q0147E: Failed to create Directory .\output\xxx.bin\ER$$.ARM.__AT_0x00000400: File exists
这个是在说0x00000400地址访问不到,查看map文件,发现在code部分的0x400地址竟然是个data,这就说明程序里面对0x400地址有特别操作,后来在程序中搜索400,结果找到这段代码:
注意:FLASH_BASE是我自己填的,若您看到应该括号只有0x400。
后来在用户手册找到了原因:
数据手册里面说,在上电后,程序会默认读地址为0x400这个地方的内容,配置一些东西,包括看门狗。
这样有一定好处,在stm32我们设置看门狗,都是在main函数里面开启,但是若程序还没执行到main函数里面的的开启看门狗程序,就死机了,那就真的死机了。但是华大的通过这个,可以在开机的时候直接启动看门狗,这样更安全。
但是当我更改了app的程序运行位置,这个0x400就不在我程序编译的范围内,所以要更改为:
其中,这两个宏是在上面 2.1节 定义的。
注意:这个程序在文件hc32f460_icg.c文件中定义的,若没有这个文件,需要手动从sdk库中添加此文件。
这样hc32f460的app基本就完成了。
3. boot loader的实现(未完成)
整理中。。。