打印
[STM32F1]

中断向量表重映射后,remap的USART1发送不了数据

[复制链接]
1386|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
st316|  楼主 | 2019-4-26 17:49 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 st316 于 2019-4-26 17:59 编辑

Hello,我最近碰到一个非常奇怪的问题,实在没有办法,所以来这里向大家请教。芯片是STM32F101VD。

我有一个应用程序,可以简化看作实现了以下两个功能:
1. LED 周期性闪烁,示意应用程序在跑。
2. 使用 remap 后的USART1(默认是 PA9 和 PA10,remap之后,使用了PB6 和 PB7)收发数据。串口仅使能了 RXNE 中断。

如果不重映射中断向量表,这个应用程序则可以正常工作:LED 周期性闪烁,串口也能正常收发数据。

但是为了实现 IAP 在线升级,我在0x8000000处烧录了一个 bootloader, 所以,上述的应用程序需要进行中断向量表的重映射。(被映射到了 0x8008000处)。

这时,奇怪的事情发生了,现象如下:
1. LED 周期性闪烁,由此可以看出,已经从 bootloader 成功地跳到了应用程序。
2. PC接收不到任何串口发出来的数据。通过仿真我发现,串口可以接收到 PC 发给它的数据,但是串口发送出来的数据,PC收不到。

只要将中断向量的重映射去掉,这个应用程序就能正常工作了。这太奇怪了!

请求大家指点迷津,谢谢!
另外,附上我是如何重映射中断向量表的,看起来没问题啊。

在SystemInit函数之后:
/*    Set the Vector Table base address at 0x08008000        */
        NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x8000 );

在MDK中配置如下:
   

使用特权

评论回复
沙发
sometimesno1| | 2019-4-26 17:58 | 只看该作者
你最好可以确认一下固件有没有被破坏,还有,重映射是否生效了

使用特权

评论回复
板凳
st316|  楼主 | 2019-4-26 18:20 | 只看该作者
刚才冒出一个想法,不是怀疑是由于 remap 而导致 USART1 不能正常工作吗,那没有 remap 过的 USART1 能不能正常工作呢?

于是我赶紧动手试了一下,在中断向量表重映射之后,没有 remap 的USART1 (即使用 PA9 和 PA10) 是可以正常工作的。

我都不相信会有这样的试验结果,于是仔细检查,再重新做了一遍,结果确实如以上所述。

使用特权

评论回复
地板
st316|  楼主 | 2019-4-26 18:22 | 只看该作者
sometimesno1 发表于 2019-4-26 17:58
你最好可以确认一下固件有没有被破坏,还有,重映射是否生效了

让我再仔细检查一下先

使用特权

评论回复
5
yklstudent| | 2019-4-28 07:47 | 只看该作者
boot区用了串口了?

使用特权

评论回复
6
zhuomuniao110| | 2019-4-28 09:21 | 只看该作者
这个项目不重映射没法用?

使用特权

评论回复
7
st316|  楼主 | 2019-4-28 10:04 | 只看该作者
yklstudent 发表于 2019-4-28 07:47
boot区用了串口了?

没有,在 Bootloader 里没有使用串口 USART1。
非常感谢你提醒了我这很重要的一点。

使用特权

评论回复
8
st316|  楼主 | 2019-4-28 10:06 | 只看该作者
zhuomuniao110 发表于 2019-4-28 09:21
这个项目不重映射没法用?

因为要做 IAP 在线升级,所以必须在应用程序里重映射中断向量表啊。

使用特权

评论回复
9
st316|  楼主 | 2019-4-28 10:57 | 只看该作者
本帖最后由 st316 于 2019-4-29 16:27 编辑

非常感谢各位的意见,今早就在我都要怀疑这是不是芯片BUG的时候,各位的思路让我**一闪,问题的根本原因终于找到了。
虽然现在 USART1 是可以正常工作了,但是,目前仍然还有不清楚的地方,如果有兴趣,各位不妨往下接着看。

我手上这个项目是在一个已有产品的代码的基础上做开发。这个成熟的产品,软件分为 Bootloader 和 Application (应用程序)两部分。它的 USART1并没有经过 Remap,即它是使用的 PA9 和 PA10 作为发送和接收。

手头的这个新项目,USART1 被 Remap到了 PB6 和 PB7 上。Remap 一下嘛,在软件上加一两行代码就很轻易地实现了。可是修改过后的 Application,其它功能都正常,唯独 USART1 有问题。

