OpenEdv-开源电子网

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

串口+DMA+IDLE进行数据接收时遇到的困惑

[复制链接]

3

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2017-11-30
在线时间
23 小时
发表于 2020-6-16 21:50:17 | 显示全部楼层 |阅读模式
1.使用串口接收数据,为什么用串口空闲中断来进行中断,尝试关闭了串口IDLE中断,DMA指向的数组中一直无数据。2.DMA接收到的数据还要读一下寄存器中的值,而不是直接就可以使用。
中断代码
void USART1_IRQHandler(void)                        //串口1中断服务程序
{
        if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
        {
                  USART_ReceiveData(USART1);                                 //读取接收到的数据,对应问题2为什么要读一遍。
               
                  Usart1_Rec_Cnt = DMA_Rec_Len-DMA_GetCurrDataCounter(DMA1_Channel5);        //算出接本帧数据长度
                                //***********帧数据处理函数************//
                        printf ("The lenght:%d\r\n",Usart1_Rec_Cnt);
                        printf ("The data:\r\n");
                        Usart1_Send(DMA_Rece_Buf,Usart1_Rec_Cnt);
                        printf ("\r\nOver! \r\n");
                        //*************************************//
                  USART_ClearITPendingBit(USART1, USART_IT_IDLE);         //清除中断标志
                  MYDMA_Enable(DMA1_Channel5);                   //恢复DMA指针,等待下一次的接收
                       
        }   

}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2022-7-15
在线时间
4 小时
发表于 2022-7-19 15:16:34 | 显示全部楼层
这个应该是用来清除接收完成标志位的,
回复 支持 1 反对 0

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2022-7-19 15:31:54 | 显示全部楼层
1.用空闲中断有个好处就是可以数据不定长,只要DMA缓冲不要超出就可以了.
其他的比如,完成中断等都是需要中断自行处理判断的.

至于你说关闭了IDLE中断无数据,这个基本上需要查下DMA是不是重新启动了,不然没数据是正常的.

2.串口读RX的寄存器如果没用,基本上是为了清理标志位,这是硬件清理的.
回复 支持 反对

使用道具 举报

54

主题

351

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1110
金钱
1110
注册时间
2022-4-20
在线时间
380 小时
发表于 2022-7-22 17:29:36 | 显示全部楼层
问题1:
因为DMA是独自在工作的,你的串口数据来一个它就搬走一个,等到串口没有数据来了,就进入了空闲状态,此时的空闲中断就等于是告诉你“我数据都传完了,你快来看看你要拿这些数据干什么事”,就不会频繁地来一个字节就喊你一次。
问题2:
在中文参考手册的寄存器描述里面有这样一句话“当检测到总线空闲时,该位被硬件置位。如果USART_CR1中的IDLEIE为’1’,则产生中断。由软件序列清除该位(先读USART_SR,然后读USART_DR)。”读值的操作就是为了清除中断标志位。
又菜又爱指点
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-11 04:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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