关于USB的DFU固件升级的一些问题

参考: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程序,再按下按键,结果如下:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值