0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ARM处理器如何编写Bootloader

strongerHuang 来源:strongerHuang 2023-07-26 09:10 次阅读

前面给大家分享过Bootloader从应用角度执行的相关文章,今天从底层原理来给大家描述ARM处理器如何编写Bootloader,以及底层流程。

关于Bootloader

Bootloader顾名思义就是引导加载程序,是在操作系统或应用程序运行之前的一段程序,是在系统上电后执行的一段程序代码

BootLoader是严重地依赖于硬件而实现的,特别是在嵌入式平台。因此,在嵌入式平台里建立一个通用的BootLoader几乎是不可能的。尽管如此,我们仍然可以对bootloader归纳出一些通用的概念来,以指导用户特定的BootLoader设计与实现。

---来源百度百科

Bootloader在手机电脑、众多嵌入式系统中都存在,它的作用有很多,比如:初始化底层应用驱动、加载应用程序、更新应用程序等。

不同的设备,Bootloader可能差异很大,通常来说Bootloader比较依赖底层硬件和实际项目需求。

如何编写bootloader

bootloader是一段引导加载程序代码,它更新用户的应用程序代码,可以使用很多硬件下载通道(例如USB网络端口)获得新代码。

在执行引导ROM之后,将执行bootloader程序,并在需要时进行更新,然后执行最终用户应用程序。

引导加载程序和用户应用程序应作为两个独立的Project或Object进行编写和编译,从而产生两个独立且可执行的(bin/hex)文件。

引导加载程序的主要任务是在必要时对用户应用程序进行重新编程/替换,并跳转至用户应用程序以执行该程序,应用程序不一定需要知道引导加载程序的存在。

引导加载程序通常位于芯片闪存基址,下面通过一张图来描述内存和Flash代码映射关系:

wKgaomTAcreAShl8AAC9qrwfuIw063.png

有很多方法可以引导bootloader进入编程模式,以将用户应用程序重新编程到Flash中,或者直接跳转到现有的用户应用程序来执行。最简单的方法是检查GPIO引脚以确定是否应进入编程模式。

大多数芯片供应商为用户提供了一种方便的方式,例如 ISP 和 IAP 接口,bootloader将使用它们来更新闪存内容。

当Flash内容已更新或已经是最新时,引导加载程序将跳转到用户应用程序。在执行用户应用程序之前,这需要许多步骤:

1.确保CPU处于特权模式。

2.禁用NVIC中所有启用的中断。

3.禁用所有可能产生中断请求的使能外设,并清除这些外设中的所有未使用中断标志。

4.清除NVIC中所有未使用的中断请求。

5.禁用SysTick并清除其异常挂起位。

6.如果引导加载程序使用了单个故障处理程序,请禁用它们。

7.如果发现内核当前与PSP一起运行,则激活MSP(由于编译器可能仍在使用堆栈,因此在此之前需要将PSP复制到MSP)。

8.将用户应用程序的向量表地址加载到SCB-> VTOR寄存器中。确保地址符合对齐要求。

9.最后一部分是将MSP设置为用户应用程序向量表中找到的值,然后将用户应用程序的重置向量值加载到PC中,也就是跳转功能。

比如通过调用下面的示例BootJump()这样的函数来完成此操作:

staticvoidBootJump(uint32_t*Address)
{
  //1.确保CPU处于特权模式。
if(CONTROL_nPRIV_Msk&__get_CONTROL())
  {  /* not in privileged mode */
EnablePrivilegedMode();
  }


  //2.禁用NVIC中所有启用的中断。
  Disable_All_Peripherals();


  //3.禁用所有可能产生中断请求的使能外设,并清除这些外设中的所有未使用中断标志。
  NVIC->ICER[ 0 ] = 0xFFFFFFFF;
  NVIC->ICER[ 1 ] = 0xFFFFFFFF;
  NVIC->ICER[ 2 ] = 0xFFFFFFFF;
  NVIC->ICER[ 3 ] = 0xFFFFFFFF;
  NVIC->ICER[ 4 ] = 0xFFFFFFFF;
  NVIC->ICER[ 5 ] = 0xFFFFFFFF;
  NVIC->ICER[ 6 ] = 0xFFFFFFFF;
  NVIC->ICER[ 7 ] = 0xFFFFFFFF;


  //4.清除NVIC中所有未使用的中断请求。
  NVIC->ICPR[ 0 ] = 0xFFFFFFFF;
  NVIC->ICPR[ 1 ] = 0xFFFFFFFF;
  NVIC->ICPR[ 2 ] = 0xFFFFFFFF;
  NVIC->ICPR[ 3 ] = 0xFFFFFFFF;
  NVIC->ICPR[ 4 ] = 0xFFFFFFFF;
  NVIC->ICPR[ 5 ] = 0xFFFFFFFF;
  NVIC->ICPR[ 6 ] = 0xFFFFFFFF;
  NVIC->ICPR[ 7 ] = 0xFFFFFFFF;


  //5.禁用SysTick并清除其异常挂起位。
  SysTick->CTRL = 0;
  SCB->ICSR |= SCB_ICSR_PENDSTCLR_Msk;


  //6.如果引导加载程序使用了单个故障处理程序,请禁用它们。
  SCB->SHCSR &= ~( SCB_SHCSR_USGFAULTENA_Msk |  
                 SCB_SHCSR_BUSFAULTENA_Msk |  
                 SCB_SHCSR_MEMFAULTENA_Msk ) ;


  //7.如果发现内核当前与PSP一起运行,则激活MSP
if(CONTROL_SPSEL_Msk&__get_CONTROL())
  {  /* MSP is not active */
__set_MSP(__get_PSP());
__set_CONTROL(__get_CONTROL()&~CONTROL_SPSEL_Msk);
  }


  //8.将用户应用程序的向量表地址加载到SCB-> VTOR寄存器中。
  SCB->VTOR = ( uint32_t )Address ;


  //9.跳转
BootJumpASM(Address[0],Address[1]);
}
再次说明bootloader与底层硬件和实际需求有关,以上代码仅供参考,主要是提供思路,方便大家理解。

