OpenEdv-开源电子网

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

STM32用DMA发送串口数据提前进中断

[复制链接]

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2015-12-30
在线时间
16 小时
发表于 2016-4-6 15:43:38 | 显示全部楼层 |阅读模式
2金钱
我用的是USART2来发送数据,中断使用的是DMA_ITConfig(DMA1_Channel7,DMA_IT_TC,ENABLE);
可是为什么数据还没有发完就进入中断了!我现在是在中断里加一个延时等他发完,这明显不是我想要的!

最佳答案

查看完整内容[请看2#楼]

In transmission mode, once the DMA has written all the data to be transmitted (the TCIF flag is set in the DMA_ISR register), the TC flag can be monitored to make sure that the USART communication is complete. This is required to avoid corrupting the last transmission before disabling the USART or entering the Stop mode. The software must wait until TC=1. The TC flag remains cleared during all ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2015-12-30
在线时间
16 小时
 楼主| 发表于 2016-4-6 15:43:39 | 显示全部楼层
In transmission mode, once the DMA has written all the data to be transmitted (the TCIF flag is set in the
DMA_ISR register), the TC flag can be monitored to make sure that the USART communication is
complete. This is required to avoid corrupting the last transmission before disabling the USART or
entering the Stop mode. The software must wait until TC=1. The TC flag remains cleared during all data
transfers and it is set by hardware at the last frame’s end of transmission。
原来如此,明白了,谢谢大家!
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-4-6
在线时间
5 小时
发表于 2016-4-6 15:44:52 | 显示全部楼层
是不是时序的问题,我的以前也出现过这种问题,后来我就是加的延时好的
回复

使用道具 举报

14

主题

115

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
358
金钱
358
注册时间
2015-12-19
在线时间
307 小时
发表于 2016-4-6 15:46:41 | 显示全部楼层
初步怀疑你的DMA_ITConfig()函数用到不对,
void DMA_ITConfig(DMA_Stream_TypeDef* DMAy_Streamx, uint32_t DMA_IT, FunctionalState NewState)
这个是函数原型,第一个参数是数据流哎
回复

使用道具 举报

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2015-12-30
在线时间
16 小时
 楼主| 发表于 2016-4-6 15:54:59 | 显示全部楼层
9ack 发表于 2016-4-6 15:44
是不是时序的问题,我的以前也出现过这种问题,后来我就是加的延时好的

不是时序问题,我如果不使用中断,是可以发完的,因为我在中断里关了通道,所以发送一半就不发了!
回复

使用道具 举报

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2015-12-30
在线时间
16 小时
 楼主| 发表于 2016-4-6 15:56:01 | 显示全部楼层
shiqinghai 发表于 2016-4-6 15:46
初步怀疑你的DMA_ITConfig()函数用到不对,
void DMA_ITConfig(DMA_Stream_TypeDef* DMAy_Streamx, uint3 ...

void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState)
我这是V3.5的版本.....
回复

使用道具 举报

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2015-12-30
在线时间
16 小时
 楼主| 发表于 2016-4-6 16:06:58 | 显示全部楼层
yklstudent 发表于 2016-4-6 16:00
你用串口扫描中断来关闭DMA的???

void DMA1_Channel7_IRQHandler(void)
{
         // delay_ms(30);
                DMA_ClearFlag(DMA1_FLAG_TC7);
                DMA_ClearFlag(DMA1_FLAG_TE7);
                DMA_Cmd(DMA1_Channel7,DISABLE);                                 
                USART2_RX;       
}
加上延时发送数据没有问题,可是去掉延时就只能发一半多出去。TC不是发送完成中断吗?
回复

使用道具 举报

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2015-12-30
在线时间
16 小时
 楼主| 发表于 2016-4-7 09:10:52 | 显示全部楼层
yklstudent 发表于 2016-4-6 17:33
你是RS232还是485???

是用的485发送数据的!
回复

使用道具 举报

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2018-5-4
在线时间
13 小时
发表于 2019-5-17 11:18:48 | 显示全部楼层
楼主,您的解决办法是是什么呀  泪奔!!!!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 15:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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