当前位置:   article > 正文

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

江协科技stm32旋转编码器

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

当我们的挡光片或者编码盘在这个对射式红外传感器中间经过时,这个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口的外部中断,在这里,只初始化一个外部中断也是可以的完成功能的

 

 

 这样做其实并没有问题

 

 

 关于中断函数的建议

 

 

 

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/676766
推荐阅读
相关标签
  

闽ICP备14008679号