OpenEdv-开源电子网

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

DMA通信读取UART接收值的问题

[复制链接]

3

主题

9

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-3-20
在线时间
9 小时
发表于 2016-4-4 15:59:55 | 显示全部楼层 |阅读模式
1金钱
用DMA读取串口接收值(外设到内存,把UART->DR读取到自己定义的一个数组)时,设置DMA_InitStructure.DMA_BufferSize = 8是什么意思?网上很多人说这就代表读取8个字节的数据之后完成DMA,然后进入TC中断(TCIF已经置位)。但是大家都知道DMA读取寄存器的速度要远远大于串口通信的速度,那么这八次读取会不会出现因为串口太慢来不及更新DR而导致读取的八个值都一样的情况?还是说只有在串口的DR更新之后才会发送DMA请求继而把串口接收到的字节写入内存?

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

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11521
金钱
11521
注册时间
2014-4-1
在线时间
1310 小时
发表于 2016-4-4 16:04:54 | 显示全部楼层

后面的情况,
必须接收成功,再触发DMA。


回复

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-3-20
在线时间
9 小时
 楼主| 发表于 2016-4-4 16:06:39 | 显示全部楼层
xuande 发表于 2016-4-4 16:04
后面的情况,
必须接收成功,再触发DMA。

您的意思是说只有当串口接收数据成功也就是说数据已经更新了才会触发DMA请求吗?
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11521
金钱
11521
注册时间
2014-4-1
在线时间
1310 小时
发表于 2016-4-4 16:08:51 | 显示全部楼层
静水k深流 发表于 2016-4-4 16:06
您的意思是说只有当串口接收数据成功也就是说数据已经更新了才会触发DMA请求吗?


对,要设置成这样。


回复

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-3-20
在线时间
9 小时
 楼主| 发表于 2016-4-4 16:22:34 | 显示全部楼层
xuande 发表于 2016-4-4 16:08
对,要设置成这样。

C:\Users\Administrator\Desktop
回复

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-3-20
在线时间
9 小时
 楼主| 发表于 2016-4-4 16:27:00 | 显示全部楼层
xuande 发表于 2016-4-4 16:08
对,要设置成这样。

为什么我把DMA设置成普通模式不循环,然后用串口给单片机发送01 02 03这三个字节,在DMA的TC中断服务函数里面打印USART_RX_BUF[0],USART_RX_BUF[1],USART_RX_BUF[2]也就是想把01 02 03打印出来(设置buffersize为3),结果确实打印出来了01 02 03但是打印完一次01 02 03之后仍然继续不停打印03,如果我只发送一次01 02 03难道不应该只进入一次TC中断吗?

这是中断服务程序

void DMA2_Stream7_IRQHandler(void)
{
        if(DMA_GetFlagStatus(DMA2_Stream7,DMA_FLAG_TCIF7) != RESET)
        {               
                DMA_ClearFlag(DMA2_Stream7,DMA_FLAG_TCIF7);
                DMA_ClearITPendingBit(DMA2_Stream7, DMA_IT_TCIF7);

                USART_SendData(USART1,USART_RX_BUF[0]);               
                USART_SendData(USART1,USART_RX_BUF[1]);
                USART_SendData(USART1,USART_RX_BUF[2]);

        }
       
        MYDMA_Enable(DMA2_Stream7,SEND_BUF_SIZE);   

回复

使用道具 举报

18

主题

50

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1881
金钱
1881
注册时间
2017-10-8
在线时间
228 小时
发表于 2018-3-12 22:11:41 | 显示全部楼层
楼主,可以把代码分享一下吗?感谢您。这个从外设到内存的传输过程中,内存的地址到底是什么呢?是不是你定义的数组就作为内存的地址啊?我一直在疑惑这个问题,而且您的那个外设是从哪里接受到的数据啊?是不是另一个单片机啊
回复

使用道具 举报

82

主题

589

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1255
金钱
1255
注册时间
2017-11-18
在线时间
296 小时
发表于 2018-3-13 08:33:00 | 显示全部楼层
天耀中华 发表于 2018-3-12 22:11
楼主,可以把代码分享一下吗?感谢您。这个从外设到内存的传输过程中,内存的地址到底是什么呢?是不是你定 ...

外设到内存的传输,定义的数组名就是内存的地址
没有脑袋
回复

使用道具 举报

82

主题

589

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1255
金钱
1255
注册时间
2017-11-18
在线时间
296 小时
发表于 2018-3-13 08:34:02 | 显示全部楼层
静水k深流 发表于 2016-4-4 16:27
为什么我把DMA设置成普通模式不循环,然后用串口给单片机发送01 02 03这三个字节,在DMA的TC中断服务函数 ...

清除DMA传输完成标志试试
没有脑袋
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-29 23:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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