STM32 07 对射式红外传感器计次
一、实验目标掌握GPIO外部中断配置使用PB14引脚外接对射红外传感器物体遮挡触发上升沿中断完成计数通过0.96寸OLED实时刷新计数值实现物体通行计数功能。本次重点EXTI外部中断初始化、NVIC中断优先级配置、中断服务函数计数、OLED动态数字显示基于标准库STM32F10x开发。二、硬件接线说明1.对射式红外传感器VCC3.3V禁止5V避免烧坏单片机IOGND开发板GND共地OUT信号脚接STM32 PB14EXTI14中断通道原理无遮挡时OUT输出低电平物体挡住红外光束OUT输出高电平电平上升沿触发外部中断计数1。0.96寸I2C OLED屏幕GND电源地VCC3.3VSCL(时钟)PB8SDA(数据)PB9三、代码块main函数#includestm32f10x.h// Device header#includedelay.h#includeOLED.h#includeThrough-beam infrared sensor.hintmain(){count_init();OLED_Init();OLED_Clear();OLED_ShowString(1,1,Count);count_init();while(1){OLED_ShowNum(1,6,Get(),5);Delay_ms(1000);}}外部中断模块#includestm32f10x.h// Device header#includedelay.huint16_tcount;voidcount_init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_ModeGPIO_Mode_IPU;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_InitStructure.GPIO_PinGPIO_Pin_14;GPIO_Init(GPIOB,GPIO_InitStructure);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);EXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_LineEXTI_Line14;EXTI_InitStructure.EXTI_LineCmdENABLE;EXTI_InitStructure.EXTI_ModeEXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_TriggerEXTI_Trigger_Rising;EXTI_Init(EXTI_InitStructure);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannelEXTI15_10_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmdENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority1;NVIC_InitStructure.NVIC_IRQChannelSubPriority1;NVIC_Init(NVIC_InitStructure);}uint16_tGet(void){returncount;}voidEXTI15_10_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line14)SET){count;}EXTI_ClearITPendingBit(EXTI_Line14);}四、代码关键知识点解析OLED显示函数坐标规则OLED_ShowNum(1, 6, Get(), 5) 参数含义第1个参数 1 行Y轴一行可显示8个英文字符/1个汉字第2个参数 6 列X轴从屏幕最左侧开始计数第3个参数需要显示的数字读取全局count计数值第4个参数 5 数字显示长度不足5位时高位自动补空格。外部中断核心要点1. AFIO时钟必须开启EXTI复用IO映射功能依赖AFIO外设不开启时钟中断无法正常工作2. 浮空输入模式红外传感器OUT为高低电平输出GPIO配置浮空输入即可正确读取电平3. 上升沿触发无遮挡低电平→遮挡高电平上升沿精准捕捉物体经过动作4. 中断标志清除 EXTI_ClearITPendingBit 必须写在中断函数末尾否则硬件会持续重复进入中断5. 中断通道共用PB10~PB14全部共用 EXTI15_10_IRQHandler 一个中断服务函数函数内通过 EXTI_GetITStatus 区分具体触发引脚。全局计数变量说明uint16_t count 定义为全局变量中断服务函数直接修改数值主函数调用 Get() 读取数值实现中断与主循环的数据交互。五、实验现象与调试注意事项正常实验现象1. 上电后OLED第一行显示固定字符串 Count 2. 无物体遮挡红外对射管时屏幕数字保持初始03. 手/物体穿过红外光路触发一次上升沿中断数字自动1每秒刷新一次屏幕。常见问题排查1. 计数乱跳、自动累加原因红外信号线无下拉/上拉电阻电平干扰误触发解决传感器OUT引脚并联10k下拉电阻到GND或修改GPIO为上拉输入模式。2. 遮挡传感器计数无变化排查顺序确认PB14接线无误传感器VCC接3.3V检查代码是否开启AFIO时钟确认中断服务函数中清除中断标志代码存在示波器测量PB14遮挡时是否有电平上升跳变。3. OLED屏幕不显示数字确认I2C引脚PB8/PB9接线正确OLED驱动初始化无报错显示列参数未超出屏幕最大宽度。六、个人学习心得作为刚入门外部中断的初学者本次实验让我对GPIO外部中断、NVIC中断优先级、中断服务函数有了直观认知1. 中断和主循环是两套独立运行逻辑主循环负责屏幕刷新中断函数负责瞬时捕捉传感器信号二者通过全局变量完成数据传递2. 区分查询法与中断法如果用while循环不断读取PB14电平属于轮询查询会占用单片机全部算力外部中断仅在电平变化时触发CPU空闲时可以执行其他任务资源利用率更高3. 模块化开发优势红外传感器、OLED屏幕、延时函数全部封装独立 .c/.h 驱动文件业务逻辑计数显示写在主函数底层硬件驱动完全隔离后续更换传感器、修改屏幕参数无需改动主循环代码4. 中断代码规范很重要忘记清除中断挂起位、漏开AFIO时钟、中断通道写错这三类错误不会直接报编译报错只会出现计数异常调试耗时很久写代码时要牢记初始化完整流程。