STM32CUBEMX(2)--USART通过DMA方式接收不定长数据
STM32CUBXME--2USART通过DMA方式接收不定长数据
- 概述
- 硬件准备
- 选择芯片型号
- 配置时钟源
- 配置时钟树
- 串口配置
- 生成工程设置
- 代码生成设置
- 生成代码
- 配置keil
- 代码
- 演示效果
- 教学视频
- 最后
概述
直接存储器访问(DMA)用于在外设与存储器之间以及存储器与存储器之间提供高速数据传输。可以在无需任何CPU操作的情况下通过DMA快速传输传输。这样节省的CPU资源可供其它操作使用。
DMA允许在后台执行数据传输,无需Cortex-MO处理器干预。在此操作过程中,主处理器可以执行其它任务,仅当整个数据块需要处理时,才会中断主处理器。这样即使传输大量数据也不会对系统性能造成太大影响。
DMA主要用于为不同的外设模块实现集中数据缓冲存储(通常在系统SRAM中)。与分布式解决方案(其中每个外设都需要实现自己的本地数据存储)相比,DMA解决方案在硅片成本和功耗方面的成本较低。
根据使用的产品型号的不同,有一个或两个DMA模块。
STM32F0XX DMA控制器总共有5个通道用于DMA1,每个通道都专门管理来自一个或多个外设的存储器访问请求。它具有一个仲裁器,用于处理不同的DMA请求的优先级。
本篇文章主要介绍如何使用STM32CubeMX实现串口DMA读取,并且打印出去。
硬件准备
首先需要准备一个开发板,这里我准备的是NUCLEO-F030R8的开发板:
选择芯片型号
使用STM32CUBEMX选择芯片stm32f030r8,如下所示:
配置时钟源
HSE与LSE分别为外部高速时钟和低速时钟,在本文中使用内置的时钟源,故都选择Disable选项,如下所示:
配置时钟树
STM32F0的最高主频到48M,所以配置48即可:
串口配置
本次实验使用的串口1进行串口通信,波特率配置为115200。
配置DMA
中断
生成工程设置
代码生成设置
最后设置生成独立的初始化文件:
生成代码
配置keil
代码
在main.c中,添加头文件,若不添加会出现 identifier “FILE” is undefined报错。
/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */
变量定义:
/* USER CODE BEGIN PV */
#define BUFFERSIZE 255 //可以接收的最大字符个数
uint8_t ReceiveBuff[BUFFERSIZE]; //接收缓冲区
uint8_t recv_end_flag = 0,Rx_len;//接收完成中断标志,接收到字符长度
/* USER CODE END PV */
函数声明和串口重定向:
/* USER CODE BEGIN PFP */
void uart1_data(void); //接收函数
#ifdef __GNUC__ //串口重定向
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);return ch;
}
/* USER CODE END PFP */
开启串口IDLE中断:
/* USER CODE BEGIN 2 */printf("串口1DMA例程\r\n");__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//使能串口1 IDLE中断 /* USER CODE END 2 */
主循环:
/* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE */uart1_data();//串口数据处理/* USER CODE BEGIN 3 */}/* USER CODE END 3 */
串口DMA获取:
/* USER CODE BEGIN 4 */
void uart1_data(void)
{if(recv_end_flag ==1)//接收完成标志{printf("数据长度=%d\r\n",Rx_len);//打印接收到的数据长度 printf("数据内容:");for(int i=0;i<Rx_len;i++){printf("%c",ReceiveBuff[i]);//向串口打印接收到的数据}printf("\r\n"); for(int i = 0; i < Rx_len ; i++) //清空接收缓存区ReceiveBuff[i]=0;//置0Rx_len=0;//接收数据长度清零recv_end_flag=0;//接收标志位清零}//开启下一次接收HAL_UART_Receive_DMA(&huart1,(uint8_t*)ReceiveBuff,BUFFERSIZE);
}
/* USER CODE END 4 */
#include "stm32f0xx_it.c"文件中断外部变量引用:
/* USER CODE BEGIN 0 */
#define BUFFERSIZE 255 //可接收的最大数据量
extern uint8_t recv_end_flag,Rx_len,bootfirst;
/* USER CODE END 0 */
串口1中断函数:
/*** @brief This function handles USART1 global interrupt.*/
void USART1_IRQHandler(void)
{/* USER CODE BEGIN USART1_IRQn 0 *//* USER CODE END USART1_IRQn 0 */HAL_UART_IRQHandler(&huart1);/* USER CODE BEGIN USART1_IRQn 1 */uint32_t temp;if(USART1 == huart1.Instance)//判断是否为串口1中断{ if(RESET != __HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE))//如果为串口1{__HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除中断标志HAL_UART_DMAStop(&huart1);//停止DMA接收temp = __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);//获取DMA当前还有多少未填充Rx_len = BUFFERSIZE - temp; //计算串口接收到的数据个数recv_end_flag = 1;}} /* USER CODE END USART1_IRQn 1 */
}
演示效果
教学视频
https://www.bilibili.com/video/BV1vz4y1y7Ni
最后
以上的代码会在Q群里分享。QQ群:615061293。
或者关注微信公众号『记贴』,持续更新文章和学习资料,可加作者的微信交流学习!
STM32CUBEMX(2)--USART通过DMA方式接收不定长数据相关推荐
- 串口IDLE空闲中断+DMA实现接收不定长数据基于stm32cubemx
引言:对于串口接收一些不定长的数据,必须面对一个问题:怎么判断一帧数据接收是否完成?通常使用RXNE非空中断配合简单的数据协议,在数据中加入帧头.帧尾,在程序中判断是否接收到帧尾来确定数据接收完毕,因 ...
- STM32使用串口IDLE中断的两种接收不定长数据的方式
现在有很多数据处理都要用到不定长数据,而单片机串口的RXNE中断一次只能接收一个字节的数据,没有缓冲区,无法接收一帧多个数据,现提供两种利用串口IDLE空闲中断的方式接收一帧数据,方法如下: 方法1: ...
- android 串口一直打开_STM32之串口DMA接收不定长数据
STM32之串口DMA接收不定长数据 引言 在使用stm32或者其他单片机的时候,会经常使用到串口通讯,那么如何有效地接收数据呢?假如这段数据是不定长的有如何高效接收呢? 同学A:数据来了就会进入串口 ...
- STM32单片机串口空闲中断+DMA接收不定长数据
在上一篇文章STM32单片机串口空闲中断接收不定长数据中介绍了利用串口空闲中断接收不定长数据,这种方式有一个问题就是串口每接收到一个字节就会进入一次中断,如果发送的数据比较频繁,那么串口中断就会不停打 ...
- STM32使用串口1配合DMA接收不定长数据,大大减轻CPU载荷
摘自:http://www.openedv.com/thread-63849-1-1.html 参考:https://blog.csdn.net/heda3/article/details/80602 ...
- STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷
STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷 http://www.openedv.com/thread-63849-1-1.html 实现思路:采 用STM32F103的串口1,并配 ...
- MM32F3277空闲中断+DMA接收不定长数据
摘要:在实际项目中经常用到串口接收一些不定长的数据,怎么判断这一帧数据接收完成了呢?通常使用UART非空中断配合简单的数据协议,在数据中加入帧头.帧尾,在程序中判断是否接收到帧尾来确定数据接收完毕,对 ...
- 【STM32】USART接收不定长数据、防止数据溢出
给大家分享一种usart接收不定长数据,并且防止数据溢出卡死等情况: 在这里需要引用到两个中断,接收数据非空中断(RXNE)&接收总线空闲中断(IDLE),废话不多说,直接上代码. 中断服务函 ...
- STM32 HAL库 串口DMA接收不定长数据
STM32 HAL库 串口DMA接收不定长数据 整体思路:我是用的CUBEMX软件生成的工程,使能了两个串口,串口2用来接收不定长的数据,串口1用来发送串口2接收到的数据:串口2我找了一个UBLOX卫 ...
最新文章
- TESLA CENTER
- 1.4 消息循环和回调函数
- 4.4基于switch语句的译码器
- 分享25个新鲜出炉的 Photoshop 高级教程
- python socket模块实现udp通信_Python基于socket模块实现UDP通信功能示例
- 硬盘:协议-总线-接口
- jquery.筛选文档处理
- 华为Mate 20X电路图纸
- 计算机相关的文章,关于计算机的论文精选范文
- 485型传感器之数据回传进行CRC校验
- 小米5x android auto,小米 5s Plus重生——伪装Pixel XL
- Android 11.0 任务栏中清除掉播放器的进程,状态栏仍有音乐播放器状态问题的解决
- .Net微服务架构:API网关
- pandas合并groupby_pandas数据聚合与分组运算——groupby方法
- CTPN文本检测网络
- 李洪超 硬件工程师_壹号本推出工程师PC运维迷你电脑,7寸大小,丰富的接口配置...
- java excel导出 jxl_JAVA利用JXL导出/生成 EXCEL
- Silverlight框架
- ue4种上树木 草地
- Internet Download Manager6.40最高版电脑高速下载工具
热门文章
- cc1plus:所有的警告都被当作是错误
- 前_Fri Jun 16 00:00:00 CST 2017_转换后2017/6/13 15:36:39_IllegalArgumentException
- MapReduce实现分组排序
- 社区APP “钱途”漫漫
- 《零基础学C语言》读后感学习笔记
- dockernvidia-docker快速入门学习笔记
- 篮球队编程题(Java)
- 对Hive连接metastore数据库的密码进行加密处理
- Qt 调用echo命令写文件失效
- INIC6081(通用PS3111 马甲/固态硬盘)固态U盘 开卡试玩及避坑