STM32中断的应用:对射式红外传感器计次

目标 : 对射式红外传感器计次

开发板:STM32F103C8T6
套件:STM32最小系统板面包板套件

 

接线图:

步骤:

  • 第一步:配置RCC使能必要外设——GPIOB,AFIO

  • 第二步:配置GPIO——结构体的定义,指定引脚,速度配置,工作模式配置,初始化GPIO

  • 第三步:配置AFIO——选择使用哪一路的GPIO与后面的EXTI相连

  • 第四步:配置EXTI——选择触发响应方式(中断响应和事件响应),选择边沿触发方式(上升沿,下降沿,双沿)

  • 第五步:配置NVIC——为中断选择的优先级

代码:

CountSensor.c

#include "stm32f10x.h"                  // Device header

uint16_t CountSensor_Count;            //定义变量

void CountSensor_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);    //开启RCC时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);     //开启AFIO时钟
	
    //配置GPIO选择端口为输入模式
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);                            
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);    //选择中断引脚
	EXTI_InitTypeDef EXTI_InitStructure;
	EXTI_InitStructure.EXTI_Line = EXTI_Line14;                    //中断/事件线选择
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;                      //控制是否使能
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;            //中断模式选择
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;        //指定触发信号的有效边沿(下降沿触发)
	EXTI_Init(&EXTI_InitStructure);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);            //配置中断源
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;       //配置抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure. NVIC_IRQChannelPreemptionPriority = 1;    //配置抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =  1;           //配置响应优先级
	NVIC_Init(&NVIC_InitStructure);                
	
}


uint16_t CountSensor_Get(void)
{
	return CountSensor_Count;
}


void EXTI15_10_IRQHandler(void)                    //中断函数,固定函数名,可在启动文件里查看
{
	if(EXTI_GetITStatus(EXTI_Line14) == SET)        //检查指定外部中断线的状态是否有效。
	{
		CountSensor_Count ++;                        
		EXTI_ClearITPendingBit(EXTI_Line14);        //中断标志位清除
	}
	
}

  CountSensor.h    

#ifndef __DELAY_H
#define __DELAY_H
 
void CountSensor_Init(void);
uint16_t CountSensor_Get(void);
 
#endif

主函数:

#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "CountSensor.h"

int main(void)
{
	OLED_Init();
	CountSensor_Init();
	
	OLED_ShowString(1,1,"Count:");
	
	while(1)
	{
		OLED_ShowNum(1,7,CountSensor_Get(),6);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值