外部中断框图

产生中断
硬件触发外部中断
配置中断屏蔽寄存器中的屏蔽位,允许该外部中断请求
通过AFIO_EXTICRx配置GPIO线上的外部中断/事件,必须先使能AFIO时钟
选择外部中断的触发边沿,上升沿/下降沿/两者都检测
在NVIC中设置外部中断的优先级,并使能该中断
在中断发生后,在中断服务函数中,清除请求挂起寄存器中的对应位(写1清除)
STM32参考手册中的描述:要产生中断,必须先配置好并使能中断线。根据需要的边沿检测设置2个触发寄存器,同时在中断屏蔽寄存器的相应位写’1’允许中断请求。当外部中断线上发生了期待的边沿时,将产生一个中断请求,对应的挂起位也随之被置’1’。在挂起寄存器的对应位写’1’,将清除该中断请求。

产生软件中断
软件触发外部中断
- 配置中断屏蔽寄存器中的屏蔽位,允许该外部中断请求
- 通过AFIO_EXTICRx配置GPIO线上的外部中断/事件,必须先使能AFIO时钟
- 选择外部中断的触发边沿,上升沿/下降沿/两者都检测(可选操作)
- 在NVIC中设置外部中断的优先级,并使能该中断
- 在软件中断/事件寄存器中对应位写1,触发该外部中断
- 在中断发生后,在中断服务函数中,清除请求挂起寄存器中的对应位(写1清除)
产生事件
硬件触发事件
- 配置事件屏蔽寄存器中的屏蔽位,允许该事件请求
- 通过AFIO_EXTICRx配置GPIO线上的外部中断/事件,必须先使能AFIO时钟
- 选择事件的触发边沿,上升沿/下降沿/两者都检测
- 事件发生后,脉冲发生器将产生一个脉冲,供给其他外设使用(如ADC,TIM)
要产生事件,必须先配置好并使能事件线。根据需要的边沿检测通过设置2个触发寄存器,同时在事件屏蔽寄存器的相应位写’1’允许事件请求。当事件线上发生了需要的边沿时,将产生一个事件请求脉冲,对应的挂起位不被置’1’。
注意:事件触发后,不需要清除挂起寄存器中的对应位
产生软件事件
软件触发事件
- 配置事件屏蔽寄存器中的屏蔽位,允许该事件请求
- 通过AFIO_EXTICRx配置GPIO线上的外部中断/事件,必须先使能AFIO时钟
- 选择外部中断的触发边沿,上升沿/下降沿/两者都检测(可选操作)
- 在软件中断/事件寄存器中对应位写1,触发该事件
外部中断-硬件下降沿触发demo
采用STM32F103C8T6单片机,KeilMDK5.32版本
外部中断线1连接PA1,硬件下降沿触发,在中断回调函数中实现LED的亮灭的翻转。
STM32CubeMX配置
用EXTI1来代表外部中断1
其他配置选项

外部中断回调函数
/**
* @brief EXTI line detection callbacks.
* @param GPIO_Pin: Specifies the pins connected EXTI line
* @retval None
*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
/* 采用位带操作实现LED翻转 */
PCout(13) = !PCin(13);
}
注意:HAL库在进入回调函数前就已经将外部中断挂起寄存器中的对应位清除了
软件触发中断/事件
主要代码如下:
/* USER CODE BEGIN 2 */
EXTI_HandleTypeDef exti1 = { 0 };
exti1.Line = EXTI_LINE_1;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_Delay(1000);//延时1000毫秒
/* 软件触发外部中断 */
EXTI->SWIER = EXTI_LINE_1;//直接操作寄存器触发
//HAL_EXTI_GenerateSWI(&exti1);//HAL库来触发
}
/* USER CODE END 3 */
工程文件下载链接
外部事件-硬件下降沿触发demo
STM32在低功耗模式(睡眠模式)下,可通过PA1外部事件线1来唤醒内核。
采用STM32F103C8T6单片机,KeilMDK5.32版本
配置一个外部EXTI1线为事件模式来唤醒STM32,WFE指令进入睡眠状态,选择SLEEP-NOW微控制器立即进入睡眠模式。
PC13控制LED灯,LED的亮灭用来指示程序是否在运行
注意:未开启外部中断(NVIC寄存器中为使能外部中断)
STM32CubeMX配置
主要代码
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_Delay(1000);//延时1000毫秒
/* 采用位带操作实现LED翻转 */
PCout(13) = !PCin(13);
if(times > 4)
{
//HAL_SuspendTick();//停止系统滴答计时器
CLEAR_BIT(SysTick->CTRL, SysTick_CTRL_ENABLE_Msk);//失能系统滴答定时器
HAL_PWR_EnterSLEEPMode(0, PWR_SLEEPENTRY_WFE);//WFE指令进入睡眠模式
times = 0;
SET_BIT(SysTick->CTRL, SysTick_CTRL_ENABLE_Msk);//使能系统滴答定时器
//HAL_ResumeTick();//恢复系统滴答计时器
}
times++;//循环次数加一
}
工程文件下载链接
参考资料
- STM32F10x-中文参考手册
参考资料下载链接
