bootloader从0到1--第一部分

谨以此文记录一下,关于bootloader从0开始的过程;

一.通俗理解Bootloader

Bootloader简单来说就是一段程序,它在整个系统上电后最先运行,其作用就是引导程序下载到主FLASH里面。它的好处就是在调试接口没有引出时,能够方便地更新或者升级mcu上的代码,试想一下,你的产品卖出去后如果想要更新程序,通用jlink通过swd口烧写肯定是不现实的,顾客也不会有烧写器,而bootloader就能通过串口或者蓝牙等实现升级。顺便说一句,你的jlink能够烧写程序也是因为jlink自带bootloader。

在没有Bootloader的情况下,代码一般从Flash的首地址开始运行,比如STM32F1的flash首地址为0x0800 0000;而当我们加入Bootloader后,整个FLASH的代码布局如图1所示:

 从图1可以看出,我们先将Bootloader烧写在FLASH首地址,然后将APP,也就是应用程序整体挪移到了后面,我们先设定挪移到0x0804 0000这个地址;那么一上电后,代码会从FLSAH的首地址(0x0800 0000)先运行Bootloader,然后我们肯定需要在Bootloader代码中让程序跳到app地址(0x0804 0000)处运行;

二.Bootloader代码(APP没有中断异常时)

当app程序中不存在中断等异常向量时,也就是说我们可以不必重新设置中断向量表的地址,这里解释一下中断向量表:当程序发生异常(中断也是一种异常)时,硬件会自动到中断向量表中寻找对应的函数,然后去跳转执行异常处理的代码,这个代码一般是0x0800 0000,也就是FLASH首地址。但如果存在Bootloader的话,这个0x0800 0000已经被Bootloader使用了,APP可能使用Bootloader的中断向量表吧,因此app存在中断等异常向量时,需要重新设置中断向量表的地址。当然这是后话了,我们今天所用的app不存在中断等异常;

首先来看Bootloader的代码:

我们先明确我们要将app代码搬移到0x0804 0000,如图2所示代码:

 从图2可以看出,我们设置了一个函数指针app,然后直接把0x0804 0000赋值给app,这样的话当执行app();时,就会直接跳到0x0804 0000地址去执行app代码,而之所以图中是0x0804 0001,是因为地址的最后1bit表示所用代码是thumb指令集(1)还是arm指令集(0);

三.app代码

app的代码就比较简单了,首先来看图3,app的启动文件:

 这里我们注释掉了向量表相关的部分,当Bootloader跳到0x0804 0000时,直接执行LDR sp的操作,再看main文件:

main文件就没什么特殊的,只是用串口进行打印操作;

最后,我们需要知道怎么将app代码烧写到0x0804 0000的地方,来看keil的设置界面,如图5和6:

当然我们也可以修改散列文件来修改加载地址,这也不是今天的讨论范围;

至此,我们就完成了第一个最简单Bootloader的编写:Bootloader和app都存在flsh中,app也在flash中就地运行;后续文章会讲解如何将app搬移到ram中运行,已经怎么重定位向量表。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值