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

STM32学习笔记——中断控制

基础知识:

中断控制

STM32 中断控制是微控制器系统中的关键机制,用于高效处理外部事件和内部异常。以下是其核心概念和工作原理的概述:

1. 中断基本概念

  • 中断定义:CPU 在执行程序时,被内部或外部事件打断,转去执行预先安排好的处理程序(中断服务函数),处理完后返回原程序继续执行。
  • 中断源
    • 外部中断:来自 GPIO 引脚(如按键、传感器触发)。
    • 内部中断:定时器溢出、ADC 转换完成、通信接口数据接收等。
    • 异常:复位、硬件错误、调试事件等。

2. STM32 中断控制器(NVIC)

STM32 通过嵌套向量中断控制器(NVIC)管理中断,主要特性:

  • 中断优先级
    • 支持多级抢占优先级和子优先级(不同型号位数不同,如 4 位抢占 + 0 位子优先级)。
    • 抢占优先级高的中断可打断低优先级中断,形成嵌套。
  • 中断使能 / 禁用:每个中断源可独立配置使能位。
  • 挂起管理:存储待处理的中断请求。

3. 中断处理流程

  1. 中断发生:中断源产生有效信号(如上升沿、定时器溢出)。
  2. NVIC 响应:检查中断是否使能及优先级,若允许则挂起该中断。
  3. 上下文切换:CPU 保存当前程序计数器(PC)、寄存器等上下文。
  4. 执行中断服务函数(ISR):跳转到对应 ISR 地址执行。
  5. 恢复上下文:ISR 执行完毕后,恢复现场,继续执行原程序。

相关代码

对射式红外传感器计次

重要库函数文件编写CountSensor.c

#include "stm32f10x.h"                  // Device headeruint16_t CountSensor_Count;void CountSensor_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);EXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_Line = EXTI_Line14;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_Init(&EXTI_InitStructure);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_InitStructure);
}uint16_t CountSensor_Get(void)
{return CountSensor_Count;
}void EXTI15_10_IRQHandler(void)
{if (EXTI_GetITStatus(EXTI_Line14) == SET){/*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) == 0){CountSensor_Count ++;}EXTI_ClearITPendingBit(EXTI_Line14);}
}

主函数部分:

 

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "CountSensor.h"int main(void)
{OLED_Init();CountSensor_Init();OLED_ShowString(1, 1, "Count:");while (1){OLED_ShowNum(1, 7, CountSensor_Get(), 5);}
}

旋转编码器计次

重要库函数编写:Encoder.c

#include "stm32f10x.h"                  // Device headerint16_t Encoder_Count;void Encoder_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);EXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_Line = EXTI_Line0 |EXTI_Line1 ;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_Init(&EXTI_InitStructure);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;NVIC_Init(&NVIC_InitStructure);
}int16_t Encoder_Get(void){int16_t temp=Encoder_Count;Encoder_Count=0;return temp;
}void EXTI0_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line0)==SET) {if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0) {Encoder_Count--;}EXTI_ClearITPendingBit(EXTI_Line0);}
}void EXTI1_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line1)==SET) {if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0) {Encoder_Count++;}EXTI_ClearITPendingBit(EXTI_Line1);}
}

主函数部分

#include "stm32f10x.h"
#include "Delay.h"
#include "OLED.h"
#include "Encoder.h"int16_t Num;int main(void)
{OLED_Init();Encoder_Init();//OLED_ShowString(1,3,"helloworld");while(1){Num+=Encoder_Get();OLED_ShowSignedNum(1,5,Num,5);}
}

相关文章:

  • 新闻网站开发总结淘宝关键词排名查询网站
  • 网上做网站 干对缝儿生意世界网站排名查询
  • 临沂网站制作策划互联网广告营销
  • 如何在手机上做自己的网站备案查询站长工具
  • 网站建设价目windows系统优化软件
  • 作风建设网站百度快照推广效果怎样
  • 华为云Flexus+DeepSeek征文|华为云ModelArts Studio:利用New API实现大模型网关与AI资产管理的无缝对接
  • 响应式API和非响应式API
  • 【软考高级系统架构论文】论单元测试方法及应用
  • Zephyr OS蓝牙广播(Advertising)功能实现
  • 【Docker基础】Docker容器管理:docker unpause详解
  • 大模型本地部署,拥有属于自己的ChatGpt
  • 14.OCR字符识别
  • 【计算机网络】期末复习
  • STM32 环境监测与控制系统的设计与实现
  • 壁挂马桶品牌推荐:我的“瑞尔特瑞家HX5”沉浸式体验报告健康与洁净的硬核科技
  • 集成学习基础:Bagging 原理与应用
  • Linux环境下MariaDB如何实现负载均衡
  • 什么是RibbitMQ
  • 【e^ix图像展示】
  • 选择整数类型
  • 浸入式学语言助手(illa-helper)一款基于“可理解输入“理论的浏览器扩展插件,帮助在日常网页浏览中自然地学习语言。
  • [3D-Portfolio] docs | js集中式配置 | React组件 | 组件嵌套
  • 深度学习在智能机器人导航中的创新应用与未来趋势
  • 学习日记-spring-day36-6.24
  • NLP基础1_word-embedding