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

学习中断配置的一天(第五天)

在这里插入图片描述


👨‍💻个人主页:@开发者-削好皮的Pineapple!

👨‍💻 hello 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 削好皮的Pineapple! 原创

👨‍💻 收录于专栏:C语言到基于STM32 的智能矿探小车


请添加图片描述

请添加图片描述

文章目录

    • 前言
    • 🎶一、外部中断基础
      • 1.1 外部中断与GPIO引脚对应关系
    • 🎶二、基于STM32F4xx的外部中断配置(初始化流程)
      • 2.1 中断源配置
        • 2.1.1 时钟信号使能
        • 2.1.2 GPIO初始化
        • 2.1.3 SYSCFG配置
        • 2.1.4 EXTI配置
      • 2.2 NVIC配置
    • 🎶三、外部中断服务函数
        • 结束语🥇


前言

今天是聚焦于STM32的外部中断相关知识的累累的一天。

中断是打断CPU正常执行的一种机制,对于STM32,有16个外部中断和GPIO引脚相关,分别称为EXTI0到EXTI15,GPIO引脚和外部中断按引脚编号一一对应,比如PA0对应EXTI0,PB0也对应EXTI0等。

我们所用的四个按键S1到S4分别连接PA0、PE2、PE3、PE4,对应产生EXTI0、EXTI2、EXTI3、EXTI4中断,按下相应按键可产生外部中断,进而实现小车行驶状态切换、速度增减及速度更改步长修改等功能,为后续智能矿探小车的开发进一步夯实基础。
在这里插入图片描述


🎶一、外部中断基础


1.1 外部中断与GPIO引脚对应关系

对于STM32,有16个外部中断和GPIO引脚相关,分别为EXTI0、EXTI1、EXTI2、…、EXTI15。

GPIO引脚和外部中断的对应关系为引脚编号一一对应,具体如下:

  • PA0、PB0、PC0、…、PI0均对应EXTI0
  • PA1、PB1、PC1、…、PI1均对应EXTI1
  • …以此类推

以我们使用的按键为例:

  • S1连接PA0,对应EXTI0
  • S2连接PE2,对应EXTI2
  • S3连接PE3,对应EXTI3
  • S4连接PE4,对应EXTI4

当按下这些按键时,会产生相应的外部中断。


🎶二、基于STM32F4xx的外部中断配置(初始化流程)


中断从产生到CPU处理要经过两级,分别是中断源配置和NVIC配置。

2.1 中断源配置

中断源即能够产生中断的地方,配置步骤如下:

2.1.1 时钟信号使能
  • 使能GPIO引脚时钟,使用函数RCC_AHB1PeriphClockCmd
  • 使能SYSCFG时钟,使用函数RCC_APB2PeriphClockCmd
2.1.2 GPIO初始化

通过GPIO_Init函数进行初始化,将GPIO配置成输入模式。

2.1.3 SYSCFG配置

使用SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex)函数进行配置,其中:

  • EXTI_PortSourceGPIOx用于指定GPIO的组号,如EXTI_PortSourceGPIOAEXTI_PortSourceGPIOB
  • EXTI_PinSourcex用于指定GPIO引脚编号,如EXTI_PinSource0EXTI_PinSource1、…、EXTI_PinSource15

注意:该函数不能进行位或操作,需逐个配置。例如:

SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource2);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource3);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource4);
2.1.4 EXTI配置

通过EXTI_Init(EXTI_InitTypeDef * EXTI_InitStruct)函数进行配置,EXTI_InitStruct结构体包含以下参数:

  • EXTI_Line:指定外部中断线,如EXTI_Line0EXTI_Line1
  • EXTI_Mode:指定外部中断的模式,设为EXTI_Mode_Interrupt(中断模式)
  • EXTI_Trigger:指定外部中断的触发因素,可选择EXTI_Trigger_Falling(下降沿触发)、EXTI_Trigger_Rising(上升沿触发)、EXTI_Trigger_Rising_Falling(双边沿触发)
  • EXTI_LineCmd:使能标志,设为ENABLE(使能)

2.2 NVIC配置

