STM32CubeMX UART1_DMA接收不定长度信息
前言
记录自己学习的过程
一、CubeMX配置
1.开启usart1,默认配置即可
2.设置usart1_Tx的DMA
3.设置usart1_Rx的DMA
注意:USART_Rx要设置成上拉模式
为什么?
为了减少误进入串口空闲中断
具体介绍可以参考这篇文章
4.设置usart1中断
二、Keil代码
1.main.c
__IO uint8_t uart_dma_recbuf[255] = {0};//串口接收缓冲区
int main(void)
{
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);//使能串UART2 IDLE中断
HAL_UART_Receive_DMA(&huart1,(uint8_t *)uart_dma_recbuf, 255);//开启USART1的DMA接收
while(1)
{
}
}
2.stm32f4xx_it.c
#include <stdio.h>
#include <string.h>
extern __IO uint8_t uart_dma_recbuf[255];
void USART1_IRQHandler(void)//串口的中断函数
{
/* USER CODE BEGIN USART1_IRQn 0 */
uint8_t tmp_flag = 0;
uint8_t temp = 0;
tmp_flag = __HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE);
if(tmp_flag != RESET)//IDLE标志被置位
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除标志位
HAL_UART_DMAStop(&huart1);//关闭串口的DMA
temp = 255 - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);//接收的字节 = 总字节 - 剩余的字节
HAL_UART_Transmit_DMA(&huart1,(uint8_t *)uart_dma_recbuf,temp);//将接收到的数据发出去
// memcpy(buff, (char *)uart_dma_recbuf,temp );
HAL_UART_Receive_DMA(&huart1,(uint8_t *)uart_dma_recbuf, 255);//因为上面关闭了串口的DMA,所以要重新开启DMA接收
}
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}