当前位置: 首页 > news >正文

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接收中断&#xff0c;使用乒乓缓存的设计接收数据并将其回显在PC 串口工具上。以stm32f10为例&#xff0c;配置USART1 9600波特率。具体配置参考上一章节STM32 寄存器配置笔记——USART配置 打印。 乒乓缓存的设计应用场景&#xff1a;当后面…...

第二十一章 解读XML与JSON文件格式(工具)

XML XML tree and elements 将XML文档解析为树&#xff08;tree&#xff09; 我们先从基础讲起。XML是一种结构化、层级化的数据格式&#xff0c;最适合体现XML的数据结构就是树。ET提供了两个对象&#xff1a;ElementTree将整个XML文档转化为树&#xff0c;Element则代表着…...

Web 自动化神器 TestCafe(三)—用例编写篇

一、用例编写基本规范 1、 fixture 测试夹具 使用 TestCafe 编写测试用例&#xff0c;必须要先使用 fixture 声明一个测试夹具&#xff0c;然后在这个测试夹具下编写测试用例&#xff0c;在一个编写测试用例的 js 或 ts 文件中&#xff0c;可以声明多个测试夹具 fixture(测试…...

Redis 基本命令—— 超详细操作演示!!!

内存数据库 Redis7—— Redis 基本命令 三、Redis 基本命令&#xff08;下&#xff09;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&#xff08;RHEL&#xff09;的开源操作系统&#xff0c;因此与其他基于Linux的系统共享很多相似的命令。以下是一些在CentOS上常用的命令 件和目录操作: ls: 列出目录内容。cd: 切换目录。pwd: 显示当前工作目录。mkdir: 创建目录…...

数据结构-二叉树(1)

1.树概念及结构 1.1树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 1.有一个特殊的结点&…...

SpringBoot——国际化

优质博文&#xff1a;IT-BLOG-CN 一、Spring 编写国际化时的步骤 【1】编写国际化配置文件&#xff1b; 【2】使用ResourceBundleMessageSource管理国际化资源文件&#xff1b; 【3】在页面使用ftp:message取出国际化内容&#xff1b; 二、SpringBoot编写国际化步骤 【1】创…...

shell 条件语句 if case

目录 测试 test测试文件的表达式 是否成立 格式 选项 比较整数数值 格式 选项 字符串比较 常用的测试操作符 格式 逻辑测试 格式 且 &#xff08;全真才为真&#xff09; 或 &#xff08;一真即为真&#xff09; 常见条件 双中括号 [[ expression ]] 用法 &…...

C语言:写一个函数,实现3*3矩阵的转置(指针)

分析&#xff1a; 在主函数 main 中&#xff0c;定义一个 3x3 的整型数组 a&#xff0c;并定义一个指向整型数组的指针 p。然后通过循环结构和 scanf 函数&#xff0c;从标准输入中读取用户输入的 3x3 矩阵的值&#xff0c;并存储到数组 a 中。 接下来&#xff0c;调用 mov…...

STL pair源码分析

STL pair源码分析 pair是STL中提供的一个简单的struct&#xff0c;用来处理类型不同的一对值&#xff0c;是非常常用的数据结构。这一对值是以public的形式暴露出来的&#xff0c;直接通过first和second就能访问。我们以MSVC提供的STL源码为例&#xff0c;分析pair的具体实现。…...

【开源】基于Vue和SpringBoot的农家乐订餐系统

项目编号&#xff1a; S 043 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S043&#xff0c;文末获取源码。} 项目编号&#xff1a;S043&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户2.2 管理员 三、系统展示四、核…...

MyBatis 操作数据库(入门)

一&#xff1a;MyBatis概念 (1)MyBatis &#x1f497;MyBatis是一款优秀的持久层框架&#xff0c;用于简化JDBC的开发 (2)持久层 1.持久层 &#x1f49c;持久层&#xff1a;持久化操作的层&#xff0c;通常指数据访问层(dao)&#xff0c;是用来操作数据库的 2.持久层的规范 ①…...

JVM——垃圾回收器(G1,JDK9默认为G1垃圾回收器)

1.G1垃圾回收器 JDK9之后默认的垃圾回收器是G1&#xff08;Garbage First&#xff09;垃圾回收器。 Parallel Scavenge关注吞吐量&#xff0c;允许用户设置最大暂停时间 &#xff0c;但是会减少年轻代可用空间的大小。 CMS关注暂停时间&#xff0c;但是吞吐量方面会下降。 而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. 内容简介 近期&#xff0c;…...

