打印
[STM32F1]

真是没天理......

[复制链接]
2420|29
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
西门看雪|  楼主 | 2015-5-31 22:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[STM32F103CB]

使用ST的固件库 3.5.0


有没有发现,USART1 接收中断和发送中断只能用一个啊?!!


如果 USART 接收中断和发送中断 同时使能的话,只能进发送中断,进不了接收中断啊,有木有?


把发送中断使能关了,立马就可以正常进入接收中断了!!


没天理啊~~~有没有大神,可以解决这个问题?


这到底是STM32 MCU硬件的bug还是固件库的bug?还是程序写错了,或者它本来就是如此??


沙发
yklstudent| | 2015-5-31 23:20 | 只看该作者
直观MCU硬件应该没这么傻,多半是自己的代码问题,但库文件问题也还是有可能的

使用特权

评论回复
板凳
西门看雪|  楼主 | 2015-6-1 00:54 | 只看该作者
yklstudent 发表于 2015-5-31 23:20
直观MCU硬件应该没这么傻,多半是自己的代码问题,但库文件问题也还是有可能的 ...

为了这个破事已经玩儿了大半天了,目前已经找到解决方法,原因未明。

以下猜测未经验证:

大约是 STM32 MCU 的硬件太吊,我等无法用常人的思维去理解。

当你使能发送中断之后,并不是每次你调用发送函数USART_SendData(USARTxx, SendData);就会产生一个发送中断的。

使用特权

评论回复
地板
huarana| | 2015-6-1 11:40 | 只看该作者
囧,发送有两个中断 一个是发送完成中断 一个是寄存器为空中断

使用特权

评论回复
5
wind~风| | 2015-6-1 12:23 | 只看该作者
优先级设置不当的问题

使用特权

评论回复
6
西门看雪|  楼主 | 2015-6-1 12:27 | 只看该作者
huarana 发表于 2015-6-1 11:40
囧,发送有两个中断 一个是发送完成中断 一个是寄存器为空中断

TXE,应该是寄存器为空中断吧。

使用特权

评论回复
7
coslight| | 2015-6-1 12:34 | 只看该作者
你的通讯协议是不是搞得太复杂了,导致收发没有时隙啊,再加上中断优先级的配置,才会出现这种现象,个人猜测

使用特权

评论回复
8
西门看雪|  楼主 | 2015-6-1 12:34 | 只看该作者
wind~风 发表于 2015-6-1 12:23
优先级设置不当的问题

这个应该和优先级设置没什么关系吧?如果在初始化(串口)的时候使能发送中断,然后在main中发送数据,你就会发现,数据发送完成之后,竟然不会产生发送完成中断!

使用特权

评论回复
9
wind~风| | 2015-6-1 16:57 | 只看该作者
西门看雪 发表于 2015-6-1 12:34
这个应该和优先级设置没什么关系吧?如果在初始化(串口)的时候使能发送中断,然后在main中发送数据,你 ...

如果在发生这个中断的同时发生了一个更高优先级的中断,你这个就会被屏蔽,根本就看不到

使用特权

评论回复
10
error_dan| | 2015-6-1 18:22 | 只看该作者
官方给的例子里有,自己找哪里不对.肯定是你程序问题.

使用特权

评论回复
11
mmuuss586| | 2015-6-1 18:39 | 只看该作者

应该是你程序问题;

程序跟踪下,看下中断的寄存器是否正确;

使用特权

评论回复
12
diweo| | 2015-6-1 19:48 | 只看该作者
wind~风 发表于 2015-6-1 16:57
如果在发生这个中断的同时发生了一个更高优先级的中断,你这个就会被屏蔽,根本就看不到 ...

不会看不到,只不过高优先级先响应,等它中断函数退出后,会快速响应低优先级中断。

使用特权

评论回复
13
戈卫东| | 2015-6-1 20:17 | 只看该作者
TXE在没有数据要发送的时候都是要禁止的。
如果没有数据的时候允许TXE那么将会不停地进入TXE中断。
错误的用法当然无法得到良好的结果。

使用特权

评论回复
14
wind~风| | 2015-6-1 21:08 | 只看该作者
diweo 发表于 2015-6-1 19:48
不会看不到,只不过高优先级先响应,等它中断函数退出后,会快速响应低优先级中断。 ...

但是高优先级退出后,低优先级中断可能已经结束了

使用特权

评论回复
15
玄德| | 2015-6-1 22:32 | 只看该作者

对于串口之类慢速设备,从来只用查询,不用中断。

几万行的程序,我最多开 1 ~ 2 个中断。


使用特权

评论回复
16
zh113214| | 2015-6-1 23:03 | 只看该作者
对此,我一点都不懂,学习了,增长了不少知识.

使用特权

评论回复
17
西门看雪|  楼主 | 2015-6-2 00:26 | 只看该作者
戈卫东 发表于 2015-6-1 20:17
TXE在没有数据要发送的时候都是要禁止的。
如果没有数据的时候允许TXE那么将会不停地进入TXE中断。
错误的 ...

差不多,不过不完全对。

使用特权

评论回复
评论
xl1736 2015-6-2 01:30 回复TA
你什么应用要用到发送中断??? 
18
戈卫东| | 2015-6-2 02:44 | 只看该作者
西门看雪 发表于 2015-6-2 00:26
差不多,不过不完全对。

噗。。。。。。。。。。。怎么可能不完全对。。。。。。。。。。。。

使用特权

评论回复
19
diweo| | 2015-6-2 08:21 | 只看该作者
wind~风 发表于 2015-6-1 21:08
但是高优先级退出后,低优先级中断可能已经结束了

低优先级中断会悬起,等高优先级中断退出后,会继续处理低优先级中断.而且是"咬尾"机制,所以是快速响应.
建议你看看<<CM3权威指南>>第9章

使用特权

评论回复
20
西门看雪|  楼主 | 2015-6-2 09:55 | 只看该作者
戈卫东 发表于 2015-6-1 20:17
TXE在没有数据要发送的时候都是要禁止的。
如果没有数据的时候允许TXE那么将会不停地进入TXE中断。
错误的 ...

第一句近似对的,剩下的估计就是乱说一通的了,不信你就去验证一下,看看会不会不停地进入TXE中断?

使用特权

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

本版积分规则

个人签名:……

87

主题

3000

帖子

4

粉丝