当前位置:网站首页>STM32F103实现IAP在线升级应用程序
STM32F103实现IAP在线升级应用程序
2022-08-09 09:27:00 【InfoQ】
一、环境介绍
二、 IAP介绍
二、hex文件与bin文件区别
三、使用Keil软件完成hex文件转bin文件
四、 使用win hex软件将bin文件搞成数组
五、 Keil编译程序大小计算
1. Code(代码): 程序所占用的FLASH大小,存储在FLASH.
2. RO-data(只读的数据): Read-only-data,程序定义的常量,如const型,存储在FLASH中。
3. RW-data(有初始值要求的、可读可写的数据):
4. Read-write-data,已经被初始化的变量,存储在FLASH中。初始化时RW-data从flash拷贝到SRAM。
5. ZI-data:Zero-Init-data,未被初始化的可读写变量,存储在SRAM中。ZI-data不会被算做代码里因为不会被初始化。
六、工程编译信息与堆栈信息查看
/* ——————— TASK STACK SIZE ———————- */
#define OS_TASK_TMR_STK_SIZE 128 /* Timer task stack size (# of OS_STK wide entries) */
#define OS_TASK_STAT_STK_SIZE 128 /* Statistics task stack size (# of OS_STK wide entries) */
#define OS_TASK_IDLE_STK_SIZE 128 /* Idle task stack size (# of OS_STK wide entries) */
#define APP_TASK_MANAGER_STK_SIZE 512
#define APP_TASK_GSM_STK_SIZE 512
#define APP_TASK_OBD_STK_SIZE 512
#define OS_PROBE_TASK_STK_SIZE 128
七、实现STM32在线升级程序
7.1 升级的思路与步骤
7.2 待升级的程序FLASH起始设置
7.3 Bootloader的程序设置
//设置写入的地址,必须偶数,因为数据读写都是按照2个字节进行
#define FLASH_APP_ADDR 0x08005000 //应用程序存放到FLASH中的起始地址
int main()
{
printf("UART1 OK.....\n");
printf("进入IAP Bootloader程序!\n");
while(1)
{
key=KEY_Scanf();
if(key==1) //KEY1按下,写入STM32 FLASH
{
printf("正在更新IAP程序...............\n");
iap_write_appbin(FLASH_APP_ADDR,(u8*)app_bin_data,sizeof(app_bin_data));//烧写新的程序到内置FLASH
printf("程序更新成功....\n");
iap_load_app(FLASH_APP_ADDR);//执行FLASH APP代码
}
}
}
/*
函数功能:跳转到应用程序段
appxaddr:用户代码起始地址.
*/
typedef void (*iap_function)(void); //定义一个函数类型的参数.
void IAP_LoadApp(u32 app_addr)
{
//给函数指针赋值合法地址
jump2app=(iap_function)*(vu32*)(app_addr+4);//用户代码区第二个字为程序开始地址(复位地址)
__set_MSP(*(vu32*)app_addr); //设置主堆栈指针
jump2app(); //跳转到APP.
}
边栏推荐
- 单元测试是什么?怎么写?主要测试什么?
- 自动化测试简历编写应该注意哪方面?有哪些技巧?
- WAVE SUMMIT 2022深度学习开发者峰会
- 第三方免费开放API 获取用户IP 并查询其地理位置
- Jfinal loading configuration file principle
- lateral view explode的另一种实现方式
- 条件和递归
- 性能测试的基本概念是什么?做好性能测试需要掌握哪些知识?
- MySQL Leak Detection and Filling (3) Calculated Fields
- The div simulates the textarea text box, the height of the input text is adaptive, and the word count and limit are implemented
猜你喜欢
on duplicate key update
Django实现对数据库数据增删改查(一)
HD Satellite Map Browser
接口测试主要测试哪方面?需要哪些技能?要怎么学习?
makefile学习-解决目标文件输出路径问题
Swap swap partition
使用Protege4和CO-ODE工具构建OWL本体的实用指南-1.3版本(4.Building An OWL Ontology)
接口设计
How much do you know about the mobile APP testing process specifications and methods?
接口性能测试方案设计方法有哪些?要怎么去写?
随机推荐
米斗APP逆向分析
软件测试个人求职简历该怎么写,模板在这里
5.Set接口与实现类
The div simulates the textarea text box, the height of the input text is adaptive, and the word count and limit are implemented
迭代
单元测试是什么?怎么写?主要测试什么?
3.练习Thread
MySQL event_single event_timed loop event
makefile学习-解决目标文件输出路径问题
8.递归遍历和删除案例
AES/ECB/PKCS5Padding encryption and decryption
本体开发日记02-sparql简单查询
自动化测试框架有哪几种?搭建的思路是什么?一篇文章让你彻底了解自动化
全网最全的软件测试基础知识整理(新手入门必学)
6.File类
命令行查询数据库
4.泛型和工具类
本体开发日记03-排错进行时
本体开发日记05-努力理解SWRL(Built-Ins)
本体开发日记05-努力理解SWRL(下)