编程技术分享平台

网站首页 > 技术教程 正文

从单片机的角度看bootloader(单片机boot1)

xnh888 2024-10-23 16:22:58 技术教程 19 ℃ 0 评论

问一个拷问灵魂的问题?单片机的程序从哪里开始?想三秒钟之后再接着往下看。有的人第一个答案是从main()函数开始。究竟这个答案是不是正确的?我们来聊聊。

我们举个例子,32位的单片机,在keil软件里面我们通常会默认或者设置的都是从0x08000000这个地方开始,这是什么?这是flash开始的地址。我们平时搭建环境、编写完程序之后编译直接下载就可以了。那这跟我将要聊到的bootloader有什么关系呢?

bootloader是一个引导程序,如果有引导程序的话,那我们的功能代码这一块就是应用app了,实际上这两块代码组合成了一个完整的单片机系统软件。为什么这么说,flash存放代码的区域其实不止一个,要是我们的flash里面存着两个app甚至是三个app的时候,单片机该从哪个地方开始,执行哪个app代码呢?这时候是不是需要一个引导程序,引导从哪个地方启动app?显然是这样的,bootloader就是这样一个作用。

最近芯片慌,一芯难求,更别说一芯一意了,从玩stm32到NXP17系列到现在的国产芯片。最近也在用GD32,我们就用GD32来举个例子说明bootloader、app和flash的爱恨情仇。

我们使用的芯片是GD32F407VE,内存情况如下

flash位置

名称

大小

0x0800 0000 - 0x0800 3FFF

bootloader

16K

0x0800 4000 - 0x0800 7FFF

保留

16K

0x0800 8000 - 0x0800 BFFF

保留

16K

0x0800 C000 - 0x0800 FFFF

校验码,升级标志位

16K

0x0801 0000 - 0x0801 FFFF

保存基础数据

64K

0x0802 0000 - 0x0803 FFFF

App1

128K

0x0804 0000 - 0x0805 FFFF

App 2

128K

0x0806 0000 - 0x0807 FFFF

App 3

128K


表中所示是整个芯片的flash地址及大小,为什么会这么分,首先要说明的一点就是,bootloader一定是要放在0x08000000这里的,因为程序开始的地址就是这个地方,为什么要把app放在后面三个呢?因为程序本身比较大,也都超过了64k,所以放在稍大一点的扇区。这样做的一个好处是,所放的程序不会占用两个扇区,多出来的小的扇区可以用来保存数据。

程序的启动,在bootloader引导程序中,我们会启用标志位,每个app对应一个标志位,如果判断成功就跳转到相应的地址去启动相应的程序。这也是我们后期需要做的在线OTA功能。

对于OTA功能,这里也做了一个规划,形式和途径可能不一样,但是原理是一样的,都是接收数据、校验、写进flash里面,然后跳转或者重启。流程大体如下:

话题一转,单片机如此,linux不也如此吗?uboot不就是一个引导程序吗?也可以应用于不同的平台,这种不同平台也还是相当于app而已,原理是一样,启动的东西不一样罢了,当然还要看兼容性。就给大家分享这么多,希望大家都有收获,欢迎交流。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表