【STM32+HAL+Proteus】系列学习教程---中断(NVIC、EXTI、按键)

实现目标

1、掌握STM32的中断知识

2、学会STM32CubeMX软件关于中断的配置

3、具体目标:1、外部中断检测按键,每按一次计一次数,满5次LED1状态取反。


一、中断概述

1.1、中断定义

        CPU执行程序时,由于发生了某种随机的事件(包括外部或内部),让CPU暂时停下正在运行的程序,转而去执行一段处理事件的程序(中断服务子程序或中断处理程序),当这段程序执行完时(事件处理完时),程序又返回被停下的程序继续执行,这一过程称为中断。引发中断的称为中断源。中断可分为外部中断内部中断

        中断程序执行中又出现了中断,那么这种情况又叫做中断嵌套

1.2、中断的作用和意义

        中断的最终目的是高效处理紧急程序,并且不会占用CPU资源。还有就是能实现程序的并行化,实现嵌入式系统进程之间的切换等。

  • 实时控制:在确定的时间内对相应事件做出相应;例如:温度控制;
  • 故障处理:检测到故障,需要第一时间进行处理;
  • 数据传输:不确定数据何时会来,利用中断进行控制;

1.3、STM32的中断

        STM32F10x芯片有84个中断通道,包括16个内核中断68 个可屏蔽中断,这些中断通道已按照不同优先级顺序固定分配给相应的外部设备。

具体可参考:STM32F103的中文参考手册(9.1.2中断和异常向量)

二、 NVIC(中断向量控制器)

2.1 NVIC基本概念

        NVIC英文全称是Nested Vectored Interrupt Controller,中文意思就是嵌套向量中断控制器,通俗的讲它就是一个开关与选择器。它属于M3内核的一个外设,控制着芯片的中断相关功能。M3 内核都是支持 256 个中断,其中包含了 16 个系统中断 240 个外部中断,并且具有 256 级的可编程中断设置。

2.2、中断处理机制

工作过程:

         对于外部产生的中断不管是串口、定时器、IIC还是EXTI ,GPIO都由做NVIC来管理,NVIC的主要功能可以概括为:1. 中断管理;2.支持异常及中断向量化处理;3.支持嵌套中断。

2.3、STM32中断优先级

        当多个中断同时到来时,CPU该执行那个中断呢?这个时候就需要用到中断优先级,给中断的执行顺序排个序,优先级高的可以比优先级低的先执行,甚至优先级高的可以打断正在执行的优先级低的中断程序。

        STM32F103芯片支持60个可屏蔽中断通道,每个中断通道都具备自己的中断优先级控制字节(8位,但是STM32F103中只使用4位,高4位有效),用于表达优先级的高4位又可以组成抢占式优先级响应优先级,通常也把响应优先级称为“亚优先级”或“副优先级”,每个中断源都需要被指定这两种优先级。

NVIC_PriorityGroup

### STM32 HAL库在Proteus中实现按键控制LED #### 准备工作 为了实现在Proteus中通过STM32 HAL库使用按键控制LED的功能,需准备好相应的硬件资源和软件环境。具体来说,需要一块STM32开发板(如STM32F103C8T6),以及必要的外围设备如LED、蜂鸣器等[^2]。 #### 创建Proteus项目 启动Proteus软件并新建一个工程文件,在该环境中搭建电路图,包括放置STM32芯片模型及其周边元件,比如用于触发事件的按钮开关与作为输出指示的目标LED灯泡。确保所有组件之间的连线正确无误,特别是GPIO端口的选择要匹配实际使用的引脚定义。 #### 配置CubeMX生成初始化代码 打开STM32CubeMX工具配置目标MCU参数,设置时钟树结构,并启用所需的外设模块——这里主要是通用定时器TIM以便于延时函数的支持,还有GPIO接口用来管理输入/输出信号。对于按键操作,则应激活外部中断EXTI机制以响应用户的按压动作。完成后导出适用于所选IDE平台(如Keil uVision)的基础框架源码包。 #### 编写HAL库驱动程序 接下来编写具体的嵌入式应用程序逻辑部分: ```c #include "main.h" // 定义全局变量 uint8_t ledState = 0; void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void){ // 初始化系统时钟 HAL_Init(); SystemClock_Config(); // GPIO初始化 MX_GPIO_Init(); while (1){ // 主循环体保持空闲状态等待中断服务例程处理按键事件 } } /** * @brief 处理PA0上的按键按下产生的外部中断请求 */ void EXTI0_IRQHandler(void){ /* 清除待处理标志位 */ HAL_NVIC_ClearPendingIRQ(EXTI0_IRQn); if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_0)){ __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0); // 切换LED的状态 ledState ^= 1; // 更新LED显示 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15, (ledState ? GPIO_PIN_SET : GPIO_PIN_RESET)); } } ``` 上述代码片段展示了如何利用STM32 HAL库中的API来捕获来自特定IO管脚(此处假设为PA0)的边沿变化从而触发对应的ISR(Interrupt Service Routine)。每当检测到有效的下降沿脉冲到来时就会执行一次`EXTI0_IRQHandler()`函数内部的操作序列,即改变当前存储着LED亮灭情况的数据成员值并通过调用`HAL_GPIO_WritePin()`方法刷新物理层面上的实际表现形式[^4]。 #### 运行调试验证效果 将编译好的二进制映像加载至虚拟单片机实例之中,返回Proteus界面观察运行状况下的交互行为是否符合预期设计:每次轻触指定位置处布置的小型机械式触动开关之后都应该能够看到相应数量级大小不一的一组红色发光二极管交替闪烁起来。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

面包板扎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值