IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 串口 DMA+空闲中断 -> 正文阅读

[嵌入式]串口 DMA+空闲中断

文章主要参考了
https://blog.csdn.net/qq_42810361/article/details/106570373

Cubemx的配置

跳过基本的配置
1USART1 配置
在这里插入图片描述
中断配置
在这里插入图片描述
其他默认配置不改变

代码块

usart.c 这里要添加头文件#include<string.h>

ts_usart_type usart_nb_type;
void hal_uart_recv_init(void)
{
	/* 1. 打开串口空闲中断 */
	__HAL_UART_ENABLE_IT(&huart1 ,UART_IT_IDLE );
	/* 2. 打开 DMA 接收 */
	HAL_UART_Receive_DMA(&huart1 ,usart_nb_type.usart_dma_recv_buffer, USART_DMA_RECV_SIZE);
}
void hal_uart_irq_prejudge(void)
{
	uint32_t temp;
	/* 1. 判断空闲中断 */
	if(__HAL_UART_GET_FLAG(&huart1 , UART_FLAG_IDLE) != RESET)
	{
		/* 2. 清除中断 */
		__HAL_UART_CLEAR_IDLEFLAG(&huart1);
		/* 3. 停止 DMA 接收 */
		HAL_UART_DMAStop(&huart1);
		//清除 DMA 接收中断,只需读取一次状态寄存器和数据寄存器,即可实现
		temp = huart1.Instance->ICR;
		temp = huart1.Instance->RDR;
		/* 4. 获取 DMA 接收数据长度 : NDTR 为递减计数器,故 SIZE - NDTR*/
		temp = USART_DMA_RECV_SIZE -__HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
		usart_nb_type.usart_dma_recv_len = temp;
		/* 5. 串口回调函数 */
		HAL_UART_RxCpltCallback(&huart1);
	}
}	
void hal_uart_recv_judge(void)
{
		/* 1. 判断是否有完整数据 */
		if(usart_nb_type.usart_recv_flag == 1)
		{
		/* 2. 打印数据到指定串口 */
			HAL_UART_Transmit(&huart1 ,usart_nb_type.usart_recv_buffer ,usart_nb_type.usart_recv_len ,100 );
		/* 3. 清空接收缓存区 */
			memset(usart_nb_type.usart_recv_buffer ,0 ,usart_nb_type.usart_recv_len);
		
		/* 4. 清空数据接收标志 */
			usart_nb_type.usart_recv_flag = 0;
		
		/* 5. 清空数据接收长度 */
			usart_nb_type.usart_recv_len = 0;			
		}
}

usart.h

#define USART_DMA_RECV_SIZE     256
#define USART_RECV_SIZE  		1024
/* 串口数据类型 */
typedef struct 
{
	/* 数据接收标志 */
	uint8_t usart_recv_flag;
	/* 数据解析长度 */
	uint16_t usart_recv_len;
	/* DMA 数据长度 */
	uint16_t usart_dma_recv_len;
	/* 数据解析缓冲区 */
	uint8_t usart_recv_buffer [USART_RECV_SIZE];
	/* DMA 数据缓冲区 */
	uint8_t usart_dma_recv_buffer [USART_DMA_RECV_SIZE];
}ts_usart_type;
extern ts_usart_type usart_nb_type;
void hal_uart_recv_judge(void);
void hal_uart_recv_init(void);
void hal_uart_irq_prejudge(void);

stm32g4xx_it.c中 添加usart.h头文件

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
	hal_uart_irq_prejudge();
  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
	HAL_UART_Receive_DMA(&huart1 ,usart_nb_type.usart_dma_recv_buffer ,USART_DMA_RECV_SIZE);
  /* USER CODE END USART1_IRQn 1 */
}

修改这个处理函数

main.c 中 添加头文件string.h

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	/* 1. 判断是否为 NB 串口 */
	if(huart->Instance == huart1.Instance)
	{
		/* 2. 判断是否有未处理的数据 */
		/* 有,从地址 0+old_len 开始获取 DMA 接收区数据。 */
		if(usart_nb_type.usart_recv_len > 0)
		{
			memcpy(&usart_nb_type.usart_recv_buffer[usart_nb_type.usart_recv_len] ,usart_nb_type.usart_dma_recv_buffer ,usart_nb_type.usart_dma_recv_len);
			usart_nb_type.usart_recv_len += usart_nb_type.usart_dma_recv_len;
		}
		/* 无,从地址 0 开始获取 DMA 接收区数据。 */
		else
		{
			memcpy(usart_nb_type.usart_recv_buffer ,usart_nb_type.usart_dma_recv_buffer ,usart_nb_type.usart_dma_recv_len);
			usart_nb_type.usart_recv_len = usart_nb_type.usart_dma_recv_len;
		}
		/* 3. 清空 DMA 接收区 */
		memset(usart_nb_type.usart_dma_recv_buffer ,0 ,usart_nb_type.usart_dma_recv_len);
		/* 4. 清空 DMA 接收长度 */
		usart_nb_type.usart_dma_recv_len = 0;
		/* 5. 置位数据接收标志 */
		usart_nb_type.usart_recv_flag = 1;
		hal_uart_recv_judge();
	}
}

在while(1)之前初始化

hal_uart_recv_init();
  while (1)

结果

在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-03 12:04:50  更:2021-09-03 12:07:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:46:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码