【嵌入式系统开发12】在stm32F103C8T6环境下,用HAL库,采用中断模式编程,控制LED的高亮与熄灭

2023-05-16

本文目的是主要解释如何用stm32F103核心板的GPIOA端一管脚接一个LED,GPIOB端口一引脚接一个开关;并采用中断模式编程,当开关接高电平时,LED亮灯;接低电平时,LED灭灯。

文章目录

  • 前言
  • (一)中断技术详解
    • 1.什么是中断?
    • 2.中断源
    • 3.中断处理的基本过程
      • 3.1中断请求阶段
        • 3.1.1中断请求触发器
        • 3.1.2中断允许触发器
      • 3.2中断判优阶段
        • 3.2.1软件判优
        • 3.2.2硬件判优
      • 3.3中断响应阶段
      • 3.4中断服务阶段
      • 3.5中断返回阶段
      • 3.6中断过程总结
    • 4.中断优先级
  • (二)工程新建
    • 1.硬件准备
    • 2.中断工程新创
    • 3.外设设置
    • 3.GPIO设置
    • 4.配置中断优先级
    • 5.时钟设置
    • 6.工程生成
  • (三)“小试牛刀”——中断控LED亮灭
    • 1.代码编写
    • 2.代码编译
    • 3.烧录实现
  • (四)总结
  • (五)参考文献


前言

※ 中断即打断,实至CPU再执行当前程序时,由于系统出现了某种需要处理的紧急情况,CPU暂停正在执行的程序,转而去执行另一段特殊程序来处理的出现的紧急事务,处理结束后CPU自动返回到原先暂停的程序中去继续执行,这种执行过程由于外界的的原因被中间打断的情况成为中断。
通俗一点,当生活中你正在专注于某事的时候,却因为某些原因,你需要放下手中的事,去做另外一件事情。就好比C/C++语言中的if语句。


(一)中断技术详解

1.什么是中断?

● 在单片机系统中,如果遇到需要紧急处理的突发事件时,CPU需要迅速的作出反应,暂停正在运行的程序来处理突发事件,这时就需要中断
● 中断是指单片机正在执行程序的时,发生突发事件从而打断当前程序,转而去处理这一事件,当处理完成后再回到原来被打断出继续执行原程序的过程。
● 意义:中断能提高CPU的效率,同事能够对突发事件做出实时处理。实现程序的并行化,实现嵌入式系统进程之间的切换。
中断分为同步中断异步中断
● 同步中断——同步中断是当指令执行时由 控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后 CPU 才会发出中断。
● 异步中断——异步中断是由其他硬件设备依照 CPU 时钟信号随机 产生的。
通常我们所说的中断指的是异步中断,我们将同步中断称为异常。(异常是由程序的错误产生的,或者是由内核必须处理的异常条件产生的)
在这里插入图片描述

2.中断源

● 任何能够引发中断的事件都称为中断源。
● 分类:中断源可分为硬件中断源和软件中断源。

硬件中断源:外设,数据通道,时钟电路和故障源(如电源掉电)。
软件中断源: 为调试程序设置的中断,中断指令,执行过程出错。

3.中断处理的基本过程

● 中断处理分为如下几个步骤:中断请求,中断响应,保护断点,处理中断,中断返回。

3.1中断请求阶段

● 发生在CPU内部的中断(内部中断),不需要中断请求,CPU内部的中断控制逻辑直接接收处理。
● 外部中断请求由中断源提出。外部中断源利用CPU的中断输入引脚 输入中断请求信号。一般CPU设有两个中断请求输入引脚:可屏蔽中断请求输入引脚和不可屏蔽中断请求输入引脚。

3.1.1中断请求触发器

● 每个中断源发中断请求信号的时间是不确定的,而CPU在何时响应中断也 是不确定的。所以,每个中断源都有一个中断请求触发器,锁存自己的中断请求信号,并保持到CPU响应这个中断请求之后才将其清除。

3.1.2中断允许触发器

● 在CPU内部有一个中断允许触发器,当其为“1”时,允许CPU响应中断, 称为开中断。若其为“0”,不允许CPU响应中断,中断被屏蔽,称为关中断。
● 通常,当CPU复位时,中断允许触发器也复位为“0”,即关中断。当 CPU中断响应时,CPU自动关闭中断,禁止接受另一个新的中断。
● 中断允许触发器的状态可以用开中断或关中断指令来设置。

3.2中断判优阶段

