【STM32H7教程】第67章 STM32H7的系统bootloader基础知识

完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980

第67章       STM32H7的系统bootloader基础知识

本章为大家介绍STM32H7内置的系统bootloader的基础知识。

目录

第67章       STM32H7的系统bootloader基础知识

67.1 初学者重要提示

67.2 系统bootLoader基础知识

67.2.1 系统bootLoader执行流程

67.2.2 系统bootLoader使用的引脚

67.3 进入系统bootLoader的方法

67.3.1 设置硬件boot引脚进入系统bootLoader

67.3.2 用户应用程序跳转到系统bootLoader

67.4 退出系统bootLoader的方法

67.5 系统bootLoader的擦写管理

67.6 总结


 

67.1 初学者重要提示

  1.   本章主要为大家介绍系统bootloader的理论知识,下个章节为大家实战。
  2.   更多系统bootloader的基础知识看本帖的AN2606应用笔记:http://www.armbbs.cn/forum.php?mod=viewthread&tid=96573 。

67.2 系统bootLoader基础知识

STM32的系统存储区自带bootloader,此程序是ST在芯片出厂时烧录进去的,主要用于将用户应用程序下载到芯片内部Flash。支持USB,SPI,I2C,CAN,UART等接口方式下载。如果大家的应用程序打算采用这种接口方式进行升级,可以考虑采用系统bootloader,简单易用,无需用户自己写bootLoader了。

更重要的是,使用系统BootLoader可以不依赖硬件boot引脚,可以直接从应用程序跳转到系统BootLoader,这样灵活性就很大了。

67.2.1 系统bootLoader执行流程

下面是STM32H7的BootLoader程序执行流程,简单了解下即可:

【STM32H7教程】第67章 STM32H7的系统bootloader基础知识_第1张图片

关于这个执行流程,要特别注意一点:如果在进入系统BootLoader前就插入了USB线,会导致进入系统BootLoader后优先执行USB DFU,其它的接口方式将没有机会执行。

67.2.2 系统bootLoader使用的引脚

STM32H7的Bootloader使用到的引脚分配如下:

【STM32H7教程】第67章 STM32H7的系统bootloader基础知识_第2张图片

67.3 进入系统bootLoader的方法

STM32进入系统BootLoader主要有两种方法,一种是设置boot引脚,另一种是应用程序直接跳转到系统BootLoader。

67.3.1 设置硬件boot引脚进入系统bootLoader

H7的启动方式比较更灵活,只需一个boot引脚。但是一个引脚只能区分出两个状态,为了解决这个问题,H7专门配套了两个option bytes选项字节配置,如此以来就可以方便设置各种存储器地址了。

 【STM32H7教程】第67章 STM32H7的系统bootloader基础知识_第3张图片

BOOT_ADD0和BOOT_ADD1对应32位地址到高16位,这点要特别注意。通过这两个选项字节,所有0x0000 0000到0x3FFF 0000的存储器地址都可以设置,包括:

  •   所有Flash地址空间。
  •   所有RAM地址空间,ITCM,DTCM和SRAM。

设置了选项字节后,掉电不会丢失,下次上电或者复位后,会根据BOOT引脚状态从BOOT_ADD0,或BOOT_ADD1所设置的地址进行启动。也就是说是,H7可以从0x0000 0000到0x3FFF 0000所有地址进行启动,这点与F4完全不同,F4系列是固定从0x0000 0000启动的。

STM32H7的boot引脚设计:

【STM32H7教程】第67章 STM32H7的系统bootloader基础知识_第4张图片

使用BOOT功能,注意以下几个问题:

  •   如果用户不慎,设置的地址范围不在有效的存储器地址,那么BOOT = 0时,会从Flash首地址0x0800 0000启动,BOOT = 1时,会从ITCM首地址0x0000 0000启动。
  •   如果用户使能了Flash Level 2保护,那么只能从Flash地址空间进行启动。

67.3.2 用户应用程序跳转到系统bootLoader

除了使用boot引脚控制运行系统BootLoader,也可以上电后跳转,跳转前注意以下问题:

  •   禁止所有外设时钟。
  •   禁止使用的PLL。
  •   禁止所有中断。
  •   清除所有中断挂起标志。
  •   如果使用Go命令,对于BootLoader中使用的硬件外设寄存器,跳转前是不会设置到复位值的,如果用户代码中恰好也用到这些寄存器,需要重新配置。这里要特别注意的是BootLoader会用到看门狗,并且喂狗时间设为最长了,如果用户代码里面要用到看门狗请根据需要重新配置,并且看门狗一旦开启是无法关闭的。
  •   对于具有双bank特性的STM32,为了能够从用户代码跳转到系统boot,需要将系统boot代码区使用寄存器SYSCFG重映射到0x0000 0000(除了F7和H7系列)。对于STM32F7系列,需要禁止nDBOOT / nDBANK 特性,然后跳转到系统boot区。
  •   如果用到系统bootloader的DFU/CAN接口,需要用到HSE时钟,这个时钟的频率是通过内部HSI/MSI检测出具体频率。因此,由于外部温度等各种情况,内部HSI的精度会受到影响,从而影响检测出来的HSE时钟有较大误差,最终导致DFU/CAN运行失败。

 

具体实现会在下一章节为大家讲解。

67.4 退出系统bootLoader的方法

当前主要研究了USB DFU和串口IAP退出bootLoader。

  •   USB DFU

当芯片工作在系统bootLoader的USB DFU模式,更新完毕程序后,不会自动退出USB DFU,需要重新复位芯片后才会退出。由于DFU模式会用到USB线,插拔USB线是难以避免的,所以是否支持自动退出,并不影响。

  •   串口IAP

当芯片工作在系统bootLoader的串口升级模式,更新完毕程序后,可以自动退出。所以基于串口的组网设备,使用系统bootloader非常方便。

67.5 系统bootLoader的擦写管理

注:这部分知识点有个了解即可。

  • 使用bootloader命令进行的所有写操作都只能字对齐(地址应该是4的倍数)。要写入的数据数量也必须是4的倍数(接受未对齐的半页写地址)。
    •   有些产品不支持批量擦除操作。使用BootLoader进行批量擦除时,有两种方法可用:
    •   使用扇区擦除命令一个一个删除。
  •   将保护级别设置为1,然后设置为0(使用读保护命令,然后使用读非保护命令),将导致大批量擦除操作。
  •   STM32 L1和L0系列的Bootloader除了支持操作内部Flash,内部SRAM,可选字节等,还支持操作Data Memeory(数据存储区,貌似是指的EEPROM)。数据存储区支持读写操作,而不支持擦除命令,如果要擦除,写0即可。另外对此存储区的写操作必须是4字节对齐(写地址),并且写入的数据也是4的倍数。
  •   F2, F4, F7 和 L4除了支持操作内部Flash,内部SRAM,可选字节等,还支持操作OTP存储区。仅支持读写操作,不支持擦除命令。
  •   F2, F4 和 F7系列的内部Flash写格式依赖于供电电压范围,默认的写操作只支持字节(半字,字和双字是不支持的),为了增加写操作速度,用户施加足够的电压范围以允许写操作按半字,字或双字,并通过虚拟内存位置的boot程序更新此配置。该内存位置不是物理地址,但可以根据协议使用常规的BootLoader读写操作。该存储位置包含4个字节,分别为如下表所述:

【STM32H7教程】第67章 STM32H7的系统bootloader基础知识_第5张图片

67.6 总结

本章节就为大家讲解这么多,更新相关的知识看ST的应用笔记AN2606。

 

你可能感兴趣的:(STM32H7教程)