刚刚实现了STM32F0的IAP程序,用的串口下载,上位机用QT实现,在此做一些总结。
关于bootloader就不多介绍了,官网有详细资料和例程,也可以点下面链接下载:
stm32f0_programming_usart.zip
(1.58 MB)
STM32F0串口升级.pdf
(184.25 KB)
bootloader运行完成后开始运行用户程序,这里主要说一下编写用户程序需要注意的地方。
其实和F1系列一样,主要是要让内核知道中断向量表的存储位置,这样在又中断到来时可以准确的
跳到相应处理函数,假如我的用户程序起始地址为0x08003000,如果是Cotex_M3内核,可以直接在
用户程序开始处重定向中断向量表地址到0x08003000,但是F0系列不支持向量表重定向,详见
STM32F0参考手册,这里截图如下:
所以,上面也给出了解决办法。。。。
M0系列提供了一个系统配置寄存器SYSCFG,其中的最低两位MEM_MODE段提供了内存映射方式,默认是
将flash地址0x08000000映射到0x00000000处,这样的话,如果有中断到来,则内核直接从0x00000000处
取中断处理函数的地址,跳到相应的函数中执行。如果用户程序的起始地址设为0x08003000,这时候中断
向量表也在0x08003000,这样如果不采取措施的话,一旦某个中断到来,程序还是会跳到0x08000000指定
的中断处理函数中,结果不可预料。这时就要根据上面图片中介绍的办法,SYSCFG中的MEM_MODE还提供
了将SRAM(即内存,起始地址0x20000000)重映射到0x00000000中的方法,所以我们可以在用户程序起始处
,先将0x08000000开始处的中断向量表复制到SRAM起始地址(0x20000000)中,然后再修改SYSCFG最低两位
,修改地址映射方式为将SRAM起始地址映射到0x00000000处,这样的话相当于内核执行的向量表是用户程序
的中断向量表,程序即能正常运行。
|