STM32 寄存器配置笔记——USART配置中断接收乒乓缓存处理
一、概述
本文主要介绍如何配置USART接收中断,使用乒乓缓存的设计接收数据并将其回显在PC 串口工具上。以stm32f10为例,配置USART1 9600波特率。具体配置参考上一章节STM32 寄存器配置笔记——USART配置 打印。
乒乓缓存的设计应用场景:当后面的处理单元在工作期间,前面的 buffer 的内容不能被释放。或者,在处理单元工作期间, buffer 的特定地址的内容不止被访问一次。优点是相比全部写完再读的方式,可以节约读写时序。
二、中断优先级
STM32 的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,其属性编号越小,表明它的优先级别越高。即抢占优先级和响应优先级。
抢占
抢占,是指打断其他中断的属性,即因为具有这个属性会出现嵌套中断(在执行中断服务函数A 的过程中被中断B 打断,执行完中断服务函数B 再继续执行中断服务函数A),抢占属性由NVIC_IRQChannelPreemptionPriority 的参数配置。
响应
响应属性则应用在抢占属性相同的情况下,当两个中断向量的抢占优先级相同时,如果两个中断同时到达, 则先处理响应优先级高的中断, 响应属性由NVIC_IRQChannelSubPriority 参数配置。
二、配置流程
1)使能RXNE中断
接收缓冲区非空中断使能,通过MY_NVIC_init函数配置中断的抢占优先级和响应优先级为3(这里可以随意配置本章重点不在这)。最后一个参数表示分组为2。即有2位用来表示抢占优先级,2位用来表示响应优先级。
USART1->CR1 |= 1 << 5; // enable RXNE interrupt MY_NVIC_Init(3,3,USART1_IRQn,2); // 2bit PreemptionPriority 3 2bit SubPriority 3

2)编写串口中断函数
USART1_IRQHandler是在启动文件里定义的只要有串口中断便会跑进来。查询状态寄存器USART_SR的RXNE位为1则表示收到数据可以读出。此时从USART_DR寄存器读取数据。




三、乒乓缓存设计
1)数据结构定义
typedef struct
{u8 USART_RX_BUF[USART_REC_LEN];u16 len;
} USART_DATA;typedef struct
{USART_DATA stUartFifo[2];u8 curRecFifo;
} USART_HANDLE;static USART_DATA *p_cur_Usart1_Handle = NULL;
static USART_DATA *p_cur_Data_ProcessingHandle = NULL;
static USART_HANDLE g_Usart1Handle;uin16 needPro = 0;
2)乒乓缓存初始化
void init_usart_handle(void)
{memset((u8*)&g_Usart1Handle, 0, sizeof(USART_HANDLE));p_cur_Usart1_Handle = &g_Usart1Handle.stUartFifo[0];
}
3)乒乓缓存接收
void USART1_IRQHandler(void)
{if(USART1->SR&(1<<5)){p_cur_Usart1_Handle->USART_RX_BUF[p_cur_Usart1_Handle->len++] = USART1->DR;}
}
4)乒乓缓存切换
这里是以每收到一帧完整帧的数据都是以0x0d 0x0a结尾的数据为例。收到一帧完整帧将当前乒乓缓存A切换为处理,乒乓缓存B切换为接收。
void change_curFifo(void)
{u16 len = p_cur_Usart1_Handle->len;if (len >= 2){if (p_cur_Usart1_Handle->USART_RX_BUF[len - 2] == 0x0d && p_cur_Usart1_Handle->USART_RX_BUF[len - 1] == 0x0a){printf("curFifo:%d len:%d\r\n", g_Usart1Handle.curRecFifo, len);p_cur_Data_ProcessingHandle = p_cur_Usart1_Handle;g_Usart1Handle.curRecFifo++;p_cur_Usart1_Handle = &g_Usart1Handle.stUartFifo[g_Usart1Handle.curRecFifo % 2];p_cur_Usart1_Handle->len = 0;needPro = 1;}}
}
5)乒乓缓存处理
打印接收内容。
void data_processing(void)
{if (needPro){needPro = 0;p_cur_Data_ProcessingHandle->USART_RX_BUF[p_cur_Data_ProcessingHandle->len] = 0;printf("func:%s dat:%s\r\n", __func__, p_cur_Data_ProcessingHandle->USART_RX_BUF);}
}
6)调用如下
主循环一直轮询是否需要切换乒乓缓存以及是否存在数据待处理。

