STM32CubeMX—串口空闲中断+DMA接收

2023-11-10

一、实验说明

实验平台:STM32F103C8T6
实验内容:使用串口一空闲中断结合DMA 完成不定长数据接收

STM32的串口接收数据的方式
1、轮询接收

  所谓轮询,就是在主函数中判断接收完成的标志位。举个不太恰当例子,就比如,此时你正在考试作弊,手机藏在兜里,你的队友再给你发答案,但是你的手机静音,所以你不得不写一会题看一会手机,有的时候答案已经发来了但是你此时在假装写,没有看,导致你没能及时看到答案浪费了时间(仅仅为了举例而已。。。。)。轮询接收数据也是这样。

2、中断接收

  串口接收配置为中断模式,当有数据收到时,进入到串口接收中断中读取数据。继续上面的例子(你为了不浪费时间且及时抄到答案,你把手机开了震动,消息一来立马看,这是就比上面好多了,能够及时发现消息。但是又出了一个问题,你的猪队友,写一个选择给你发一次,不停的震动,完全扰乱了你的节奏)。其实也就是,串口接收数据时,一次接收一个字节,当数据量较大时,显然这样频繁的进入中断,打断主程序,严重影响系统性能。

3、空闲中断接收

  空闲中断接收,当一帧数据接收完成之后,串口会进入到空闲中断中去,然后在空闲中断中处理收到的数据。这种模式对处理不定长数据帧带来很大的便利,我们不必频繁的进入接收中断处理数据,但是弊端也是明显的,由于每次都要接收完一个完整的数据帧后才空闲中断,所以当一帧数据出错时,我们也不得不接收这帧错误的数据。在通讯可靠的场合,使用空闲中断接收模式接收串口数据,将会大大提高系统的性能。

二、实验步骤

1、基础配置

1)、sys中,选好调试方式,例如jtag-4pin。
2)、RCC时钟,晶振选择。
3)、时钟树配置。
4)、中断分组配置。
以上步骤可以参考串口中断实验。

串口中断实验配置

本实验要配置好printf函数便于演示效果

2、串口和DMA配置

1)、串口一配置。
这是

2)、DMA选择在这里插入图片描述
在这里插入图片描述
3)、生成工程代码
在这里插入图片描述
然后生成代码。
4)、添加代码
在这里插入图片描述

// 这里没有使用中断回调函数,这样写更直接一点。
extern volatile uint8_t rx_len;//接收到的数据长度
extern volatile uint8_t recv_end_flag; //接收完成标志位
extern uint8_t rx_buffer[200]; //数据缓存数组
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); 
    if((tmp_flag != RESET))
    { 
        __HAL_UART_CLEAR_IDLEFLAG(&huart1);
        temp = huart1.Instance->SR;  
        temp = huart1.Instance->DR; 
        HAL_UART_DMAStop(&huart1); 
        temp  = hdma_usart1_rx.Instance->CNDTR;
        rx_len =  200 - temp; 
        recv_end_flag = 1;		
    }
    HAL_UART_IRQHandler(&huart1);	
}

如下图,在usart.c 文件中先把变量定义上,同时把支持printf的函数添加上。

//注:**这三个变量 需要在stm32f1xx_it.c和main.c中外部声明**
volatile uint8_t rx_len=0;  //接收到的数据长度
volatile uint8_t recv_end_flag=0;//接收成功标志位
uint8_t rx_buffer[200];//缓存数组

在这里插入图片描述
在这里插入图片描述

 	__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
 HAL_UART_Receive_DMA(&huart1,rx_buffer,200);

在这里插入图片描述

