STM32之USB固件升级IAPUSB程序升级上位机软件操作
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程序,也就是⽤户程序。不多说了,直接上程序。
i f (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、跳转到⽤户函数去执⾏。
程序中我们要修改⼏个宏定义,具体名称和意义如下所⽰(⽤搜索功能获取这些名称位置):
ApplicationAddress ⽤户程序地址,系统默认为0x08000000,我们修改为0x08003000。
DFU_ENTER GPIOA
DFU_ENTER_PIN GPIO_Pin_8
RCC_APB2Periph_GPIO_DFU RCC_APB2Periph_GPIOA 这三个为判断按键的管脚配置
USB_DISCONNECT GPIOB
USB_DISCONNECT_PIN GPIO_Pin_14
RCC_APB2Periph_GPIO_DISCONNECT RCC_APB2Periph_GPIOB 这个三给为主机识别
USB设备的控制端⼝
以上为程序上要进⾏的修改,当然你可以根据你的需要修改⼀些应⽤上的功能。
USB升级⼯程配置如下,(例⼦程序的⼯程已经配好,你可以查看,这⾥只⽤来做解释)
红⾊框内为程序的⾸地址,绿⾊框为所使⽤的地址空间⼤⼩,蓝⾊框表⽰使⽤Microf的缩减库,因为程序空间有限,否则会出错。
红⾊圈内勾上,具体什么⽤处,不晓得,哈哈。
以上就是对升级程序的修改。
上位机软件开发培训
⼆、⽤户程序
⽤户程序只要修改⼀个地⽅,就是中断向量表,呵呵,因为我们⽤户程序的地址变了,⼆中断向量表是紧随⽤户程序初始地址的,所以也需要修改,当然如果你程序未⽤到中断,就可以不⽤改(强烈建议你还是该,否则会出现你预料不到的问题)。
打开你的⽤户程序,使⽤搜索插到系统中所有的涉及到NVIC_SetVectorTable()函数的语句,将⾥
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0)改为NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x08003000),当然具体值要以你实际使⽤的为准。
注意:如果你的电路中设计了⽤按键去控制电源开关,如果你在升级程序中配置过,在⽤户程序中请勿重新配置,否则会出错,因为我⼯程中⽤到了长按键开关机功能,出现过这种错误。
好了,⽤户程序就只要做这些修改。下⾯将介绍⽤户程序⼯程所需要的修改
红⾊圈内为⽤户程序的开始地址,系统默认为0X8000000,我项⽬中修改为了0X8003000,这个要和USB升级程序中的ApplicationAddress宏定义对应;蓝⾊框为你给⽤户程序的空间⼤⼩,这个要⽐你实际程序⼤⼩⼤,最好是设定为你⽤的芯⽚的FLASH空间⼤⼩减去USB升级程序所使⽤的FLASH空
间⼤⼩,这⾥我设置为0X7D000,你可以以这个为参考同时结合你红⾊圈内的地址值来修改。记住蓝⾊
圈必须勾上,否则USB升级程序那⾥会判断不通过。
链接和下载的选项按上图进⾏设置。
⼯程的其他设置请按你平时设置进⾏。
三、上位机
上位使⽤的是ST公司的⼀款软件(ST公司其实很难下到,⾃动上次更新过⼀次⽹站之后,各位就⾃⼰去百度咯),软件名称为DfuSe_Demo_V3.,点击运⾏安装程序,⼀路NEXT就⾏了,安装成功后可以从开始程序看到我们所安装的软件,
我们要⽤到两个,DFU File Manager是⽤来⽣成下载所需要的DFU格式⽂件的,DfuSe Demostration是⽤来下载程序的。
(1)、STM32 USB驱动安装
将你的STM32开发板通过USB与上位机连接,STM32先不上电运⾏(这⾥假设你已经将USB 升级程序下载到了STM32电路板上,记住不是⽤户程序,是USB升级程序),按住前⾯说的那个判断是否下载程
序的按键,然后给STM32电路板上电,之后放开按键,STM32进⼊到USB升级程序中去了,如果这些操作成功的话,你的电脑会弹出⼀个发现硬件的对话框,同时要求你安装驱动,你选择从列表安装,然后选择这个路径安装驱动C:\Program
Files\STMicroelectronics\Software\DfuSe\Driver,点击安装进⾏驱动安装,安装过程中可能会弹出⼀个对话框叫你给⼀个STTub30.sys,你选择录下路径C:\Program Files\STMicroelectronics\Software\DfuSe\Driver\x86⾥⾯的STTub30.sys,好了,驱动安装完成,你可以去看下“设备管理器”,你会发现有如下红⾊框中设备
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论