STM32中断的概念
简单来说,就是当主程序运行时,突然发生一件事情,导致主程序的运行被打断,此时32要先停止主程序的运行,转头处理意外事件,待事件处理完毕后,再继续主函数的运行。
上图是中断的概念图,我也是跟着江科大学32的,所以用的也是老师PPT里面的图。
触发中断
触发中断的核心原理就是读取测试IO输出口的边沿信号,可以在EXTI中设置上升沿触发、下降沿触发、上下升沿混合触发,以下是库函数中的具体定义:
typedef enum
{
EXTI_Trigger_Rising = 0x08,
EXTI_Trigger_Falling = 0x0C,
EXTI_Trigger_Rising_Falling = 0x10
}EXTITrigger_TypeDef;
代码部分
<CountSensor.c>部分
#include "stm32f10x.h" // Device header
#include "countsensor.h"
#include "led.h"
#include "delay.h"
uint16_t count;
void CountSensor_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct={GPIO_Pin_9,GPIO_Speed_50MHz,GPIO_Mode_IPU};
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource9);
EXTI_InitTypeDef EXTI_InitStruct={EXTI_Line9,EXTI_Mode_Interrupt,EXTI_Trigger_Falling,ENABLE};
EXTI_Init(&EXTI_InitStruct);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStruct={EXTI9_5_IRQn,2,2,ENABLE};
NVIC_Init(&NVIC_InitStruct);
}
uint16_t CountSensor_count(void)
{
return count;
}
void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line9)==SET)
{
Delay_us(100);
if(EXTI_GetITStatus(EXTI_Line9)==SET)
{
count++;
Delay_us(10);
LED1_Turn();
EXTI_ClearITPendingBit(EXTI_Line9);
}
}
}
<CountSensor.h>部分
#ifndef _COUNT_H
#define _COUNT_H
uint16_t CountSensor_count(void);
void CountSensor_Init(void);
#endif
主函数部分
#include "stm32f10x.h" // Device header
#include "countsensor.h"
#include "led.h"
int main(void)
{
LED_Init();
OLED_Init();
CountSensor_Init();
OLED_ShowString(1,1,"count=");
while (1)
{
OLED_ShowNum(1,7,CountSensor_count(),5);
}
}
实验现象
这个实验目的实现功能:当对射式红外传感器发出低电平时,LED灯亮,OLED屏上计数加1。
红外中断演示
代码细节
刚开始,我在中断函数里面放入LED状态切换函数时,发现LED灯没有切换状态,而且OLED显示计数也出现错误,总是两个两个的加,有时是三个,甚至有时直接加100。后来我才知道,不是代码问题,而是红外传感器的问题,因为其有个和按键同样的缺点,那就是有抖动现象(就姑且称红外的这种现象叫抖动),为了消除抖动,可以添加延时代码:
if(EXTI_GetITStatus(EXTI_Line9)==SET)
{
Delay_us(100);
if(EXTI_GetITStatus(EXTI_Line9)==SET)
{
count++;
Delay_us(10);
LED1_Turn();
EXTI_ClearITPendingBit(EXTI_Line9);