目标 : 对射式红外传感器计次
开发板: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);
}
}