int main(void)
{
	HAL_Init();
	SystemClock_Config();
	MX_GPIO_Init();
	MX_DMA_Init();
	MX_USART1_UART_Init();
	/* USER CODE BEGIN WHILE */
	printf("DMA_TEST");
	while (1)
	{
		if(recv_end_flag ==1)			
		{	
			printf("接收到的数据长度为%d\r\n",rx_len);
			HAL_UART_Transmit(&huart1,rx_buffer, rx_len,200);
			for(uint8_t i=0;i<rx_len;i++)
			{
				rx_buffer[i]=0;
			}
			printf("\r\n");
			rx_len=0;
			recv_end_flag=0;
		}
		HAL_UART_Receive_DMA(&huart1,rx_buffer,200);	
		/* USER CODE END WHILE */
	}
}
3 烧录调试

添加链接描述在这里插入图片描述

代码下载

代码下载地址 提取码 wqoo

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32CubeMX—串口空闲中断+DMA接收 的相关文章

  • 将集合绑定到自定义控件属性

    我没有运气尝试将数据集合绑定到我的自定义控件的属性 我已经实现了该控件的字符串属性的机制 在此处提供了一些帮助 并期望集合类型同样简单 但是我无法让它再次工作 这是我的自定义控件视图
  • 数据模板绑定垃圾邮件输出窗口出现错误:找不到管理 FrameworkElemen

    我有问题 System Windows Data 错误 2 找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement BindingExpression 无路径 数据项 空 目标元素是 So
  • 通过 SocketCAN 进行 boost::asio

    我正在考虑利用升压阿西奥 http www boost org doc libs 1 49 0 doc html boost asio html从a读取数据套接字CAN http en wikipedia org wiki SocketCA
  • 使用 mono/nunit-console/4 在 Mac OS X 控制台上运行测试

    我安装了 Max OS X 10 11 1 上面装有 Xamarin 我编写了简单的测试类 只是为了测试在 Mac OS X 和 Ubuntu 上运行 Nunit 测试 该类实际上有一个返回字符串的方法 using System names
  • 在 C/C++ 中获得正模数的最快方法

    通常在我的内部循环中 我需要以 环绕 方式索引数组 因此 例如 如果数组大小为 100 并且我的代码要求元素 2 则应该给它元素 98 高级语言 例如 Python 可以简单地使用my array index array size 但由于某
  • 何时使用 =default 使析构函数默认?

    尽管对构造函数使用 default 对我来说很清楚 即强制编译器在其他构造函数存在时创建默认构造函数 但我仍然无法理解这两种类型的析构函数之间的区别 那些使用 default 的 那些没有显式定义并由编译器自动生成的 我唯一想到的是 gro
  • 为什么在创建矩阵类时使用向量不好?

    对于我的矩阵类 我做了 template
  • VS 程序在调试模式下崩溃,但在发布模式下不崩溃?

    我正在 VS 2012 中运行以下程序来尝试 Thrust 函数查找 include cuda runtime h include device launch parameters h include
  • 单例模式和 std::unique_ptr

    std unique ptr唯一地控制它指向的对象 因此不使用引用计数 单例确保利用引用计数只能创建一个对象 那么会std unique ptr与单例执行相同 单例确保只有一个实例属于一种类型 A unique ptr确保只有一个智能指针到
  • C# 构建一个 webservice 方法,它接受 POST 方法,如 HttpWebRequest 方法

    我需要一个接受 POST 方法的 Web 服务 访问我的服务器正在使用 POST 方法 它向我发送了一个 xml 我应该用一些 xml 进行响应 另一方面 当我访问他时 我已经使用 HttpWebRequest 类进行了管理 并且工作正常
  • 将二进制数据从 C# 上传到 PHP

    我想将文件从 Windows C 应用程序上传到运行 PHP 的 Web 服务器 我知道 WebClient UploadFile 方法 但我希望能够分块上传文件 以便我可以监控进度并能够暂停 恢复 因此 我正在读取文件的一部分并使用 We
  • AES 输出是否小于输入?

    我想加密一个字符串并将其嵌入到 URL 中 因此我想确保加密的输出不大于输入 AES 是可行的方法吗 不可能创建任何始终会创建比输入更小的输出的算法 但可以将任何输出反转回输入 如果您允许 不大于输入 那么基本上您只是在谈论同构算法alwa
  • 在 EnvDTE 中调试时捕获 VS 局部变量

    是否可以使用 EnvDTE 进行 vsix Visual Studio 扩展来捕获本地和调试窗口使用的调试数据 或者可以通过其他方法吗 我想创建一个自定义的本地窗口 我们可以修改它以根据需要显示一些较重的内容 而无需为高级用户牺牲原始的本地
  • 使用taskkill停止Windows服务

    我需要帮助来使用 C 终止 Windows 服务 现在要终止该服务 请使用以下选项 从命令 sc queryex ServiceName 发现后PID服务的 taskkill pid 1234 exemple f 为了便于阅读 但如果您明白
  • 每个数据库多个/单个 *.edmx 文件

    我有一个通过 ADO net 数据服务与数据库交互的项目 数据库很大 近 150 个具有依赖关系的表 该项目几年前开始 当时使用的是数据集 现在我们正在转向实体模型关系 由于我们添加了更多需要使用的表 该模型正在不断增长 这是管理这一切的正
  • 矩阵到数组 C#

    这将是转换方阵的最有效方法 例如 1 2 3 4 5 6 7 8 9 into 1 2 3 4 5 6 7 8 9 in c 我在做 int array2D new int 1 2 3 4 5 6 7 8 9 int array1D new
  • 将 char[][] 转换为 char** 会导致段错误吗?

    好吧 我的 C 有点生疏了 但我想我应该用 C 来做我的下一个 小 项目 这样我就可以对其进行抛光 并且我已经有不到 20 行的段错误了 这是我的完整代码 define ROWS 4 define COLS 4 char main map
  • C++0x中disable_if在哪里?

    Boost 两者都有enable if and disable if 但 C 0x 似乎缺少后者 为什么它被排除在外 C 0x 中是否有元编程工具允许我构建disable if按照enable if 哦 我刚刚注意到std enable i
  • 使我的 COM 程序集调用异步

    我刚刚 赢得 了在当前工作中维护用 C 编码的遗留库的特权 这个dll 公开使用 Uniface 构建的大型遗留系统的方法 除了调用 COM 对象之外别无选择 充当此遗留系统与另一个系统的 API 之间的链接 在某些情况下 使用 WinFo
  • 使用 QtWebEngine 将 C++ 对象暴露给 Qt 中的 Javascript

    使用 QtWebkit 可以通过以下方式将 C 对象公开给 JavascriptQWebFrame addToJavaScriptWindowObject如中所述https stackoverflow com a 20685002 5959

