STM32(F103ZET6)第四课:串口中断

news2024/9/24 17:12:08

目录

  • 需求
    • 一、串口中断过程与作用
    • 二、中断实现流程
      • 1.中断优先级分组
      • 2.配置串口中断
    • 三、需求的实现

需求

1.设备上电后四个灯灭。
2.按下KEY1,LED1灯亮,同时串口发送“LED1灯亮”。
3.再次按下KEY1,LED1灯灭,同时串口发送“LED1灯灭”。
4.加入中断,添加串口控制LED灯,且和按键相互不冲突。

一、串口中断过程与作用

在这里插入图片描述
1、外设发出中断请求
2、处理器暂停当前执行的任务,保护现场,将当前位置的PC地址压栈;
3、程序跳转到中断服务程序,执行中断服务程序;
4、恢复现场,将栈顶的值回送给PC;
5、跳转到被中断的位置开始执行下一个指令
中断服务函数:
相对于正常子函数,中断服务函数有以下需要注意的地方:
1、中断服务函数不能传入参数;
2、中断服务函数不能有返回值;
3、中断服务函数应该做到短小精悍,快入快出,禁止延时性的过程。
4、不要在中断函数中使用printf函数,会带来重入和性能问题。
5、不要加浮点型(double,float)运算
中断重入:就是在一个中断程序执行过程中又被另一个中断打断,转而又去执行另一个中断程序。
中断的部分专业术语
中断源:引起中断的原因,或者能够发出中断请求信号的来源统称为中断源
中断优先级:中断同时到来,谁先执行。数字越小,优先级越高。
中断响应:中断事件发生,Cortex-M3内核准备执行该事件,即为中断响应。
中断嵌套:可嵌套的内核 – 中断可以被其他中断打断。(Cortex-M)
不可嵌套的内核 – 不可以打断。
中断挂起:中断事件发生了,但是Cortex-M内核还没准备去执行。
中断服务函数: 中断发生后,要执行的程序。(固定格式)

二、中断实现流程

1.中断优先级分组

NVIC 支持由软件指定的优先级。通过对中断优先级寄存器的8位 IPR_N 区执行写操作,来将中断的优先级指定为 0~255,见中断优先级寄存器。硬件优先级随着中断号的增加而降低。 0 优先级最高, 255 优先级最低。指定软件优先级后,硬件优先级(默认优先级)无效。

利用系统控制块(SCB)中一个名为优先级分组的配置寄存器(属于SCB中的应用中断和复位控制寄存器)将每个具有可编程优先级的优先级配置寄存器可被分为两部分。上半部分(左边的位)为分组(抢占)优先级﹐而下半部分(右边的位)则为子优先级。事实上stm32只用了4位优先级,分组时从优先级高位向低位方向分组。

抢占优先级:高抢占优先级中断到来,可以打断低抢占优先级的;
次级优先级:两个抢占优先级一样高的中断,并且同时到来,判断次级优先级,谁高谁先执行

整个工程使用中断之前先设置优先级分组,并且只用分组一次
内核里面有8位可以配置中断的优先级分组:(stm32只支持四位优先级分组:高四位)
每个中断都要设置中断优先级:抢占优先级能够打断低抢占优先级的中断
在这里插入图片描述
x表示抢占,y是次级,高亮部分是有效部分

了解了以上之后,我们就可以开始配置寄存器了
NVIC_SetPriorityGrouping(X);
直接在这个函数中填写分组的序号X即可。
注意:该函数要放在main函数中,类似于初始化。
组号为7时只能打断主程序,不能打断中断。
分组代码如下:
在这里插入图片描述

2.配置串口中断

首先要打开手册找串口1的接收非空中断使能位置,由查询可知CR1控制寄存器的第五位即为接收非空中断使能位置,置1打开即可。

配置中断通道的优先级。
优先级配置函数:
NVIC_SetPriority();
注意:值为0~15但是只有高4位有用。

最后,使能中断通道打开即可使用中断函数。
使能中断通道函数:
NVIC_EnableIRQ();
注意:每个中断通道都能单独打开和关闭。
在这里插入图片描述
中断函数:
在这里插入图片描述
(USART1->SR&0x1<<5)!=0 执行该中断函数的原因有很多,所以判断一下是不是接收导致的
data = USART1->DR; 读操作,同时也是清空中断标志位
库函数配置
在这里插入图片描述
库函数中断接收
在这里插入图片描述

三、需求的实现

#include "usart.h"
#include "stdio.h"