不断地屏蔽 Application 部分的代码,最后只剩下 USART1 的初始化和发送数据了,USART1 依旧发送不出来数据。

花了好长时间,直到看到这篇**(https://blog.csdn.net/xuezhimeng2010/article/details/40506833),对照我的代码一检查,果然,I2C1的时钟也是被一起使能了。可是,此时 USART1依然不能工作。
期间我又使用的官方例程和评估板做了各种各样的测试,另外,因为 Application 跑了系统,我又在这错误的方向上怀疑了好久。

总之,问题的现象就如同我在这个帖子最初描述的那样,如果不重映射中断向量表,一切正常;如果重映射了中断向量表,要想 USART1 能正常工作,就不能对它进行 Remap。

今早就在我都要怀疑是不是芯片BUG的时候,各位的回复给了我灵感,赶紧检查 Bootloader,它里面也把根本就没有使用的 I2C1 的时钟给使能了。

现在USART1 虽然能工作了,但我心里仍然有个问题,如此看来,那在这个新项目里,I2C1 这个外设,我是不是就再也不能够使用它了?



碰巧是的,这个新项目并没有用到 I2C1 这个外设。
但是我猜想,是不是将 I2C1 Remap 过后,然后再打开 I2C1 的时钟,这样就不会影响 Remap 过的 USART1 了?
GPIO_PinRemapConfig(GPIO_Remap_I2C1, ENABLE);


有空再验证,如果有知道的朋友,请告知一下,谢谢!

使用特权

评论回复
10
yklstudent| | 2019-4-28 16:37 | 只看该作者
说了半天就没看懂问题出在哪里,怎么解决的

使用特权

评论回复
11
香水城| | 2019-4-29 14:37 | 只看该作者
提醒下:
1、对于STM32F1来讲,代码从BOOT跳到APP后做中断矢量重映射是合理的;

你现在说跳转后不做重映射运行正常,尤其中断服务程序还运行正常。这个需要你好好确认下,因为即
使是同一中断请求,BOOT区和APP区的中断服务代码一般来说是不一样的;

2、检查下你的启动文件跟你所选择芯片是一致的;

使用特权

评论回复
12
st316|  楼主 | 2019-4-29 16:10 | 只看该作者
yklstudent 发表于 2019-4-28 16:37
说了半天就没看懂问题出在哪里,怎么解决的

因为我回复内容里的超链接被系统给屏蔽了,所以...
https://blog.csdn.net/xuezhimeng2010/article/details/40506833

问题原因:对于 PB6 和 PB7,如果 Remap 作 USART1 使用后,就不能再打开 I2C1 的时钟啦。

在 Application 和 bootloader 里都将 I2C1 的时钟关掉后,我的 USART1  正常工作了。

使用特权

评论回复
13
st316|  楼主 | 2019-4-29 16:24 | 只看该作者
本帖最后由 st316 于 2019-4-29 16:28 编辑
香水城 发表于 2019-4-29 14:37
提醒下:
1、对于STM32F1来讲,代码从BOOT跳到APP后做中断矢量重映射是合理的;

谢谢,问题已经解决啦。

问题原因是, Remap  USART1 到 PB6 和 PB7后,我又使能了 I2C1 的时钟。

最开始是 Application 和 bootloader 里都使能了 I2C1 的时钟。

在我看到这篇**之后(https://blog.csdn.net/xuezhimeng2010/article/details/40506833),我只屏蔽了 Application 里使能 I2C1 时钟的代码,所以 USART1 仍旧不能使用,出现如上文所述的奇怪现象:

-Application 如果不做中断向量表的重映射,即不使用 bootloader,USART1 是可以正常工作的。
原因分析:因为我已经规避了链接**中提到的问题,所以 USART1 可以正常工作了。

-如果 Application 经过中断向量表重映射,即使用 bootloader,USART1 此时是不能正常工作的。
原因分析:因为尽管我在 Application 里规避了链接**中提到的问题(在 Application 中屏蔽了使能 I2C1 时钟的代码),但是,在 Bootloader 里面,I2C1 时钟就已经被使能了。所以此时 USART1 仍旧不能工作。

-如果 Application 经过中断向量表重映射,即使用 bootloader,但不对 USART1 进行 Remap, USART1 是能够正常工作的。
原因分析:由于没有对 USART1 进行 Remap, 那么, USART1 能否正常工作 和 I2C1 时钟是否使能是没有任何关系的。所以此时 USART1 能够正常工作。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

167

帖子

3

粉丝