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

目录

  • 需求
    • 一、串口中断过程与作用
    • 二、中断实现流程
      • 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,USART1RCC_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停止位,波特率115200USART_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~15NVIC_EnableIRQ(USART1_IRQn);//使能中断通道
}

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

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

相关文章

android studio 新建java工程, 安卓新建项目,android studio2024 如何新建java项目

主要解决&#xff0c;新增安卓工程&#xff0c;没有java选项 1. 点击左上角FIle -> New -> 2. 选择 no activity 选项&#xff0c; 然后next 3. langua 就可以选择java 了。name自己定义项目名称&#xff0c;项目存储地址&#xff0c;包名。 配置完成选择finish. 4. fin…

Rust Web框架怎么选?

在最新的web框架基准测试中 https://www.techempower.com/benchmarkshttps://web-frameworks-benchmark.netlify.app/result?lrust 除去一些没有发布分支或者已经很少维护或者不是rust写的框架外&#xff0c;可以看到Axum、Actix-web是目前性能最好的两款后端框架&#xff0…

python,json数据格式,pyecharts模块,pycharm中安装pyecharts

json数据格式 JSON是一种轻量级的数据交互格式 可以按照JSON指定的格式去组织和封装数据 JSON本质上是一个带有特定格式的字符串 主要功能&#xff1a; json就是一种在各个编程语言中流通的数据格式&#xff0c;负责不同编程语言中的数据传递和交互. 类似于&#xff1a; 国…

手撕python之基本数据类型以及变量

​​​​​​1.基础概念 python就是将不同的数据划分成了不同的类型 就像我们生活中的数据有数字、字符等数据一样 小知识点&#xff1a; 注释&#xff1a;# 全体注释&#xff1a;AltF3 取消注释&#xff1a;AltF4 2.数值类型 数值类型概括 数值类型分为三种&#xff…

JavaWeb JavaScript ⑤ JS常见对象

某一瞬间&#xff0c;是平静的自我接纳 —— 24.8.27 一、数组 1.创建数组的四种方式 ① new Array() 创建空数组 ② new Array(5) 创建数组时给定长度 ③ new Array(ele1,ele2,…,elen); 创建数组时给定元素值 ④ [ele1,ele2,…,elen] 相当于…

【STM32单片机_(HAL库)】3-4-3【中断EXTI】【智能排队控制系统】排队系统代码框架搭建

3-4-2系统框图及硬件接线 3.软件 beep、exti、gate、LCD1602、led、tasks驱动文件添加GPIO常用函数中断配置流程main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "tasks.h" #include "gate.h"…

腾讯浙大提出定制化视频生成框架CustomCrafter,只需通过少量图像就可以完成高质量视频生成!

腾讯联合浙大提出了一种定制化视频生成框架-CustomCrafter&#xff0c;它能够基于文本提示和参考图像生成自定义视频&#xff0c;同时保留运动生成和概念组合的能力。通过设计一系列灵活的模块&#xff0c;使得模型实现了无需额外视频&#xff0c;通过少量图像学习&#xff0c;…

嵌入式:用J-Link Commander和J-Flash进行Flash编程的区别

相关阅读 嵌入式https://blog.csdn.net/weixin_45791458/category_12768532.html?spm1001.2014.3001.5482 J-Link Commander和J-Flash都是用于Flash编程的工具&#xff0c;但它们的功能和应用场景有所不同。以下是两者的区别&#xff1a; J-Link Commander: 类型: 命令行工…

机械学习—零基础学习日志(如何理解概率论4)

当已知一个概率&#xff0c;求解另外一个函数的概率。以下是离散型的概率计算方法。 这里是连续型的&#xff0c;已知概念密度&#xff0c;计算对应的另外一个函数的概率。 这里需要求解对应的原始函数。 这里我们做一道练习题。 《概率论与数理统计期末不挂科|考研零基础入门…

什么是Redis大key问题?如何解决?

