STM32学习笔记【江科协】【5-2】对射式红外传感器计次&旋转编码器计次

这节主要内容为外部中断的代码

当我们的挡光片或者编码盘在这个对射式红外传感器中间经过时,这个DO就会输出电平变化的信号,然后这个电平跳变的信号触发STM32PB14号口的中断,我们在中断函数里执行变量++的程序,然后主循环里调用OLED显示这个变量,这样第一个程序就完成了 


首先还是把传感器的功能封装在一个模块里

第一步,配置RCC,把相关外设的时钟都打开

第二步,配置GPIO,选择我们端口为输入模式

第三步,配置AFIO,选择我们要用的这一路GPIO,连接到后面的EXTI 

第四步,配置EXTI,选择边沿触发方式,比如上升沿、下降沿或者双边沿,还有选择触发响应方式,可以选择中断响应(一般是这个)和事件响应

第五步,配置NVIC,为我们的中断选择合适的优先级

最后通过NVIC,外部中断信号就能进入CPU了,这样CPU就能收到中断信号,才能跳转到中断函数里执行中断程序


EXTI和NVIC这两个外设时钟是一直打开的,不需要我们再开启时钟。EXTI作为独立外设,但是寄存器没有其时钟位(可能与EXTI唤醒或者电路设计有关)。NVIC作为内核外设,统一是不需要开启时钟的。RCC都是管内核外的外设。

然后是初始化GPIO

 

它的库函数和GPIO是在一个文件里的

 

  • void GPIO_AFIODeInit(void); 

*复位AFIO外设,调用这个函数,AFIO外设的配置就会完全清除

  • void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

*用来锁定GPIO配置的,调用这个函数,参数指定某个引脚,那么这个引脚的参数就会被锁定,防止意外修改

  • void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
  • void GPIO_EventOutputCmd(FunctionalState NewState);

*配置AFIO的事件输出功能的

  • void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);

*引脚重映射,第一个是选择要重映射的方式,第二个是新的状态,但目前还未学到需要重映射引脚的外设

  • void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);

*调用这个函数,就可以配置AFIO的数据选择器,来选择我们想要的中断引脚

  • void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);

*这个和以太网有关,有以太网外设的芯片才用到


EXTI的库函数

  • void EXTI_DeInit(void);

*把EXTI的配置都清除,恢复成上电默认的状态

  • void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);

*调用这个函数,就可以根据结构体里的参数配置EXTI外设

  • void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);

*参数传递的结构体变量赋一个默认值

  • void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);

*软件触发外部中断的,调用这个函数,参数给定一个指定的中断线,就能软件触发一次外部中断。如果只需要外部引脚中断,那就不需要这个函数

外设运行时,会产生一些状态标志位,这些标志位都是放在状态寄存器的,当程序想知道运行状态时,就可以用到下面这四个函数

  • FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);

*获取指定的标志位是否置1

  • void EXTI_ClearFlag(uint32_t EXTI_Line);

*对置1的标志位进行清除

有些标志位比较紧急,在置标志位后会触发中断,在中断函数里想查看标志位和清除标志位,那就用下面两个函数

  • ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);

*获取中断标志位是否置1

  • void EXTI_ClearITPendingBit(uint32_t EXTI_Line);

*清除中断挂起标志位

*总结,如果想在主函数里查看和清除标志位就用上面的两个函数,如果想在中断函数里查看和清除标志位就用下面两个函数。本质上都是对状态寄存器的读写,只是下面两个只能读写与中断有关的标志位,并且对中断是否允许做出了判断,而上面的两个函数只是一般读写标志位能不能触发中断的标志位都能读取到。所以建议主程序中用上面两个,中断程序里用下面两个。


void 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);

*系统低功耗配置

 

 

 

 

 


目前为止,整个外部中断配置也结束了

首先开启时钟,外部中断的信号从GPIO到AFIO,再是EXTI,再是NVIC,最后通向CPU,这样才能让CPU由主程序跳转到中断程序执行

中断程序放在哪里?需要写一个中断函数了

在STM32中,中断函数的名字都是固定的,每个中断通道都对应一个中断函数,中断函数名字可以参考启动文件

写错了就进不了中断了

 

 

 


下面开始第二个程序,旋转编码器计次 

 初始化PB0和PB1两个GPIO口的外部中断,在这里,只初始化一个外部中断也是可以的完成功能的

 

 

 这样做其实并没有问题

 

 

 关于中断函数的建议

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32单片机配合红外传感器进行计次原理通常涉及以下几个步骤: 1. **选择传感器**:首先,你需要一个红外(IR)传感器,比如常见的IR-recv模块,它能检测到红外信号的变化。 2. **连接硬件**:将IR传感器的中断引脚连接到STM32的输入引脚,以便在接收到红外脉冲时产生中断。例如,你可以连接到PA0或PB6这样的GPIO口。 3. **初始化中断**:在STM32的初始化阶段,配置中断控制器和GPIO为中断模,并设置适当的中断服务函数(ISR)来处理接收到的红外脉冲。 4. **中断服务函数(ISR)**:当红外信号变化时,ISR会被调用。在这个函数中,你需要检查传感器的状态(如接收到信号或未接收到),然后增加计数器或者设置标志位。 5. **计数或逻辑判断**:在中断服务函数中,根据红外脉冲的频率,你可以简单地计数,每接收到一个脉冲就递增计数器,或者根据特定的红外编码执行特定的操作,比如控制LED闪烁或发送数据。 6. **数据处理或显示**:在非中断上下文中,周期性地检查计数器或标志位的结果,可能的话,将计数值存储到存储器或通过串口发送出去。 7. **可能的错误处理**:确保有适当的错误处理机制,比如红外接收不连续或长时间没有接收到信号,防止误触发和计数溢出。 8. **电源管理**:考虑到电池寿命或功耗,确保在空闲时关闭不必要的功能,并使用低功耗模降低待机时的电流消耗。 **相关问题**: 1. STM32如何配置中断以响应红外传感器? 2. 如何在STM32中正确处理中断服务函数以计数红外脉冲? 3. 红外传感器计次时如何避免误触发和数据丢失?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值