STM32芯⽚的DFU编程及相关话题
相当部分的芯⽚都带USB模块,有时我们会考虑利⽤STM32芯⽚的USB模块进⾏程序代码的下载或升级。USB协议中有专门针对设备固件升级的类协议,即可以通过DFU类协议进⾏产品固件的加载或更新。
关于STM32产品的DFU程序下载和升级,ST官⽅有相关的资料⽂档。可以去或者去搜索DFUse下载相关资料。
有个⽤户⼿册UM0412详细介绍了如何利⽤ST官⽅软件⼯具DfuSe进⾏相关编程操作。顺便提醒下,下载DfuSe安装包解压运⾏DfuSe_Demo_之后,还不算安装完成,还得安装针对DfuSe的WINDOWS环境下的驱动程序。如果你运⾏
DfuSe_Demo_时使⽤默认路径的话,该驱动程序的位置⼀般就在下图⽅框所指的路径,选择合适.INI⽂件。
当你见到设备驱动程序成功安装的提⽰时,PC端的安装才算完成。⾄于DFU⽂件的准备操作这⾥就不再赘述,⼿册讲得很清晰。
这⾥要额外提醒的是,利⽤DFU⽅式对STM32 程序代码加载或更新有两种模式,即ISP模式和IAP模式。
所谓ISP模式就是指MCU芯⽚出⼚时内部已集成了DFU相关⾃举驱动代码,利⽤它并借助接⼝即可将⽤户应⽤程序下载进芯⽚。不妨以STM32F4xx 为例来介绍,下图是STM32F4xx⾃举模式配置及内部系统存储器的描述。
可以看出,STM32F4XX系列芯⽚的系统存储器内集成了相关DFU驱动,⽀持ISP模式下的DFU⽅式进⾏⽤户代码加载或升级。此时,BOOT配载在system memory模式,你只需准备好相关的⽤户程序代码,借助上⾯的DfuSe⼯具即可完成⽤户程序的下载。之后,将BOOT配置为⽤户模式,即main flash memory模式。
当然,并不是所有带USB模块的STM32 芯⽚内都集成了相关DFU⾃举驱动,或者说即使集成了但你并不想使⽤它。那你就可以换个模式,即IAP模式。⾃⾏编写DFU相关⾃举驱动程序,然后通过调试设备下载到芯⽚⾥,之后通过该DFU驱动并借助DfuSe⼯具完成⽤户程序的更新或下载。此时boot配置是⽤户模式,即main flash memory模式。这点跟上⾯的ISP模式不⼀样的。
对于各STM32系列IAP的参考代码,在ST官⽅⽹站都有,基本可以拿过来就⽤。需要修改的地⽅主要是触发源,⽐⽅按键,再就是要跳转的⽤户程序起始地址,以及编译时相关内存地址的调整。
为了⽐较,我们顺便看看STM32F1系列系统内部存储区⾃举程序的介绍:
很明显,对于STM32F1系列,只有互联型⼦系列[STM32 F105/STM32F107]⽀持通过DFU⽅式实现ISP编程。⽽其它STM32F1芯⽚即使带USB模块,若想利⽤DFU⽅式编程就只能⾃⾏编写DFU⾃举驱动,通过IAP模式实现⽤户程序的下载或升级。
⼏年前在这个地⽅,我就被折腾了⼀次。我⾸先是拿ST官⽅的评估板STM3210C EVAL⽤ISP⽅式测试DFU功能,没问题,⼀路畅通。后来某客户借了块STM32F1的评估板[当时我以为也是STM3210C EVAL],他使⽤ISP⽅式测试这个DFU功能,奇怪得很,怎么也不成功。我跟他回复确认说这个功能测试过肯定没问题。后来反复沟通,发现他拿的那块评估板是STM3210E EVAL,主芯⽚是STM32F103ZE,⽽我之前测试的评估板的主芯⽚是STM32F107VC,后者是F1系列中的互联型,前者则不是。只怪当时⼿册看得不细,加上这两种评估板长相也很雷同。
其实,利⽤USB接⼝来加载程序跟利⽤UART接⼝加载程序的流程是类似的,只是接⼝、协议有差异⽽已。实现⽅式可以是ISP,也可以是IAP。具体实现⽅式要结合芯⽚内部集成的相关⾃举驱动和实际应⽤需求来考虑。
最后提醒下,在对STM32F1/F2/F3/F4/F0⼏个系列的芯⽚作IAP应⽤时,F0系列跟其它系列不⼀样,它没有中断⽮量定义寄存器SCB_VTOR,所以在相应的⽤户APP代码开始处要先做SYSCFG外设时钟的使能开启和中断⽮量的拷贝操作。相关参考代码如下:
int main(void)
eval是做什么的{undefined
uint32_t i = 0;
/* Relocate by softwarethe vector table to the internal SRAM at 0x20000000 ***/
/* Copy the vector table from the Flash(mapped at the base of the application
loadaddress APPLICATION_ADDRESS) to the base address of the SRAM at 0x20000000. */
for(i = 0; i < 48; i++)
{undefined
VectorTable[i] = *(__IOuint32_t*)(APPLICATION_ADDRESS + (i<<2));
}
/* Enable the SYSCFG peripheral clock*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
/* Remap SRAM at 0x00000000 */
SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);
/****************下⾯书写你的应⽤代码  **********************/
其它操作跟其它⼏个系列⼀样,该怎么操作怎么操作。
也许有⼈会问,那⾼⼤上的STM32F7系列是怎样的呢? STM32F7系列在中断⽮量配置和程序执⾏地址映射这些地⽅跟STM32F1/F2/F4等⼜有点差异,主要体现在更为灵活、⽅便。ST官⽅有份应⽤笔记《STM32F7与STM32F4复位序列⽐较》做了较详细的解说,有兴趣的话可以去搜索下载阅读。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。