目录 Key多大算大呢&#xff1f; 识别big key 处理big key Big Key是Redis中存储了大量的数据的Key&#xff0c;不要误以为big key只是表示Key的值很大&#xff0c;他还包括这个Key对应的value占用空间很多的情况&#xff0c;通常在String、list、hash、set、zset等类型中出…

使用Vue创建cesium项目模版该如何选择?

目录 问题描述模版说明及选用建议小结 问题描述 刚入手这个项目&#xff0c;什么都是一知半解。使用Vue,创建Cesium项目的时候&#xff0c;提示需要选择一个模版&#xff08;如下图所示&#xff09;&#xff0c;该如何选择项目模版选&#xff0c;总结如下&#xff1a; 模版说明…

大模型入门到精通——Prompt Engineering工程

Prompt Engineering 1. Prompt Engineering 的意义 在 LLM&#xff08;大语言模型&#xff09;时代&#xff0c;Prompt Engineering&#xff08;提示工程&#xff09;已经成为开发者与用户的重要技能和概念。随着大模型&#xff08;如 GPT、GLM、BERT 等&#xff09;的快速发…

8.26DEBUG

线程负责监听和处理不同的需求 顾客&#xff1a;代表需要被监控的文件句柄或网络socket&#xff0c;他们可能有各种需求&#xff0c;如点餐&#xff08;发送数据&#xff09;、询问菜品状态&#xff08;读取数据&#xff09;或需要帮助&#xff08;异常处理&#xff09; 菜单…

数据结构(邓俊辉)学习笔记】串 05——KMP算法:理解next[]表

文章目录 1.快速移动2.避免回溯3.通配哨兵 1.快速移动 在接下来这节&#xff0c;就让我们从严格的意义上来理解 next 表的具体含义及其原理。 我们已经切实地看到&#xff0c; KMP 算法的优化效果首先体现在它可以使模式串得以快速地后移&#xff0c;而不是如蛮力算法那样只…

【STM32单片机_(HAL库)】3-4-4【中断EXTI】【智能排队控制系统】项目实现

3-4-2系统框图及硬件接线 3-4-3系统代码框架搭建 4.软件—tasks.c文件编写 排队控制系统状态机 tasks.c #include "tasks.h" #include "led.h" #include "beep.h" #include "exti.h" #include "lcd1602.h" #include &…

22. K8S及DevOps

22. K8S及DevOps 一. 章节简介二. DevOps1. 简介2. CICD三. Kubernetes[1. 官网](https://kubernetes.io/zh-cn/)--------------------------------------------------------------------------------------------------------一. 章节简介 二. DevOps 1. 简介 2. CICD

【C语言】文件操作 (详细!!)

1、为什么使用文件 使用文件的原因&#xff1a;使用文件主要是为了在程序的执行过程中保存、读取和交换数据。文件提供了一种持久化存储数据的方式&#xff0c;使得程序在关闭后&#xff0c;数据不会丢失&#xff0c;可以被其他程序或后续的程序执行周期重新读取和处理。 1.0 什…

Spring Boot启用GZIP压缩

1.为什么是需要gzip压缩&#xff1f; 经常我们都会与服务端进行大数据量的文本传输&#xff0c;例如 JSON 就是常见的一种格式。通过 REST API 接口进行 GET 和 POST 请求&#xff0c;可能会有大量的文本格式数据提交、返回。然后对于文本&#xff0c;它有很高的压缩率&#x…

神经网络——最大池化

1.Pooling Layers讲解&#xff1a; 最大池化有时也被称为下采样&#xff0c;对应的有上采样。注意ceil_mode参数的使用 2.代码实战&#xff1a; import torch from torch import nn from torch.nn import MaxPool2dinputtorch.tensor([[1,2,0,3,1],[0,1,2,3,1],[1,2,1,0,0],…

react 的学习随记

npx create-react-app my-app 创建一个名叫my-app的react的项目 npm run eject 运行 显示config 文件夹 react jsx &#xff08;使用时将babel 将jsx转为js&#xff09; 单页面时需要引用 1&#xff0c;样式&#xff08;在虚拟dom时&#xff09; 1. 引用样式时 用classNa…