STM32 bootloader实现

在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行。可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。在一个基于ARM core的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的BootLoader程序 。而STM32 则是在0x08000000外启动,各家稍有不同.

Bootloader是嵌入式系统在加电后执行的第一段代码,在它完成CPU和相关硬件的初始化之后,再将操作系统映像或固化的嵌入式应用程序装载到内存中然后跳转到操作系统所在的空间,启动操作系统运行.
对于嵌入式系统,Bootloader是基于特定硬件平台来实现的。因此,几乎不可能为所有的嵌入式系统建立一个通用的Bootloader,不同的处理器架构都有不同的Bootloader。Bootloader不但依赖于CPU的体系结构,而且依赖于嵌入式系统板级设备的配置。对于2块不同的嵌入式板而言,即使它们使用同一种处理器,要想让运行在一块板子上的Bootloader程序也能运行在另一块板子上,一般也都需要修改Bootloader的源程序
反过来,大部分Bootloader仍然具有很多共性,某些Bootloader也能够支持多种体系结构的嵌入式系统。例如,U-Boot就同时支持PowerPC、ARM、MIPS和X86等体系结构,支持的板子有上百种。通常,它们都能够自动从存储介质上启动,都能够引导操作系统启动,并且大部分都可以支持串口和以太网接口.

今天我要讲的是USART(通用串口)Bootloader:

在学习制作串口升级 Bootloader 之前,我们先了解一下STM32的 IAP (In Application Programming)即在应用编程,IAP是用户自己的程序在运行过程中对 User Flash 的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级.


设计这样的功能需要有两个项目代码:

Bootloader 程序: 该部分代码用于实现通过某种通信方式(如 USB,USART)接收程序或数据,执行对第二部分代码的更新,通常存储于 Flash 的起始地址(0x08000000);
App 程序: 该部分代码是产品实现业务逻辑正常运行的代码,该部分代码需要在存储的 Flash 中进行相对的地址偏移.

当芯片上电或者复位后,首先是Bootloader代码开始运行,它作如下操作:

(1) 检查是否需要对第二部分代码进行更新;
(2) 如果不需要更新则等待命令;
(3) 执行更新操作;
(4) 跳转到第二部分代码执行.

Bootloader程序实现
(1) 完成 USART 串口数据接收传输功能,并将接收到的数据绝对定位到 SRAM 的设定地址中,地址的设定根据实际情况而定,应保证设定的地址大于 Bootloader 执行需要的 RAM 的空间;
(2) 需要实现对 STM32 Flash 读写操作相关的驱动,并将绝对定位 SRAM 处的固件数据写入到 Flash 中;
(3) 完成固件数据接收和写入 Flash 后,需要对 PC 指针进行程序跳转,跳转完成后,即运行固件中的程序.

App程序实现
(1)在 main 函数最开头处设置 VTOR 寄存器,实现固件中断向量表的重定向,对于M0系列MCU没有VTOR寄存器,需要手动RAM实现中断向量表的重定向.例如:
  SCB->VTOR = FLASH_BASE | 0X10000; /*中断向量表偏移量设置*/
(2) 设置 App 程序的存储偏移地址.
(3)下面是实验的代码工程,见附件.

技术文档

类型标题档案
软件STM32F105RB boot

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论