(直播)利用stm32cubemx实现USBDFU对芯片程序的更新升级(板卡stm32f4discovery) - STM32cube中文网.pdf
DFU 直播利用stm32cubemx实现USBDFU对芯片程序的更 新升级板卡stm32f4discovery 取消关注 | 2 . DFU这个功能给客户现场升级程序 功能类似串口实现IAP 有时我们会考虑利用STM32芯片的USB模块进行程序代码的下载或升级。USB协议中有专门针对设备固件升级的类协议,即可以通过DFU类协议进 行产品固件的加载或更新 前面介绍F103的usb dfu功能,但是搁浅了. 这次介绍F4discovery板卡上面实现DFU功能的具体操作 打开stm32cubemx软件,选择板卡那项,选discovery卡 发起 /uploads/questions/20160713/6882f41fcda0ce30931956c71fe0000a.jpg 左侧选择RCC时钟为外部时钟 usb_otg_fs选择Device_only /uploads/questions/20160713/ef0484514b23997c6573f229a784e8ab.jpg 参考串口iap我们需要一个按键来控制dfu discoevry卡上面的按键是PA0 /uploads/questions/20160713/76c78fbb95c862c300b030febede21be.jpg 回到上面,usb_device选择DFU模式 /uploads/questions/20160713/7fa1fbaa07c60b94c5935eaa6e5cc0fa.jpg 点击上方的时钟选项卡,会自动弹出一个对话框,提示的大致意思是你使用了usb所以时钟需要修改 这时候我们就默认让它自动计算值好了.自动调整的结果如下 3 小时前 添加评论 邀请 1 编辑 相关链接 分享 举报 /uploads/questions/20160713/1ec4f61b2199750e2277c83a6622e4a7.jpg 关注的人 时间 _ _ H A L _ F L A S H _ C L E A R _ F L A G F L A S H _ F L A G _ E O P | F L A S H _ F L A G _ O P E R R | F L A S H _ F L A G _ W R P E R R | F L A S H _ F L A G _ P G A E R R | F L A S H _ F L A G _ P G P E R R | F L A S H _ F L A G _ P G S E R R ; 解锁flash和清除一些flash的异常状态标识 把 uint16_t MEM_If_DeInit_FSvoid 函数里面增加一个 H A L _ F L A S H _ L o c k ; 紧接着是flash 的写入操作 u i n t 1 6 _ t M E M _ I f _ E r a s e _ F S u i n t 3 2 _ t A d d / * U S E R C O D E B E G I N 3 * / u i n t 3 2 _ t U s e r S t a r t S e c t o r ; u i n t 3 2 _ t S e c t o r E r r o r ; F L A S H _ E r a s e I n i t T y p e D e f p E r a s e I n i t ; / * U n l o c k t h e F l a s h t o e n a b l e t h e f l a s h c o n t r o l r e g i s t e r a c c e s s * * * * * * * * * * * * * / M E M _ I f _ I n i t _ F S ; / * G e t t h e s e c t o r w h e r e s t a r t t h e u s e r f l a s h a r e a * / U s e r S t a r t S e c t o r G e t S e c t o r A d d ; p E r a s e I n i t . T y p e E r a s e T Y P E E R A S E _ S E C T O R S ; p E r a s e I n i t . S e c t o r U s e r S t a r t S e c t o r ; p E r a s e I n i t . N b S e c t o r s 9 ; p E r a s e I n i t . V o l t a g e R a n g e V O L T A G E _ R A N G E _ 3 ; i f H A L _ F L A S H E x _ E r a s e r e t u r n U S B D _ O K ; / * U S E R C O D E E N D 3 * / 擦除操作,先解锁,然后清空所需flash所在sector 这个是直接参考串口的iap操作写的,其中的Bbsectors 9 来自于前面提到的,3*16K用来放dfu 所以还剩下0101079个sector 嗯,就这样. 哦,对了,GetSector函数需要自己写,我们之前在串口的iap里面已经写过了,所以复制过来用 我们先按照用户手册上写的在文件usbd_dfu_if.h中define一些需要用到的sector起始地址 d e f i n e A D D R _ F L A S H _ S E C T O R _ 0 u i n t 3 2 _ t 0 x 0 8 0 0 0 0 0 0 / * B a s e o f S e c t o r 0 , 1 6 K b y t e * / d e f i n e A D D R _ F L A S H _ S E C T O R _ 1 u i n t 3 2 _ t 0 x 0 8 0 0 4 0 0 0 / * B a s e o f S e c t o r 1 , 1 6 K b y t e * / d e f i n e A D D R _ F L A S H _ S E C T O R _ 2 u i n t 3 2 _ t 0 x 0 8 0 0 8 0 0 0 / * B a s e o f S e c t o r 2 , 1 6 K b y t e * / d e f i n e A D D R _ F L A S H _ S E C T O R _ 3 u i n t 3 2 _ t 0 x 0 8 0 0 C 0 0 0 / * B a s e o f S e c t o r 3 , 1 6 K b y t e * / d e f i n e A D D R _ F L A S H _ S E C T O R _ 4 u i n t 3 2 _ t 0 x 0 8 0 1 0 0 0 0 / * B a s e o f S e c t o r 4 , 6 4 K b y t e * / d e f i n e A D D R _ F L A S H _ S E C T O R _ 5 u i n t 3 2 _ t 0 x 0 8 0 2 0 0 0 0 / * B a s e o f S e c t o r 5 , 1 2 8 K b y t e * / d e f i n e A D D R _ F L A S H _ S E C T O R _ 6 u i n t 3 2 _ t 0 x 0 8 0 4 0 0 0 0 / * B a s e o f S e c t o r 6 , 1 2 8 K b y t e * / d e f i n e A D D R _ F L A S H _ S E C T O R _ 7 u i n t 3 2 _ t 0 x 0 8 0 6 0 0 0 0 / * B a s e o f S e c t o r 7 , 1 2 8 K b y t e * / d e f i n e A D D R _ F L A S H _ S E C T O R _ 8 u i n t 3 2 _ t 0 x 0 8 0 8 0 0 0 0 / * B a s e o f S e c t o r 8 , 1 2 8 K b y t e * / d e f i n e A D D R _ F L A S H _ S E C T O R _ 9 u i n t 3 2 _ t 0 x 0 8 0 A 0 0 0 0 / * B a s e o f S e c t o r 9 , 1 2 8 K b y t e * / d e f i n e A D D R _ F L A S H _ S E C T O R _ 1 0 u i n t 3 2 _ t 0 x 0 8 0 C 0 0 0 0 / * B a s e o f S e c t o r 1 0 , 1 2 8 K b y t e * / d e f i n e A D D R _ F L A S H _ S E C T O R _ 1 1 u i n t 3 2 _ t 0 x 0 8 0 E 0 0 0 0 / * B a s e o f S e c t o r 1 1 , 1 2 8 K b y t e * / 再在usbd_dfu_if.c文件末尾添加函数 / * * * b r i e f G e t s t h e s e c t o r o f a g i v e n a d d r e s s * p a r a m A d d r e s s F l a s h a d d r e s s * r e t v a l T h e s e c t o r o f a g i v e n a d d r e s s * / s t a t i c u i n t 3 2 _ t G e t S e c t o r u i n t 3 2 _ t A d d r e s s u i n t 3 2 _ t s e c t o r 0 ; i f A d d r e s s A D D R _ F L A S H _ S E C T O R _ 0 s e c t o r F L A S H _ S E C T O R _ 0 ; e l s e i f A d d r e s s A D D R _ F L A S H _ S E C T O R _ 1 s e c t o r F L A S H _ S E C T O R _ 1 ; e l s e i f A d d r e s s A D D R _ F L A S H _ S E C T O R _ 2 s e c t o r F L A S H _ S E C T O R _ 2 ; e l s e i f A d d r e s s A D D R _ F L A S H _ S E C T O R _ 3 s e c t o r F L A S H _ S E C T O R _ 3 ; e l s e i f A d d r e s s A D D R _ F L A S H _ S E C T O R _ 4 s e c t o r F L A S H _ S E C T O R _ 4 ; e l s e i f A d d r e s s A D D R _ F L A S H _ S E C T O R _ 5 s e c t o r F L A S H _ S E C T O R _ 5 ; 2 小时前 0 0 e l s e i f A d d r e s s A D D R _ F L A S H _ S E C T O R _ 6 s e c t o r F L A S H _ S E C T O R _ 6 ; e l s e i f A d d r e s s A D D R _ F L A S H _ S E C T O R _ 7 s e c t o r F L A S H _ S E C T O R _ 7 ; e l s e i f A d d r e s s A D D R _ F L A S H _ S E C T O R _ 8 s e c t o r F L A S H _ S E C T O R _ 8 ; e l s e i f A d d r e s s A D D R _ F L A S H _ S E C T O R _ 9 s e c t o r F L A S H _ S E C T O R _ 9 ; e l s e i f A d d r e s s A D D R _ F L A S H _ S E C T O R _ 1 0 s e c t o r F L A S H _ S E C T O R _ 1 0 ; e l s e s e c t o r F L A S H _ S E C T O R _ 1 1 ; r e t u r n s e c t o r ; admin 关键点在写入操作 u i n t 1 6 _ t M E M _ I f _ W r i t e _ F S u i n t 8 _ t * s r c , u i n t 8 _ t * d e s t , u i n t 3 2 _ t L e n / * U S E R C O D E B E G I N 3 * / u i n t 3 2 _ t i 0 ; f o r i 0 ; i 本帖所用代码可以在本站百度网盘中找到,名称F4_USBDFU.zip Copyright 2016 - Email AD 官方QQ群 342625081, All Rights Reserved Powered By STM32cube中文平台 | Design By WeCenter 回复 上传附件 允许 jpg,jpeg,png,gif,zip,doc,docx,rar,pdf