野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10503|回复: 0

DMA—UART的代码应该怎么设计是最优解?

[复制链接]
发表于 2020-4-13 11:05:51 | 显示全部楼层 |阅读模式
先说下我的理解:

DMA收:
利用的中断是串口总线空闲中断。
DMA在后台(理解上的后台)搬运数据到缓存,当触发总线空闲中断,在中断中取出缓存的数据,这样就实现了按帧处理串口数据,也叫不定长度接收。

__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
HAL_UART_Receive_DMA(&huart1, rec_buff, BUFF_SIZE_REC);


整个架构是:
1.设置串口中断+DMA接收。
2.对端发送完成后,串口空闲会触发IDLE中断,进入中断后,从缓存取数据
3.在IDLE中断函数中,重设中断,重新开启DMA收。

---------------------------------------------------------------------------------------------------------------------------------

DMA发:
利用的中断是DMA的TC(发送完成)中断
相对于HAL_UART_Transmit的发送堵塞,发送完函数返回不同的是,DMA发送返回快
相当于是把缓存地址告诉DMA,DMA自行发送,发送完成后进入TC中断。

HAL_UART_Transmit_DMA
上述这个函数内部开启了UART_IT_TC


整个架构是:
1.设置DMA TC中断,在需要发送的时候调用DMA发送。
2.DMA发送完成,会进入DMA TC中断,表示发送完成。
3.在中断中重设DMA发送。

请问一下:
1.我上述的理解对吗?
2.为什么接收是用串口的IDLE中断,而发送是用的DMA的TC中断?有没有适用于DMA的接受中断?(我在手册上没有看到合适的寄存器,真的没有嘛?)
3.idle中断进入的标志是对端发送停止吗?我方持续发送,是否会影响这个IDLE?

回复

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-28 01:23 , Processed in 0.033583 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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