● CPU一次只能接受一个中断源的请求,当多个中断源同时向CPU提出中断请求时,CPU必须找出中断优先级最高的中断源,这一过程称为中断判优。
● 中断判优可以采用硬件方法,也可采用软件方法。

3.2.1软件判优

● CPU检测到中断请求后,首先读取中断请求寄存器的内容,逐位检测它们的状态,检测到某一位为1,就确定对应的中断源有中断请求,转去执行它的中断服务程序。
● 先检测哪一个,哪一个的优先级就高,后检测哪一个,哪一个优先级就低,检测的顺序就是各中断源的优先级顺序。
在这里插入图片描述
假设上图中输入端口地址为87FFH。有如下查询程序:
MOV DX, 87FFH
IN AL, DX ;读中断请求寄存器内容
SHR AL, 1
JC IR0 ;IRQ0有请求,转IR0
SHR AL,1
JC IR1 ;IRQ1有请求,转IR1
SHR AL,1
JC IR2 ;IRQ2有请求,转IR2
… …
软件判优耗时较长。如果中断源很多,中断的实时性就很差,但是软件判优优先权安排灵活。

3.2.2硬件判优

● 利用专门的硬件电路确定中断源的优先级,有两种常见的方式:菊花链判优电路和中断控制器判优。
菊花链判优电路
设计思想:每个中断源都有一个中断逻辑电路,所有的中断逻辑电路形成一个链,犹如菊花链。排在链前端的中断源优先级最高,越靠后的设备优先级越低。
在这里插入图片描述
实现过程: CPU收到中断请求,如果允许中断,CPU发出中断响应信号。中断响应信号首先到达菊花链的前端,如果中断源1提出了中断请求,它就会截获中断响应信号,封锁它,使它不能向下一个中断源传送。不论下面的中断源有没有提出中断请求,都不可能接收到中断响应信号,因此它们的中断请求也不能被响应。
中断控制器判优
● 中断控制器,如Intel8259A,可以以多种方式设置中断源的中断优先级。 中断控制器中有一个中断优先级判别器,它自动判别出目前提出中断请求的优先级最高的中断源,并将它的中断向量码送到数据总线,CPU接收中断向量码并据此找到它的中断服务程序。
在这里插入图片描述

3.3中断响应阶段

● 经过中断判优,中断处理就进入中断响应阶段。中断响应时,CPU向中断源发出中断响应信号,同时:
① 保护硬件现场;
② 关中断;
③ 保护断点;
④ 获得中断服务程序的入口地址。

3.4中断服务阶段

中断服务程序的一般结构为:
1)保护现场。 在中断服务程序的起始部分安排若干条入栈指令,将各寄存器的内容压入堆栈保存。
2)开中断。 在中断服务程序执行期间允许级别更高的中断请求中断现 行的中断服务程序,实现中断嵌套。
3)中断服务。 完成中断源的具体要求。
4)恢复现场。 中断服务程序结束前,必须恢复主程序的中断现场。通常是将保存在堆栈中的现场信息弹出到原来的寄存器中。
5)中断返回。 返回到原程序的断点处,继续执行原程序。

3.5中断返回阶段

返回到原程序的断点处,恢复硬件现场,继续执行原程序。
中断返回操作是中断响应操作的逆过程。

3.6中断过程总结

● 若中断事件发生,中断源向CPU发出有效的INT-REQ
● CPU结束当前指令的执行,进入对中断源请求信号的检测
● 如果CPU检测到有效的中断请求信号并满足响应条件,则向提出请求的中断源发送INT-ACK信号。
● CPU进行断点保护,即将现行程序被打断的标志寄存器状态内容以及CS和IP寄存器内容入栈(断点地址)入栈保存。同时获得有效INT-ACK信号的中断源撤销发出的中断请求信号,并为CPU提供中断处理程序的入口地址相关信息。
● 如果有多个中断源,CPU要先识别高优先级的中断源,然后根据中断源提供的中断程序入口地址转去执行中断服务程序。
● CPU执行中断处理程序,对获得响应的中断源进行服务,例如对IO设备进行IO操作,系统掉电时进行重要数据保护等。
● 中断处理完成时,恢复被保存在堆栈中的断点信息。
● CPU执行断点返回指令,是CPU回到之前被中断的程序断点处继续执行原程序。

4.中断优先级

8086/8088中断优先级:
软件中断(除单步中断)>非屏蔽中断NMI>可屏蔽中断INTR>单步中断
不同优先级中断的处理原则:

