STM32的每个IO都可以作为外部中断的中断输入口。
STM32F103的中断控制器支持19个外部中断/事件请求。每个中断设有状态为,每个中断/事件都有独立的触发和屏蔽设置。
STM32F103的19个外部中断为:
EXTI线0~15:对应外部IO口的输入中断。
EXTI线16:连接到PVD输出。(Programmable Votage Detector 可编程电压监测器。连到EXTI的电源电压检测(PVD)中断)
EXTI线17:连接到RTC闹钟事件。
EXTI线18:连接到USB唤醒事件。
STM32供IO口使用的中断线只有16个,而STM32的IO口远超16个。
所以STM32的GPIOx.0~GPIOX.15(x=A,B,C,D,E,F,G)分别对应中断线0~15。
以线0为例,对应了GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。
从《STM32中文参考手册》里可以看到映像,如下图:
但是中断线每次只能连接到1个IO口上,需要通过配置来指定中断线配置到哪个GPIO上。
在标准函数库中,该配置函数为:
/**
* @brief Selects the GPIO pin used as EXTI Line.
* @param GPIO_PortSource: selects the GPIO port to be used as source for EXTI lines.
* This parameter can be GPIO_PortSourceGPIOx where x can be (A..G).
* @param GPIO_PinSource: specifies the EXTI line to be configured.
* This parameter can be GPIO_PinSourcex where x can be (0..15).
* @retval None
*/
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
配置示例:
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource2);
GPIO_PinSource2即为EXTI2的线,在库里定义命名为EXTI_Line2。
EXTI_Line2相关配置如下:
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line2;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
接着需要配置中断的优先级:
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
配置结束后就要编写中断服务函数。
需要注意的是,中断线0~4每个中断线各自对应一个中断服务函数
EXPORT EXTI0_IRQHandler [WEAK]
EXPORT EXTI1_IRQHandler [WEAK]
EXPORT EXTI2_IRQHandler [WEAK]
EXPORT EXTI3_IRQHandler [WEAK]
EXPORT EXTI4_IRQHandler [WEAK]
中断线5~9共用一个中断服务函数
EXPORT EXTI9_5_IRQHandler [WEAK]
中断线10~15共用一个中断服务函数
EXPORT EXTI15_10_IRQHandler [WEAK]
在中断服务函数里,经常需要使用两个函数。
1、判断某个中断线上的中断是否发生(即相关标志位是否置位);
2、清除某个中断线上的中断标志位。
示例:
void EXTI2_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line2) != RESET)
{
...
EXTI_ClearITPendingBit(EXTI_Line2);
}
}
除了EXTI_GetITStatus之外函数库还提供了EXTI_GetFlagStatus,两者的区别是EXTI_GetITStatus会先判断这种中断是否使能,使能了才去判断中断标志位,而EXTI_GetFlagStatus直接用来判断状态标志位。
上一篇:STM32中对ADC1_Config()函数(ADC1_GPIO_Config()和ADC1_Mode_Config())的理解
下一篇:STM32F1笔记(七)WWDG窗口看门狗
推荐阅读最新更新时间:2024-11-02 20:35
设计资源 培训 开发板 精华推荐
- NEWTEC-NTBMS: NewTec电池管理系统(BMS)参考设计
- AP2138超低静态电流CMOS Ldo典型应用
- LTC3806EDE 演示板,同步反激式稳压器,4 个输出,Vin = 25V - 60V,Vout1 = 12V @ 400mA,Vout2 = 5V @ 400mA,Vout3 = 3.3V @ 3A,Vout4 = 2.5V @ 2A
- #第八届立创电赛#基于瑞萨的桌面电子时钟
- LT1071、5 至 12Vin 升压转换器的典型应用
- 分立式超声波测距仪
- LTM4627 的典型应用 - 15A DC/DC 模块稳压器
- LMV324DR2G 运算放大器电压基准的典型应用电路
- TLV431C 低压精密可调并联稳压器的典型应用
- 1.8V DC 至 DC 单输出便携式电源
- 直播:您的安全保护做到了吗?TI毫米波雷达直播给您答案
- 阅读TI Think.lnnovate 神级DIY系列博文,你来畅想我送礼!
- 详述项目申请,可获 TI Stellaris开发板!
- 直播已结束|TI C2000 Piccolo 单芯片——实现双轴伺服电机和马达控制
- 有奖直播:TI 超低功耗 MCU 在触摸及智能化工业网关中的应用
- 【主题月活动】小电阻,大智慧!
- 有奖直播:TI最新C2000实时控制器,在功率变换应用中实现高性能的成本优化型设计
- EEWorld邀你来拆解第9期——电机驱动专场,拆旧物 赢电机等好礼
- 电感知识大考:遇到这些问题怎么办?|“MPS电感探索季:发现小且不凡的秘密!”第一站