OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 30518|回复: 32

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

[复制链接]

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-3-17 12:43:09 | 显示全部楼层 |阅读模式

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


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

的确是乱套了,不过还是有解决办法的。下面为大家演示一下:(可以用我这个DFU功能http://www.openedv.com/posts/list/28532.htm或者原子战舰光盘的例程:实验48 串口IAP实验)
使用的资源:

1ST官方库函数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设备。是不是       意味着就不能这样用了呢??


第四、这时我们就看看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红色LED指示(试过想在LCD上显示字符来的,加   了LCD显示字符语句电脑识别设备失败,具体原因可能显示字符时间太长了)


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


      图中红色框框中显示的是进入了DFU模式
      
图中蓝色框框红色LED点亮,说明进入的是Bootloader中的USB唤醒中断服务函数。

第六、USB读卡器程序中,USB唤醒中断服务函数增加LED1蓝色LED指示


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


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


      图中红色框框显示了USB读卡器实验
      
图中蓝色框框是读取到了TF卡(我用的)的容量信息

第九、这时插上USB线连接电脑,板子上显示如下界面


      图中红色框框显示USB读卡器模式,已经连接上电脑

      图中蓝色框框显示的蓝色LED点亮,说明已经进入USB读卡器的USB唤醒中断服务函数了。(前面我       的Bootloader程序中的USB唤醒中断也点了灯的,红色不亮

第十、电脑上已经正常识别到了STM32开发板上的USB读卡器了,电脑进去,双击打开可移动磁盘,里面内容


第十一、看到TF的内容了,说明已经成功了,可以进行读、写、删除等操作尝试。

第十二、不相信的话可以用读卡器将你开发板上的TF卡在电脑上看下里面的内容


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


然后再看下面的代码


完全汇编,是不是看不懂呢???结合前面的图53.1.2来看下就知道什么意思了,呵呵,自己琢磨一下吧。

至于寄存器操作的没试过,大家自己依葫芦画瓢吧。。。

现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2015-1-28
在线时间
8 小时
发表于 2015-9-23 14:27:29 | 显示全部楼层
八度大神,我还是不懂。在main开头设置中断表偏移量和在systemInit里面设置有什么区别?Reset_Handler会先后调用systemInit和mian,只是时间先后的问题,为什么会有影响呢?
持续而安静地投入
回复 支持 0 反对 1

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2014-3-17 14:20:49 | 显示全部楼层
顶,谢谢分享
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2014-3-17 14:33:33 | 显示全部楼层
回复【2楼】xiaoyan:
---------------------------------
谢谢版主!
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2013-11-19
在线时间
0 小时
发表于 2014-6-25 17:26:30 | 显示全部楼层
要不要这么厉害!楼主膜拜呀!
我也要开始搞DFU啦!
回复 支持 反对

使用道具 举报

25

主题

163

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
443
金钱
443
注册时间
2012-4-29
在线时间
38 小时
发表于 2015-6-30 12:24:11 | 显示全部楼层

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

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

 

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

回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2015-6-30 21:52:38 | 显示全部楼层
回复【5楼】ilikerome:
---------------------------------
仔细看下那个加入APP之后的运行流程图
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

25

主题

163

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
443
金钱
443
注册时间
2012-4-29
在线时间
38 小时
发表于 2015-7-1 10:36:25 | 显示全部楼层
回复【6楼】八度空间:
---------------------------------
真心没看懂,大侠。
我在bootloader中把串口发送干掉,app里面的中断就可以正常执行了。不知道咋回事。
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2015-7-1 21:51:17 | 显示全部楼层
回复【7楼】ilikerome:
---------------------------------
记得我的例程里两边有有串口初始化的,你的BOOTLOADER中串口用到中断吧,如果你的APP中断偏移了,两者都有中断是不影响的
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

4

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2015-7-16
在线时间
29 小时
发表于 2015-7-21 13:36:17 | 显示全部楼层
大神,一路追随着你到这里,如果直接使用原子哥的寄存器源码通过DFU下载的话,可以修改sys.c中的参数
[mw_shl_code=c,true]void MYRCC_DeInit(void) { RCC->APB1RSTR = 0x00000000;//?????á?? RCC->APB2RSTR = 0x00000000; RCC->AHBENR = 0x00000014; //??????????????SRAM?±??????.??????±?. RCC->APB2ENR = 0x00000000; //???è?±????±?. RCC->APB1ENR = 0x00000000; RCC->CR |= 0x00000001; //?????????????±??HSION RCC->CFGR &= 0xF8FF0000; //????SW[1:0],HPRE[3:0],PPRE1[2:0],PPRE2[2:0],ADCPRE[1:0],MCO[2:0] RCC->CR &= 0xFEF6FFFF; //????HSEON,CSSON,PLLON RCC->CR &= 0xFFFBFFFF; //????HSEBYP RCC->CFGR &= 0xFF80FFFF; //????PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE RCC->CIR = 0x00000000; //??±??ù?????? //?????ò??±í #ifdef VECT_TAB_RAM MY_NVIC_SetVectorTable(0x20000000, 0x0); #else MY_NVIC_SetVectorTable(0x08000000,0x0); }[/mw_shl_code]


和你修改的异曲同工,只要把最后一行的0x0改成偏移地址就行了。这里不得不佩服原子哥的强大,已经帮我们想到了这个,之前头疼的问题一下就解决了
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2015-7-22 21:37:48 | 显示全部楼层
回复【9楼】兜兜里缺钱:
---------------------------------
原子哥大牛不得不佩服,呵呵
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2015-9-25 08:15:46 | 显示全部楼层
回复【11楼】磨剑:
---------------------------------
这个没怎么研究,都没时间搞这些了
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2013-9-1
在线时间
0 小时
发表于 2015-11-14 14:03:24 | 显示全部楼层
把中断偏移放在main函数和SystemInit函数中理论上是没有区别的,我觉得楼主出现这种问题可能是在main函数中设置偏移量后又调用了一遍SystemInit(),结果把偏移量设回去了。
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2015-11-14 16:48:59 | 显示全部楼层
回复【13楼】转身落在清明上:
---------------------------------
systeminit函数是启动代码中调用的
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2014-4-5
在线时间
12 小时
发表于 2016-5-17 16:00:53 | 显示全部楼层
感谢分享!!!!!!!!!!!!!!
回复 支持 反对

使用道具 举报

15

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
307
金钱
307
注册时间
2013-11-4
在线时间
112 小时
发表于 2016-8-1 12:04:44 | 显示全部楼层
刚好用到,多谢楼主分享
回复 支持 反对

使用道具 举报

38

主题

109

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2014-8-1
在线时间
6 小时
发表于 2016-9-6 16:28:23 | 显示全部楼层
响应IAP中断中的中断,极大可能就是APP中断向量表没有设置好
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2016-9-7 08:48:30 | 显示全部楼层
静 发表于 2016-9-6 16:28
响应IAP中断中的中断,极大可能就是APP中断向量表没有设置好

是的,需要跳转
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

8

主题

550

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2861
金钱
2861
注册时间
2016-5-13
在线时间
180 小时
发表于 2016-9-7 09:11:31 | 显示全部楼层
多谢楼主分享
虽然不明白你们在说什么,但感觉很厉害的样子。
回复 支持 反对

使用道具 举报

28

主题

218

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
498
金钱
498
注册时间
2013-11-19
在线时间
92 小时
发表于 2016-11-17 20:20:16 | 显示全部楼层
学习分享,很棒
回复 支持 反对

使用道具 举报

18

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
465
金钱
465
注册时间
2016-1-20
在线时间
89 小时
发表于 2017-8-8 09:57:39 | 显示全部楼层
查眼                                            
回复 支持 反对

使用道具 举报

2

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2018-6-25
在线时间
11 小时
发表于 2018-9-20 22:04:37 | 显示全部楼层
MArk   
回复 支持 反对

使用道具 举报

2

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2014-3-25
在线时间
16 小时
发表于 2018-10-30 10:18:02 | 显示全部楼层
IAP和APP中都用到了串口3,现在遇到的情况是从IAP跳转到APP以后,感觉其它功能都没正常初始化,就串口还不停发送东西。。。照你说的,把SystemInit()最后那边偏移地址改了,貌似还是一样现象,IAP和APP程序只要在魔法棒里面分别设置好了对应flash地址,分别下载进去就可以了吧?还是一定要把它们两个合并一起用jflash下载??
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2018-10-31 22:34:41 | 显示全部楼层
seupenn 发表于 2018-10-30 10:18
IAP和APP中都用到了串口3,现在遇到的情况是从IAP跳转到APP以后,感觉其它功能都没正常初始化,就串口还不 ...

IAR要修改icf文件中的define symbol __ICFEDIT_region_ROM_start__    = 0x08000000;
这个地址,最好是使用外部的这个icf在标准库里边有这个文件
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

2

主题

474

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6252
金钱
6252
注册时间
2018-6-27
在线时间
534 小时
发表于 2019-1-23 08:29:12 | 显示全部楼层
学习学习,学习学习。
回复 支持 反对

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2099
金钱
2099
注册时间
2017-2-11
在线时间
306 小时
发表于 2020-1-17 09:22:15 | 显示全部楼层

楼主能分享一下F407的  DFU代码吗?我也想了解一下
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2020-2-5 13:49:08 | 显示全部楼层
jiangyy 发表于 2020-1-17 09:22
楼主能分享一下F407的  DFU代码吗?我也想了解一下

跟这个差不多,参考移植就可以了
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2020-3-13
在线时间
13 小时
发表于 2020-5-9 09:39:45 | 显示全部楼层
八度空间 发表于 2020-2-5 13:49
跟这个差不多,参考移植就可以了

八度大神,我参照你的代码在103ZET6上进行了DFU移植,发现APP程序好后,换一个APP程序就不能成功了。但是DfeseDemo提示市=是成功的,复位后APP程序是上次烧的,而不是本次烧的
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2020-5-20 15:14:39 | 显示全部楼层
ying214329 发表于 2020-5-9 09:39
八度大神,我参照你的代码在103ZET6上进行了DFU移植,发现APP程序好后,换一个APP程序就不能成功了。但是 ...

没遇到这种情况喔,是不是什么地方没移植好
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

0

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2019-5-2
在线时间
26 小时
发表于 2020-6-26 16:06:22 | 显示全部楼层
IAP完成后,清理一下USB相关的寄存器就好了,,然后在进入APP
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2020-7-16 08:52:02 | 显示全部楼层
单片机爱好者666 发表于 2020-6-26 16:06
IAP完成后,清理一下USB相关的寄存器就好了,,然后在进入APP

直接复位了事,全部都清除了
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

0

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2019-5-2
在线时间
26 小时
发表于 2020-10-30 21:47:12 | 显示全部楼层
八度空间 发表于 2020-7-16 08:52
直接复位了事,全部都清除了

直接复位又进到IAP boot了,,
回复 支持 反对

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2015-10-29
在线时间
25 小时
发表于 2021-11-4 10:10:01 | 显示全部楼层
如果IAP中用到了中断,最好把总中断关闭,在APP初始化完毕后在打开,不然可能会出错。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 04:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表