[应用相关] stm32 usart在DMA模式下只能发送一次

[复制链接]
 楼主| 雨果喝水 发表于 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 | 显示全部楼层
  1. (+++) Configure the USARTx interrupt priority and enable the NVIC USART IRQ handle
  2.      (used for last byte sending completion detection in DMA non circular mode)
 楼主| 雨果喝水 发表于 2022-1-28 17:30 | 显示全部楼层
 翻看STM32F4系列早于1.5.0的文件都没有这句,可能是官方的疏忽或者是个人理解不到位,总之增加了USART2中断之后(cube生成的),usart DMA发送是完全正常了。
james03 发表于 2022-1-28 22:24 | 显示全部楼层
基于HAL库,USART使用DMA时,如果使用中断则需要开UART和DMA的中断,否则需要查询发送状态后再清除UART和DMA状态位
您需要登录后才可以回帖 登录 | 注册

本版积分规则

90

主题

1213

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部