我有固件升级的要求.我打算使用USB DFU类.但在我的情况下,固件升级命令将来自PC应用程序.所以我需要切换到系统内存中的bootloader.最初我正在运行应用程序,因此它从用户闪存启动,即我为用户闪存配置了Boot0和Boot 1引脚.由于DFU引导加载程序存在于系统闪存中,现在需要更改Boot0和Boot1引脚设置.有没有像启动0和启动1设置保持用户闪存相同的方式,在应用程序中我们跳转到系统内存?
解决方法
Boot0 / 1引脚仅在处理器启动时被采样,以检查它是否应从内存加载用户代码或是否应加载引导加载程序.
之后这些引脚的状态对引导加载程序没有影响.
之后这些引脚的状态对引导加载程序没有影响.
我一直面临类似的请求,并找到了2种按需加载引导加载程序的方法.
首先,您可以从用户代码到引导加载程序“JUMP”.例如,您可以在按下按钮时跳转到引导加载程序.
但是……这比简单的JUMP指令复杂得多:一些寄存器和设备必须正确配置才能与引导程序一起工作,你必须确保在JUMP期间不会触发IRQ,…实际上,你必须重新配置处理器,就像它在重置后刚启动一样.
您可以找到有关此技术的一些信息:on this video from ST.
我设法在STM32F1xx项目上做了这样的事情.
然而,在基于STM32F4的更复杂的项目中,这将变得非常困难……我将不得不停止所有设备(定时器,通信接口,ADC,DAC ……),确保不会触发IRQ,重新配置所有时钟,……
相反,我决定实现第二个解决方案:当我想跳转到引导加载程序时,我在其中一个备份寄存器中写入一个字节,然后发出软复位.然后,当处理器重新启动时,在程序的最开始,它将读取该寄存器.该寄存器包含指示应在引导加载程序模式下重新引导的值.然后,跳转到引导加载程序要容易得多,如the youtube video所示.