[STM32] Stm32的bootloader和App分离编写

[复制链接]
3094|14
 楼主| 一路向北lm 发表于 2021-5-7 09:58 | 显示全部楼层 |阅读模式
本帖最后由 一路向北lm 于 2021-5-9 21:53 编辑

#申请原创#


当我们玩单片机到一定境界的时候,一些稀奇古怪的想法便会油然而生
     

固件升级到底如何实现的?为什么人家使用单片机开发的设备可以支持固件升级,而我完全不知道怎么回事?

@21小跑堂 @21小管家  你们知道吗?



开始科普(以STM32为例)

1. 我们写的代码程序被烧写到哪里?  
这个问题很简单,我们大家都知道我们写的代码被烧写到了芯片内部的Flash里面。

2. 芯片内部的Flash有多大?是否有剩余的空间?  
关于芯片内部的Flash有多大这个问题大家需要去参考芯片手册,我们熟悉的STM32F103C8  内部Flash是64k,而STM32F103ZE  内部Flash达到了256k;如果我们只是在STM32F103ZE  里面点一个灯,那256k的Flash岂不是给浪费了。

3.我们来简单的看一下,点一个灯,究竟占据Flash多少的空间?
双击C8T6的LED工程:Template,即可打开Template.map文件。


定位到Memory Map of the image,通过内存映射我们可以看到Falsh的基地址是0X0800 0000,最大可存储0X10000(64K),LED工程大小只占据了0X52C (不到2K),剩余的62K白白浪费了。


4.Falsh怎么被合理的利用呢?
有人提出:可以把需要储存的参数信息写入到芯片内部的Falsh,不再需要外部扩展Flash和EEPROM啦;
也有人提出:可以把写的程序烧录两份到内部的Falsh中,其中一份作为备用和更新。
也有人提出: 我们是否可以建立分层的思想,将内部Falsh划分为四大区域:Boot区域、APP运行代码区域、备份升级代码区域、参数存储区域,这个想法,我拍手叫绝。


开始实战(以STM32F103C8为例)
1、 如何分配STM32F103C8 的boot和app的空间?
2、 怎么从boot跳转到app?
3、 怎么设置App的中断向量?
如何分配STM32F103C8 的boot和app的空间:
stm32f103c8t6flash的大小是64k,所以把它分成如下所示:
0x08000000 ---0x0800 33FF分配给bootloader使用,大小是13k
0x0800 3400----0x080097FF分配给第一个APP的使用,大小是25k
0x08009800----0x0800 FBFF分配给升级备份的APP的使用,大小是25k
0x0800FC00----0x0800 FFFF 分配给参数存储使用,大小是1k

Boot中ROM大小设置:
App1中ROM大小设置:
App2中ROM大小设置:
如何从boot跳转到app?
跳转函数如下:
  1. #define  RUN_CODE_ADDR       0x08003400   //RunCode Start Adress  0x08003400~0x080097FF    25K
  2. typedef void (*pfun) (void);   //函数指针类型定义
  3. void go_to_app(void)
  4. {
  5.           pfun  Jump_To_Application;
  6.          __IO uint32_t JumpAddress;
  7.        
  8.         ENTER_CRITICAL();   
  9.     if (((*(volatile uint32_t*)RUN_CODE_ADDR) & 0x2FFFE000 ) == 0x20000000)
  10.   {
  11.                 /* 地址要偏移4 */
  12.     JumpAddress =  *(volatile uint32_t*)(RUN_CODE_ADDR + 4);
  13.     Jump_To_Application = (pfun)JumpAddress;
  14.                
  15.                 /* 使用app的栈 */
  16.     __set_MSP(*(volatile uint32_t*)RUN_CODE_ADDR);
  17.                
  18.                 /* 跳转到用户函数入口地址 */
  19.     Jump_To_Application();
  20.   }
  21. }
跳转函数解释如下:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
爱情海玩偶 发表于 2021-5-7 10:20 | 显示全部楼层
楼主加油,我写过,但是也是依葫芦画瓢。还没深究
 楼主| 一路向北lm 发表于 2021-5-7 10:32 | 显示全部楼层
爱情海玩偶 发表于 2021-5-7 10:20
楼主加油,我写过,但是也是依葫芦画瓢。还没深究

哈哈,我慢慢写哈哈
ayb_ice 发表于 2021-5-7 11:34 | 显示全部楼层
我还见过一个项目分多个工程搞的,把各种业务分成多个工程开发,每人分搞一部分,分开编译,分开烧录,确实挺高级的
Prry 发表于 2021-5-7 16:43 | 显示全部楼层
来一个高效的Boot、App、参数区合并方法:
https://acuity.blog.csdn.net/article/details/106724373
 楼主| 一路向北lm 发表于 2021-5-8 10:03 | 显示全部楼层
Prry 发表于 2021-5-7 16:43
来一个高效的Boot、App、参数区合并方法:
https://acuity.blog.csdn.net/article/details/106724373 ...

感谢分享啊
 楼主| 一路向北lm 发表于 2021-5-8 10:04 | 显示全部楼层
ayb_ice 发表于 2021-5-7 11:34
我还见过一个项目分多个工程搞的,把各种业务分成多个工程开发,每人分搞一部分,分开编译,分开烧录,确实 ...

是的,这个工程比较庞大
 楼主| 一路向北lm 发表于 2021-5-8 10:05 | 显示全部楼层
Prry 发表于 2021-5-7 16:43
来一个高效的Boot、App、参数区合并方法:
https://acuity.blog.csdn.net/article/details/106724373 ...

自己写的博客?
Prry 发表于 2021-5-8 12:26 | 显示全部楼层

是的,有问题欢迎指出。
mcuisp 发表于 2021-5-8 16:49 | 显示全部楼层
好工具SRecord
 楼主| 一路向北lm 发表于 2021-5-8 17:42 | 显示全部楼层

还没使用过SRecord
mcuisp 发表于 2021-5-8 17:55 | 显示全部楼层
你的srec-cat点进去就是SRecord吧
 楼主| 一路向北lm 发表于 2021-5-9 21:29 | 显示全部楼层
mcuisp 发表于 2021-5-8 17:55
你的srec-cat点进去就是SRecord吧

 楼主| 一路向北lm 发表于 2021-5-9 21:43 | 显示全部楼层
更新一点
luckmanliang 发表于 2021-5-11 09:14 来自手机 | 显示全部楼层
刚接触,学习学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则

293

主题

3837

帖子

81

粉丝
快速回复 在线客服 返回列表 返回顶部