STM32的自学历程——实现红外中断

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值