void Usart1_Config()
{
	    //开时钟:GPIOA,USART1
	    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);
	    //配置对应的IO口 PA9(tx):复用推挽 PA10(RX):浮空输入
	    GPIO_InitTypeDef GPIO_InitStruct = {0};
		GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
		GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
		GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOA,&GPIO_InitStruct);
		GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
		GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
		GPIO_Init(GPIOA,&GPIO_InitStruct);
	  //配置串口1    8数据位,0校验位,1停止位,波特率115200
		USART_InitTypeDef USART_InitStruct = {0};//可以通过结构体类型跳转
		USART_InitStruct.USART_BaudRate = 115200;//波特率
		USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件控制流不开
		USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;//打开发送和接收
		USART_InitStruct.USART_Parity = USART_Parity_No;
		USART_InitStruct.USART_StopBits = USART_StopBits_1;
		USART_InitStruct.USART_WordLength = USART_WordLength_8b;
		USART_Init(USART1,&USART_InitStruct);
		USART_Cmd(USART1,ENABLE);
  //配置串口1的中断
	//在串口1产生接收的时候,会产生中断,我们直接去中断函数里面处理就可以了
	//选择串口1的中断原因
    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//USART1->CR1 |= 0x1<<5;//使能串口1的接收非空中断
	NVIC_SetPriority(USART1_IRQn,7);//设置优先级0~15
	NVIC_EnableIRQ(USART1_IRQn);//使能中断通道
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2078064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据计算-SQL优化手段(CBO)-以Flink为例

文章目录 背景理论知识示例结果展示结果解释 背景 大数据计算中&#xff0c;SQL生成的执行计划第一轮会经过固定规则的优化&#xff0c;第二轮会根据原计划&#xff0c;生成多条结合成本的的执行计划&#xff0c;根据cost 进行排序&#xff0c;选出最优的执行计划。 理论知识…

深入调研亚马逊云科技AI平台Amazon Bedrock热门开发功能

国际数据公司&#xff08;IDC&#xff09;在2024 年 8 月发布了《 中国大模型平台市场份额&#xff0c; 2023 &#xff1a;大模型元年——初局 》调研报告 。IDC的数据显示&#xff0c;2023年中国大模型平台及相关应用市场规模达惊人的17.65亿元人民币&#xff0c;且科学计算大…

带有音频的ppt导出视频 带有音频的ppt自动播放

之前帮导师申请基金&#xff0c;基金委的要求是提交ppt的讲解视频&#xff0c;这个需求比较容易实现。只要提前把各页的音频录制好&#xff0c;插入对应页&#xff0c;然后直接选择导出-创建视频即可&#xff0c;不需要设置幻灯片自动切换&#xff0c;以及自动换片时间&#xf…

C++ 设计模式——享元模式

C 设计模式——享元模式 C 设计模式——享元模式1. 主要组成成分2. 享元模式内部状态3. 享元模式外部状态4. 逐步构建享元模式4.1 抽象享元类定义4.2 具体享元类实现4.3 享元工厂类实现4.4 主函数 5. 享元模式 UML 图享元模式 UML 图解析 6. 享元模式的优点7. 享元模式的缺点8.…

TMDOG的微服务之路_07——初入微服务,NestJS微服务快速入门

TMDOG的微服务之路_07——初入微服务&#xff0c;NestJS微服务快速入门 博客地址&#xff1a;TMDOG的博客 在前几篇博客中&#xff0c;我们探讨了如何在 NestJS 中的一些基础功能&#xff0c;并可以使用NestJS实现一个简单的单体架构后端应用。本篇博客&#xff0c;我们将进入…

Python 如何进行简单的 GUI 编程(Tkinter)

图形用户界面&#xff08;GUI&#xff09;编程是指使用窗口、按钮、文本框等元素与用户进行交互的编程方式。在Python中&#xff0c;Tkinter是一个非常流行的标准库&#xff0c;它使得我们可以轻松地创建和管理图形用户界面。 Tkinter是Python内置的GUI库&#xff0c;它提供了…

Datawhale X 李宏毅苹果书 AI夏令营(深度学习进阶)task1(1.1+1.2)

深度学习的基础 常见的临界点的种类为局部最小值和鞍点 task1.1 1.局部最小值 对于任何目标函数f(x)&#xff0c;如果在x处对应的f(x)值小于在x附近任意其他点的f(x)值&#xff0c;那么f(x)可能是局部最小值。如果f(x)在x处的值是整个域中目标函数的最小值&#xff0c;那么…

爬虫中使用第三方打码平台(识别验证码)

