学习中断配置的一天(第五天)
👨💻个人主页:@开发者-削好皮的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_PortSourceGPIOA
、EXTI_PortSourceGPIOB
等EXTI_PinSourcex
用于指定GPIO引脚编号,如EXTI_PinSource0
、EXTI_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_Line0
、EXTI_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_IRQn
、EXTI1_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的智能矿探小车
💬 欢迎点赞、收藏、留言讨论,一起攻克嵌入式开发