UART DMA串口收发记录

如果想要参考我的工程和代码可以给我留言

用CUBE MX生成了工程,我用的是Keil5.25。配置如下:

遇到的几个问题:

  1. 使用DMA接收数据,不进中断回调函数:能够进USART3 中断,如果将回调函数中的内容写在串口中断里,就可以处理中断,但是如果放在单独的回调函数里,就进不去HAL_UART_RxCpltCallback,这个令我很苦恼。
  2. 如果HAL_UART_Receive_DMA(&huart3, (u8*)receive_buff, BLE_DATA_LEN);这个函数中的BLE_DATA_LEN == 1,就能够收到完成的数据,如果大于1就只能收到第一个数据;
  3. HAL_UART_Transmit 和HAL_UART_Transmit_IT都可以将数据发送出去,但是HAL_UART_Transmit_DMA不能发送数据,一直返回tx_busy.

苦恼了一个下午,晚上请教了高人,将这些问题一一解决:

  1. 首先解决的是第2个问题,有人已经在CSDN上发布了答案,我自己找到了,具体看链接:(5条消息) 解决串口开启DMA接受却只能接收到第一个字节之后就再也接受不到数据的问题_love421的博客-CSDN博客_串口dma接收不到数据icon-default.png?t=M4ADhttps://blog.csdn.net/qq_37449342/article/details/111301536?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-1-111301536-blog-90612609.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-1-111301536-blog-90612609.pc_relevant_default&utm_relevant_index=2

在启动DMA接收和中断中使用过程中,HAL_UART_Receive_DMA(&huart3, (u8*)receive_buff, BLE_DATA_LEN),这个BLE_DATA_LEN长度要保持一致,另外,并且要在串口初始化之后开启,中间不要有延时。

  1. 回答第一个问题,在串口初始化之后,很多网上的教程会把 这4句话其中的一部分或者全部放到MX_USART3_UART_Init初始化函数中,这个有点多余,因为HAL_UART_Receive_DMA这个函数中已经打开了前面三个的中断,所以只保留最后一个就可以了。

HAL_UART_Receive_IT(&huart3, (u8 *)receive_buff, BLE_DATA_LEN);

__HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);

__HAL_UART_ENABLE_IT(&huart3, UART_IT_RXNE);

HAL_UART_Receive_DMA(&huart3, (u8*)receive_buff, BLE_DATA_LEN);

开启了DMA之后,中断进去的应该是DMA中断处理函数 DMA1_Stream1_IRQHandler,这里面的中断处理函数HAL_DMA_IRQHandler会在接收完成设定长度的数据后调用回调函数HAL_UART_RxCpltCallback,在这里完成数据处理即可。这时候也会进入到对应的串口中断,但是不会调用回调函数。

这里不进回调函数是令我最苦恼的,请教了原厂的支持后,带我梳理了一遍MX的配置:建议将DMA开启时钟的时间和系统时钟临近,这样早点开启DMA时钟。经过几轮折腾,终于都实现了,也能用DMA发数据了。

这也是今天学到的技能,原来main中外设的初始化顺序是可以在ADVANCED SETTING中进行修改顺序的,右上角的那两个不起眼的箭头就是干这个用的。

 

明后天开始折腾CAN和其它的串口,项目中一共用到了3个串口,加油干!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值