STM32自学教程:使用对射式红外传感器进行计数

9a821e331f22455bab0a88d2bdf650c3.jpg

infrared_count.c文件

/*

编写步骤

一、初始化函数

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;

}

infrared_count.h文件

#ifndef __INFRERED_COUNT_H

#define __INFRERED_COUNT_H

#include "stdint.h"

void Infrared_count_Init(void);

uint16_t NumberCount_Get(void);

#endif

main.c文件

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

 }

}

物联沃分享整理
物联沃-IOTWORD物联网 » STM32自学教程:使用对射式红外传感器进行计数

发表评论