其他
结合 Keil 描述如何编写ARM处理器的Bootloader
1
关于BootloaderBootloader顾名思义就是引导加载程序,是在操作系统或应用程序运行之前的一段程序,是在系统上电后执行的一段程序代码。
BootLoader是严重地依赖于硬件而实现的,特别是在嵌入式平台。因此,在嵌入式平台里建立一个通用的BootLoader几乎是不可能的。尽管如此,我们仍然可以对bootloader归纳出一些通用的概念来,以指导用户特定的BootLoader设计与实现。
---来源百度百科
Bootloader在手机、电脑、众多嵌入式系统中都存在,它的作用有很多,比如:初始化底层应用驱动、加载应用程序、更新应用程序等。
不同的设备,Bootloader可能差异很大,通常来说Bootloader比较依赖底层硬件和实际项目需求。
2
如何编写bootloaderstatic 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与底层硬件和实际需求有关,以上代码仅供参考,主要是提供思路,方便大家理解。
如果还不能理解,建议结合bootloader实际项目进行理解,比如之前给大家分享过的:STM32 + IAP + Ymodem完美结合
长按前往图中包含的公众号关注