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接收 的相关文章

  • C++ 数组中的多字节 UTF-8

    我在处理数组中的 3 字节 Unicode UTF 8 字符时遇到了问题 当它们位于 char 数组中时 我收到多字符字符常量和隐式常量转换警告 但当我使用 wchar t 数组时 wcout 根本不返回任何内容 由于项目的性质 它必须是数
  • 将 Blend 行为添加到 DatePicker 时出现问题

    我正在尝试向 DatePicker 控件添加 Blend 行为 以将 MVVM Light RelayCommand 绑定到 DateChanged 事件 如下所示
  • 指定初始化和基类?

    在C 20 最新草案 中 给出以下代码 struct B int mb struct D B int md 这六个表达式中哪些是格式错误的 哪些不是 1 D 42 43 2 D 42 43 3 D 42 md 43 4 D 42 md 43
  • 处理长时间运行的报告

    我正在开发一个用 C 和 Sql Server 2000 数据库编写的 ASP net 应用程序 我们有多个 PDF 报告供客户用于满足其业务需求 问题是这些报告需要一段时间才能生成 gt 3 分钟 通常最终发生的情况是 当用户请求报告时
  • 如何确保我们读取 boost::child 进程中的所有行

    我在上面看到了下面的代码boost child文档页面 其中解释了如何读取子进程的输出 http www boost org doc libs 1 64 0 doc html boost process tutorial html http
  • SetOaNoCache 是在哪里定义的?

    试图disableBSTR缓存 SetOaNoCache VC 编译器构建输出 SetOaNoCache identifier not found Don t想要使用 奥诺缓存 1 问题 哪里设置Oa无缓存 http msdn micros
  • DDD - 跨有界上下文边界聚合根实体使用情况

    在域模型中对实体身份进行建模的一种建议方法是创建值对象而不是使用原始类型 例如在 C 中 public class CustomerId public long Id get set 在我看来 此类应该在整个应用程序中使用 而不仅仅是在域模
  • 从数据表中删除列

    我有一个包含 20 列的数据表 但我不需要当前处理的所有列 除了 5 列 所以我执行了以下操作来删除列 List
  • 使用 cout 打印字符数组的全部内容

    我对 C 很陌生 只是 Java 的背景不太好 并且对如何打印 char 数组的全部内容感到困惑 我相信我需要使用循环 并将循环基于数组的长度 但我的编译尝试没有成功 这就是我现在所拥有的 在此先感谢您的帮助 include
  • size_t 是否足够大以表示任何类型的大小? [复制]

    这个问题在这里已经有答案了 Is size t保证足够大来表示任何类型的大小 根据this https en cppreference com w c types size t参考 size t可以存储理论上可能的对象的最大尺寸 任何类型
  • 如何通过命令行在 MSBuild 中指定 CodeAnalysisRuleset

    我希望能够在命令行 MSBuild 中指定代码分析规则 用于代码分析 FXCOP 项目文件中会有这样的内容
  • 在 C++ 中将浮点值作为数组中的索引

    浮点值可以用作数组的索引吗 如果用作索引的表达式生成浮点值 会发生什么情况 float 值将被转换为 int 根据编译器的警告级别 它可能会给出警告或错误 s1 q 12 2 same as q 12 s2 q 12 999999 same
  • 无法加载 DLL“tensorflow”或其依赖项之一(ML.NET)

    我有一个用于图像分类的 NET Core 3 应用程序 使用 Microsoft 的 ML NET 框架 在我的开发机器上 我可以运行代码并且一切正常 但是 当我将其部署到临时服务器时 我在运行时收到此错误 System Reflectio
  • 使用指针的合法遗留代码突然变成了UB

    假设我们有 C 98 的遗留代码 bool expensiveCheck struct Foo bool someFunc Foo ptr 0 if expensiveCheck ptr new Foo doing something ir
  • C# 中 a+=1 和 a=a+1 的区别

    我发现在C 中a 1不等于a a 1 例如 以下代码编译时不会出现任何错误 字节 b 10 b 5 而下面的代码有编译错误 字节 b 10 b b 5 有人可以告诉我为什么吗 Because b 5变成整数 Int32 主要是因为有重载的可
  • 如何在asp.net中创建动态复选框

    我正在创建一个需要添加动态复选框列表的应用程序 请任何人告诉我如何使用 C 添加动态复选框列表 在表单上放置一个带有 ID 的占位符placeHolder并将以下代码添加到您的Page Load CheckBoxList cbList ne
  • 无法打开包含的文件

    我使用的是 BorlandC 和 Windows 7 当我编译该文件时 出现以下错误 Error Assign C Unable to open include file stdio h Error Assign C Unable to o
  • 添加 Imap 文件夹 Mailkit

    我尝试使用 Mailkit 添加顶级文件夹 因此当我添加以下标签时 我可以将它们分组到该文件夹 下 标签是 邮件包 档案 邮件包 标记 我想创建一个名为 mailkit 的文件夹 以便 gmail 将它们分组 但目前我似乎无法找到执行此操作
  • 如何可靠地判断 boost 线程是否已退出其 run 方法?

    我以为 joinable 会表明这一点 但事实似乎并非如此 在工人阶级中 我试图表明它仍在通过谓词进行处理 bool isRunning return thread gt joinable 已经退出的线程不是不能加入吗 我错过了什么 boo
  • 如何安装 C++ 的 VOCE?

    我正在尝试安装 VOCE api 它是为 C 和 Java 构建的语音识别 API 这是我第二次使用外部 C 库 也是第一次使用 Java C api 语音链接 http voce sourceforge net http voce sou

随机推荐

  • 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 轮询接收 所谓轮询 就是在主函数中判断接收完成的标志位 举个不太恰当例子 就比如 此时你正在