STM32的BootLoader 从SD卡更新固件

本文详细介绍了如何为STM32 Cortex-M3单片机编写BootLoader,实现从SD卡更新固件。内容涵盖BootLoader的基本概念、中断向量表、栈指针、复位向量、Flash操作及文件系统的使用。通过理解M3内核启动过程,设置栈指针和重定位中断向量表,实现从SD卡读取bin文件并写入Flash,最后跳转到新程序执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

预备知识 我们这里是为ARM的Cortex-M3单片机写的BootLoader,需要了解一下M3内核的架构,并且要了解M3单片机是怎么启动的等等。这个方面的知识,可以参考《Cortex-M3权威指南》,这里的话我只是为了实现BootLoader简单介绍一下,大家有什么不清楚的请参考权威指南。并且这里是以STM32为例说明问题的,使用的开发环境是RVMDK(Keil)。
  这里参考的是《Cortex-M3权威指南》的3.8节,复位序列。
  M3单片机复位后,从0x00000000取栈指针(SP), 从0x00000004取复位向量(PC),有了栈指针和复位向量后,单片机就按照正常流程运行了,在BootLoader里面,我们更新完程序后需要做的步骤之一就是设置栈指针,跳转到复位向量。
  栈是一种数据结构,后进先出LIFO。借用百度百科的解释:栈由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。它使用的是一级缓存,他们通常都是被调用时处于存储空间中,调用完毕立即释放。
  复位向量是一个函数地址,在Cortex M3单片机里是复位函数的地址。也就是单片机启动后第一个执行的函数。
  这里参考《Cortex-M3权威指南》的7.3节,向量表。
  BootLoader是一个完整的程序,下载的新程序(以下称为App)也是一个完整的程序。都包含中断向量表,所以的话,我们是有两个中断向量表,相信因为有两个向量表,大家都知道我们应该需要对这两个向量表做点什么吧。
  的中断向量表 我们只看前16个向量,因为其余的向量属于外设使用,与Cortex M3内核无关。
  __Vectors DCD __initial_spTop ; Top of Stack
  DCD Reset_Handler ; Reset Handler
  DCD NMI_Handler ; NMI Handler
  DCD HardFault_Handler ; Hard Fault Handler
  DCD MemManage_Handler ; MPU Fault Handler
  DCD BusFault_Handler ; Bus Fault Handler
  DCD UsageFault_Handler ; Usage Fault Handler
  DCD 0 ; Reserved
  DCD 0 ; Reserved
  DCD 0 ; Reserved
  DCD 0 ; Reserved
  DCD SVC_Handler ; SVCall Handler
  DCD DebugMon_Handler ; Debug Monitor Handler
  DCD 0 ; Reserved
  DCD PendSV_Handler ; PendSV Handler
  DCD SysTick_Handler ; SysTick Handler
  __initial_spTop就是栈指针,Reset_Handler是复位向量。这里只显示了16个向量,CortexM3单片机的话总共有256个向量,也就是从栈指针的地址开始有1KB的区域属于中断向量表。
  单片机启动默认先运行BootLoader,所以默认的中断向量表位置是BootLoader的中断向量表。为了App可以正常运行,下载完App后,我们还需要把中断向量表重新定位到App程序那里。根据《Cortex M3权威指南》,介绍一下怎样重定位中断向量表。
  Cortex-M3单片机有一个管理中断向量表的寄存器,叫做向量表偏移量寄存器(VTOR)(地址:0xE000_ED08)。具体可以看看截图:
   pic
  STM332程序的起始地址一般在0x08000000。所以BootLoader程序是在0x08000000,不是在0x00000000是因为STM32的重映射技术(不符合Cortex-M3的设计,有点搞另类的感觉)。所以BootLoader的中断向量表在0x08000000那里。如果我们的App程序起始地址在0x08070000,并且App的中断向量表在起始地址,那么BootLoader程序下载App后,为了App程序能正确运行,开始App程序的运行后第一步,就要把中断向量表重定位到0x08070000那里。
  具体实现下面会再介绍,接下来介绍分散加载文件相关内容。
  这一节涉及的内容主要属于分散加载文件,大家具体上网了解,这里只是介绍了能够实现BootLoader的一小部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值