1、实验目标: STM32 IAP学习时,希望有一个快捷的方式去实验IAP与APP之间的相互跳转。
1)验证IAP跳转至APP 2)验证APP通过软件reset跳转至IAP
(避免再一开始就实验完整的IAP过程,编写BootLoader,编写 APP,再通过PC工具下载APP代码,然后再看是否能正常更新,过程很长,新学时可能遇到的障碍太多 )
2、实验方法: 分别编写BootLoader 和 APP程序(两个程序仅仅简单的完成串口打印和跳转工作,不设计其他功能(如接受bin文件件,更新flash等功能都不包含)),通过串口打印识别区分IAP 和APP程序。
分别通过jlink在线调试的方式,先后将IAP程序和APP程序下载至STM32,实现IAP/APP实验的在线调试
3、IAP 代码实现:
IAP主要流程如上图,进入IAP后初始化,然后打印数据,等待,随后跳转至APP
4、APP代码实现
APP代码流程 初始化,打印,delay,跳转至IAP。
此处需要特别注意一点,APP程序在线调试时,发现会死在串口发送上。后来在UART初始化时,先将其disable,然后再enable来规避这个问题。
以上说明一个值得注意的问题,IAP程序在跳转至APP程序时,可能有些状态是没有清楚的,导致APP程序在运行时引入异常,针对这类问题,APP程序的在线调试方法就非常有用的,直接在线调试可以快速定位问题。
5、IAP程序的在线调试
设置好ROM1即可,不需要太多配置。
没有下载过APP程序的情况下,iap_load_app(FLASH_APP1_ADDR);程序不会真的跳转,会回到IAP程序继续执行。
6、APP在线调试
APP程序的在线调试非常关键,因为APP程序的地址不是默认地址,仅仅设置ROM1的情况下,在线调试时依然会默认进IAP程序,无法进行在线调试。
KEIL4需要完成的设置如下:
1)设置flash地址空间,ROM1
2)设置flash download 地址
3) 配置debug信息
添加ini file 。(我认为这个ini文件是在在线调试的入口调用的,这样做可以使得在线调试直接从APP的入口处开始执行,这样的话就可以直接对APP进行debug)
设置完以上的数据,IAP程序debug无误后,再进行APP的在线调试,如下图:
设断点,串口直接打印APP INIT说明debug是直接从APP程序的入口处开始的(0x08010000)
连续运行的效果如下图:
7、特别鸣谢
http://www.stmcu.org/module/forum/thread-380078-1-1.html