如果还不能理解,建议结合bootloader实际项目进行理解,比如之前给大家分享过的:STM32官方IAP例程详细说明
审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    19286

    浏览量

    229875
  • ARM
    ARM
    +关注

    关注

    134

    文章

    9097

    浏览量

    367614
  • 嵌入式系统
    +关注

    关注

    41

    文章

    3593

    浏览量

    129484
  • bootloader
    +关注

    关注

    2

    文章

    235

    浏览量

    45630

原文标题:ARM处理器Bootloader底层流程

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    ARM处理器简介及RISC设计要点

    ARM是一个32位RISC(精简指令集)处理器架构,ARM处理器则是ARM架构下的微处理器
    的头像 发表于 04-01 08:17 9276次阅读
    <b class='flag-5'>ARM</b><b class='flag-5'>处理器</b>简介及RISC设计要点

    ARM处理器ARM处理器工作模式

    ARM处理器状态ARM处理器的工作状态一般有两种,并可在两种状态之间切换:第一种为ARM状态,此时处理
    发表于 01-27 11:13

    ARM处理器ARM处理器工作模式

    ARM处理器状态ARM处理器的工作状态一般有两种,并可在两种状态之间切换:第一种为ARM状态,此时处理
    发表于 01-27 14:19

    什么是ARM处理器 ARM处理器有哪些系列

    ARM 处理器是一种低功耗高性能的 32 位 RISC(精简指令系统)处理器。从结构 入手对其进行分析,并针对目前流行的 ARM920T 核详细描述其硬件结构和编程。
    发表于 09-24 17:47

    Motorola微处理器bootloader分析与应用

    以Motorola 32位处理器ColdFire5307 为例,分析、介绍Motorola公司用于嵌入式系统开发的dBUG通用bootloader 软件的结构、运行原理及应用。
    发表于 04-15 10:26 18次下载

    Motorola微处理器bootloader分析与应用

    引 言??bootloader是用来完成系统启动和系统软件加载工作的程序。它是底层硬件和上层应用软件之间的一个中间件软件,完成处理器和周边电路正常运行所要的初始化工
    发表于 03-11 12:39 1091次阅读
    Motorola微<b class='flag-5'>处理器</b>的<b class='flag-5'>bootloader</b>分析与应用

    ARM的位置无关程序设计在Bootloader中的应用

    ARM的位置无关程序设计在Bootloader中的应用 ARM处理器支持位置无关的程序设计,这种程序加载到存储的任意地址空间都可以正常运
    发表于 03-29 15:12 1253次阅读

    ARM,ARM处理器是什么意思

    ARM,ARM处理器是什么意思 ARM处理器简介 ARM(Advanced RISC Mach
    发表于 03-26 10:53 5278次阅读

    ARMBootloader启动流程研究

    讲述了基于ARM 处理器的嵌入式系统在上电启动后应用程序或操作系统运行前,对处理器及其内部功能模块进行初始化的过程,并结合经过实际验证的代码详细的分析了S3C44B0 Bootloader
    发表于 02-03 14:48 70次下载
    <b class='flag-5'>ARM</b>的<b class='flag-5'>Bootloader</b>启动流程研究

    arm是什么处理器arm处理器汇总

    ARM处理器是Acorn计算机有限公司面向低预算市场设计的第一款RISC微处理器。更早称作Acorn RISC Machine。ARM处理器
    发表于 11-10 16:32 3163次阅读

    arm的协处理器有几个?ARM处理器详解

    本文首先介绍了ARM处理器特点与主要模式,其次介绍了arm的协处理器有几个,最后介绍了CP14和CP15系统控制协处理器
    发表于 04-24 15:34 8974次阅读

    如何编写ARM处理器Bootloader

    作者 | strongerHuang 微信公众号 | strongerHuang 之前从应用的角度给大家分享过Bootloader相关的文章,今天从底层原理来给大家描述ARM处理器如何编写
    的头像 发表于 10-27 11:02 4173次阅读
    如何<b class='flag-5'>编写</b><b class='flag-5'>ARM</b><b class='flag-5'>处理器</b>的<b class='flag-5'>Bootloader</b>

    结合 Keil 描述如何编写ARM处理器Bootloader

    Bootloader顾名思义就是引导加载程序,是在操作系统或应用程序运行之前的一段程序,是在系统上电后执行的一段程序代码。
    发表于 02-08 15:43 5次下载
    结合 Keil 描述如何<b class='flag-5'>编写</b><b class='flag-5'>ARM</b><b class='flag-5'>处理器</b>的<b class='flag-5'>Bootloader</b>

    ARM处理器如何编写Bootloader呢?其底层流程是怎样的呢?

    Bootloader顾名思义就是引导加载程序,是在操作系统或应用程序运行之前的一段程序,是在系统上电后执行的一段程序代码。
    发表于 08-08 10:28 702次阅读
    <b class='flag-5'>ARM</b><b class='flag-5'>处理器</b>如何<b class='flag-5'>编写</b><b class='flag-5'>Bootloader</b>呢?其底层流程是怎样的呢?

    arm处理器有哪些中断源?arm处理器对异常中断的响应过程

    arm处理器有哪些中断源?arm处理器对异常中断的响应过程  ARM处理器是一种广泛使用的嵌入式
    的头像 发表于 10-19 16:35 1459次阅读