相关文章:
STM32 寄存器配置笔记——USART配置中断接收乒乓缓存处理
一、概述 本文主要介绍如何配置USART接收中断,使用乒乓缓存的设计接收数据并将其回显在PC 串口工具上。以stm32f10为例,配置USART1 9600波特率。具体配置参考上一章节STM32 寄存器配置笔记——USART配置 打印。 乒乓缓存的设计应用场景:当后面…...
第二十一章 解读XML与JSON文件格式(工具)
XML XML tree and elements 将XML文档解析为树(tree) 我们先从基础讲起。XML是一种结构化、层级化的数据格式,最适合体现XML的数据结构就是树。ET提供了两个对象:ElementTree将整个XML文档转化为树,Element则代表着…...
Web 自动化神器 TestCafe(三)—用例编写篇
一、用例编写基本规范 1、 fixture 测试夹具 使用 TestCafe 编写测试用例,必须要先使用 fixture 声明一个测试夹具,然后在这个测试夹具下编写测试用例,在一个编写测试用例的 js 或 ts 文件中,可以声明多个测试夹具 fixture(测试…...
Redis 基本命令—— 超详细操作演示!!!
内存数据库 Redis7—— Redis 基本命令 三、Redis 基本命令(下)3.8 benchmark 测试工具3.9 简单动态字符串SDS3.10 集合的底层实现原理3.11 BitMap 操作命令3.12 HyperLogLog 操作命令3.13 Geospatial 操作命令3.14 发布/订阅命令3.15 Redis 事务 四、Re…...
Linux:centOS常用命令
CentOS是一种基于Red Hat Enterprise Linux(RHEL)的开源操作系统,因此与其他基于Linux的系统共享很多相似的命令。以下是一些在CentOS上常用的命令 件和目录操作: ls: 列出目录内容。cd: 切换目录。pwd: 显示当前工作目录。mkdir: 创建目录…...
数据结构-二叉树(1)
1.树概念及结构 1.1树的概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 1.有一个特殊的结点&…...
SpringBoot——国际化
优质博文:IT-BLOG-CN 一、Spring 编写国际化时的步骤 【1】编写国际化配置文件; 【2】使用ResourceBundleMessageSource管理国际化资源文件; 【3】在页面使用ftp:message取出国际化内容; 二、SpringBoot编写国际化步骤 【1】创…...
shell 条件语句 if case
目录 测试 test测试文件的表达式 是否成立 格式 选项 比较整数数值 格式 选项 字符串比较 常用的测试操作符 格式 逻辑测试 格式 且 (全真才为真) 或 (一真即为真) 常见条件 双中括号 [[ expression ]] 用法 &…...
C语言:写一个函数,实现3*3矩阵的转置(指针)
分析: 在主函数 main 中,定义一个 3x3 的整型数组 a,并定义一个指向整型数组的指针 p。然后通过循环结构和 scanf 函数,从标准输入中读取用户输入的 3x3 矩阵的值,并存储到数组 a 中。 接下来,调用 mov…...
STL pair源码分析
STL pair源码分析 pair是STL中提供的一个简单的struct,用来处理类型不同的一对值,是非常常用的数据结构。这一对值是以public的形式暴露出来的,直接通过first和second就能访问。我们以MSVC提供的STL源码为例,分析pair的具体实现。…...
【开源】基于Vue和SpringBoot的农家乐订餐系统
项目编号: S 043 ,文末获取源码。 \color{red}{项目编号:S043,文末获取源码。} 项目编号:S043,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户2.2 管理员 三、系统展示四、核…...
MyBatis 操作数据库(入门)
一:MyBatis概念 (1)MyBatis 💗MyBatis是一款优秀的持久层框架,用于简化JDBC的开发 (2)持久层 1.持久层 💜持久层:持久化操作的层,通常指数据访问层(dao),是用来操作数据库的 2.持久层的规范 ①…...
JVM——垃圾回收器(G1,JDK9默认为G1垃圾回收器)
1.G1垃圾回收器 JDK9之后默认的垃圾回收器是G1(Garbage First)垃圾回收器。 Parallel Scavenge关注吞吐量,允许用户设置最大暂停时间 ,但是会减少年轻代可用空间的大小。 CMS关注暂停时间,但是吞吐量方面会下降。 而G1…...
多模态——使用stable-video-diffusion将图片生成视频
多模态——使用stable-video-diffusion将图片生成视频 0. 内容简介1. 运行环境2. 模型下载3. 代码梳理3.1 修改yaml文件中的svd路径3.2 修改DeepFloyDataFiltering的vit路径3.3 修改open_clip的clip路径3.4 代码总体结构 4. 资源消耗5. 效果预览 0. 内容简介 近期,…...
springboot(ssm网络相册 在线相册管理系统Java(codeLW)
springboot(ssm网络相册 在线相册管理系统Java(code&LW) 开发语言:Java 框架:ssm/springboot vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.7(或8.0)…...
邮箱发送短信的多种方式
第一种:邮箱验证方法: 导入依赖: <!-- mail依赖(发送短信的依赖) --><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId> &l…...
R语言——taxize(第五部分)
taxize(第五部分) 3. taxize 文档中译3.71. nbn_synonyms(从 NBN 返回具有给定 id 的分类群名称的所有同义词)3.72. ncbi_children(在 NCBI 中搜索类群的子类群)3.73. ncbi_downstream(检索 NCB…...
负载均衡lvs
简介 ipvsadm 是 Linux 内核中的 IP 虚拟服务器(IPVS)管理工具。IPVS是 Linux 内核提供的一种负载均衡解决方案,它允许将入站的网络流量分发到多个后端服务器,以实现负载均衡和高可用性。IPVS通过在内核中维护一个虚拟服务器表&a…...
【腾讯云云上实验室】探索向量数据库背后的安全监控机制
当今数字化时代,数据安全成为了企业和个人最为关注的重要议题之一。随着数据规模的不断增长和数据应用的广泛普及,如何保护数据的安全性和隐私性成为了迫切的需求。 今天,我将带领大家一起探索腾讯云云上实验室所推出的向量数据库,…...
阅读笔记——《Removing RLHF Protections in GPT-4 via Fine-Tuning》
【参考文献】Zhan Q, Fang R, Bindu R, et al. Removing RLHF Protections in GPT-4 via Fine-Tuning[J]. arXiv preprint arXiv:2311.05553, 2023.【注】本文仅为作者个人学习笔记,如有冒犯,请联系作者删除。 目录 摘要 一、介绍 二、背景 三、方法…...
Arm_Cortex-M3权威指南
这本权威指南只是对应某一种具体的处理器内核,深入一种处理器内核对于我们理解整个ARM架构大有帮助 书籍资源在下面的链接 Arm_Cortex-M3权威指南 第2章 Cortex-M3概览 简介 Cortex-M3是一个32位处理器内核。内部的数据路径是32位,寄存器是32位&…...
告别破解风险,用快马AI五分钟搭建你的专属数据库管理工具原型
最近在做一个需要频繁操作数据库的小项目,原本想用Navicat这类工具,但正版价格不菲,破解版又担心安全和法律风险。正好发现InsCode(快马)平台可以快速生成代码原型,就尝试用它5分钟搭建了一个简易的数据库管理工具。 为什么选择W…...
前端骨架搭建
一、安装UI与功能库在终端运行以下命令npm install arco-design/web-vuenpm install lucide-vue-nextnpm install md-editor-v3npm install pinia axios分别安装预计项目所需的UI库、图标库、编辑器、状态管理功能。检查node版本,发现其为过时的v16版本,…...
Gazebo传感器仿真全攻略:从摄像头到Kinect的ROS联动配置
Gazebo传感器仿真全攻略:从摄像头到Kinect的ROS联动配置 1. 传感器仿真基础与Gazebo环境搭建 在机器人算法开发中,传感器仿真是验证算法有效性的关键环节。Gazebo作为ROS生态中最强大的物理仿真平台,能够模拟真实世界中的物理特性和传感器行为…...
[技术突破] 解决营销行业3大痛点:基于control_v1p_sd15_qrcode_monster的创新方案
[技术突破] 解决营销行业3大痛点:基于control_v1p_sd15_qrcode_monster的创新方案 【免费下载链接】control_v1p_sd15_qrcode_monster 项目地址: https://ai.gitcode.com/hf_mirrors/monster-labs/control_v1p_sd15_qrcode_monster 一、痛点剖析:…...
如何在Windows系统中轻松访问Linux分区?Ext2Read的5个实用技巧
如何在Windows系统中轻松访问Linux分区?Ext2Read的5个实用技巧 【免费下载链接】ext2read A Windows Application to read and copy Ext2/Ext3/Ext4 (With LVM) Partitions from Windows. 项目地址: https://gitcode.com/gh_mirrors/ex/ext2read 你是否曾经在…...
OpenClaw技能组合:Kimi-VL-A3B-Thinking+文件处理实现智能归档
OpenClaw技能组合:Kimi-VL-A3B-Thinking文件处理实现智能归档 1. 为什么需要智能文件归档系统 作为一名长期与杂乱文件搏斗的技术从业者,我深知手动整理文件的痛苦。每次收到发票、合同或报告,都需要先打开文件查看内容,然后根据…...
SEO_新手必看的SEO优化入门教程与核心方法(271 )
SEO优化入门教程:新手必看的核心方法 在当今的数字时代,搜索引擎优化(SEO)已经成为了每一个想要在互联网上站稳脚跟的人必不可少的技能。无论你是一个小企业的网站管理员,还是一个内容创作者,了解和掌握SE…...
智能家居组网实战:蓝牙Mesh vs ZigBee,哪种更适合你的智能灯泡?
智能家居组网实战:蓝牙Mesh与ZigBee的深度对比与选型指南 当你站在智能家居的十字路口,面对琳琅满目的智能灯泡和五花八门的组网协议,是否曾为选择蓝牙Mesh还是ZigBee而纠结?这两种技术看似相似,却在底层架构、性能表现…...
5分钟搞定!通义千问多模态检索系统一键部署与体验
5分钟搞定!通义千问多模态检索系统一键部署与体验 1. 为什么选择通义千问多模态检索系统? 想象一下这样的场景:你在电商平台搜索"红色连衣裙",结果却出现大量粉色上衣;或者在视频网站查找"猫咪搞笑视…...
