STM32F10x的IAP在线升级功能非常实用——不必拆开设备的外壳,然后通过JLINK或是其它工具烧录程序。而是仅通过设备上的串口、USB或是CAN,即可完成程序的更新,实现固件升级。
整个过程用到两个程序,一个IAP程序,它用来实现通过串口下载用户程序。另一个就是用户应用程序了。
通过串口实现在线升级的原理如下:
1、首先通过JLINK或其它工具将IAP程序下载至STM32的FLASH中,其占据的地址空间为0x800 0000到0x8002fff,这段空间用来存放IAP程序,IAP代码大小不能超过(0x800 2fff - 0x800 0000 =12K)。
2、打开“超级终端”,按照IAP程序里设置的参数(波特率、数据长度、校验位等),对“超级终端”作相应设置。
3、将设备断电,按住设备上的某一开关或是按键(这个可以在IAP程序里自已定义,下文有叙述)。然后给设备上电,这时“超级终端”上会显示操作界面,让用户选择:1、给STM32下载新的用户程序;2、将STM32内现存的用户程序上传至电脑;3、运行新下载的用户程序。出现这个界面后,就可以松开开关或是按键了。
4、通过电脑键盘上的“1”、“2”、“3”这几个数字键选择你想执行的操作。若是希望下载,按下数字键“1”.接下来电脑屏幕上会弹出对话框,让你选择希望下载的二进制文件,以及传输协议,这个得选“Ymodem”协议。完成后按“确定”就开始下载了。
再来看一下两个源程序里,用户根据自己的需要可能得改动的地方。
an2557.zip里面就是IAP程序。
这个程序里面,用户可能要改动的就是IAP的触发方式,即如何进入IAP来进行新的用户程序的下载。该源程序里定义的是一个连接至PB9的按键,当设备刚上电的时候,如果该按键按下,则进入IAP模式,否则跳至0x8003000运行用户程序。如何触发IAP,用户可以根据自己的实际情况,自行定义。另外,这里面初始化了一个串口,即用来和PC通信的串口,波特率、数据长度、校验位等,也是这里设置的。
再来看用用户应用程序里需要改动两个的地方。
1、将中断向量表映射至0x8003000处。在main函数里,待系统初始化后,可以通过这条语句即可实现:
NVIC_SetVectorTable(0x08000000,0x00003000);
2、将用户应用程序的起始地址设置为0x8003000,在keil4中如下图所示:

另外请注意,在线升级时只能选择BIN格式的二进制文件,可以通过H-JTAG里面的Convert工具,将Keil编译生成的HEX文件转换成BIN文件。
以上就是通过串口实现STM32IAP在线升级的原理及过程。
若有不清楚的地方请看an2557:STM32F10x in-application programming using theUSART 这个PDF文档,里面有详细的说明。
an2557 ApplicationNote.pdf下载地址:
http://www.st.com/st-web-ui/static/active/en/resource/technical/document/application_note/CD00161640.pdf
an2557.zip下载地址:(IAP源代码)http://www.st.com/st-web-ui/static/active/en/st_prod_software_internet/resource/technical/software/firmware/stsw-stm32008.zip
|