OpenEdv-开源电子网

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

BootLoader的一点心得,记录一下

[复制链接]

17

主题

194

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1049
金钱
1049
注册时间
2016-9-3
在线时间
158 小时
发表于 2018-8-8 11:11:37 | 显示全部楼层 |阅读模式
本帖最后由 午夜狼嚎 于 2018-8-8 11:22 编辑

    在对STM32了解还不够,连FLASH和RAM都理不清的情况下,迫于需求要写BootLoader。经过奋战,现在能实现想要的效果,但还不够优化。写此贴记录一下心得,同时请大神指出我的错误理解与不足,并提出一些优化建议,谢谢!
    刚开始在网上找了一些资料和源程序,进行了一番琢磨,然后改了个雏形。
1、遇到的第一个问题就是地址问题:
    因为是模仿原子哥例程改的,例程里面有FLASH APP和SRAM APP两种,并且还有一个串口接收数据的SRAM区起始地址,刚开始对keil里面Target处地址设置比较迷。现在清楚我用的是FLASH APP,所以在IROM1处设置程序的存储的起始地址。而串口接收数据是缓存在SRAM里面,之前对FLASH不了解,以为串口接收的数据直接就存储在FLASH了,其实是缓存在SRAM里面,在程序中有个iap_write_appbin函数,就是将SRAM中缓存的数据(接收到的APP程序)写入FLASH对应地址。为了把APP写入对应的FLASH地址,需要在APP程序中设置IROM1的地址及范围,根据BootLoader及APP程序的大小来设置,并且需要在APP程序中进行中断向量偏移,就是用这个“SCB->VTOR”。
2、将地址摸清楚后,可以进行程序升级了,但是只能升级一次。也就是在BootLoader下载好后,将一个APP程序通过串口发送后可以实现功能,但是我想将另一个APP发送下去进行升级就不行。
无奈知识功底不够,只得进行各种尝试来实验了。
a、我首先对整个系统的运行进行了理解,我在BootLoader的main函数开头加了5s延时来等待,期间如果接收到新的APP,则进行升级。否则跳转至现有APP。这样一试就知道了开机后,程序还是先执行BootLoader,然后再跳转至APP的,并且这样可以实现多次升级,但是这样肯定不行的,这方法太土了。
b、《原子教你玩STM32》的IAP那章有一句话:“main函数执行过程中,如果CPU得到一个中断请求,PC指针仍强制跳转到地址0x08000004中断向量表处,而不是新程序的中断向量表”。我的理解就是在APP执行过程中,如果串口接收到新数据,就会自动跳转至BootLoader的中断向量表查询中断,然后自然就进入了串口接收中断,接着就和第一个APP操作一样把新的APP写进去了。
    我用在线调试时,发现在发送第二个APP时并没有进入中断。然后抓了好久的头皮才有点头绪,既然当前正在执行APP程序,我是不是在APP里开启串口及中断,才会有相应的响应,于是我就这么尝试了,然后就OK了,所以刚开始是对那句话理解不够,对整个系统的运行理解也不够,任重道远!

现在不需要按键什么的,只要串口就可以实现升级了,想怎么生怎么生

文字功底不怎样,只能写成这样了!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

194

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1049
金钱
1049
注册时间
2016-9-3
在线时间
158 小时
 楼主| 发表于 2019-7-30 14:11:29 | 显示全部楼层
这是BootLoader程序和测试APP
BootLoader.zip (11.65 MB, 下载次数: 922)
回复 支持 反对

使用道具 举报

17

主题

194

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1049
金钱
1049
注册时间
2016-9-3
在线时间
158 小时
 楼主| 发表于 2019-7-30 14:23:59 | 显示全部楼层
这个是不需要按键检测实现程序升级,是通过串口接收到几个字节来判断
BootLoader.zip (14.75 MB, 下载次数: 1234)
回复 支持 1 反对 0

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2013-3-14
在线时间
29 小时
发表于 2020-7-14 10:23:41 | 显示全部楼层
做过各种各样的bootloader,spi uart iic ,sd卡 ,can升级的,什么双bootloader相互升级的,总结起来就是:flash驱动,通信接口,向量表,链接文件搞定什么方式都能升级啊
回复 支持 1 反对 0

使用道具 举报

35

主题

560

帖子

2

精华

资深版主

Rank: 8Rank: 8

积分
17666
金钱
17666
注册时间
2018-3-3
在线时间
523 小时
发表于 2018-8-8 11:36:56 | 显示全部楼层
你只在app1里开启了串口和中断就行了吗?不用写串口的服务函数?那这样在app1中升级app2是用 bootloder的中断服务函数升级的?
/*
*
*
*
*
*
*/
回复 支持 反对

