概况:
6 E6 y; F0 E. g IAP框架布局:( k8 [- D4 B2 k5 O5 O: H v/ f" J ' ~/ j3 O+ u, o, O, J. u ! W3 `. J- _) Z / k' o* `4 _. E8 Y3 g5 | STM32F103ZET6的启动方式有三种:内置FLASH启动、内置SRAM启动、系统存储器ROM启动,通过BOOT0和BOOT1引脚的设置可以选择从哪中方式启动,这里选择内置的FLASH启动。其FLASH的地址为0x08000000—0x0807ffff,共512KB,这些都能从芯片数据手册中直接得到。而这里首要的一个问题是中断的问题。正常情况下发生中断的过程为:发生中断(中断请求),到中断向量表查找中断函数入口地址,跳转到中断函数,执行中断函数,中断返回。也就是说在STM32的内置的Flash中有一个中断向量表来存放各个中断服务函数的入口地址,内置Flash的分配情况大致如下图2-1。 . W w1 N, W" f, D) M4 _& p # H& F. x5 x/ p+ s1 ~6 W9 ~ ! g4 i9 E, t% x# v* v4 W4 m% T. ` 5 O1 B+ K0 `3 X- Y/ a 在内置的Flash里面添加一个BootLoader程序,BootLoader程序和user application各有一个中断向量表,假设BootLoader程序占用的空间为N+M字节,则程序的走向应该如图2-2所示(借用网友的原图并做改动,其中虚线部分为原图步骤④⑤的走向,本人改为指向灰色部分)。 # k4 l0 {* h& w0 E: X% p 上电初始程序依然从0x08000004处取出复位中断向量地址,执行复位中断函数后跳转到IAP的main(标号①所示),在IAP的main函数执行完成后强制跳转到0x08000004+N+M处(标号②所示),最后跳转到新的main函数中来(标号③所示),当发生中断请求后,程序跳转到新的中断向量表中取出新的中断函数入口地址,再跳转到新的中断服务函数中执行(标号④⑤所示),执行完中断函数后再返回到main函数中来(标号⑥所示)。- X7 v5 j2 d9 w0 D, T# ~ 对于步骤④⑤,网友认为是:“在main执行的过程中,如果CPU得到一个中断请求,PC指针仍强制跳转到地址0x08000004中断向量表处,而不是新的中断向量表,如图标号④所示,程序再根据我们设置的中断向量表偏移量,跳转到对应中断源新的中断服务程序中,如图标号⑤所示”。我对此的理解是:“当发生中断后,程序从0x08000004(旧)处的中断向量表中得到相应的中断服务函数入口地址,继而跳转到相应的中断服务程序”。但是旧的中断向量列表里边存放的是IAP程序中断函数的入口地址,它是如何得到user程序中断函数的入口地址呢?所以我觉得此种说法是错误的。“当发生中断时PC指针强制会跳转到0x08000004处”这种说法并没有错,只是忽略了后续的一些知识要点而导致这个说法出现矛盾。 5 B* P7 |5 x7 x5 L' _1 x 对于步骤④⑤我认为的是,在main函数的执行过程中,如果CPU得到一个中断请求,PC指针本来应该跳转到0x08000004处的中断向量表,由于我们设置了中断向量表偏移量为N+M,因此PC指针被强制跳转到0x08000004+N+M处的中断向量表中得到相应的中断函数地址(待求证),再跳转到相应新的中断服务函数,执行结束后返回到main函数中来。* Z5 ^/ j6 k6 ^* K& }4 w1 j IAP流程描述:1、IAP的bootloader引导程序 IAP在应用中编程,可以拓展成远程网络更新应用固件。 $ H. ` Y5 ^$ A& x
其中,app应用固件的分区地址: n0 t9 b% V4 ^& U6 K# ~
2、app应用固件* ]8 R9 W$ e. q8 o9 Q- K. k 需要两处的更改,不然错误未知& X% v$ y! j! r# I2 l 0 ?% V* P5 D5 p# w9 w: ~: E
% m: }# v7 g* W& q3 c; L) E 其中: / w4 h- R$ r6 S
查错:. i" W+ J5 p! D" _8 { 如果做了上边的工作,IAP依然无法顺利执行跳转至app应用程序,可以查看.map和.bin文件,确定是否如实的改变的中断向量表的偏移和栈顶指针,如图:
6 U% Y0 I. Y5 O
附:3 E: ^$ n; h; P( a, Q) T 1、如需要.hex文件转.bin,参见上边的文章" ~4 ]$ q& z4 S7 g) r& j % o1 ?) u2 O/ ~& G
& z; S. }7 |$ j* E 2、地址偏移后的app应用程序,是否能够独立的运行?/ [8 G3 r) \# t# n/ U7 H5 O; G$ M : ]- C5 {& ^5 y) O6 ]- F4 d1 A |
【银杏科技ARM+FPGA双核心应用】STM32H7系列10——ADC
【银杏科技ARM+FPGA双核心应用】STM32H7系列57——MDK_FLM
【STM32图书分享之九】—《STM32F 32位ARM微控制器应用设计与实践》
无刷直流电机控制应用+基于STM8S系列单片机---电子书
STM32 USB的程序,包含固件、驱动和测试用的应用程序
工业以太网总线ETHERCAT驱动程序设计及应用(扫描版)
【实战经验】STM32 DFSDM测量温度应用
【实战经验】基于STM32 I2S的音频应用开发介绍
【中文文档】AN4112_使用STM32F05xx模拟比较器的六个应用案例
[连载]STM32F103ZET6 uCGUI3.90a控件应用教程(第五节 复选框和单选按钮)