【STM32】对射式红外传感器计次&旋转编码器计次(江科大)

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

在这里插入图片描述


AFIO 外设
在这里插入图片描述
这个函数是用来复位AFIO外设的,调用一下这个函数,AFIO外设的配置就会全部清除


在这里插入图片描述
这个函数是用来锁定GPIO配置的,调用这个函数,参数指定某个引脚,这个引脚的配置就会被锁定,防止意外更改(用的不多)


在这里插入图片描述
这两个函数是用来配置AFIO的事件输出功能的(用的不多)


在这里插入图片描述
这两个函数比较重要,第一个函数可以用来进行引脚重映射,第一个参数可以选择重映射的方式,第二个参数是新的状态;第二个函数是本节外部中断需要用的函数,调用这个函数,可以配置AFIO的数据选择器,来选择中断引脚


在这里插入图片描述
这个是和以太网有关的,用不到


配置AFIO外部中断引脚
在这里插入图片描述
当执行完这个函数后,AFIO的第14个数据选择器就拨好了,其中输入端被拨到了GPIOB外设上,对应的就是PB14号引脚,输出端固定连接的是EXTI的第14给中断线路,这样,PB14号引脚的电平信号就可以顺利通过AFIO,进入到后级EXTI电路了


配置EXTI
在这里插入图片描述


在这里插入图片描述
把EXTI的配置都清除,恢复成上电默认的状态


在这里插入图片描述
初始化EXTI,可以根据这个结构体里的参数配置EXTI外设


在这里插入图片描述
把参数传递的结构体变量赋一个默认值


在这里插入图片描述
用来软件触发外部中断,调用这个函数,参数给一个指定的中断线,就能软件触发一次这个外部中断;如果只需要外部引脚触发中断,就不需要这个函数


在这里插入图片描述
GetFlagStatus可以获取指定的标志位是否被置1,ClearFlag可以对置1的标志位进行清除,对于这些标志位,有的比较紧急,在置标志位后会触发中断,在中断函数里,如果想查看标志位和清除标志位,可以用下面两个函数
在这里插入图片描述
GetITStatus,获取中断标志位是否被置1,ClearITPendingBit清除中断挂起标志位
总结:如果想在主程序里查看和清除标志位,用上面两个函数;如果想在中断函数里查看和清除标志位,用下面两个函数(都是读写状态寄存器)


在这里插入图片描述


配置NVIC
在这里插入图片描述


CountSensor.c

#include "stm32f10x.h"                  // Device header

uint16_t CountSensor_Count;				//全局变量,用于计数

/**
  * 函    数:计数传感器初始化
  * 参    数:无
  * 返 回 值:无
  */
void CountSensor_Init(void)
{
   
	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);		//开启GPIOB的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);		//开启AFIO的时钟,外部中断必须开启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);						//将PB14引脚初始化为上拉输入
	
	/*AFIO选择中断引脚*/
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);//将外部中断的14号线映射到GPIOB,即选择PB14为外部中断引脚
	
	/*EXTI初始化*/
	EXTI_InitTypeDef EXTI_InitStructure;						//定义结构体变量
	EXTI_InitStructure.EXTI_Line = EXTI_Line14;					//选择配置外部中断的14号线
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;					//指定外部中断线使能
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;			//指定外部中断线为中断模式
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;		//指定外部中断线为下降沿触发
	EXTI_I
### 使用 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]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值