通过NVIC_Init(NVIC_InitTypeDef * NVIC_InitStruct)函数进行配置,NVIC_InitStruct结构体包含以下参数:

  • NVIC_IRQChannel:指定IRQn通道,对应中断的_IRQn,如EXTI0_IRQnEXTI1_IRQn
  • NVIC_IRQChannelPreemptionPriority:指定抢占优先级
  • NVIC_IRQChannelSubPriority:指定子优先级
  • NVIC_IRQChannelCmd:使能标志,设为ENABLE(表示使能)

在STM32中,抢占优先级和子优先级总共占用4个bit,需要进行优先级分组,使用NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)函数,一般在main函数中调用一次即可。例如:

NVIC_PriorityGroupConfig(2); // 抢占优先级占用2bits(范围0-3),子优先级占用2bits

🎶三、外部中断服务函数


在STM32中,所有中断服务函数的名字已在启动文件(.s)中编写好,CPU会自发处理外部中断,无需调用外部中断服务函数。

服务函数格式如下:

// 外部中断0的服务函数
void EXTI0_IRQHandler(void)
{// 具体处理逻辑EXTI_ClearITPendingBit(EXTI_Line0); // 手动清除外部中断0标志位
}// 外部中断2的服务函数
void EXTI2_IRQHandler(void)
{// 具体处理逻辑EXTI_ClearITPendingBit(EXTI_Line2); // 手动清除外部中断2标志位
}// 外部中断3的服务函数
void EXTI3_IRQHandler(void)
{// 具体处理逻辑EXTI_ClearITPendingBit(EXTI_Line3); // 手动清除外部中断3标志位
}// 外部中断4的服务函数
void EXTI4_IRQHandler(void)
{// 具体处理逻辑EXTI_ClearITPendingBit(EXTI_Line4); // 手动清除外部中断4标志位
}

我们需要在对应的服务函数中实现按键功能:

  • 按下S1(对应EXTI0),切换小车的行驶状态
  • 按下S2(对应EXTI2),增加小车的行驶速度
  • 按下S3(对应EXTI3),减少小车的行驶速度
  • 按下S4(对应EXTI4),修改速度的更改步长

请添加图片描述

结束语🥇

🔥 订阅专栏持续学习:C语言到基于STM32的智能矿探小车
💬 欢迎点赞、收藏、留言讨论,一起攻克嵌入式开发

http://www.dtcms.com/a/272314.html

相关文章:

  • 安装nginx+php环境
  • OpenCV探索之旅:多尺度视觉与形状的灵魂--图像金字塔与轮廓分析
  • 无人机识别比赛记录与分析
  • Java---IDEA
  • 【论文阅读】Decoupled Knowledge Distillation
  • 【大模型推理论文阅读】 Thinking Tokens are Information Peaks in LLM Reasoning
  • iOS 抓包详细教程:从零搭建、操作到实战调试的全流程指南
  • 图像亮度调整的简单实现
  • Flutter多线程机制深度解析
  • 【Docker基础】Docker容器与网络关联命令使用指南:深入理解容器网络连接
  • 力扣61.旋转链表
  • Windows下VScode配置FFmpeg开发环境保姆级教程
  • 面试150 LRU缓存
  • LeetCode - 1668. 最大重复子字符串
  • 原创:多面体编译,polybench-c-4.2批量测试脚本
  • php中array($this, ‘loadClass‘)表示啥意思?
  • 阿里云-跨账号同步OSS Bucket
  • 【Note】Linux Kernel 之 内核架构、源码文件、API/ABI 、FHS
  • Linux 内核日志中常见错误
  • idea安装maven 拉取依赖失败的解决办法
  • 网络基本概念
  • Ubuntu22.0.4安装PaddleNLP
  • Android Coil 3 data加载图的Bitmap或ByteArray数据类型,Kotlin
  • Redis BigKey 深度解析:从原理到实战解决方案
  • arm架构,arm内核,处理器之间的关系
  • 【部分省份已考真题】备战2025全国青少年信息素养大赛-算法创意实践挑战赛c++省赛/复赛真题——被污染的药剂
  • 如何发现Redis中的bigkey?
  • Django中序列化与反序列化
  • Python(31)PyPy生成器优化深度解析:JIT加速下的Python性能革命
  • 查看已安装 Django REST Framework (DRF) 版本