使用STM32进行红外传感器编程:包含实物图、外部信号流程及代码解析与扩展应用
最编程
2024-01-30 10:28:51
...
void CountSensor_Init(void)//配置外部中断
{
//第一步,初始化时钟(注:只有GPIO和AFIO需要开启时钟,且外设和总线要对应)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//初始化时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//初始化AFIO
//注:学习时,如果不中断哪个外设接到哪个总线,右键函数名,跳转定义查看(防止APB2接GPIOA等类似错误)
//第二步,配置GPIO
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//IPU为上拉输入,默认为高电平
//不知道选什么模式,需要参考数据手册中的第八章:通用和复用功能I/O(GPIO AFIO).
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
//第三步,配置AFIO(不需要开启时钟)---点击gpio.h查看函数(AFIO没用专门的库函数)
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);//选择数据选择器函数,选择引脚。B14脚进,EXTI14出
// 此处推荐跳转函数定义,查找@param的函数参数
//以下内容为Start文件夹里的stm32.GPIO.h相关函数,此处粗略介绍一下(在gpio.h的最后)
//void GPIO_AFIODeInit(void);//复位AFIO函数,调用该函数,清除AFIO
//void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//锁定GPIO配置,调用函数所指定的引脚,参数被锁定,不能更改。
//void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource); AFIO事件输出功能。
//void GPIO_EventOutputCmd(FunctionalState NewState); AFIO事件输出功能。
//void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);//重影设函数
//void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);//选择数据选择器函数,选择引脚。
//void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);//以太网使用时的函数
//第四步,配置EXTI----可点击exti.h文件查看函数
//将EXTI的第十四个线路配置为中断模式,下降沿触发,开启中断,并将EXTI传递给NVIC
EXTI_InitTypeDef EXTI_InitStruct;
EXTI_InitStruct.EXTI_Line=EXTI_Line14;//查看函数配置需要跳转定义查找@param,在下方,选择num,再次跳转,选择Line14
EXTI_InitStruct.EXTI_LineCmd=ENABLE;//指定选择中段线的新状态,应选择开启中断
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;//使用中断模式
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;//EXTI_Trigger_Falling为下降沿触发
EXTI_Init(&EXTI_InitStruct);//查看函数配置需要跳转定义查找@pram
//以下内容为Start文件夹里的stm32.exti.h相关函数,此处粗略介绍一下(在exti.h的最后)
//void EXTI_DeInit(void);//清除EXTI配置,恢复成上电默认状态
//void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);//调用后,根据结构体的参数配置EXTI外设,与初始化GPIO一致
//void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);//把参数传递的结构体变量赋默认值。
//void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);//软件触发外部中断。
//以下四个函数是标志位检测时使用的,前两个为主函数里查看和清除标志位,后两个为中断函数中查看和清除标志位
//FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);//主函数查看标志位
//void EXTI_ClearFlag(uint32_t EXTI_Line);//主函数清除标志位
//ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);//中断函数查看标志位
//void EXTI_ClearITPendingBit(uint32_t EXTI_Line);//中断函数清除标志位
//第五步,配置NVIC(不需要开启时钟,因为是内核外设)
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//选择分组方式:两位抢占,两位响应
//跳转定义,参数查找@param,函数解释查找@brief
NVIC_InitTypeDef NVIC_InitStruct;//重定义结构体...
NVIC_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn;//EXTI的15-10都合并到了EXTI15_10_IRQn,所以选择这个参数
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;//此处配置较随意,设置为1,1
//因为优先级配置多使用于多个优先级同时需要起作用,需要"排次序时",此处只有一个优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStruct);//初始化函数需要配置上面的结构体
//以下内容为Start文件夹里的misc.h(杂糅函数)相关函数,此处粗略介绍一下(在misc.h的最后)
//void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);//中断分组,参数是中断分组的方式
//void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);//根据结构体里面指定的参数初始化NVIC
//void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset);//设置中断向量表
//void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState);//系统低功耗配置
}
void EXTI15_10_IRQHandler(void)//中断函数
//中断函数都是无参无返回值的,建议从启动文件复制过来,在startup_stm3210x_mds.s文件里(119行)
{
//判断是不是EXTI14
if(EXTI_GetITStatus(EXTI_Line14)==SET)//中断函数查看标志位
{
CountSensor_Count++;//中断触发次数函数++
EXTI_ClearITPendingBit(EXTI_Line14);
//中断程序结束后,需要清除中断标志位,跳出中断,否则程序就一直响应中断.
}
}
//统计中断触发次数函数
uint16_t CountSensor_Count_Get(void)
{
return CountSensor_Count;
}