cubeMX配置stm32实现uart dma接收不定长数据并实时回传的功能

本文旨在利用STM32的UART1和DMA功能,创建一个能实时接收并回传不定长字符串的系统。通过CubeMX配置时钟和相关参数,接着在工程中开启空闲中断,定义接收和发送缓冲区,并编写中断服务函数以实现数据的DMA传输。在main.c和stm32f1xx_it.c文件中进行关键设置后,成功完成程序编写并通过编译。最终烧录固件验证功能。

一 目标:利用uart1 dma通道,实现实时接收并返回不定长字符串的功能。

二 关键词:

uart1

Dma

不定长数据实时接收并回传

三 思路

四 cubemx配置

UART DMA接收不定长数据常见的方法思路及代码实现如下: #### 通过空闲中断实现 利用UART的空闲中断,当检测到串口空闲时,表示一帧数据接收完成,此时可以获取实际接收到的数据长度。 在stm32f1xx_it.c中编写USART1_IRQHandler中断服务函数: ```c int temp = 0; if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!= RESET) // 检查空闲中断IDLE { __HAL_UART_CLEAR_IDLEFLAG(&huart1); // 清除空闲中断标志位 temp = huart1.hdmarx->Instance->CNDTR; // 从uart寄存器上得到待发送数据的数量 revlen = sizeof(uart_rx_buffer)-temp; // 通过计算得到接收长度 // 非循环模式下(noraml),关闭DMA重写接收长度,DMA才会重新接收串口数据 __HAL_DMA_DISABLE(huart1.hdmarx); // 关闭防止处理期间有DMA事物 huart1.hdmarx->Instance->CNDTR = sizeof(uart_rx_buffer); // 重写接收长度 __HAL_DMA_ENABLE(huart1.hdmarx); // 重新使能dma HAL_UART_Transmit_DMA(&huart1,uart_rx_buffer,revlen); // 将接收到的数据再次通过dma通道发送至uart1实现实时回传 } if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC)!= RESET) { __HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_TC); huart1.gState = HAL_UART_STATE_READY; } ``` 此方法可以根据空闲中断来处理不定长数据接收且在接收完成后可以进行数据回传等操作[^3]。 #### 另一种UART中断处理函数实现 ```c void USART1_IRQHandler(void) { if(usart_interrupt_flag_get(USART1,USART_INT_FLAG_IDLE) == SET) // 检测到帧中断 { usart_interrupt_flag_clear(USART0,USART_INT_FLAG_IDLE); // 清除空闲中断标志位 usart_data_receive(USART1); // 必须要读,读出来的值不能要 // 处理DMA接收到的数据 rxLen = ARRAYNUM(RxBuff) - dma_transfer_number_get(DMA0,DMA_CH5); // 获取实际接收到的数据长度 memcpy(RxFrame,RxBuff, rxLen); // 保存缓冲区数组一帧 memset(RxBuff, 0, rxLen); // 清空数组 txLen=rxLen;rxLen=0; rx_complete_flag = SET; // 数据传输完成 // 重新设置DMA传输 dma_channel_disable(DMA0, DMA_CH5); // 失能DMA通道 dma_memory_address_config(DMA0, DMA_CH5,(uint32_t)RxBuff); // 设置要接收数据的内存地址 dma_transfer_number_config(DMA0, DMA_CH5,ARRAYNUM(RxBuff)); // 最大接收长度 dma_channel_enable(DMA0, DMA_CH5); } } ``` 该代码实现了根据UART的空闲中断标志来处理不定长数据接收接收完成后重新配置DMA以准备下一次接收[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值