/*
编写步骤
一、初始化函数
1.开启GPIO、AFIO时钟
(NVIC和EXIT不需要开启,因为EXIT时钟一直处于开启状态,而NVIC是内核里的外设和CPU处在一起且RCC管理的是内核外的外设,综上所述,所以不用开启)
2.配置GPIO
3.配置AFIO
4.配置EXTI
5.配置NVIC
二、中断函数
三、返回计数次数函数
*/
#include "stm32f10x.h"
#include "stm32f10x_exti.h"
#include "infrared_count.h"
uint16_t NumberCount;//统计中断触发的次数
/*初始化函数*/
void Infrared_count_Init(void)
{
//开始GPIOB、AFIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
//GPIO初始化配置
GPIO_InitTypeDef GPIO_InitStruct; //定义结构体
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_14; //设置引脚为GPIOB_14
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU; //设置GPIO模式为上拉输入
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; //设置速度位50MHz
GPIO_Init(GPIOB,&GPIO_InitStruct);
//配置AFIO的数据选择器,选择中断引脚为GPIOB_14
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);
//配置EXIT
EXTI_InitTypeDef EXTI_InitStruct; //定义结构体
EXTI_InitStruct.EXTI_Line=EXTI_Line14; //指定中断线为 EXTI_Line14
EXTI_InitStruct.EXTI_LineCmd=ENABLE; //设置指定中断线的状态为ENABLE(开启状态)
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt; //设置指定中断线的模式为中断模式
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling; //设置指定触发信号的有效边沿为下降沿触发
EXTI_Init(&EXTI_InitStruct);
//配置NVIC
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //指定中断分组为分组2(2位抢占2位响应)
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn; //设置指定中断通道为EXTI15_10
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE; //设置指定中断通道使能
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1; //设置抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1; //设置响应优先级
NVIC_Init(&NVIC_InitStruct);
}
//中断函数
void EXTI15_10_IRQHandler(void)
{
//判断中断线14的中断标志位是不是1
if(EXTI_GetITStatus(EXTI_Line14)==SET)
{
NumberCount++;
EXTI_ClearITPendingBit(EXTI_Line14);//清除中断标志位
}
}
//返回计数次数函数
uint16_t NumberCount_Get(void)
{
return NumberCount;
}
#ifndef __INFRERED_COUNT_H
#define __INFRERED_COUNT_H
#include "stdint.h"
void Infrared_count_Init(void);
uint16_t NumberCount_Get(void);
#endif
#include "stm32f10x.h"
#include "delay.h"
#include "OLED.h"
#include "infrared_count.h"
int main (void)
{
//初始化
OLED_Init();
Infrared_count_Init();
OLED_ShowString(1,1,"Number_Counter:");
while(1)
{
OLED_ShowNum(2,1,NumberCount_Get(),5);
}
}