springboot(ssm网络相册 在线相册管理系统Java(codeLW)

springboot(ssm网络相册 在线相册管理系统Java(code&LW) 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#xff09…...

邮箱发送短信的多种方式

第一种&#xff1a;邮箱验证方法&#xff1a; 导入依赖&#xff1a; <!-- mail依赖&#xff08;发送短信的依赖&#xff09; --><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId> &l…...

R语言——taxize(第五部分)

taxize&#xff08;第五部分&#xff09; 3. taxize 文档中译3.71. nbn_synonyms&#xff08;从 NBN 返回具有给定 id 的分类群名称的所有同义词&#xff09;3.72. ncbi_children&#xff08;在 NCBI 中搜索类群的子类群&#xff09;3.73. ncbi_downstream&#xff08;检索 NCB…...

负载均衡lvs

简介 ipvsadm 是 Linux 内核中的 IP 虚拟服务器&#xff08;IPVS&#xff09;管理工具。IPVS是 Linux 内核提供的一种负载均衡解决方案&#xff0c;它允许将入站的网络流量分发到多个后端服务器&#xff0c;以实现负载均衡和高可用性。IPVS通过在内核中维护一个虚拟服务器表&a…...

【腾讯云云上实验室】探索向量数据库背后的安全监控机制

当今数字化时代&#xff0c;数据安全成为了企业和个人最为关注的重要议题之一。随着数据规模的不断增长和数据应用的广泛普及&#xff0c;如何保护数据的安全性和隐私性成为了迫切的需求。 今天&#xff0c;我将带领大家一起探索腾讯云云上实验室所推出的向量数据库&#xff0c…...

阅读笔记——《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.【注】本文仅为作者个人学习笔记&#xff0c;如有冒犯&#xff0c;请联系作者删除。 目录 摘要 一、介绍 二、背景 三、方法…...

Arm_Cortex-M3权威指南

这本权威指南只是对应某一种具体的处理器内核&#xff0c;深入一种处理器内核对于我们理解整个ARM架构大有帮助 书籍资源在下面的链接 Arm_Cortex-M3权威指南 第2章 Cortex-M3概览 简介 Cortex-M3是一个32位处理器内核。内部的数据路径是32位&#xff0c;寄存器是32位&…...

告别破解风险,用快马AI五分钟搭建你的专属数据库管理工具原型

最近在做一个需要频繁操作数据库的小项目&#xff0c;原本想用Navicat这类工具&#xff0c;但正版价格不菲&#xff0c;破解版又担心安全和法律风险。正好发现InsCode(快马)平台可以快速生成代码原型&#xff0c;就尝试用它5分钟搭建了一个简易的数据库管理工具。 为什么选择W…...

前端骨架搭建

一、安装UI与功能库在终端运行以下命令npm install arco-design/web-vuenpm install lucide-vue-nextnpm install md-editor-v3npm install pinia axios分别安装预计项目所需的UI库、图标库、编辑器、状态管理功能。检查node版本&#xff0c;发现其为过时的v16版本&#xff0c;…...

Gazebo传感器仿真全攻略:从摄像头到Kinect的ROS联动配置

Gazebo传感器仿真全攻略&#xff1a;从摄像头到Kinect的ROS联动配置 1. 传感器仿真基础与Gazebo环境搭建 在机器人算法开发中&#xff0c;传感器仿真是验证算法有效性的关键环节。Gazebo作为ROS生态中最强大的物理仿真平台&#xff0c;能够模拟真实世界中的物理特性和传感器行为…...

[技术突破] 解决营销行业3大痛点:基于control_v1p_sd15_qrcode_monster的创新方案

[技术突破] 解决营销行业3大痛点&#xff1a;基于control_v1p_sd15_qrcode_monster的创新方案 【免费下载链接】control_v1p_sd15_qrcode_monster 项目地址: https://ai.gitcode.com/hf_mirrors/monster-labs/control_v1p_sd15_qrcode_monster 一、痛点剖析&#xff1a…...

如何在Windows系统中轻松访问Linux分区?Ext2Read的5个实用技巧

如何在Windows系统中轻松访问Linux分区&#xff1f;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技能组合&#xff1a;Kimi-VL-A3B-Thinking文件处理实现智能归档 1. 为什么需要智能文件归档系统 作为一名长期与杂乱文件搏斗的技术从业者&#xff0c;我深知手动整理文件的痛苦。每次收到发票、合同或报告&#xff0c;都需要先打开文件查看内容&#xff0c;然后根据…...

SEO_新手必看的SEO优化入门教程与核心方法(271 )

SEO优化入门教程&#xff1a;新手必看的核心方法 在当今的数字时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已经成为了每一个想要在互联网上站稳脚跟的人必不可少的技能。无论你是一个小企业的网站管理员&#xff0c;还是一个内容创作者&#xff0c;了解和掌握SE…...

智能家居组网实战:蓝牙Mesh vs ZigBee,哪种更适合你的智能灯泡?

智能家居组网实战&#xff1a;蓝牙Mesh与ZigBee的深度对比与选型指南 当你站在智能家居的十字路口&#xff0c;面对琳琅满目的智能灯泡和五花八门的组网协议&#xff0c;是否曾为选择蓝牙Mesh还是ZigBee而纠结&#xff1f;这两种技术看似相似&#xff0c;却在底层架构、性能表现…...

5分钟搞定!通义千问多模态检索系统一键部署与体验

5分钟搞定&#xff01;通义千问多模态检索系统一键部署与体验 1. 为什么选择通义千问多模态检索系统&#xff1f; 想象一下这样的场景&#xff1a;你在电商平台搜索"红色连衣裙"&#xff0c;结果却出现大量粉色上衣&#xff1b;或者在视频网站查找"猫咪搞笑视…...