移植ST-USB-DFU库

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33194301/article/details/88663744

USB-DFU(Device Firmware Upgrade)

由于公司需要用到DFU给设备升级(方便用户),我含着泪用3天时间将一堆资料看完并最终移植成功(#.#)(虽然还是没看懂o(╯□╰)o)。为了不让大家像我一样受这种折磨(对我来说太难啦 >Д<),我将我的移植经验分享给大家^^。(现在ST开发的STM32CubeMX对开发者来说真的很方便啊,直接点点点就可以实现了。其实我觉得前人已有的可用程序后人也无需重新再写,一节省时间二提高效率)

我所用的芯片的STM32F103RBT6(中等容量),修改的时候要看清楚自己的芯片容量哦,我当时移植的时候选了大容量,然后就凉凉啦T_T。

下面是DFU的大致流程:
在这里插入图片描述

一、下载ST提供的例程

ST库FS-USB程序(Cube)

二、修改程序

(一)、Copy

下载完上面的程序后,打开Libraries将STM32_USB-FS-Device_Driver(USB硬件驱动,通常不需要修改)、STM32F10x_StdPeriph_Driver(STM32F10X的标准库)和CMSIS中必要的文件复制到我们的文件夹。
在这里插入图片描述
然后就建立我们的工程
在这里插入图片描述

(二)、Edit

编译,肯定有很多错误的,如下:
1、

.\inc\platform_config.h(73): error: #35: #error directive: “Missing define: Evaluation board (ie. USE_STM3210E_EVAL)”

由于我们使用的是STM32F103RBT6,和USE_STM3210B_EVAL评估板使用同一系列芯片,所以我们就只定义他好了。

#define USE_STM3210B_EVAL

然后还有错,那就要修改它包含的头文件了,改成

扫描二维码关注公众号,回复: 5946118 查看本文章
#include "stm32f10x.h"
#include "stm32f10x_spi.h"
#include "stm32f10x_flash.h"
#include "spi_if.h"
#include "nor_if.h"
#include "fsmc_nor.h"

2、

…\STM32_USB-FS-Device_Driver\inc\usb_type.h(56): error: #256: invalid redeclaration of type name “bool” (declared at line 520 of “…\CMSIS\inc\stm32f10x.h”)

这是因为原本stm32f10x.h头文件已经包含这个枚举了,在usb_type.h中就重定义了,删去这个枚举即可。

3、

src\hw_config.c(284): warning: #223-D: function “STM_EVAL_PBInit” declared implicitly

在void DFU_Button_Config(void)函数内定义我们进入DFU模式的按键

void DFU_Button_Config(void)
{  
	GPIO_InitTypeDef GPIO_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);		//开启时钟
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
}

这里也可以用中断,我用的是扫描。
下面的按键读取函数我改成这样

uint8_t DFU_Button_Read (void)			//采用扫描方式识别
{
  return GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8);
}

4、

…\STM32F10x_StdPeriph_Driver\src\stm32f10x_flash.c(998): error: #20: identifier “FLASH_KEY2” is undefined

FLASH_KEY2未定义,标准库V3.5.0中包含下面代码,而我们这里V3.6.1却不包含(可能是不同芯片内部FLASH大小不同的原因),所以要我们自己添加这些程序。

/* FLASH Keys */
#define RDP_Key                     ((uint16_t)0x00A5)
#define FLASH_KEY1               ((uint32_t)0x45670123)
#define FLASH_KEY2               ((uint32_t)0xCDEF89AB)

5 、

.\Objects\test.axf: Error: L6218E: Undefined symbol sFLASH_EraseSector (referred from spi_if.o).
.\Objects\test.axf: Error: L6218E: Undefined symbol sFLASH_Init (referred from spi_if.o).
.\Objects\test.axf: Error: L6218E: Undefined symbol sFLASH_ReadBuffer (referred from spi_if.o).
.\Objects\test.axf: Error: L6218E: Undefined symbol sFLASH_WritePage (referred from spi_if.o).

spi_if.c这里出错,可是我们并没有用到spi对FLASH操作,故直接删除错误的地方就是了,只保留return部分。

三、总结

(一)、我们需要根据APP的IROM大小在hw_config.h内修改 ApplicationAddress,其值为(0x8000000+APP Size)

(二)、而在APP部分的程序我们需要system_stm32f10x.c内修改VECT_TAB_OFFSET的大小,其值为DFU程序IROM所占Size。并且在target中需要修改IROM1起始地址,其值为(0x8000000+DFU程序Size)

(三)、注意DFU+APP所占内存大小不能大于芯片最大容量!

(四)、调试时电脑枚举不出的原因有很多种,一是程序usb_desc.c枚举部分有问题,二是程序开始时有很大的延时导致PC枚举不出来(如果要自定义枚举时期,可以在USB电路部分D+的上拉电阻出接上三极管控制通断,这样电脑就不会一开始就自动执行枚举操作)。三是电压不稳定等等各种原因都会造成这种结果。

程序下载链接

猜你喜欢

转载自blog.csdn.net/qq_33194301/article/details/88663744
DFU