不同优先级的多个中断源同时发出中断请求,按照优先级高低依次处理。
低优先级中断正在处理,出现高优先级请求,应转去执行高优先级请求,服务结束后返回原低优先级中断服务程序继续执行。
高优先级中断正在处理,出现低优先级请求,可咋不响应。 中断处理时,出现同级别请求,应在当前中断处理结束后再处理新的请求。


(二)工程新建

1.硬件准备

● 硬件准备如下图:
在这里插入图片描述

2.中断工程新创

在这里插入图片描述
● 选择STM32F103C8T6。
在这里插入图片描述

3.外设设置

● 设置指示灯LED引脚PB5,设置引脚模式为输出模式GPIO_Output
● 设置按键引脚PA1,设置引脚为外部中断功能,PA1与外部中断线EXIT1连接GPIO_EXIT1
在这里插入图片描述

3.GPIO设置

在这里插入图片描述
● 对于开关对应管脚PA1,设置其触发方式为上升沿触发。
在这里插入图片描述
● 使能对应的外部中断线,点击Enabled。
在这里插入图片描述

4.配置中断优先级

● 大多数情况下不必设置中断优先级,直接使用中断编号设置的默认中断优先级。
在这里插入图片描述

5.时钟设置

● 设置32MHZ。
在这里插入图片描述
在这里插入图片描述

6.工程生成

● 命名与选择MDK-ARM。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


(三)“小试牛刀”——中断控LED亮灭

1.代码编写

● 在Keil文件中的gpio.c文件可以找到中断服务函数(void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin))。
● 当捕获到上升沿,触发中断,就会进入到这个函数里面。
● 在main.c文件中找个地方重新写一下,因为前面的 __weak 表示此函数为虚函数,需要用户重写的

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if( GPIO_Pin == A1_EXTI_Pin)//判断外部中断源
	{
		HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);//翻转LED状态
	}
}

在这里插入图片描述

2.代码编译

● 发现没有错误。在这里插入图片描述
在这里插入图片描述

3.烧录实现

在这里插入图片描述
❀ 最终实现效果如下:
请添加图片描述


(四)总结

本文目的是主要解释如何用stm32F103核心板的GPIOA端一管脚接一个LED,GPIOB端口一引脚接一个开关;并采用中断模式编程,当开关接高电平时,LED亮灯;接低电平时,LED灭灯。苦心人,天不负。艰难困苦,玉汝于成!
寄语:少年的梦想是什么
   是他日金榜题名,身披荣耀,腰缠万贯,衣锦换乡
   不,是成长,是独当一面,是能给家人遮风挡雨,为家人提笔而战!


(五)参考文献

