STM32F407串口的DMA收发

时钟配置

![外部时钟配置](https://img-blog.csdnimg.cn/84fa56dca2564222b34e5442f0d9daa5.png)

STM32F407串口的DMA收发_第1张图片

Debug配置

STM32F407串口的DMA收发_第2张图片

串口配置

STM32F407串口的DMA收发_第3张图片

DMA选择

STM32F407串口的DMA收发_第4张图片

时钟源配置

STM32F407串口的DMA收发_第5张图片

工程配置

STM32F407串口的DMA收发_第6张图片

STM32F407串口的DMA收发_第7张图片

点击“GENERATE CODE”等待生成代码

STM32F407串口的DMA收发_第8张图片

串口初始化中添加代码

STM32F407串口的DMA收发_第9张图片

xxit.c中添加代码

STM32F407串口的DMA收发_第10张图片

while(1)中处理数据

STM32F407串口的DMA收发_第11张图片

测试结果STM32F407串口的DMA收发_第12张图片

参考https://blog.csdn.net/as480133937/article/details/104827639/?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-1–blog-119351052.235v27pc_relevant_multi_platform_whitelistv3&spm=1001.2101.3001.4242.2&utm_relevant_index=4

//usart.c中
extern uint8_t rx_buffer[100];  //接收数据缓存数组
void MX_USART1_UART_Init(void)
{

  /* USER CODE BEGIN USART1_Init 0 */

  /* USER CODE END USART1_Init 0 */

  /* USER CODE BEGIN USART1_Init 1 */

  /* USER CODE END USART1_Init 1 */
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  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();
  }
  /* USER CODE BEGIN USART1_Init 2 */
  __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); //使能IDLE中断
  HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE);
  /* USER CODE END USART1_Init 2 */

}
//main.c中
extern volatile uint8_t recv_end_flag;
extern uint8_t rx_buffer[100];  //接收数据缓存数组
extern volatile uint8_t rx_len;  //接收一帧数据的长度

  while (1)
  {
	if(recv_end_flag == 1)  //接收完成标志
	{
		DMA_Usart_Send(rx_buffer, rx_len);
		rx_len = 0;//清除计数
		recv_end_flag = 0;//清除接收结束标志位
		memset(rx_buffer,0,rx_len);
	}
	HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE);//重新打开DMA接收
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
//it.c中
volatile uint8_t rx_len = 0;  //接收一帧数据的长度
volatile uint8_t recv_end_flag = 0; //一帧数据接收完成标志
uint8_t rx_buffer[100]={0};  //接收数据缓存数组

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
	uint32_t tmp_flag = 0;
	uint32_t temp;
	tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE); //获取IDLE标志位
	if((tmp_flag != RESET))//idle标志被置位
	{
		__HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除标志位
		HAL_UART_DMAStop(&huart1); 
		temp  =  __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);// 获取DMA中未传输的数据个数   
		rx_len =  BUFFER_SIZE - temp;
		recv_end_flag = 1;	// 接受完成标志位置1	
	}
  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */

  /* USER CODE END USART1_IRQn 1 */
}
//main.h中
#include "string.h"
#define BUFFER_SIZE 100



你可能感兴趣的:(stm32,单片机,嵌入式硬件,笔记)