freertos串口DMA队列发送卡死

调试回调函数的时候,我在cube中删除了默认的DMA通道,又新增了另外一个通道,导致NVIC中,该通道的优先级为0,后来改成了5就正常了。

另外在调试过程中,发现9字节的缓冲区每次只能接收到4个或5个字节,搞了一天时间,发现回调函数里的标志位写错了,我用的是normal模式。

我是像下面这样写的:

 HAL_UARTEx_ReceiveToIdle_DMA(&huart1, (uint8_t*) msg_in.Buf, 9);

__HAL_DMA_DISABLE_IT(&hdma_usart1_rx, DMA_IT_TC);

网上抄来的代码,DMA_IT_TC是接收完成中断,一直理解为上面一行代码清除中断标志位,现在发现这是禁止传输完成中断位,又获悉到HAL_UARTEx_RxEventCallback();回调函数不仅在传输完成时调用,缓冲区半满的时候也会调用(踩坑),所以才出现了只接收一半数据的情况。

改为

 HAL_UARTEx_ReceiveToIdle_DMA(&huart1, (uint8_t*) msg_in.Buf, 9);

__HAL_DMA_DISABLE_IT(&hdma_usart1_rx, DMA_IT_HT);

也就是禁用半传输中断,问题解决。

在使用FreeRTOS串口DMA队列进行数据处理时,可以采用DMA双缓存的方式来提高数据接收效率。通过开启DMA环形接收数据模式,并触发接收数据中断,将接收到的数据的偏移量与长度入队。然后使用出队函数来处理数据。这种方式可以保证任务的流畅处理,并且减少了频繁关闭/开启DMA接收对数据接收效率的影响。\[1\] 在串口DMA发送数据方面,可以使用DMA发送数据的函数来实现。首先,判断数据的大小,如果大小超过1024,则只发送1024个字节。然后,使用DMA发送数据,将数据拷贝到发送缓冲区中,并设置DMA的传输长度。最后,启用DMA通道来发送数据。\[2\] 总结来说,使用DMA双缓存的方式可以提高数据接收效率,而使用DMA发送数据可以实现快速的数据发送。这些方法可以在处理大量数据的应用场景中发挥重要作用。\[3\] #### 引用[.reference_title] - *1* [[转]STM32 串口传输处理方式 FreeRTOS+队列+DMA+IDLE (二)](https://blog.youkuaiyun.com/xuanjianqiang/article/details/123083865)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [2.13 STM32 串口传输最佳处理方式 FreeRTOS+队列+DMA+IDLE (一)](https://blog.youkuaiyun.com/oDuanYanGuHong/article/details/100574302)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [STM32F429+FreeRTOS队列 串口DMA双缓存数据接收](https://blog.youkuaiyun.com/freedompoi/article/details/122350866)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值