OpenEdv-开源电子网

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

串口dma输出切换问题,标题要满12字

[复制链接]

83

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1987
金钱
1987
注册时间
2014-7-1
在线时间
188 小时
发表于 2024-8-30 13:21:44 | 显示全部楼层 |阅读模式
1金钱
遇到个奇怪问题,
串口3使用dma每秒输出一串内容,输出正常。
不用dma,独立使用串口3输出一串内容也正常。

想实现dma输出结束后,在独立输出一串内容。
dma输出正常,独立输出一串只有第一次有效(但缺了第一个字符),第二次及之后无输出。
在线仿真设置断点后,第二次又有输出了。dma结束后加入100毫秒延时,输出也正常。
是什么原因哪?

  1. //如果每秒的心跳包发送完成
  2.                                         if(GetDMAState()==1){
  3.                                                 USART3->CR3 &=~(1<<7);           
  4.                                                 //delay_ms(100);
  5.                                                 //发送询问指令,是否采用本次数据
  6.                                                 show_ConfirmResultReply();
  7.                                                 USART3->CR3=1<<7;         
  8.                                         }
复制代码
  1. //得到DMA发送状态
  2. u8 GetDMAState(void)
  3. {
  4.         if((DMA1->ISR&DMA_ISR_TCIF2)==DMA_ISR_TCIF2)//发送完成
  5.         {
  6.                 DMA1->IFCR=DMA1->IFCR|DMA_IFCR_CGIF2;
  7.                 return 1;
  8.         }
  9.         else
  10.         {
  11.                
  12.         }
  13.         return 0;
  14. }
复制代码


最佳答案

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

估计是发快了丢数据了,在DMA发送完成后,while判断等待一下TXE,为1后再独立发数据
做一个相信自己的人
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

881

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4195
金钱
4195
注册时间
2019-9-4
在线时间
881 小时
发表于 2024-8-30 13:21:45 | 显示全部楼层
估计是发快了丢数据了,在DMA发送完成后,while判断等待一下TXE,为1后再独立发数据
回复

使用道具 举报

10

主题

3280

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8182
金钱
8182
注册时间
2020-5-11
在线时间
3694 小时
发表于 2024-8-30 13:43:55 | 显示全部楼层
这种情况,可以用示波器看看:
DMA传输完成时让某个IO翻转,示波器测量这个信号与TXD信号,
看DMA传输完成是代表数据传给了USART_DR?还是代表数据从TXD发送完成?
顺便研究一下TXE、TC标志位的区别。
我猜测是前一种情况,数据传给了USART_DR,若是紧接着又往USART_DR里写数据,那可能就会有一个数据丢失,或产生某种错误。
专治疑难杂症
回复

使用道具 举报

13

主题

102

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
350
金钱
350
注册时间
2018-11-2
在线时间
78 小时
发表于 2024-9-3 14:13:50 | 显示全部楼层
独立输出是啥意思,是普通的阻塞式发送吗?使用DMA串口发送时要等到DMA发送中断来了之后再发新的内容。
回复

使用道具 举报

83

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1987
金钱
1987
注册时间
2014-7-1
在线时间
188 小时
 楼主| 发表于 2024-9-4 09:56:09 | 显示全部楼层
LcwSwust 发表于 2024-8-30 13:43
这种情况,可以用示波器看看:
DMA传输完成时让某个IO翻转,示波器测量这个信号与TXD信号,
看DMA传输完 ...

谢谢,我弄弄。。
做一个相信自己的人
回复

使用道具 举报

83

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1987
金钱
1987
注册时间
2014-7-1
在线时间
188 小时
 楼主| 发表于 2024-9-4 09:58:58 | 显示全部楼层
qinlu123 发表于 2024-9-3 14:13
独立输出是啥意思,是普通的阻塞式发送吗?使用DMA串口发送时要等到DMA发送中断来了之后再发新的内容。

独立输出就是直接用串口发,不用dma,不用dma中断。
//串口3发送一个字节
void send_uart3(u8 u3data)
{
        USART3->DR=u3data;
        while((USART3->SR&0x40)==0);
        USART3->SR &=0x40;
}
做一个相信自己的人
回复

使用道具 举报

13

主题

102

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
350
金钱
350
注册时间
2018-11-2
在线时间
78 小时
发表于 2024-9-4 10:40:25 | 显示全部楼层
shenqihao 发表于 2024-9-4 09:58
独立输出就是直接用串口发,不用dma,不用dma中断。
//串口3发送一个字节
void send_uart3(u8 u3data)
...

我的意思是你在独立输出之前一定要确保DMA发送完了,一般情况下我们会使用一个标志位当DMA发数据时将标志位置1,DMA发送完成中断里将标志位置0,只有标志位为0时才可以继续发新数据。
回复

使用道具 举报

13

主题

102

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
350
金钱
350
注册时间
2018-11-2
在线时间
78 小时
发表于 2024-9-4 10:49:52 | 显示全部楼层
2.PNG 3.PNG
回复

使用道具 举报

83

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1987
金钱
1987
注册时间
2014-7-1
在线时间
188 小时
 楼主| 发表于 2024-9-7 13:52:27 | 显示全部楼层

好的,了解。我dma连发是通过完成状态位判断的。这一句
(DMA1->ISR&DMA_ISR_TCIF2)==DMA_ISR_TCIF2
做一个相信自己的人
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 07:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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