STM32 Bluepill Bootloader与烧录相关技术疑问咨询
我是微控制器领域的新手,若有术语使用不当或遗漏信息还请见谅。目前我希望从通用层面理解STM32 Bootloader相关内容,参考对象为搭载STM32F1的Bluepill开发板。
我了解到该控制器的系统内存起始地址为0x00000000,存储着Bootloader;主闪存起始地址为0x08000000,用于存储固件。当BOOT0和BOOT1接GND时,处理器从主闪存启动;BOOT0置高时则启动Bootloader。
我认为STM32的Bootloader与电脑操作系统中的Bootloader含义不同,设备最终使用时无需依赖它,只需正确设置BOOT0和BOOT1引脚即可。
我原本理解为若要更新固件,需将控制器设置为Bootloader启动模式,再通过相关接口烧录主闪存,但按此设置并通过USB连接电脑后,无任何反应。
我已成功通过嵌入式Rust教程中的方法,将控制器设置为主闪存启动模式,连接ST-LinkV2后可通过gdb烧录固件。现存在以下技术疑问:
- 为何使用ST-LinkV2烧录时,需将控制器设置为主固件启动模式而非Bootloader模式?
- 将控制器设置为Bootloader启动模式并通过USB连接电脑后,为何无法识别到USB设备?
- 许多用户在Arduino IDE中使用Bluepill时会烧录新的Bootloader,这是否会替换原厂ST Bootloader?烧录后的USB接口功能是否与ST-Link烧录类似?
疑问解答
1. ST-LinkV2烧录无需Bootloader模式的原因
ST-LinkV2是通过SWD/JTAG调试接口直接与STM32的内置调试模块通信,完全绕开了芯片的启动模式限制——不管芯片处于主闪存启动还是Bootloader模式,只要调试接口硬件连接正常,ST-Link就能直接访问主闪存、系统内存及寄存器,不需要依赖Bootloader完成烧录操作。设置为主闪存启动模式只是常规操作,甚至不切换模式也能正常烧录,只是默认主闪存启动更符合日常使用习惯。
2. Bootloader模式下USB无反应的原因
STM32F1的原厂Bootloader不支持USB接口烧录,它仅支持UART、I2C、SPI这类接口。Bluepill板上的USB引脚直接连接到STM32的GPIO,原厂Bootloader不会初始化这个USB外设,所以设为Bootloader模式插USB后,电脑无法识别到任何设备。如果想通过USB实现Bootloader烧录,STM32F1原厂做不到,要么换带USB Bootloader的型号(如STM32F4),要么自己在主闪存中编写USB烧录程序。
3. Arduino IDE烧录Bootloader的相关问题
- 是否替换原厂ST Bootloader?不会覆盖系统内存里的原厂Bootloader,但会在主闪存写入Arduino专用Bootloader。当BOOT0接GND时,芯片会优先启动主闪存中的Arduino Bootloader,而非系统内存里的原厂版本;只有把BOOT0置高,才会回到原厂Bootloader模式。
- USB功能是否与ST-Link类似?不一样。ST-Link是调试接口,除了烧录还支持单步调试、寄存器查看等调试功能;Arduino Bootloader的USB仅提供**DFU(设备固件升级)**功能,只能用来烧录固件,没有调试能力,且该USB功能是由Arduino Bootloader初始化实现的,和原厂Bootloader无关。
内容的提问来源于stack exchange,提问作者FordPrefect