[1]https://blog.csdn.net/weixin_45989401/article/details/119464355
[2]https://blog.csdn.net/weixin_45863060/article/details/123121438
[3]https://blog.csdn.net/windeal3203/article/details/44588205
[4]https://blog.csdn.net/weixin_42240667/article/details/105071373

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【嵌入式系统开发12】在stm32F103C8T6环境下,用HAL库,采用中断模式编程,控制LED的高亮与熄灭 的相关文章

  • ESP8266初学(一) 遇问题大全及解决方案(持续更新)

    最近开始学习wifi模块 xff0c 谁知一开始用PC连接调试wifi模块就遇到了很多问题 一 输入指令后没有反应 刚起步就头大 快乐地接好各种接口各种线 xff0c 连上电脑发现它冒蓝光光了 xff0c 好耶 xff01 然后兴致勃勃打开
  • PTA实验题:6-4 派生类的定义和使用 (10 分)

    按要求完成下面的程序 xff1a 1 定义一个Animal类 xff0c 包含一个void类型的无参的speak方法 xff0c 输出 animal language 2 定义一个Cat类 xff0c 公有继承自Animal类 xff0c
  • 模块学习(一)——编码电机

    想实现对电机的测速 xff0c 因此开始接触编码电机 此次采用的是RS365编码器电机 一 编码电机的初步了解 通过编码电机可以测出速度 常见一般编码电机分成两种 xff0c 一是光电编码器 xff0c 另一个是霍尔编码器 有六个接口 xf
  • nuxt如何处理用户登录状态持久化:nuxtServerInit 页面渲染前的store处理

    在一般的vue cli项目中 xff0c 我们可以用vuex persistedstate xff0c 它可以使vuex的状态持久化 xff0c 页面刷新都不会丢失 xff0c 原理当然是localStorage啦 xff01 当然也可以使
  • C语言查找字符

    C语言查找字符 相关文章路径 xff1a C语言求字符串的长度 gt C语言字符串的复制 gt C语言的字符串的联接 gt C语言字符串的比较 gt C语言查找字符 gt C语言BF算法 gt C语言输出字符串 gt C语言输入字符串 C
  • CPU、MPU、MCU、SOC的概念和区别

    概念 1 cpu cpu central processing unit 是一台计算机的运算核心和控制核心 xff0c CPU由运算器 控制器和寄存器以及实现他们联系的数据 控制总线构成 xff0c cpu典型的三级流水线操作是取值 译码
  • VScode报错:undefined reference to ‘WinMain’ collect2.exe: error: ld returned 1 exit status

    这是因为vs code并不会你点击了运行后就自动保存 xff0c 需要自己Ctrl 43 s保存一下 没保存显示一个圆点
  • 解决Realsense摄像头插着开机后,需要重新插拔程序才能正常工作

    安装 uhubctl 的过程 span class token function sudo span span class token function apt get span span class token function inst
  • Jetson TX2 刷机

    文章目录 准备工作1 host端 xff08 ubuntu xff09 配置2 连接线3 安装 NVIDIA SDK Manager 开始刷机STEP1STEP2STEP3STEP4 准备工作 1 host端 xff08 ubuntu xf
  • 链表头结点的插入和删除

    看了不少博客 xff0c 大都讲的比较详细到关于链表节点的删除和插入 xff0c 但因为没找到相关的头结点插入和删除的博客 xff0c 所以打算自己写一下方便大家查阅 下面是已经给出的链表的抽象数据结构 然后 然后下面是定义的插入结点的构造
  • gazebo无人机仿真显示:failsafe enabled: no rc

    修改qgc地面站参数 COM RC IN MODE 更改为 34 Joystick No RC Checks 34 这允许操纵杆输入并禁用 RC 输入检查 NAV RCL ACT to 34 Disabled 34 这可确保在没有无线遥控的
  • 力扣77组合(c++)

    力扣77组合 c 43 43 力扣题目链接 思路 这是一道经典的回溯算法题 xff0c 回溯法解决的问题都可以抽象为树形结构 xff08 N叉树 xff09 xff0c 我们可以通过树形结构来理解回溯算法 那么我把组合问题抽象为如下树形结构
  • 我的创作纪念日

    x1f36c 博主介绍 x1f468 x1f393 博主介绍 xff1a 大家好 xff0c 我是 PowerShell xff0c 很高兴认识大家 主攻领域 xff1a 渗透领域 数据通信 通讯安全 web安全 面试分析 x1f389 点
  • IDEA创建一个springboot项目教程(过程中各种报错解决)

    是不是不知道如何创建一个springboot项目 xff1f 是不是创建项目总是失败 xff1f 今天手把手带你创建一个springboot项目 配置maven 我们在创建一个springboot项目时一定要先配好maven配置文件sett
  • PHPWord相关

    phpword中进行换行操作 xff1a re 39 work experience 39 61 str replace array 34 r 34 34 n 34 34 r n 34 34 lt w br gt 34 re 39 work
  • 文件操作fwrite写txt文件乱码怎么办,我这里有方法解决

    很多大一新生到了期末做课设时 xff0c 遇到文件操作 总会有人不明白为什么写入的内容会乱码 先引入一些知识 xff1b 文件有二进制文件 xff0c 文本文件 二进制文件是按内存写入的 xff1b 文本文件是按格式写入的 xff1b 因此
  • DC电源口实物VCC引脚和GND引脚

    从后往前看 xff08 前面是电源线插进来的地方 xff09 xff0c 前面和左面是GND xff0c 后面是VCC
  • Docker入门

    前言 这就是一个简单的docker入门 因为可能现在用的少 笔者后面就有了些许草率 Docker 一篇入门 这里有阮一峰老师的docker简介传送门 这里有个语雀大佬的笔记传送门 后序也可以参考这个文章 一 Docker 简介 1 基本概述
  • java枚举类详解

    一 初始枚举 枚举类型是Java 5中新增特性的一部分 xff0c 它是一种特殊的数据类型 xff0c 之所以特殊是因为它既是一种类 class 类型却又比类类型多了些特殊的约束 xff0c 但是这些约束的存在也造就了枚举类型的简洁性 安全
  • vue报错:Component name “xxx“ should always be multi-word

    这个问题困扰我这个菜鸡很久了 xff0c 当我run serve的时候总是会报错Component name xxx should always be multi word 一直以为是命名的问题 xff0c 可是改了又改还是不行 xff0c

随机推荐