OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2961|回复: 4

嵌入式STM32 IAP(在线更新程序)的使用关键点

[复制链接]

132

主题

340

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1036
金钱
1036
注册时间
2017-10-30
在线时间
163 小时
发表于 2018-1-29 14:54:37 | 显示全部楼层 |阅读模式
所谓IAP其实就相当于一个小小的bootloader 用来更新程序的
很多产品基本都是程序做好后就直接在产线烧录一次就OK了,但是,但是BUG有时候是无可避免的,经常有产品装好后又要重新拆外壳 取下板子重新上烧录架烧的惨痛经历,所以,这种情况下IAP就很有必要了,只要一个对外的接口就能在线更新了,常用的是USB口,当然要是一定要用串口的话也是可以的 硬件上麻烦一些而已,下面就是例程

[cpp] view plain copy


  • typedef  void (*pFunction)(void);  
  • pFunction Jump_To_Application;  
  • unsigned long  JumpAddress;  
  •   
  • if(!Check_Whether_Enter_UpdateMode())//这个函数是自定义的 通过判断按键决定进入bootloader 还是APP应用  
  • {  
  •     if (((*(__IO uint32_t*)FLASH_START_ADDR_NORMAL_FIRMWARE) & 0x2FFE0000 ) == 0x20000000)//检查栈顶指针  
  •     {   
  •         /* Jump to user application */  
  •         JumpAddress = *(__IO uint32_t*) (FLASH_START_ADDR_NORMAL_FIRMWARE + 4);//取出APP的RESET地址   
  •         Jump_To_Application = (pFunction) JumpAddress;//将地址传给函数指针  
  •         /* Initialize user application's Stack Pointer */  
  •         __set_MSP(*(__IO uint32_t*) FLASH_START_ADDR_NORMAL_FIRMWARE);//设置栈顶指针  
  •         Jump_To_Application();//跳入APP  
  •     }  
  • }  


[cpp] view plain copy


  • FLASH_START_ADDR_NORMAL_FIRMWARE这个地址是APP起始地址  
  • 这就是IAP的基本思路 如果不进入APP的话就进入IAP进行代码更新 IAP里在添加USB的处理 到了这里IAP的程序就基本完成了(不过USB协议的相关处理还是有点麻烦有点难度的,  
  • 要理解了才好动手,不然容易懵,我本人就是经常懵了...)  
  • 其实类似的关于IAP博文已经很多人写了,这里之所以又写是因为有一点比较容易被忽略的,自己就碰到了,可能是我比较粗心人家其实已经提醒而我没注意到,亦或是我读的文章  
  • 不够多,又啰嗦了...唉,进入正题  
  • 上面例程的APP地址我设的是0x08003000; 那APP工程的程序基地址也要设为0x08003000 FLASH SIZE 也要相应的减去0x3000  

到了这里还有一点要注意的,我们都知道一般情况STM32复位后从0x08000000开始取指,中断向量从0x08000004开始第一个为RESET向量 那APP工程的中断向量就不能如此了 APP的向量地址要从0x08003000开始,这点比较容易被忽略掉,不过也可能是我自己比较傻的问题,说不定大部分人都懂了就我还蒙在鼓里  如下图
创客学院全新视频尽在:www.makeru.com.cn
嵌入式学习交流群:561213221

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

315

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1669
金钱
1669
注册时间
2018-1-29
在线时间
160 小时
发表于 2018-2-26 05:02:52 | 显示全部楼层
我在做IAP,你的跳转前关闭所有已经打开的中断了吗? STM32F0xx与STM32F1XX的中断不一样哦!不能一概而论的!

回复 支持 反对

使用道具 举报

6

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
293
金钱
293
注册时间
2016-1-7
在线时间
54 小时
发表于 2018-3-5 10:06:40 | 显示全部楼层
给你提个想法吧,程序分两个片区,都开启看门狗,启动函数跳转放在第一个程序中,运行放在第二个程序中,当就算烧录失败也还存在引导,继续烧录
回复 支持 反对

使用道具 举报

132

主题

340

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1036
金钱
1036
注册时间
2017-10-30
在线时间
163 小时
 楼主| 发表于 2018-3-5 11:24:57 | 显示全部楼层
落尘浅羽 发表于 2018-3-5 10:06
给你提个想法吧,程序分两个片区,都开启看门狗,启动函数跳转放在第一个程序中,运行放在第二个程序中,当 ...

666
                  
回复 支持 反对

使用道具 举报

10

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
362
金钱
362
注册时间
2018-5-14
在线时间
46 小时
发表于 2018-5-14 22:36:57 | 显示全部楼层
大佬,您那有没有IAP远程烧写程序的相关配置程序,跪求一个测试程序
行至水穷处 坐看云起时
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-6 22:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表