注意+星级公共帐户,不要错过令人兴奋的内容更强大的黄微信公众号|从应用程序角度来看,我分享了与Bootloader相关的文章。
今天,我将根据基本原理描述如何为ARM处理器编写Bootloader。
1关于Bootloader BootBootloader,顾名思义,是一个引导加载程序,它是操作系统或应用程序运行之前的一部分程序,以及在系统开机后执行的一部分程序代码。
BootLoader的实现在很大程度上取决于硬件,尤其是在嵌入式平台上。
因此,几乎不可能在嵌入式平台上构建通用的BootLoader。
尽管如此,我们仍然可以总结一些引导加载程序的一般概念,以指导用户设计和实现特定的引导加载程序。
---来源百度百科引导加载程序存在于手机,计算机和许多嵌入式系统中。
它具有许多功能,例如初始化基础应用程序驱动程序,加载应用程序和更新应用程序。
不同的设备,Bootloader可能会有很大的不同,通常,Bootloader更依赖于底层硬件和实际项目要求。
2如何编写引导加载程序引导加载程序是引导加载程序代码的一部分,它更新用户的应用程序代码,您可以使用许多硬件下载通道(例如USB,网络端口)来获取新代码。
在执行引导ROM之后,将执行引导加载程序并在需要时进行更新,然后将执行最终用户应用程序。
引导加载程序和用户应用程序应作为两个独立的项目或对象编写和编译,从而产生两个独立且可执行的(bin / hex)文件。
引导加载程序的主要任务是在必要时对用户应用程序进行重新编程/替换,并跳转至用户应用程序以执行程序。
应用程序不一定需要知道引导加载程序的存在。
引导加载程序通常位于芯片闪存的基址。
下图描述了内存和Flash代码之间的映射关系:有很多方法可以引导引导加载程序进入编程模式,以将用户应用程序重新编程到Flash中,或直接跳转到现有用户应用程序来执行。
最简单的方法是检查GPIO引脚以确定是否应进入编程模式。
大多数芯片供应商为用户提供了一种方便的方式,例如ISP和IAP接口,引导加载程序将使用它们来更新闪存内容。
当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()){/ *不在特权模式下* / 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