[STM32F4] F407VET6 发送中断完成后, 关中断,最后一个字符不能发出

[复制链接]
712|15
手机看帖
扫描二维码
随时随地手机跟帖
eydj2008|  楼主 | 2021-11-26 10:24 | 显示全部楼层 |阅读模式
也是怪得很,最近移植FREEMASTER到F407VET6上,  (用的UASRT2  波特率115200  如果用9600延时要更久才行)
结果发现用中断方式,  最后一个字节始终不能发出.
发现 仿真是可以发出来的, 一运行 就不行, 那么我在最后一个字节发送完成中断里面加一点DELAY,再关发送中断, 运行没问题了,
最后一个字节能成功发出来.    (发送中断是发送完成后才中断的呀)
但是我不能这样用啊 在中断加一点DELAY
怪怪的问题,  
各路大侠 有碰到这种奇葩的问题吗?

使用特权

评论回复
james03| | 2021-11-26 10:42 | 显示全部楼层
要用发送完成中断

使用特权

评论回复

评论

james03 2021-11-29 11:28 回复TA
@eydj2008 :不客气,就是趟过的坑多一些 
eydj2008 2021-11-26 15:10 回复TA
谢谢大神 
香水城| | 2021-11-26 10:57 | 显示全部楼层
本帖最后由 香水城 于 2021-11-29 22:59 编辑

你现在是基于TXE事件进的中断,此时关闭可能导致数据还没完全发送完毕。
你可以查看下UART收发的那个框图。

其实也可以不要加延时,你可以查询下TC标志,如果该标志置位后就进行关闭。

使用特权

评论回复

评论

eydj2008 2021-11-26 15:39 回复TA
1楼是大神 结果移植的时候 真的用的 发送空中断 进中断后TC一直为1 也说发送完成了的, 用Bit 6 TCIE: Transmission complete interrupt enable 就行了, 我一直以为是TC完成中断 哎... 
eydj2008|  楼主 | 2021-11-26 13:39 | 显示全部楼层
香水城 发表于 2021-11-26 10:57
你现在是基于TXE事件进的中断,此时关闭可能导致数据还没完全发送完毕。
你可以查看下UART收发的那个框图。 ...

TC标志 没有置1  不会产生完成中断吧 ,
我尝试过 TC早被置1了 没用
本来就是发送完成中断, 所以最后一个字符也会再产生一次中断,  这个时候已经不发送任何数据了.

使用特权

评论回复
呐咯密密| | 2021-11-26 15:48 | 显示全部楼层
贴一下代码可以不

使用特权

评论回复

评论

eydj2008 2021-12-12 18:21 回复TA
就是一楼说的 配置的时候一定要用发送完成中断 ,而不是发送空中断 ,因为发送有二个中断, 空中断进入 TC也是为1的 结果 我以为是发送完成中断了. 
jgp886585| | 2021-11-26 15:50 | 显示全部楼层
如果用的是HAL库的,直接去callback函数里关就完事了,其他的你就需要读状态标志判断是否完成

使用特权

评论回复

评论

eydj2008 2021-12-12 18:22 回复TA
FREEMASTER 有做好的通用驱动 所以就没用HAL库 
香水城| | 2021-11-26 17:35 | 显示全部楼层
eydj2008 发表于 2021-11-26 13:39
TC标志 没有置1  不会产生完成中断吧 ,
我尝试过 TC早被置1了 没用
本来就是发送完成中断, 所以最后一个 ...

uart发送中断 有基于TXE和TC事件,如果基于TXE进入中断就可能发生你现在的情况,
你如果是基于TC事件进入的中断就应该不会。

使用特权

评论回复
m564522634| | 2021-11-26 18:12 | 显示全部楼层
这不是机奇拔问题呀,你空的判断 有问题呀, 有两种空一种是FIFO缓冲空,别个一个写入发送寄存器空,你明显判断了发送缓冲空关的中断,导致最后一个字节无法生产中断发送出去了

使用特权

评论回复

评论

eydj2008 2021-12-12 18:23 回复TA
就是 .... 
yizushijie| | 2021-11-27 08:31 | 显示全部楼层
txe中断,不代表数据发送完成。tc中断,才是发送完成。

使用特权

评论回复
香水城| | 2021-12-13 11:35 | 显示全部楼层

使用特权

评论回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则