专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
IAP升级程序中Bootloader和APP程序中断复用的解决办法
2019-07-21 05:39
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
6865
24
1374
菜鸟级别(像我这样的),高手可以给予我们菜鸟一族指点指点或者
点击叉叉离开
相信大家在实现了
STM32
的
USB_DFU或者原子的串口
升级
APP
程序,因为
Bootloader
程序中用到了
USB
的相关中断,在
APP
程序中同样也用到了相同的中断,这时是不是就乱套了呢?
的确是乱套了,不过还是有解决办法的。下面为大家演示一下:(可以用我这个DFU功能
http://www.openedv.com/posts/list/28532.htm
或者原子战舰光盘的例程:实验48 串口IAP实验)
使用的资源:
1
、
ST
官方库函数
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
这个中断向 量表地址去提取相关的中断服务函数执行,问题就来了,在这个地址存放的是
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
红 {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-22 13:47
回复【13楼】转身落在清明上:
---------------------------------
systeminit函数是启动代码中调用的
加载中...
传说小松松
2楼-- · 2019-07-22 14:41
精彩回答 2 元偷偷看……
加载中...
一棵葱
3楼-- · 2019-07-22 18:33
刚好用到,多谢楼主分享
加载中...
静
4楼-- · 2019-07-22 18:41
响应IAP中断中的中断,极大可能就是APP中断向量表没有设置好
加载中...
八度空间
5楼-- · 2019-07-22 21:30
静 发表于 2016-9-6 16:28
响应IAP中断中的中断,极大可能就是APP中断向量表没有设置好
是的,需要跳转
加载中...
电脑小白
6楼-- · 2019-07-23 01:05
多谢楼主分享
加载中...
上一页
1
2
3
4
下一页
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
STM32开发板免费用活动
7 个回答
stm32 处理 DHT11占用太多时间,大家程序是怎么设计的
8 个回答
分享一个STM32单片机做的离线编程器代码
9 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
---------------------------------
systeminit函数是启动代码中调用的
是的,需要跳转
一周热门 更多>