CountSensor學習注釋22/8/10學習打卡
CountSensor.c
#include "stm32f10x.h"? ? ? ? ? ? ? ? ? // Device header
//涉及中斷
uint16_t CountSensor_Count;
//配置中斷,外部中斷信號從GPIO到AFIO,再到EXTI,再到NVIC,最后到CPU
void CountSensor_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//RCC開啟GPIO時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//開啟AFIO的時鐘
//EXTI和NVIC的時鐘是一直打開的
//配置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);//初始化GPIOB外設
//配置AFIO外部中斷引腳選擇
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);//采用PB14引腳
//GPIO_EXTILineConfig()雖然以GPIO開頭但為AFIO的函數
//配置EXTI外設
/*配置為將EXTI的第14個線路配置為中斷模式
選中的線路開啟中斷,下降沿觸發(fā)
PB14的電平信號通過EXTI通向下一級NVIC
? ? ? ?*/
EXTI_InitTypeDef EXTI_InitStructure;//定義結構體
EXTI_InitStructure.EXTI_Line = EXTI_Line14; //需要PB14所在的線路故為Line14
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//指定選中線的新狀態(tài)
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
//可以是中斷模式(_Interrupt)或事件模式(_Event)
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
//指定觸發(fā)信號的有效邊沿,EXTI_Trigger_Rising上升沿觸發(fā),EXTI_Trigger_Falling下降沿觸發(fā)
//EXTI_Trigger_Rising_Falling上升沿和下降沿均觸發(fā)
EXTI_Init(&EXTI_InitStructure);
//配置NVIC
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//函數指定中斷分組,整個芯片只能采用一種分組
//(NVIC_PriorityGroup_2)兩位搶占中斷,兩位響應中斷
NVIC_InitTypeDef NVIC_InitStructure;//定義結構體,結構體名為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)//此中斷EXTI10`EXTI15均能進入
{
if (EXTI_GetITStatus(EXTI_Line14) == SET)//中斷標志位判斷,確保為想要的中斷源(EXTI14)觸發(fā)該函數
//EXTI_GetITStatus()返回值為SET或者RESET
{
/*如果出現數據亂跳的現象,可再次判斷引腳電平,以避免抖動*/
if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) == 0)
{
CountSensor_Count ++;//采用的是下降沿觸發(fā)的方式,在紙片移開時會++
}
EXTI_ClearITPendingBit(EXTI_Line14);//清除中斷標志位函數
/*只有當中斷標志位 置1,程序就跳轉到中斷函數,若不清除中斷標志位,則會一直申請中斷*/
}
}
CountSensor.h
#ifndef __COUNT_SENSOR_H
#define __COUNT_SENSOR_H
void CountSensor_Init(void);
uint16_t CountSensor_Get(void);
#endif