IAP升级程序中Bootloader和APP程序中断复用的解决办法

2019-07-21 05:39发布

菜鸟级别(像我这样的),高手可以给予我们菜鸟一族指点指点或者点击叉叉离开


相信大家在实现了
STM32USB_DFU或者原子的串口升级APP程序,因为Bootloader程序中用到了USB的相关中断,在APP程序中同样也用到了相同的中断,这时是不是就乱套了呢?

的确是乱套了,不过还是有解决办法的。下面为大家演示一下:(可以用我这个DFU功能http://www.openedv.com/posts/list/28532.htm或者原子战舰光盘的例程:实验48 串口IAP实验)
使用的资源:
1ST官方库函数V3.5 2、两个LED灯,一个红 {MOD}LED0,一个蓝 {MOD}LED1 红 {MOD}LED指示的是进入DFU模式的USB中断唤醒点亮 蓝 {MOD}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设备。是不是       意味着就不能这样用了呢??

第四、这时我们就看看STM32程序执行的流程怎么走的(参考原子的《STM32开发指南-库函数版                 本 V1.2 .pdf》中的APP程序执行图)

      具体解说这个流程图请参考原子《STM32开发指南-库函数版本 V1.2 .pdf》第700页开头的解说。
      图中知道这么一个消息,在执行APP程序中发生了中断请求,程序仍然跳转到了0x0800 0004这个中断向       量表地址去提取相关的中断服务函数执行,问题就来了,在这个地址存放的是BootloaderUSB中断服       务函数,读取了,USB枚举的时候就来了,因为DFUUSB枚举参数和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红 {MOD}LED指示(试过想在LCD上显示字符来的,加   了LCD显示字符语句电脑识别设备失败,具体原因可能显示字符时间太长了)

C、编译成功后下载到板子上,按住Bootloader程序中设定的按键后复位开发板,显示DFU模式界面时插          上USB连接电脑。

      图中红 {MOD}框框中显示的是进入了DFU模式
      
图中蓝 {MOD}框框红 {MOD}LED点亮,说明进入的是Bootloader中的USB唤醒中断服务函数。
第六、USB读卡器程序中,USB唤醒中断服务函数增加LED1蓝 {MOD}LED指示

第七、这时我不在main函数开头处加写中断向量表地址重设代码,我直接修改“system_stm32f10x.c”文件       中“void SystemInit (void)”函数末尾的代码,修改如下

第八、编译成功后通过DFU下载到板子上,复位进入如下界面

      图中红 {MOD}框框显示了USB读卡器实验
      
图中蓝 {MOD}框框是读取到了TF卡(我用的)的容量信息 第九、这时插上USB线连接电脑,板子上显示如下界面

      图中红 {MOD}框框显示USB读卡器模式,已经连接上电脑
      图中蓝 {MOD}框框显示的蓝 {MOD}LED点亮,说明已经进入USB读卡器的USB唤醒中断服务函数了。(前面我       的Bootloader程序中的USB唤醒中断也点了灯的,红 {MOD}不亮
第十、电脑上已经正常识别到了STM32开发板上的USB读卡器了,电脑进去,双击打开可移动磁盘,里面内容

第十一、看到TF的内容了,说明已经成功了,可以进行读、写、删除等操作尝试。
第十二、不相信的话可以用读卡器将你开发板上的TF卡在电脑上看下里面的内容

最后,至于为什么这样改就可以了呢?打开我们程序中的启动文件代码看下,有这么一段

然后再看下面的代码

完全汇编,是不是看不懂呢???结合前面的图53.1.2来看下就知道什么意思了,呵呵,自己琢磨一下吧。 至于寄存器操作的没试过,大家自己依葫芦画瓢吧。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
24条回答
磨剑
1楼-- · 2019-07-21 06:05
八度大神,我还是不懂。在main开头设置中断表偏移量和在systemInit里面设置有什么区别?Reset_Handler会先后调用systemInit和mian,只是时间先后的问题,为什么会有影响呢?
xiaoyan
2楼-- · 2019-07-21 09:07
顶,谢谢分享
八度空间
3楼-- · 2019-07-21 12:27
回复【2楼】xiaoyan:
---------------------------------
谢谢版主!
低调
4楼-- · 2019-07-21 14:37
 精彩回答 2  元偷偷看……
ilikerome
5楼-- · 2019-07-21 17:11

LZ,我在搞nec的v850也遇到此类型的问题。

串口中断进入了bootloader的中断服务函数,导致app功能失常。

 

看了你最后的原因说明,没搞明白,可否指教一下,谢谢了。

八度空间
6楼-- · 2019-07-21 19:28
回复【5楼】ilikerome:
---------------------------------
仔细看下那个加入APP之后的运行流程图

一周热门 更多>