参考:STM32CubeMX学习笔记(50)——USB接口使用(DFU固件升级)
1、在插入USB时电脑弹出“无法识别位置USB设备”,网上查阅资料可能是USB驱动没装好,转到s设备管理器中查看:
直接卸载该设备重新检测,如果不行的话还是应该把bootloader程序新修改一下(因为那篇博客的BootLoader好像是直接就跳转到APP中了,如果跳到APP中好像按键就没啥用了),让其进入DFU中,然后再插入USB设备,如果是第一次识别则此时可能会出现以下问题:
在设备管理器中更新一下USB驱动就可以去掉感叹号:
2、识别出USB端口后,发现按照参考博客中的步骤出现以下问题:
如果点击是,立刻电脑重启!`-`,然后就出现上面1的问题又不能识别USB啦,嘤嘤嘤
3、再查看资料有说堆栈设置大小的问题:因为DFU默认使用了1K的缓冲区(USBD_static_malloc
),所以栈区的大小一定大于2K才能不会出现问题,这里大小设置可以编译后查看map文件,查看栈的使用情况。这里示例工程,使用不会很大,就随便设置一下:
然后还是没有用~~~
在反复报错重启电脑中终于知道,我在某次尝试修改中在CubeMX中reset了USB设置,然后那个USBD_DFU_APP_DEFAULT_ADD 就变成了bootloar的地址0x08000000(我就说为啥串口打印一直都在循环),修改后还是发现2和1 的问题,就发现参考博客程序一进BootLoader程序就跳转到APP了,一跳到APP的话,设备应该就不是在DFU中,然后
这里就有问题了

所以就自己修改了按键代码,首先得保证程序是在DFU模式下,也就是进入BootLoader后不会自动跳转到APP中,等到通过DfuSeDemo.exe下载程序成功, 再按下按键,按键识别到变化就跳转到APP程序中:

BootLoader中main.c程序修改如下:
/* USER CODE BEGIN 2 */
printf("\r\n****** USB-DFU Example1 ******\r\n\r\n");
printf("Key Down Enter DFU\r\n");
MX_USB_DEVICE_Init();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_8) == GPIO_PIN_RESET)
{
printf("Enter Application\r\n");
if(((*(__IO uint32_t *) USBD_DFU_APP_DEFAULT_ADD) &0x2FFFE000) == 0x20000000)
{
JumpAddress = *(__IO uint32_t *)(USBD_DFU_APP_DEFAULT_ADD + 4);
JumpToApplication = (pFunction)JumpAddress;
__set_MSP(*(__IO uint32_t *)USBD_DFU_APP_DEFAULT_ADD);
__disable_irq();//跳转前关闭所有中断
JumpToApplication();
}
}
}
/* USER CODE END 3 */
}
结果如下:
注意:如果此时想要再次修改FLASH中的APP程序,需要reset一下恢复到BootLoader中 ,然后建议重新打开DfuSe Demo.exe,查看是否还是在DFU Mode,如果不是,需要拔掉USB重插(不要问为啥要看,一不下心就重启电脑了。呜呜呜),然后再重新下载新的.dfu程序,再按下按键,结果如下: