打印
[STM32]

Stm32的bootloader和App分离编写

[复制链接]
2331|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 一路向北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?
跳转函数如下:
#define  RUN_CODE_ADDR       0x08003400   //RunCode Start Adress  0x08003400~0x080097FF    25K
typedef void (*pfun) (void);   //函数指针类型定义
void go_to_app(void)
{
          pfun  Jump_To_Application;
         __IO uint32_t JumpAddress;
       
        ENTER_CRITICAL();   
    if (((*(volatile uint32_t*)RUN_CODE_ADDR) & 0x2FFFE000 ) == 0x20000000)
  {
                /* 地址要偏移4 */
    JumpAddress =  *(volatile uint32_t*)(RUN_CODE_ADDR + 4);
    Jump_To_Application = (pfun)JumpAddress;
               
                /* 使用app的栈 */
    __set_MSP(*(volatile uint32_t*)RUN_CODE_ADDR);
               
                /* 跳转到用户函数入口地址 */
    Jump_To_Application();
  }
}
跳转函数解释如下:

使用特权

评论回复

相关帖子

沙发
爱情海玩偶| | 2021-5-7 10:20 | 只看该作者
楼主加油,我写过,但是也是依葫芦画瓢。还没深究

使用特权

评论回复
板凳
一路向北lm|  楼主 | 2021-5-7 10:32 | 只看该作者
爱情海玩偶 发表于 2021-5-7 10:20
楼主加油,我写过,但是也是依葫芦画瓢。还没深究

哈哈,我慢慢写哈哈

使用特权

评论回复
地板
ayb_ice| | 2021-5-7 11:34 | 只看该作者
我还见过一个项目分多个工程搞的,把各种业务分成多个工程开发,每人分搞一部分,分开编译,分开烧录,确实挺高级的

使用特权

评论回复
5
Prry| | 2021-5-7 16:43 | 只看该作者
来一个高效的Boot、App、参数区合并方法:
https://acuity.blog.csdn.net/article/details/106724373

使用特权

评论回复
6
一路向北lm|  楼主 | 2021-5-8 10:03 | 只看该作者
Prry 发表于 2021-5-7 16:43
来一个高效的Boot、App、参数区合并方法:
https://acuity.blog.csdn.net/article/details/106724373 ...

感谢分享啊

使用特权

评论回复
7
一路向北lm|  楼主 | 2021-5-8 10:04 | 只看该作者
ayb_ice 发表于 2021-5-7 11:34
我还见过一个项目分多个工程搞的,把各种业务分成多个工程开发,每人分搞一部分,分开编译,分开烧录,确实 ...

是的,这个工程比较庞大

使用特权

评论回复
8
一路向北lm|  楼主 | 2021-5-8 10:05 | 只看该作者
Prry 发表于 2021-5-7 16:43
来一个高效的Boot、App、参数区合并方法:
https://acuity.blog.csdn.net/article/details/106724373 ...

自己写的博客?

使用特权

评论回复
9
Prry| | 2021-5-8 12:26 | 只看该作者

是的,有问题欢迎指出。

使用特权

评论回复
10
mcuisp| | 2021-5-8 16:49 | 只看该作者
好工具SRecord

使用特权

评论回复
11
一路向北lm|  楼主 | 2021-5-8 17:42 | 只看该作者

还没使用过SRecord

使用特权

评论回复
12
mcuisp| | 2021-5-8 17:55 | 只看该作者
你的srec-cat点进去就是SRecord吧

使用特权

评论回复
13
一路向北lm|  楼主 | 2021-5-9 21:29 | 只看该作者
mcuisp 发表于 2021-5-8 17:55
你的srec-cat点进去就是SRecord吧

使用特权

评论回复
14
一路向北lm|  楼主 | 2021-5-9 21:43 | 只看该作者
更新一点

使用特权

评论回复
15
luckmanliang| | 2021-5-11 09:14 | 只看该作者
刚接触,学习学习

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

270

主题

3698

帖子

74

粉丝