他妈的ST32 IAP 功能, 要让所有的人都可以轻松搞定

2019-12-08 14:35发布

高手请直接跳过!

理论上的东西就不写了,自己在论坛上看看! 这里直接讲如何操作的问题!

IAP 应用,首先把FLASH分两个区, 一个iap BOOT区, 一个用户APP应用区.

IAP BOOT区就是 IAP升级程序的大小, 如果你不用STM32 的FLASH做别的应用(如E2PROM),那么剩下的空间都可以作为APP应用程序区!

所以,一个完整带IAP的项目,我们要写两个单片机程序和一个PC升级程序(如果你想用PC对APP升级的话)!


本示例是IAP BOOT用串口接收PC发过来的BIN文件对STM32的APP进行升级!


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
首先,我们要完成IAP BOOT单片机程序, 这个程序很简单,你就当是STM32对自己内部的FLASH的擦写操作!

既然我们要在IAP BOOT中读写FLASH,那么我们先要设置FLASH的大小,我们把STM32的0x08003000之后的地址都作为FLASH(那么IAP BOOT程序要小于12K)
#define ApplicationAddress                                0x08003000                  //APP应用程序起始地址(存放在FLASH前12K)                                                                                                                             //保留0X08000000~0x08003000的空间为IAP使用
       
#define USER_FLASH_SIZE                        42                        //用户APP flashROM大小, 42 PAGE                       
#define FLASH_PAGE_SIZE                        1024//2048                //FLASH 页大小


主程序很简单:

第一步当然是配置系统时钟
1.PNG (1.75 KB, 下载次数: 22) 下载附件 2013-8-28 14:36 上传

第二步: 根据系统时钟频率设置FLASH读写周期:
2.PNG (16.67 KB, 下载次数: 22) 下载附件 2013-8-28 14:39 上传

第三步: 就是初始化串口(uart_init();)
3.PNG (29.69 KB, 下载次数: 17) 下载附件 2013-8-28 14:42 上传
这里串口的发送及接收都是用的阻塞方式,说白了就是死等!

第四步: 单片机向PC上位机发送联机请求: (规定,单片机与上位机通讯一帧数据是260个字节,也就是说,单片机如果要对上位机发送数据就必须是260个字节,接收也是260个字节, 小于260个字节的数据将被抛弃)

/*  上位机与单片机通讯协议如下(一帧数据是260个字节,第一个字节是字头, 第二个字节是命令字, 3~258个字节是要发送的数据, 第259个字节是结束符,最后一个字节是校验字节):   */
1. 下位机请求与上位机联机:
上位机发送: 0x55 , 'C' .....后面的258个字节可以不管

程序中定义:
#define COM_BUF_SIZE                256+4
uint8_t ComBuf[COM_BUF_SIZE];        //0字头0x55/1命令/
数据发送及接收都用ComBuf存储

单片机请求联机::
4.PNG (1.98 KB, 下载次数: 17) 下载附件 2013-8-28 15:03 上传

//联机结果
41.PNG (62.13 KB, 下载次数: 18) 下载附件 2013-8-28 15:10 上传

第五步: 单片机带超时(比如10s)等待上位机命令(没有等到PC消息就跳到APP区运行程序, 有消息就在IAP BOOT区中运行程序):
5.PNG (38.78 KB, 下载次数: 20) 下载附件 2013-8-28 15:20 上传


第六步,擦除FLASH(APP应用区):
6.PNG (49.58 KB, 下载次数: 15) 下载附件 2013-8-28 15:27 上传

第七步: 写FLASH(APP应用 BIN 文件)
7.PNG (48.99 KB, 下载次数: 13) 下载附件 2013-8-28 15:35 上传

呵呵,从上面看,IAP BOOT就两步而已, 一 、擦除FLASH      二 、写FLASH!


MDK都不用设置,编译OK后,把HEX文件下载到FLASH里就OK了!

////////////////////////////////////////////////////////////////////////////////////////
只要注意 #define ApplicationAddress                                0x08003000

就可以了,这个地址我们在APP应用程序中要用到!
/////////////////////////////////////////////////////////////////////////////////////////








友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
98条回答
skype
1楼-- · 2019-12-08 20:16
上源码!

STM32 lib3.50 iap.rar (5.38 MB, 下载次数: 2696) 2013-8-28 15:43 上传 点击文件名下载附件
单片机IAP BOOT




stm32 ISP 8-28.rar (3.49 MB, 下载次数: 2292) 2013-8-28 15:42 上传 点击文件名下载附件
上位机源码


bbstr
2楼-- · 2019-12-08 22:52
IAP主要讲究的是生产以后,便于升级固件的。MDK的下载那是ICP,属于量产或者调试阶段通过jlink之类的链路来下载。IAP可以是串口,usb,can,网络,等等

有兴趣的话,可以研究下支持多种升级模式,并且代码尺寸尽量小
flytosky8
3楼-- · 2019-12-09 00:01
 精彩回答 2  元偷偷看……
苦行僧
4楼-- · 2019-12-09 01:51
好像很厉害的样子
32MCU
5楼-- · 2019-12-09 06:43
标记。不错。
skype
6楼-- · 2019-12-09 09:56
本帖最后由 skype 于 2013-8-28 16:02 编辑

App应用程序设置:


呵呵,这个简单了,是人都会写了

还记得IAP BOOT中的这个地址吗?
#define ApplicationAddress                0x08003000

就它了  0x3000    !


APP  三个设置就可以搞定!

1、FLASH偏移量

8.PNG (31.54 KB, 下载次数: 5)

下载附件

2013-8-28 15:55 上传



2、输出BIN文件,把它写入stm32 flash(从ApplicationAddress开始写)

81.PNG (27.46 KB, 下载次数: 5)

下载附件

2013-8-28 15:57 上传



3、 要让APP在应用区(ApplicationAddress)跑起来,一定要加上

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x3000);

82.PNG (33.73 KB, 下载次数: 4)

下载附件

2013-8-28 15:58 上传



其他注意事项:::无无无


////
APP 文件下载
STM32 lib3.50工程模版.rar (752.44 KB, 下载次数: 1166) 2013-8-28 15:59 上传 点击文件名下载附件

一周热门 更多>