
前段时间研究了一下STM32内部的BootLoader ,也就是STM32内嵌的一段程序,搞明白原理后,使用Qt编写的一个测试小工具,展示效果如下:https://mp.weixin.qq.com/s/8dXPqM0e7_VJXrFh2PdWGQ 可能你还不知道:STM32中内嵌了一段自举程序,可能很多人不知道。那段自举程序存放在System memory(系统存储器)中,我们通过配置启动,选择启动系统存储器就可以运行这段程序。 STM32有三种启动模式:01.Main Flash memory:主FLASH 02.System memory:系统存储器 03.Embedded SRAM:内置SRAM 三种模式是通过不同配置来实现,一般通过BOOT引脚和BOOT位来配置启动模式。不同的芯片配置有差异,有些芯片没有BOOT1引脚,会结合BOOT位来实现。 内嵌的自举程序 STM32内嵌的自举程序存放在系统存储区,由ST在生产线上写入,用户不能修改。我们选择System memory(系统存储器)启动模式,就会进入系统存储区执行自举程序,内嵌的自举程序主要用于通过串行、IIC、SPI、USB、CAN等接口与外部通讯。不同型号MCU支持的串行接口不一样,具体请参看应用笔记 AN2606。 自举程序中UART协议 通信就会牵涉到协议,这里也说一下自举程序中 USART 协议。 USART 自举程序命令集:(具体参考官方文档AN3155) ![]() 4.介绍几个简单的命令流程 4.1 Get 命令 用户通过 Get 命令可获取自举程序的版本及支持的命令。自举程序接收到 Get 命令后,会将自举程序版本和支持命令的代码发送给主机。 ![]() 具体如下: ![]() 4.2Get Version & Read Protection Status 命令GetVersion & Read Protection Status 命令用于获取自举程序版本及读保护状态。自举程序接收到此命令后,会将如下信息(版本、使能和禁止读保护的次数)发送给主机。 ![]() 具体如下: ![]() 4.3Get ID 命令Get ID命令用于获取芯片 ID(标识)的版本。自举程序接收到此命令后,会将产品 ID 发送给主机。 ![]() 具体如下: ![]() 4.4 Read Memory 命令ReadMemory 命令用于从RAM、 Flash 和信息块(系统存储器或选项字节区域)中的任何有效存储器地址(参见注释)读取数据。(读的前提是Flash没有加读保护操作) ![]() 具体如下:(读取flash 0x 08000000 开始的16个字节的数据) ![]() 4.5 Go 命令Go 命令用于从应用程序指定的地址开始执行已下载的代码或其它任何代码。自举程序接收到 Go 命令后,会将 ACK 字节发送到应用程序。发送 ACK 字节后,自举程序会等待一个地址(4 个字节,字节 1 表示地址 MSB,字节 4 表示 LSB)和一个校验和字节,然后检查接收到的地址。如果接收到的地址有效且校验和正确,则自举程序将发送一个ACK字节,否则将发送一个 NACK 字节并中止此命令。 ![]() 具体如下:使用go 跳转到 flash地址处执行(0x08000000),此时LED已经闪烁 ![]() 命令太多,其它的就不再介绍了! 5.自举程序上位机(自己使用Qt编写的,主要用于测试)01. 在自举模式下可以简单实现对内部flash的数据的读出(flash不加锁)02. 在自举模式下可以简单实现对内部sram的数据的读出(flash不加锁)03.可以生成对应的.hex文件,使用Qt自己设计算法实现。04.下载部分暂且没有做。 ![]() ![]() 读取Hex文件 和拼Hex文件代码开源给大家
|
是不是相当于可以不用写BootLoader代码直接更新了 |
其实就是ISP功能,利用串口下载程序 |
好样的,,一直知道有多种下载方式,但是没有想到要去研究一下它的bl.. |