STM32Cube 串口DMA发送问题

本文解决了一个关于STM32Cube使用串口DMA发送数据的问题,即发送操作只能成功进行一次,再次尝试时会遇到HAL_BUSY状态错误。通过调整代码逻辑,实现了连续调用HAL_UART_Transmit_DMA发送指定长度数组的功能。

STM32Cube 串口DMA发送问题:只能运行一次,第二次返回状态为HAL_BUSY

解决办法:

这样就可以实现每次调用HAL_UART_Trasmit_DMA发送指定长度的数组。

转载于:https://www.cnblogs.com/zq-Embedded-System/p/5925714.html

### STM32Cube UART DMA 数据发送实现方法 在STM32Cube环境中,通过DMA方式实现UART数据发送是一种高效的方法。以下是关于如何配置和使用DMA进行UART数据发送的具体实现细节。 #### 配置步骤概述 为了启用UART的DMA发送功能,需要完成以下几个方面的设置: 1. **初始化UART外设** 使用STM32CubeMX工具生成代码时,需确保已正确配置USART/UART模块的工作模式为异步通信,并启用了相应的波特率、字长和其他参数[^1]。 2. **使能DMA控制器并分配通道资源给UART设备** 在项目配置阶段,指定用于UART TX操作的专用DMA请求信号及其对应的硬件通道编号。例如,在某些型号上可能选择`DMA1_Channel4`服务于`USART1_TX`端口的数据流管理需求[^3]。 3. **定义目标缓冲区变量存储待传信息序列** 创建全局或者局部静态数组作为实际装载欲传送字符集的空间载体;比如声明如下形式的一维byte型向量: ```c uint8_t tx_data[] = "This is a test message via DMA."; ``` 4. **调用API启动传输过程** 调用特定接口函数来触发基于DMA机制下的批量写入动作,典型做法是在适当位置插入类似这样的语句片段: ```c HAL_StatusTypeDef status; status = HAL_UART_Transmit_DMA(&huart1, (uint8_t*)tx_data, sizeof(tx_data)-1); if(status != HAL_OK){ // 错误处理逻辑... } ``` 此处需要注意的是传递进去的实际长度应扣除字符串结尾标志符`\0`所占用的一个额外单元位数[^4]。 5. **监听完成事件并通过回调响应后续流程控制** 当前批次的所有bit都被成功推送出去之后,系统会自动激发预注册好的中断服务程序入口点——即`HAL_UART_TxCpltCallback()`,允许开发者在此基础上扩展更多个性化的业务场景支持能力。 #### 示例代码展示 下面给出一段完整的示范源码供参考学习之用: ```c #include "stm32f4xx_hal.h" UART_HandleTypeDef huart1; void MX_USART1_UART_Init(void) { /* 初始化结构体 */ huart1.Instance = USART1; huart1.Init.BaudRate = 9600; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if(HAL_UART_Init(&huart1)!= HAL_OK) { Error_Handler(); } } // 定义要发送的消息 uint8_t tx_message[] = "Hello from STM32 with DMA!\r\n"; int main(void) { HAL_Init(); // 初始化HAL库 SystemClock_Config(); // 设置系统时钟 MX_GPIO_Init(); // GPIO初始化 MX_USART1_UART_Init(); // USART1初始化 // 开始DMA发送 HAL_UART_Transmit_DMA(&huart1,(uint8_t *)tx_message,strlen((char const*)tx_message)); while(1); // 主循环保持运行状态 } /** * @brief This function handles the completion of transmission. */ void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART1) { // 可以在这里执行其他任务或重新加载新的消息到DMA队列中 } } ``` #### 注意事项 - 确认已经激活了相关的时钟树节点以及GPIO针脚映射关系。 - 如果计划连续不断地更新显示内容,则考虑采用双缓冲技术提高刷新效率。 - 对于超时保护措施也要给予充分重视以免因网络延迟等原因造成死锁现象发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值