电子产业一站式赋能平台

PCB联盟网

搜索
查看: 47|回复: 0
收起左侧

ARM处理器Bootloader底层流程

[复制链接]

334

主题

334

帖子

3289

积分

四级会员

Rank: 4

积分
3289
发表于 2024-6-27 11:45:00 | 显示全部楼层 |阅读模式
6 T9 ]) @, l4 w( T
关注+星标公众,不错过精彩内容0 E' S; u' i1 o5 \6 n

fpctscn3mu564063126332.jpg

fpctscn3mu564063126332.jpg

, c0 y, v$ N1 M, M作者 | strongerHuang% b3 q- ]( s/ h
微信公众号 | strongerHuang
9 Q4 C" A% b- @9 P" J. y前面给大家分享过Bootloader从应用角度执行的相关文章,今天从底层原理来给大家描述ARM处理器如何编写Bootloader,以及底层流程。6 l+ [! h/ c- l6 k0 q! b
关于Bootloader
# J: `7 P& L6 p) D- ^6 y/ g( yBootloader顾名思义就是引导加载程序,是在操作系统或应用程序运行之前的一段程序,是在系统上电后执行的一段程序代码。1 Y1 g" y( Z% F2 M3 `" C
BootLoader是严重地依赖于硬件而实现的,特别是在嵌入式平台。因此,在嵌入式平台里建立一个通用的BootLoader几乎是不可能的。尽管如此,我们仍然可以对bootloader归纳出一些通用的概念来,以指导用户特定的BootLoader设计与实现。---来源百度百科+ Y9 l1 T; D, H5 l6 Q& f
Bootloader在手机、电脑、众多嵌入式系统中都存在,它的作用有很多,比如:初始化底层应用驱动、加载应用程序、更新应用程序等。: [6 N3 _+ [# I- z9 y
不同的设备,Bootloader可能差异很大,通常来说Bootloader比较依赖底层硬件和实际项目需求。
5 h: v* p7 V4 g# r$ j9 {如何编写bootloader) p( A$ R/ r9 o1 D
bootloader是一段引导加载程序代码,它更新用户的应用程序代码,可以使用很多硬件下载通道(例如USB、网络端口)获得新代码。/ \/ z: I, T+ b" e0 n& M  ~
在执行引导ROM之后,将执行bootloader程序,并在需要时进行更新,然后执行最终用户应用程序。9 N  D0 p8 m* ^1 H* l* p6 ]
引导加载程序和用户应用程序应作为两个独立的Project或Object进行编写和编译,从而产生两个独立且可执行的(bin/hex)文件。
/ G3 X# j( ?, r+ o2 J* j' t& P% ~: Y引导加载程序的主要任务是在必要时对用户应用程序进行重新编程/替换,并跳转至用户应用程序以执行该程序,应用程序不一定需要知道引导加载程序的存在。7 G$ z+ D' V8 s. ^
引导加载程序通常位于芯片闪存基址,下面通过一张图来描述内存和Flash代码映射关系:3 v8 S& J( P( o* C9 @; h

cffp4lgubxs64063126432.png

cffp4lgubxs64063126432.png
0 P: P3 y, B5 _, x& t7 n
有很多方法可以引导bootloader进入编程模式,以将用户应用程序重新编程到Flash中,或者直接跳转到现有的用户应用程序来执行。最简单的方法是检查GPIO引脚以确定是否应进入编程模式。
, w: h5 s0 p5 n5 r/ ^& v) W0 m大多数芯片供应商为用户提供了一种方便的方式,例如 ISP 和 IAP 接口,bootloader将使用它们来更新闪存内容。
4 _3 w6 Y9 |( K& x# {. M! t8 `2 g当Flash内容已更新或已经是最新时,引导加载程序将跳转到用户应用程序。在执行用户应用程序之前,这需要许多步骤:1.确保CPU处于特权模式。- L  ?% q- {, V: U  n6 [
2.禁用NVIC中所有启用的中断。2 X2 X% g  N, d" g7 B! s; }
3.禁用所有可能产生中断请求的使能外设,并清除这些外设中的所有未使用中断标志。
6 }4 T5 _- M$ A. c/ P4.清除NVIC中所有未使用的中断请求。  W5 Q0 M+ L; W: l0 h8 j
5.禁用SysTick并清除其异常挂起位。
' B( P1 P# X2 T0 K! M& S6.如果引导加载程序使用了单个故障处理程序,请禁用它们。
. U; T7 K0 |6 t. L  r3 m- g. F7.如果发现内核当前与PSP一起运行,则激活MSP(由于编译器可能仍在使用堆栈,因此在此之前需要将PSP复制到MSP)。; Q& u, M! ?2 X  Z* b+ [
8.将用户应用程序的向量表地址加载到SCB-> VTOR寄存器中。确保地址符合对齐要求。
! {9 L/ o/ V& Z- ]+ I: r8 X9 R9.最后一部分是将MSP设置为用户应用程序向量表中找到的值,然后将用户应用程序的重置向量值加载到PC中,也就是跳转功能。
( `5 D* M5 r; N比如通过调用下面的示例BootJump()这样的函数来完成此操作:
  • static void BootJump(uint32_t *Address){  //1.确保CPU处于特权模式。  if( CONTROL_nPRIV_Msk & __get_CONTROL())  {  /* not in privileged mode */    EnablePrivilegedMode() ;  }
    7 u3 r" T6 x7 b4 @7 {  //2.禁用NVIC中所有启用的中断。  Disable_All_Peripherals();
    8 o5 i1 b0 G3 a; |" U) n% k4 ?4 \  //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;
    ) L3 p+ h- F# L0 a  //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;! n5 U! t2 h# _/ t0 b: i; _
      //5.禁用SysTick并清除其异常挂起位。  SysTick->CTRL = 0;  SCB->ICSR |= SCB_ICSR_PENDSTCLR_Msk;8 E$ H; W/ L4 c5 s
      //6.如果引导加载程序使用了单个故障处理程序,请禁用它们。  SCB->SHCSR &= ~( SCB_SHCSR_USGFAULTENA_Msk | \                  SCB_SHCSR_BUSFAULTENA_Msk | \                  SCB_SHCSR_MEMFAULTENA_Msk ) ;0 F- m& f5 @- K- {1 t
      //7.如果发现内核当前与PSP一起运行,则激活MSP  if( CONTROL_SPSEL_Msk & __get_CONTROL())  {  /* MSP is not active */    __set_MSP( __get_PSP()) ;    __set_CONTROL( __get_CONTROL() & ~CONTROL_SPSEL_Msk);  }
    ( I& J8 g7 B5 e$ o. H  i5 Q  //8.将用户应用程序的向量表地址加载到SCB-> VTOR寄存器中。  SCB->VTOR = ( uint32_t )Address ;: O# U: e8 c+ y; J
      //9.跳转  BootJumpASM( Address[ 0 ], Address[ 1 ]);}! U, E6 m  I8 p2 L' i
    再次说明bootloader与底层硬件和实际需求有关,以上代码仅供参考,主要是提供思路,方便大家理解。
    , R6 B, c6 q8 W2 ^6 W% E如果还不能理解,建议结合bootloader实际项目进行理解,比如之前给大家分享过的:STM32官方IAP例程详细说明% ]( Z! ?7 L* N: ^
    ------------ END ------------+ U# l! R. G0 k6 w7 f

    30ru2drxdbd64063126532.gif

    30ru2drxdbd64063126532.gif

    ) C" r0 O; V1 C  d1 E●专栏《嵌入式工具●专栏《嵌入式开发》●专栏《Keil教程》●嵌入式专栏精选教程
    ' ~1 G! B1 q9 T0 e" l, o3 c! H关注公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。* j5 [" A8 \- I& s. ?5 ?( b
    , y" R; W4 [( l& t2 u" Q3 Z

    v2xzsevwtxn64063126632.png

    v2xzsevwtxn64063126632.png
    1 ]0 y2 |* Z- {# |  P. a1 W
    点击“阅读原文”查看更多分享。
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表