bootloader 成长篇 ----IAP升级

1.为何再次写bootloader专题??

我以前一直以为看懂例程就能了解外设的原理,其实从初学的角度来看,例程确实能让我们了解外设的运行原理,但是却是很浅层次的。中国~有句古话,叫做“知其然,知其所以然”,不懂底层原理是很难了解一个外设的运作原理。其实就是要会去探讨其底层,直到到“汇编”,再去慢慢去理解。这就是成长篇的由来。本次bootloader原理会从“启动过程”,到“应用”,结合一系列的小细节讲起。这样融汇贯通,对以后做项目也是有很大的帮助。

1.1为什么要从启动过程讲起???

我刚学bootloader的时候,大部分教程都会解释啥叫bootloader,但是作为初学者来说,知道这个英文单词意义并不大。还有大部分视频都在解释芯片出厂boot,我觉得这对初学者是一个极大的误区,也导致对这个概念越来越模糊,有种剪不断理还乱的感觉。那么重点来了,为啥要了解启动过程,这就是最基础的部分。了解启动过程,就是在打基础。来不及解释,先上车!!!

启动过程(以STM32启动过程为例)主要分为两部分---硬件软件

STM32的硬件启动,硬件启动我们结合复位电路来分析:

我们重点观察RC电路,当我们的系统上电后,NREST此刻检测为低电平,但是由于电容充电,NRSET会为高电平。也就是当NRSET为低电平时,单片机此时处于复位状态,当电容放电后,单片机退出复位状态成运行状态。加个按键目的是手动复位,当按键按下时,NRSET为低电平处于复位状态。

系统硬件复位后执行启动代码,控制权首先转移至中断向量表中的起始地址,这通常是一段启动代码(也称为初始化代码或引导代码),这段引导代码就是我们需要研究的。

先了解启动代码的流程

1.2第一步何为SP,为啥要设置SP指针??

SP也就是堆栈指针,我们的启动文件其实说到底也是由一串代码和函数构成。就需要先分配一段栈空间,SP就是这段栈的栈顶指针。也就是,我的启动代码要运行,就需要有一段栈空间来存我的局部变量,形参等。那为啥叫栈定指针,这是由栈的数据结构所决定的。

假如需要N个临时变量 32位,4字节,那么栈顶SP-4*N,就是这个栈的大小。这里大家如果不了解,可以补一下栈的数据结构。毕竟,知识是慢慢积累的。

(补为啥栈顶指针不在0x000000000,而是在0x08000000,这是由于重映射决定的,由于我们的是从flash启动的(boot引脚决定),这里0x08000000的把内容复制到,0x000000000)

举例:

为什么不是0x00000000:有些STM32芯片支持内存重映射,即将不同内存区域映射到0x00000000地址处。例如,可以将Flash或SRAM映射到0x00000000地址,以加快启动速度或支持调试。在默认情况下,Flash存储器映射到0x08000000处,而SRAM等其他内存区域有自己的默认地址

书架和书籍:想象一个书架上有多排书,每排书有自己的编号和位置。例如,排号从1到10。默认情况下,第1排(地址0x08000000处)放置系统启动书籍(Flash),第2排(地址0x20000000处)放置数据书籍(SRAM)。内存重映射就像重新安排书籍的位置,比如将第1排的书籍移动到第0排(地址0x00000000处),以便更快地访问它们。

第二步设置PC指针

设置完SP这个时候就需要设置,PC指针,PC指针存储下一条将要执行的指令的地址。也就是我们的RESET_HANDLIE地址。我们来看看启动代码 

把PC指针指向复位中断,意思就是我第一步初始化好SP指针,下一步就是要执行复位中断。那么我们来看看中断复位都做了啥?

SYSTEMinit主要就是去配置我们的系统时钟等,然后在调用_MAIN,最后在调用MAIN函数。

以上就是我们的硬件到软件的启动过程。

  • 14
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值