使用道具 举报

17

主题

194

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1049
金钱
1049
注册时间
2016-9-3
在线时间
158 小时
 楼主| 发表于 2018-8-8 11:46:49 | 显示全部楼层
Psheng 发表于 2018-8-8 11:36
你只在app1里开启了串口和中断就行了吗?不用写串口的服务函数?那这样在app1中升级app2是用 bootloder的中 ...

对,当中断来了是跳转到BootLoader里面的串口中断服务函数,我现在还不知道为什么,但事实就是这样,我还在找资料进一步学习。我现在加入了软件复位,感觉已经比较满意了,APP下载后立马运行,不需要别的操作。现在就是对串口这块儿还不太满意,想实现开发板那样,直接下载任何程序就能运行,不需要在APP中设置串口。
回复 支持 反对

使用道具 举报

20

主题

227

帖子

0

精华

高级会员

Rank: 4

积分
605
金钱
605
注册时间
2017-7-14
在线时间
116 小时
发表于 2018-8-8 11:48:28 | 显示全部楼层
原子是你最好的老师啊
回复 支持 反对

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7369
金钱
7369
注册时间
2016-11-30
在线时间
632 小时
发表于 2018-8-8 12:58:24 | 显示全部楼层
午夜狼嚎 发表于 2018-8-8 11:46
对,当中断来了是跳转到BootLoader里面的串口中断服务函数,我现在还不知道为什么,但事实就是这样,我还 ...

那这个串口只能用来升级程序了,不能干别的了?
回复 支持 反对

使用道具 举报

17

主题

194

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1049
金钱
1049
注册时间
2016-9-3
在线时间
158 小时
 楼主| 发表于 2018-8-8 13:31:10 | 显示全部楼层
SimpleLife 发表于 2018-8-8 11:48
原子是你最好的老师啊

确实
回复 支持 反对

使用道具 举报

17

主题

194

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1049
金钱
1049
注册时间
2016-9-3
在线时间
158 小时
 楼主| 发表于 2018-8-8 13:32:13 | 显示全部楼层
lvkanger 发表于 2018-8-8 12:58
那这个串口只能用来升级程序了,不能干别的了?

目前是这样
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2019-5-29
在线时间
7 小时
发表于 2019-6-29 00:52:02 | 显示全部楼层
我写了boot。在c8t6下能成功下载和校验成功,为什么到rct6里校验就不成功了,64K的Flash和256k的Flash读写,bootload有什么区别吗
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-7-30
在线时间
2 小时
发表于 2019-7-30 13:39:04 | 显示全部楼层
bootloader程序可以分享吗?qq邮箱404353332@qq.com。谢啦
回复 支持 反对

使用道具 举报

17

主题

194

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1049
金钱
1049
注册时间
2016-9-3
在线时间
158 小时
 楼主| 发表于 2019-7-30 14:10:21 | 显示全部楼层
WJH1997 发表于 2019-7-30 13:39
bootloader程序可以分享吗?qq邮箱。谢啦

看楼下  我直接上传在此贴吧
回复 支持 反对

使用道具 举报

17

主题

194

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1049
金钱
1049
注册时间
2016-9-3
在线时间
158 小时
 楼主| 发表于 2019-7-30 14:14:10 | 显示全部楼层
song00 发表于 2019-6-29 00:52
我写了boot。在c8t6下能成功下载和校验成功,为什么到rct6里校验就不成功了,64K的Flash和256k的Flash读写 ...

只要地址不溢出,向量偏移没问题,FLASH大小不影响吧
回复 支持 反对

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6549
金钱
6549
注册时间
2015-8-25
在线时间
1024 小时
发表于 2019-12-24 15:40:09 | 显示全部楼层
song00 发表于 2019-6-29 00:52
我写了boot。在c8t6下能成功下载和校验成功,为什么到rct6里校验就不成功了,64K的Flash和256k的Flash读写 ...

c8t6属于中容量MCU,扇区大小1k
rct6属于大容量MCU,扇区大小2k
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2020-5-7
在线时间
12 小时
发表于 2020-7-14 09:40:40 | 显示全部楼层
我想请教一下啊 BootLoader1 中串口检测的几个代码,那几个代码 没检测到,在问一下是用串口么
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2019-2-15
在线时间
1 小时
发表于 2021-4-15 11:51:37 | 显示全部楼层
学习一下谢谢
回复 支持 反对

使用道具 举报

4

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2016-10-27
在线时间
47 小时
发表于 2021-8-20 10:28:53 | 显示全部楼层
谢谢楼主分享,谢谢!
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2020-6-14
在线时间
7 小时
发表于 2022-2-16 09:34:58 | 显示全部楼层
谢谢楼主分享
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 15:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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