stm32红外对射计次
目前这个程序有问题,遮挡然后移开count加了不止一次。可能是由于硬件抖动原因。
// main.c #include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h" #include "CountSensor.h" int main(void) { OLED_Init(); Count_Sensor_Init(); while(1) { OLED_ShowNum(1, 1, Get_Count_Sensor_Count(), 5); } }
// CountSensor.c #include "stm32f10x.h" // Device header #include "delay.h" uint16_t Count_Sensor_Count = 0; uint16_t Get_Count_Sensor_Count(void) { return Count_Sensor_Count; } void Count_Sensor_Init(void) { /* 依次配置好: 1. RCC时钟打开 -- GPIO和AFIO, 2. 一路GPIO, 3. AFIO -- 把选择的一路GPIO接到(映射到)EXTI的0-15输入脚, 4. EXTI -- 选择边沿触发方式(上升沿,下降沿,双边沿),选择中断响应方式(中断响应,事件响应), 5. NVIC -- 为这个中断选择合适优先级。 */ // 1. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 2. GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; // 下拉输入, input down GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); // 3. (GPIOB PB0) -> AFIO0 -> (EXTI) GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0); // 4. EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line = EXTI_Line0; // EXTI线0 EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 中断模式 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 下降沿触发 // 我的模块是遮住输出1,空闲输出0,要想检测物体离开,应该是下降沿触发。 EXTI_Init(&EXTI_InitStructure); // 5. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 2抢占+2响应 // 注:上面这个函数在整个程序内只需要执行一次,为了思路清晰,模块化编程, // 故把它放在这里。如果程序在其他地方也要写这个函数,务必参数要相一致。 NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_Init(&NVIC_InitStructure); } void EXTI0_IRQHandler(void) { // 中断函数都是固定的函数名在启动文件startup_.....s文件里面找, // 中断函数都是无参数无返回值的。 // 中断函数由硬件系统自动调用,不必写在头文件里。 /* 如果是中断:EXTI15_10_IRQHandler(),10到15号都能触发同一个中断, 则应该判断具体是由哪个线路申请的中断,如下if判断是否是EXTI线14申请的。 此处只有EXTI线0能申请EXTI0_IRQHandler(),故不用判断,不,还是用吧。 */ if(EXTI_GetITStatus(EXTI_Line0) == SET) { Count_Sensor_Count++; EXTI_ClearITPendingBit(EXTI_Line0); // 清除中断标志位 } }