(STM32基础)对射式红外传感器计次&旋转编码器计次

一、对射式红外传感器计次

1)配置对射式红外传感器初始化函数

1、外部中断配置:

第一步:因为对射式红外传感器模块DO数据传感器模块会给引脚发送高低电平信号来触发中断计次,所以需要配置该引脚外部中断初始化。

第二步:按照图示初始化所涉及到的外设:

①先开启所涉及的外设RCC时钟 

②配置GPIO口为输入模式

③配置AFIO选择所需要用到的Pin口连接到EXTI

④配置EXTI选择边沿出发方式,以及触发响应方式

⑤配置NVIC,给中断选择合适的优先级

代码实现:

① RCC开启所需外设的时钟,在这里只需要开启GPIO、AFIO的外设时钟,EXIT和NVIC时钟是默认开启的,NVIC是内核外设不受RCC控制。

代码:

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

② GPIO_Init 初始化配置

代码:    

    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;

③ 配置AFIO初始化,ST公司没有专门给AFIO封装专用函数库,在GPIO内附带配置了专用函数。

 GPIO_PinLockConfig  参数指定某个引脚, 那这个引脚配置会被锁定,防止误更改。

GPIO_EventOutputConfig
GPIO_EventOutputCmd    这两个函数用来配置AFIO的事件输出功能的

GPIO_PinRemapConfig   用于引脚重映射,第一个参数选择重映射的方式,第二个参数是新的状态
GPIO_EXTILineConfig    调用这个函数配置AFIO数据选择器,选择先要的中断引脚,虽然开头是GPIO,但是实际操作的是AFIO寄存器。

GPIO_ETH_MediaInterfaceConfig  以太网有关函数

代码:

 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);
 

④ 配置EXTI初始化

 EXTI_DeInit   清除EXTI的所有配置 恢复上电的初始状态
 EXTI_Init  结构体初始化EXTI函数
 EXTI_StructInit   调用这个函数可以把参数传递的结构体变量赋一个默认值
 EXTI_GenerateSWInterrupt  软件触发外部中断  调用一次 触发一次  如果只需要外部引脚触发中断则不需要次函数


FlagStatus EXTI_GetFlagStatus  获取指定标志位是否被置一
 EXTI_ClearFlag 对置一的标志位进行清除
ITStatus EXTI_GetITStatus  获取中断标志位是否被置一
 EXTI_ClearITPendingBit  清除中断挂起标志位

 这四个函数用语读取状态寄存器内的标志位,

在主函数里面对标志位操作使用前两个函数,前两个函数是一般的读写标志位,没有额外的处理,能不能触发中断标志位,都能读取。

在中断函数里面查看标志位使用下面两个函数,下面两个函数只能操作与中断有关的标志位,并且对中断是否允许做出了判断。

⑤ NVIC初始化设置

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 SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource);

 pre-emption priority and subpriority先占优先级(抢占优先级)和从占优先级(响应优先级)

二、旋转编码器计次

### 使用 HAL 庿实现对射红外传感器计次功能 为了使用 STM32 的 HAL 库实现对射红外传感器计次功能,可以采用 GPIO 中断的方检测红外传感器的状态变化。每当有物体遮挡并移开时触发中断,从而增加计数。 #### 初始化硬件资源 首先利用 CubeMX 工具配置好相应的 GPIO 口作为输入用于连接红外传感器信号端,并开启外部中断 EXTI 来响应电平变化事件[^1]。 ```c // 假设红外传感器接到了 PA0 引脚上 __HAL_RCC_GPIOA_CLK_ENABLE(); // 开启GPIOA时钟 GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING; // 上升沿下降沿都触发中断 GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* 配置NVIC以使能EXTI线上的IRQ */ HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); ``` #### 编写回调函数处理逻辑 定义全局变量 `counter` 存储次数统计值,在每次进入中断服务程序 ISR 后更新此数值: ```c volatile uint32_t counter = 0; void EXTI0_IRQHandler(void){ /* 清除待处理标志位 */ HAL_GPIO_EXTI_ClearFlag(GPIO_PIN_0); if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) != GPIO_PIN_SET){ // 如果当前状态为低电平,则认为发生了有效遮挡动作 counter++; // 这里还可以加入去抖动延时或其他过滤机制提高准确性 printf("Count:%lu\r\n", counter); // 打印当前计数值至串口监视器 } } ``` 以上代码片段展示了如何设置 GPIO 输入模以及编写简单的中断处理器来进行基本的对象通过次数计算。需要注意的是实际应用中可能还需要考虑防抖措施来确保计数精度[^3]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值