基于STM32F103ZET6(核心板)实现USB,IAP下载程序。
准备工作:
1、下载STM32F103ZET6的USB库。
USB库ST官网下载STM32F10x, STM32L1xx and STM32F3xx USB full speed device library(这是一个USB的例程库,支持STM32F10x,STM32L1xx 和 STM32F3xx系列芯片)。
ST官网下载链接:https://www.st.com/content/st_com/en/products/embedded-software/mcu-mpu-embedded-software/stm32-embedded-software/stm32-standard-peripheral-library-expansion/stsw-stm32121.html
2、下载DFU工具
DFU工具ST官网下载STM32F10x, STM32L1xx and STM32F3xx USB full speed device library(这是一个USB的例程库,支持STM32F10x,STM32L1xx 和 STM32F3xx系列芯片)。
ST官网下载链接:https://www.st.com/content/st_com/en/products/development-tools/software-development-tools/stm32-software-development-tools/stm32-programmers/stsw-stm32080.html
开始操作:
1、移植ST STM32F10x USB库中的Device_Firmware_Upgrade例程-----选择STM3210E_EVAL评估板!
因为所使用的是:STM32F103ZET6芯片,而ST的USB例程是根据它的评估板写的,所以要修改硬件相关的地方。(STM32F103ZET6对应的评估板是STM3210E_EVAL)。
查看核心板原理图:
发现要使USB被主机(一般为PC)识别成USB设备必须要PA12(D+)线上必须上拉一个电阻,这里是1K,网上也有说1.5K的。
简单来说,就是主机要识别你的USB是什么USB设备(低速、全速、高速?具体支持那种USB设备,查看芯片的参考手册USB部分):
PA11为D-,PA12为D+,
当上拉电阻接到D-线上,则为低速USB设备;
当上拉电阻接到D+线上,则为全速USB设备。
由原理图上可以看到这个上拉电阻被接到PA12(D+)线上,即是一个全速USB设备。这个上拉电阻由PD3引脚控制,即上拉电阻软开关。有些板子上就是被定死了(如STM32F407核心板的USB设备),无法通过软件断开USB设备。
STM32F407核心板的USB设备原理图如下:
软件修改两个地方:
1、在main函数中的Set_System();函数中修改上拉电阻的软开关引脚部分。
/* USB_DISCONNECT used as USB pull-up */
GPIO_InitStructure.GPIO_Pin = USB_DISCONNECT_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_Init(USB_DISCONNECT, &GPIO_InitStructure);
修改如下:
#elif defined (USE_STM3210E_EVAL)
#define USB_DISCONNECT GPIOD//GPIOB
#define USB_DISCONNECT_PIN GPIO_Pin_3//GPIO_Pin_14
#define RCC_APB2Periph_GPIO_DISCONNECT RCC_APB2Periph_GPIOD//RCC_APB2Periph_GPIOB
2、修改按键部分,因为它是通过按键来触发是否进入到USB IAP模式的。
查看核心板原理图
选择PA0(对应核心板上的用户按键1)作为进入USB IAP下载的按键
改写main函数中的DFU_Button_Config();函数
改写为:
GPIO_InitTypeDef GPIO_initStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_DeInit(GPIOA);
GPIO_initStructure.GPIO_Pin = GPIO_Pin_0;//Óû§°´¼ü1
GPIO_initStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_initStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_initStructure);
3、修改进入USB IAP的方式
将if (DFU_Button_Read() != 0x00)
修改为if (DFU_Button_Read() == 0x00)
这样就只有在按下按键(升级请求)的情况下,才进行用户程序下载。
按键没有按下就进入用户程序。
2、下载USB_IAP工程到单片机
查看USB_IAP工程占flash大小:
方式1:
方式2:
因为本次只是简单实现下DFU,所以给USB_IAP分配flash大小为0x3000,ram为默认。
FLASH的起始地址为0x08000000,默认都是从flash启动方式(BOOT1,BOOT0引脚决定)。
我们让用户程序从0x3000处开始存储,修改hw_config.h中的ApplicationAddress为0x08003000.
注意这里的ApplicationAddress地址要和用户程序的存储地址一致。
设置Debug选项为下载擦除整片FLASH。
设置好后,用ST-LINK下载到单片机上。
3、准备用户程序
用户程序为一秒间隔的LED流水灯。
关于用户程序需要注意的地方:
1、设置用户程序的存储地址为0x08003000,大小为剩下的flash空间,RAM默认。
2、main函数中设置中断向量表:
勾选生成hex文件或者设置生成bin文件。
编译!!!!!
DFU工具默认安装在:
C:\Program Files (x86)\STMicroelectronics\Software\DfuSe v3.0.6
找到DfuFileMgr.exe并打开,这是将hex或bin文件转成dfu文件的工具。
选择:我想将HEX文件转成dfu文件,点击"OK",进入下图界面。
这里的Vendor ID、Product ID、Version ID填什么?------打开DfuSeDemo.exe可以看到。
用USB线给核心板供电,按下复位键的同时按下用户按键1(升级请求)、进入USB IAP模式。
将上图中的Vendor ID、Product ID、Version ID填写到DfuFileMgr.exe界面中。
点击S19orHex按钮,选择用户程序生成的hex文件。
选择好hex文件后,点击Generate,生成dfu文件。
打开DfuSeDemo.exe
勾选Verity after download,Choose选择之前生成的dfu文件。
选择好后,点击Upgrade升级
点击是,即可完成DFU下载。
下载完成后,复位或者重新上电,即可看到烧进去的用户程序跑起来了。