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

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

3天内不再提示

如何编写ARM处理器的Bootloader

工程师 来源:strongerHuang 作者:strongerHuang 2020-10-27 11:02 次阅读

作者 | strongerHuang

微信公众号 | strongerHuang

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

1关于Bootloader

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

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

---来源百度百科

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

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

2如何编写bootloader

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

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

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

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

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

有很多方法可以引导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()这样的函数来完成此操作:

static void BootJump(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与底层硬件和实际需求有关,以上代码仅供参考,主要是提供思路,方便大家理解。

责任编辑:haq

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

    关注

    447

    文章

    47821

    浏览量

    409209
  • ARM
    ARM
    +关注

    关注

    134

    文章

    8653

    浏览量

    361890
  • 程序
    +关注

    关注

    114

    文章

    3631

    浏览量

    79555
  • keil
    +关注

    关注

    68

    文章

    1196

    浏览量

    165334
收藏 人收藏

    评论

    相关推荐

    ARM处理器7种工作模式

    ARM处理器是当前嵌入式领域使用最多的处理器,我们在使用中一定注意处理器的工作模式,下面对ARM处理
    发表于 12-15 10:15

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

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

    arm处理器的异常模式包括哪些

    arm处理器的异常模式包括哪些 ARM处理器的异常模式是其操作系统和应用程序中最重要的方面之一。异常就是处理器在执行指令时遇到的问题,这种问
    的头像 发表于 09-05 16:22 2310次阅读

    ARMv8-A处理器的裸机引导代码

    熟悉ARM软件开发。 它旨在帮助您编写ARMv8-A处理器的引导代码。 您可以参考本应用笔记中的引导代码示例,并为基于ARMv8-A处理器的裸机系统
    发表于 08-23 06:20

    ARM体系结构、处理器和设备开发文章

    ARM不生产处理器硬件。 相反,ARM创造的微处理器设计被授权给我们的客户,他们将这些设计集成到片上系统(SoC)设备中。 为了保证互操作性并在不同实现之间提供通用的程序员模型,
    发表于 08-21 07:28

    ARM Cortex处理器的Dhrystone基准测试应用说明

    ARM Cortex处理器Dhrrystone基准基准 -- -- 应用说明 273
    发表于 08-10 07:38

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

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

    ARM922T处理器技术参考手册

    ARM922T处理器是通用ARM9TDMI系列的一员微处理器,包括:•ARM9TDMI(核心)•ARM
    发表于 08-02 15:44

    ARM920T处理器技术参考手册

    ARM920T处理器是通用微处理器ARM9TDMI系列的成员,包括: •ARM9TDMI(核心)•ARM
    发表于 08-02 13:05

    ARM 720T处理器技术参考手册

    ARM720T是一款通用的32位微处理器,具有8KB的高速缓存、扩大的写入缓冲区和内存管理单元(MMU),组合在一个芯片中。ARM720T中的CPU是ARM7TDMI。
    发表于 08-02 11:36

    ARM926EJ-S处理器技术参考手册

    ARM926EJ-S处理器是通用微处理器ARM9系列的一员。ARM926EJ-S处理器针对多任务
    发表于 08-02 10:09

    ARM720T内部共处理器指令

    ARM720T内部共处理器指令
    发表于 08-02 06:52

    ARM处理器如何编写Bootloader

    前面给大家分享过Bootloader从应用角度执行的相关文章,今天从底层原理来给大家描述ARM处理器如何编写Bootloader,以及底层流
    的头像 发表于 07-26 09:10 565次阅读
    <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 处理器
    的头像 发表于 07-23 17:34 435次阅读
    混合信号世界中的<b class='flag-5'>ARM</b><b class='flag-5'>处理器</b>分析

    基于Arm处理器的游戏设计提问

    基于Arm® Cortex®-M0或Cortex-M3处理器在安路科技的EG4S20或PH1A60设计游戏内容 详情私 有尝
    发表于 05-22 20:59