当前位置: 首页 > news >正文

STM32 外设驱动模块八:红外反射式光电模块

1. 模块简介

计数传感器模块是 STM32 嵌入式系统中常用的输入控制接口,广泛用于计数应用、事件触发、检测等场景。

在实际项目开发中,计数传感器具有如下典型用途:

  • 计数器应用:例如按键或传感器事件计数。
  • 外部事件触发:用于测量外部信号的频率或发生次数。
  • 教学与实验:适用于嵌入式系统的基本实验与调试。
  • 自动控制反馈:配合其他系统模块反馈状态信息。


2. 原理解析

2.1 硬件工作原理

计数传感器模块通过外部中断方式来实现对信号的计数。一般情况下,传感器(如按钮、脉冲信号等)产生电平变化,STM32的外部中断外设(EXTI)用于检测信号的变化(如下降沿触发),触发中断服务程序后进行计数。

计数传感器模块的工作原理依赖于STM32的外部中断(EXTI),外部信号触发后计数器增值或执行其他控制操作。

2.2 电路连接示意

STM32 GPIOB14 --- 按钮传感器 --- GND
STM32 VCC --- OLED显示模块 --- GND
STM32 PB6 (SCL) --- OLED --- SCL
STM32 PB7 (SDA) --- OLED --- SDA

说明:

  • 按钮传感器与 STM32 的 GPIOB14 引脚连接,按下按钮时产生一个下降沿触发外部中断。
  • 使用 I2C 接口连接 OLED 显示模块,STM32 的 PB6 (SCL)PB7 (SDA) 引脚分别与 OLED 的时钟线和数据线连接。

3. 外设配置思路

3.1 涉及外设资源

外设名称用途说明
GPIOB14外部中断输入信号,触发计数
EXTI外部中断线,检测外部信号变化
NVIC配置中断优先级和中断处理程序
OLED (I2C)显示模块,显示计数值

3.2 配置步骤概述

  1. 开启相关外设时钟:包括 GPIO 和 EXTI。
  2. 配置 GPIOB14 为输入上拉模式。
  3. 配置外部中断线 EXTILine14 触发模式为下降沿。
  4. 配置 NVIC 优先级和中断响应优先级。
  5. OLED 显示模块配置 I2C 通信,初始化显示。

4. 标准库驱动代码

4.1 头文件引用

#include "stm32f10x.h"
#include "OLED.h"
#include "Delay.h"
#include "CountSensor.h"

4.2 初始化函数

void CountSensor_Init(void) {// 开启GPIOB时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);  // 启动AFIO时钟// 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);// 配置外部中断引脚GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);// 外部中断配置EXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_Line = EXTI_Line14;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_Init(&EXTI_InitStructure);// 配置中断优先级NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef 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);
}

4.3 辅助函数

void CountSensor_Write(uint8_t val) {// 例如:通过外部传感器控制输出或读取数据
}

4.4 主函数范例

int main(void) {OLED_Init();  // 初始化OLEDCountSensor_Init();  // 初始化计数传感器while (1) {OLED_ShowNum(1, 7, CountSensor_Get(), 5);  // OLED显示计数值}
}

5. 应用扩展建议

拓展功能实现说明或应用场景
多个传感器计数可以扩展为多个传感器并行计数,如同时处理多个按钮的计数。
计数值存储可以将计数值存储到外部存储器(如 EEPROM),实现断电后保存。
周期性计数清零可配合定时器实现周期性清零计数,或者设定一个最大计数值后清零。

6. 常见问题与调试建议

问题现象排查与解决建议
计数不准确或抖动检查按钮是否有机械抖动,可在中断服务程序中增加延时或多次判断电平。
中断无法触发确保EXTI中断线配置正确,检查GPIO引脚是否已正确配置为输入。

http://www.dtcms.com/a/347161.html

相关文章:

  • 【大语言模型 15】因果掩码与注意力掩码实现:深度学习中的信息流控制艺术
  • 2-5.Python 编码基础 - 键盘输入
  • 2025钉钉十周年新品发布会,新品 “蕨”命名,到底是什么?
  • vue3 - 组件间的传值
  • nodejs和vue安装步骤记录
  • 【Golang】有关任务窃取调度器和抢占式调度器的笔记
  • 机器人 - 无人机基础(5) - 飞控中的传感器(ing)
  • 【大语言模型 16】Transformer三种架构深度对比:选择最适合你的模型架构
  • 云原生俱乐部-k8s知识点归纳(8)
  • 资深产品经理个人能力提升方向:如何系统化进阶并考取高价值证书?
  • 资深产品经理个人能力提升方向:如何系统化进阶与考证规划
  • 可视化-模块1-HTML-02
  • Node.js特训专栏-实战进阶:23. CI/CD流程搭建
  • 国产轻量级桌面GIS软件Snaplayers从入门到精通(21)
  • 复杂街景误检率↓79%!陌讯动态融合算法在街道垃圾识别的边缘计算优化​​
  • Text2SQL、ChatBI简介
  • AI agent开发与大模型工程师面试复习纲要与高频面试题答案(4)-- AI agent系统设计与项目实践
  • Rust系统编程实战:驾驭内存安全、无畏并发与WASM跨平台开发
  • Go语言实战案例-Redis连接与字符串操作
  • python 字典有序性的实现和OrderedDict
  • 字节跳动开源Seed-OSS:36B参数模型以512K上下文与可控思考预算重新定义AI实用主义
  • Linux:进程间通信(IPC)-SystemV
  • MiMo-VL 技术报告
  • 文献阅读笔记【物理信息机器学习】:Physics-informed machine learning
  • AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年8月23日第168弹
  • Java 泛型 T、E、K、V、?、S、U、V
  • 脑洞补给站—金湾读书会—第二期—课题分离——20250823
  • GitHub 热榜项目 - 日榜(2025-08-23)
  • 小白成长之路-k8s原理(一)
  • 新能源电池深孔检测:新启航方案以激光频率梳技术打破光学遮挡,达 2μm 级