随机推荐

  • RS485通信(Modbus)丢包解决经验(基于ARM/Linux和STM32平台)

    1 RS485通信属于半双工通信 即发送和接收不能同时进行 需要切换 一般定义一根GPIO做RTS切换 2 ARM Linux平台有Linux底层驱动做自动切换 比如应用程序发送完成后 一般会在底层驱动自动切换接收 3 但是STM32平台基
  • 【工作中常用工具类,提升开发效率】

    JDK常用工具类 JDK中常用工具类 集合工具类 Collections 数组工具类 Arrays 对象工具类 Objects 文件工具类 Files 路径工具类 Paths TimeUnit 线程sleet System JDK中常用工具
  • C++基础知识 - C++的类型转换

    类型转换使用建议 static cast静态类型转换 编译的时c 编译器会做编译时的类型检查 隐式转换 基本类型转换 父子类之间合理转换 若不同类型之间 进行强制类型转换 用reinterpret cast lt gt 进行重新解释 建 议
  • 京东联盟导购平台开发指南(附带API接口)

    一 写在前面 做过淘客开发的一定接触过淘宝API开发 而做京东联盟软件自然离不开京东联盟API 京东联盟API目前上线的有很多 如下图 https jos jd com api list htm id 117 但是京东联盟API获取比较难
  • 遭遇HTML被恶意注入JS弹广告,通过SSL证书学习及安装

    起因 近期有客户反映界面错乱 本能的以为是缓存原因导致的 告知方法 操作无效 远程查看发现代码里面突然多了一句 http 45 32 21 251 1 js 好了 有线索就开始跟 if typeof PinkFlag undefined v
  • vue使用jsencrypt实现rsa前端加密

    实现 RSA 加密 介绍 vue 完成 rsa 加密传输 jsencrypt 实现参数的前端加密 1 安装 jsencrypt npm install jsencrypt 2 编写 jsencrypt js 在 utils 文件夹中新建 j
  • 数据可视化——Davinci

    数据可视化 Davinci对比及功能使用 文档地址 一 数据可视化 个人引用部分 1 有趣的意义 2 常规的意义 二 图形的内涵 1 图形类型 2 优秀可视化的特点 三 可视化需求分析 1 四个问题 2 三个沟通点 四 Davinci功能详
  • 二分查找 —— 有序数组不小于(不大于)某数的第一个(最后一个)元素

    1 不小于某数的第一个元素 def bisearch l e lo hi while lo lt hi mi lo hi 2 if e gt l mi lo mi 1 else hi mi return hi 注 1 不同于寻找等于某值的情
  • 【C】PTA期末分数排序(归并排序)

    考试结束了 全班同学的分数都出来了 老师需要对分数做一次排序 看看从高到低 分数的排列是怎样的 输入格式 第一行是一个n 表示班级同学的人数 1 lt n lt 500000 第二行开始有n个分数 0 lt 分数 lt 100 分数都是整数
  • [从零开始学习FPGA编程-23]:进阶篇 - 基本组合电路-门电路级组合逻辑运算(Verilog语言)

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 125246093 目录 前言 第1章
  • 排序函数 dense_rank()

    dense rank 对结果集进行排序 排名值没有间断 特定行的排名等于该特定行之前不同排名值的数量加一 语法 DENSE RANK OVER
  • error when starting dev server: Error: Cannot find module ‘node:url‘

    需要升级node版本 直接在官网 下载 Node js 上下载最新的msi 安装到原来node的安装目录下即可
  • 降雨预测方法

    降雨预测方法 DBNPF Deep Belief Network for Precipitation Forecast 来源 张雷师兄论文 A deep learning based precipitation forecasting 模型
  • centos 7 安装总结

    CentOS Community ENterprise Operating System 社区企业操作系统 Linux发行版之一 来源于Red Hat Enterprise Linux依照开放代码规定释出的源代码所编译而成 安装注意 安装c
  • 如何用python爬取大量博客

    如果要使用 Python 爬取大量博客 可以使用爬虫框架 例如 Scrapy 首先 需要对目标网站进行分析 确定数据的 URL 格式和数据的 HTML 标签 然后 可以使用 Scrapy 来编写爬虫代码 自动访问目标网站并提取需要的数据 具
  • 在 CLion 中进行整体替换代码

    突然在打题的时候发现int型无法满足题目要求 想要批量换成long long 使用快捷键 Ctrl Shift R Windows Linux 或 Command Shift R Mac 来打开 Find and Replace 对话框 在
  • 第一章 python初窥 课后练习题

    目录 1 输入1 127的ascii码并输出对应字符 2 输入a b c d4个整数 计算a b c d的结果 3 计算一周有多少分钟 多少秒钟 4 3个人在餐厅吃饭 想分摊饭费 总共花费35 27美元 他们还想给15 的小费 每个人该怎么
  • SpringBoot: Mybatis配置事务管理

  • awk 正则表达式、正则运算符详细介绍

    http www cnblogs com chengmo archive 2010 10 11 1847772 html 前言 使用awk作为文本处理工具 正则表达式是少不了的 要掌握这个工具的正则表达式使用 其实 我们不必单独去学习它的正
  • STM32CubeMX—串口空闲中断+DMA接收

    一 实验说明 实验平台 STM32F103C8T6 实验内容 使用串口一空闲中断结合DMA 完成不定长数据接收 STM32的串口接收数据的方式 1 轮询接收 所谓轮询 就是在主函数中判断接收完成的标志位 举个不太恰当例子 就比如 此时你正在