打印
[应用相关]

stm32 usart在DMA模式下只能发送一次

[复制链接]
602|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
雨果喝水|  楼主 | 2022-1-28 17:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AC, DM, ST, ar, DMA, USART

问题描述:使用STM32 cube生成usart2 DMA direct mode(不使用FIFO,normal模式,STM32f407)配置代码,usart2可以使用阻塞方式发送,使用DMA发送则只能发送第一次,复位后还只能发送一次。




使用特权

评论回复
沙发
雨果喝水|  楼主 | 2022-1-28 17:26 | 只看该作者
单步调试发现DMA方式下的发送在发送第一次之后,husart->State 标志变为 HAL_USART_STATE_BUSY就再也不变了。比较直接的解决思路就是在DMA发送中断中给这个标志修改为HAL_USART_STATE_READY,修改之后还是不好用(我认为是可以通过修改多个相关寄存器解决的,但是个人倾向于不深入了解其寄存器,而是用封装度更高的HAL系列函数)。

使用特权

评论回复
板凳
雨果喝水|  楼主 | 2022-1-28 17:27 | 只看该作者
读stm32f4xx_hal_usart.c(V1.5.0)文件的前面关于如何使用HAL函数的部分并与配置代码比较并没有发现问题,但是看stm32f1xx_hal_usart.c(V1.0.0)在同样的位置多了如下文字:

使用特权

评论回复
地板
雨果喝水|  楼主 | 2022-1-28 17:29 | 只看该作者
(+++) Configure the USARTx interrupt priority and enable the NVIC USART IRQ handle
     (used for last byte sending completion detection in DMA non circular mode)

使用特权

评论回复
5
雨果喝水|  楼主 | 2022-1-28 17:30 | 只看该作者
 翻看STM32F4系列早于1.5.0的文件都没有这句,可能是官方的疏忽或者是个人理解不到位,总之增加了USART2中断之后(cube生成的),usart DMA发送是完全正常了。

使用特权

评论回复
6
james03| | 2022-1-28 22:24 | 只看该作者
基于HAL库,USART使用DMA时,如果使用中断则需要开UART和DMA的中断,否则需要查询发送状态后再清除UART和DMA状态位

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

1128

帖子

0

粉丝