引入 在爬虫程序中,常常会遇到验证码校验的关卡,人工识别不仅慢而且很费精力,使用打码平台就成了高效,省时且便利的选择。 本次案例对于高清资源库1080zyk.com进行爬虫采集&#xff0c;使用超级鹰验证码识别(chaojiying.com)和python的requests库具体实现&#xff0c;类似的第…

CSS的动画效果

动画效果 语法&#xff1a; 创建动画&#xff1a;keyframes 调用动画&#xff1a;animation animation参数值 参数值效果animation-name规定 keyframes 动画的名称。animation-duration规定动画完成一个周期所花费的秒或毫秒。默认是 0animation-timing-function规定动画的速…

ZBrush入门使用介绍——11、边缘环

大家好&#xff0c;我是阿赵。   继续介绍ZBrush的用法。这次看看边缘环的使用方法。我个人的感觉&#xff0c;边缘环有点类似于3DsMax之类软件的挤出功能&#xff0c;可以沿着环形的面&#xff0c;添加凹凸效果。   边缘环工具入口在几何体编辑里面&#xff1a; 一、 边…

AI大语言模型之分布式训练概述

一、前言 随着语言模型参数量和所需训练数据量的急速增长&#xff0c;单个机器上有限的资源已无法满足大语言模型训练的要求。需要设计分布式训练&#xff08;Distributed Training&#xff09;系统来解决海量的计算和内存资源需求问题。 在分布式训练系统环境下需要将一个模…

关于java中Excel的导入导出

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、配置pom依赖二、搭建utils工具类1.Excel表头设置表2.Excel导入导出工具类3.Excel导出配置4.Excel导入配置 三、添加user表和工具类使用方法1.user表设置2.工…

uni-app开发日志:新增页和修改页因字段太多用分段器实现分段分类

schema2code默认只能实现较为简单的分组&#xff0c;当填写项目较多的时候&#xff0c;肯定是用选项卡明确分段比较合适&#xff0c;这时候schema2code自生成的就没法实现了&#xff0c;摒着最最少的代码修改来尝试设置生成前的schema和生成后的vue页面。 一、schema设计 先把…

【Hot100】LeetCode—46. 全排列

目录 1- 思路回溯 2- 实现⭐46. 全排列——题解思路 3- ACM 实现 题目连接&#xff1a;46. 全排列 1- 思路 回溯 由于是排列问题&#xff0c;需要讲究元素顺序。元素相同顺序不同是不同的排列&#xff0c;而组合问题不强调元素顺序。组合中的 startIndex 是用来保证&#xff…

如何用Java SpringBoot+Vue打造法律援助平台?毕业设计全攻略

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

【区间dp】 CF607B Zuma 题解

题面翻译 Genos \texttt{Genos} Genos 最近在他的手机上下载了祖玛游戏。在祖玛游戏里&#xff0c;存在 n ( 1 ≤ n ≤ 500 ) n(1\leq n\leq 500) n(1≤n≤500) 个一行的宝石&#xff0c;第 i i i 个宝石的颜色是 C i C_i Ci​。这个游戏的目标是尽快的消灭一行中所有的宝石…

python 实现zellers congruence泽勒一致算法

zellers congruence泽勒一致算法介绍 Zeller’s Congruence&#xff08;泽勒一致算法&#xff09;是一种用于计算给定日期是星期几的算法。这个算法可以处理公历&#xff08;Gregorian calendar&#xff09;和儒略历&#xff08;Julian calendar&#xff09;日期。其核心公式如…

SpringBoot实战:Spring Boot项目使用SM4国密加密算法

引言 在业务系统构建与部署的环节中&#xff0c;数据库作为核心存储组件&#xff0c;其连接信息的安全至关重要。通常情况下&#xff0c;这些敏感信息&#xff0c;如数据库密码&#xff0c;会直接以明文形式存储在YAML配置文件中&#xff0c;这无疑增加了信息泄露的风险。为有效…

用EA和SysML一步步建模的操作指南(01)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 对于许多学习SysML和MBSE的同学来说&#xff0c;比较头痛的问题之一是&#xff1a;各种各样的教程里给出的案例&#xff0c;图都是画好了的&#xff01;如何从零开始用建模工具把模型画…

【企业级】像素流管理平台 V1.0

在当今快速发展的数字世界里&#xff0c;虚幻引擎的像素流技术为用户带来了前所未未有的视觉体验和交互方式。为了进一步提升开发效率和用户体验&#xff0c;我们【企业级】像素流管理平台 V1.0应运而生。通过一系列精心设计的功能&#xff0c;这个平台不仅简化了开发流程&…