STM32 之USB 固件库IAP 升级 (以下全部为实际操作所得) 最近做了STM32 通过USB 程序升级功能,也就是所谓的DFU,所使用的程序为ST 公司提供的例子程序(位置为:安装目录/ARM/Examples/ST/STM32F10xUSBLib/Demos/Device_Firmware_Upgrade),此文件夹包含多两个工程,project 文件夹存放的是用来升级的程序-IAP,binary 文件夹存放的是用户程序—APP。 一、USB 升级程序 打开 Project 里面的工程(用什么软件打开就不用我讲了吧),如果你电脑上有 Source Insight 就更好了,方便查阅。从 MAIN 里面我们可以知晓,程序先判断某个按键是否按下(这个可以根据你的实际电路设计来修改),如果按下则进入升级功能程序,否则就跳转到 APP 程序,也就是用户程序。不多说了,直接上程序。 if (DFU_Button_Read() == 0x00)//如果未按下 1 { /* Test if user code is programmed starting from address 0x8003000 */ if (((*(vu32*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000) 2 { /* Jump to user application */ JumpAddress = *(vu32*) (ApplicationAddress + 4); 3 Jump_To_Application = (pFunction) JumpAddress; 4 /* Initialize user application's Stack Pointer */ __MSR_MSP(*(vu32*) ApplicationAddress); 5 Jump_To_Application(); 6 } } /* Otherwise enters DFU mode to allow user to program his application */ 1、 判断按键是否按下,如果未按下,则准备进入用户程序区,是准备哦,因为后面还有判断语句。否则就进入 USB 升级程序。下面的USB 升级程序就是配置一些 USB 方面的东东,因为和系统已经配好了,就无需管了。 2、 用来判断用户的代码存放地址是否郑旭(这个地址用户可以修改,是系统的一个宏定义ApplicationAddress,稍后将做解释),如果用户程序代码未按规定存放,或者用户代码区没有程序的话,程序会跳到 USB 升级程序那里去,等待下载升级程序。 3、 ApplicationAddress 为用户程序的首地址,同时也是堆栈的地址。紧接着它的是复位中断地址,所以这条语句是获取复位中断的地址。 4、 获取堆栈的地址 5、 将堆栈的地址写入堆栈指针(什么用途就不用说了) 6、 跳转到用户函数去执行。 程序中我们要修改几个宏定义,具体名称和意义如下所示(用搜索功能获取这些名称位置): ApplicationAddr...