关于STM32F4的IAP的一点点记录

    看了原子的STM32的IAP 教程,一开始还以为bootloader是啥意思,差点跟uboot搞混淆了,其实stm32的“bootloader”不需要自己写汇编和链接脚本,Boot和App都是单片机程序,只是实现的功能不同,前者是为了引导App,后者是为了实现业务逻辑。只不过boot是有写flash或者sram的功能,再加上通信口(USB/USART etc. )来接收所谓的应用程序app代码。然后跳转到该代码执行就好了,但是要重新设置一下中断向量表的位置,要不然两个程序的中断可能会混淆。也就是说boot代码的中断要进boot代码的irq handler 而 app代码的中断要进app代码的irq handler。下边就以flash iap为例来具体说说需要注意的两点:

(1)boot代码和app代码在flash中的位置

两个代码都要正常运行那肯定不能在写入app代码到flash时把boot的代码给覆盖了,要不然boot代码就失效了。

STM32F429IG支持三种启动方式 
1. FLASH启动        上电复位后PC指针指向第一条指令位置——0x08000000
2. SRAM启动        上电复位后PC指针指向第一条指令位置——0X20000000
3. 系统存储器启动 上电复位后PC指针指向第一条指令位置——0X1FFF0000

程序的起始地址默认是被放在FLASH的起始地址处,即0x08000000。

下图为boot程序的flash设置:


boot程序的地址不需要更改就是用默认的地址,理论上我们只需要确保 APP 起始地址在 Boot 之后,并且偏移量为 0X200

的倍数即可。

设置boot的占用64k(0x10000),就是0X08000000 ~ 0X08010000的flash区间。

该芯片flash共1M,则app占用的起始地址设置为: 0X08010000,size为:1M-64k =960K (0XF0000)。

以下为app程序的flash设置: 


(2)中断向量表的重定位

我们都知道一般情况STM32复位后从0x08000000开始取指,中断向量从0x08000004开始第一个为RESET向量 那APP工程的中断向量就不能如此了 APP的向量地址要从0x08010000开始:

NVIC_SetVectorTable(FLASH_BASE, 0x10000);

这里的0x10000根据实际情况更改即可。

    

猜你喜欢

转载自blog.csdn.net/gongyuan073/article/details/79475368