菜鸟级别(像我这样的),高手可以给予我们菜鸟一族指点指点或者点击叉叉离开
相信大家在实现了STM32的USB_DFU或者原子的串口升级APP程序,因为Bootloader程序中用到了USB的相关中断,在APP程序中同样也用到了相同的中断,这时是不是就乱套了呢?
的确是乱套了,不过还是有解决办法的。下面为大家演示一下:(可以用我这个DFU功能http://www.openedv.com/posts/list/28532.htm或者原子战舰光盘的例程:实验48 串口IAP实验)
使用的资源:
1、ST官方库函数V3.5
2、两个LED灯,一个红色LED0,一个蓝色LED1:
红色LED指示的是进入DFU模式的USB中断唤醒点亮,
蓝色LED指示的是进入USB读卡器模式的USB唤醒点亮
3、前面的STM32_DFU_Bootloader程序,STM32读卡器程序
第一、在正常的DFU移植的时候做法在APP程序中的main函数开头加入修改中断向量表地址的语句
SCB->VTOR = FLASH_BASE | 0X30000;(偏移值视情况而定,不一定按这个参数)
第二、假设APP程序中没有用到和Bootloader中的中断服务函数的时候,一切运行正常,当用上的时候 呢???
第三、通过前面的方法,在USB读卡器实验程序中的main函数开头增加
SCB->VTOR = FLASH_BASE | 0X30000;语句,编译后DFU下载到板子上复位运行,这时可以进入板子 可以进入USB读卡器模式。
但是,当你插上USB线连接电脑的时候,问题来了,电脑弹出提示框提示无法识别的USB设备。是不是 意味着就不能这样用了呢??
![](http://www.openedv.com/upload/2014/3/17/fe9b1945df75af2195275c591440c8dc_134.jpg)
第四、这时我们就看看STM32程序执行的流程怎么走的(参考原子的《STM32开发指南-库函数版 本 V1.2 .pdf》中的APP程序执行图)
![](http://www.openedv.com/upload/2014/3/17/05ea34c1bb794ce24e97971061411e3a_524.jpg)
具体解说这个流程图请参考原子《STM32开发指南-库函数版本 V1.2 .pdf》第700页开头的解说。
图中知道这么一个消息,在执行APP程序中发生了中断请求,程序仍然跳转到了0x0800 0004这个中断向 量表地址去提取相关的中断服务函数执行,问题就来了,在这个地址存放的是Bootloader的USB中断服 务函数,读取了,USB枚举的时候就来了,因为DFU的USB枚举参数和USB读卡器枚举的参数不一样, 所以就发生了电脑无法识别的USB设备的错误提示框。是不是蒙了呢???【具体可以对照代 码usb_desc.c中的字符串描述内容等】
第五、不用怕,看到图53.1.2中的第⑤步跳转,下面编辑代码验证一下。
A、USB读卡器中也用到了USB的相关中断,有两个还是和Bootloader中的USB中断服务函数一样的调用。
具体可以参考我这个帖子http://www.openedv.com/posts/list/27484.htm或者原子战舰光盘里面的例 程:实验50 USB读卡器实验
都用到的函数是:USB_LP_CAN1_RX0_IRQHandler()和USBWakeUp_IRQHandler()
B、在Bootloader程序中,USB唤醒中断服务函数增加LED0红色LED指示(试过想在LCD上显示字符来的,加 了LCD显示字符语句电脑识别设备失败,具体原因可能显示字符时间太长了)
![](http://www.openedv.com/upload/2014/3/17/c28655b2f7715ff5eb4362793d0565f8_473.jpg)
C、 编译成功后下载到板子上,按住 Bootloader 程序中设定的按键后复位开发板,显示 DFU 模式界面时插 上 USB 连接电脑。
![](http://www.openedv.com/upload/2014/3/17/1362cf2838ec928b3dafbfccdbb0fedc_736.jpg)
图中红色框框中显示的是进入了DFU模式
图中蓝色框框的红色LED点亮,说明进入的是Bootloader中的USB唤醒中断服务函数。
第六、在USB读卡器程序中,USB唤醒中断服务函数增加LED1蓝色LED指示
![](http://www.openedv.com/upload/2014/3/17/898332b66860b3cd22ed95fe4cb7b44f_200.jpg)
第七、这时我不在main函数开头处加写中断向量表地址重设代码,我直接修改“system_stm32f10x.c”文件 中“void SystemInit (void)”函数末尾的代码,修改如下
![](http://www.openedv.com/upload/2014/3/17/4c00faa4522e00cb0d46a033ba513dab_231.jpg)
第八、编译成功后通过DFU下载到板子上,复位进入如下界面
![](http://www.openedv.com/upload/2014/3/17/0742f7ee45d8b4d44228065e5997dfe6_627.jpg)
图中红色框框显示了USB读卡器实验
图中蓝色框框是读取到了TF卡(我用的)的容量信息
第九、这时插上USB线连接电脑,板子上显示如下界面
![](http://www.openedv.com/upload/2014/3/17/da48affa73bc4dc7133c556f89974a38_936.jpg)
图中红色框框显示USB读卡器模式,已经连接上电脑
图中蓝色框框显示的蓝色LED点亮,说明已经进入USB读卡器的USB唤醒中断服务函数了。(前面我 的Bootloader程序中的USB唤醒中断也点了灯的,红色不亮)
第十、电脑上已经正常识别到了STM32开发板上的USB读卡器了,电脑进去,双击打开可移动磁盘,里面内容
![](http://www.openedv.com/upload/2014/3/17/73bce17437b58e66b5563da00107fa94_677.jpg)
第十一、看到TF的内容了,说明已经成功了,可以进行读、写、删除等操作尝试。
第十二、不相信的话可以用读卡器将你开发板上的TF卡在电脑上看下里面的内容
![](http://www.openedv.com/upload/2014/3/17/9b93a9c1c6336aec8a0406afb3ec54f6_570.jpg)
最后,至于为什么这样改就可以了呢?打开我们程序中的启动文件代码看下,有这么一段
![](http://www.openedv.com/upload/2014/3/17/464aa1bc517f83d98b1bb184b35cd020_258.jpg)
然后再看下面的代码
![](http://www.openedv.com/upload/2014/3/17/a25dedf6ba0f5764127bd22efe3c6ae2_940.jpg)
完全汇编,是不是看不懂呢???结合前面的图53.1.2来看下就知道什么意思了,呵呵,自己琢磨一下吧。
至于寄存器操作的没试过,大家自己依葫芦画瓢吧。。。