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();  // 初始化OLED
    CountSensor_Init();  // 初始化计数传感器

    while (1) {
        OLED_ShowNum(1, 7, CountSensor_Get(), 5);  // OLED显示计数值
    }
}

5. 应用扩展建议

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

6. 常见问题与调试建议

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客晨风

感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值