学习来源:[5-2] 对射式红外传感器计次&旋转编码器计次_哔哩哔哩_bilibili
1· 接线
(1)STM32
(2)OLED屏
(3)对射性红外传感器
(4)仿真烧录器
2·准备工作
以之前OLED屏程序,为基础,可通过oled屏显示,更为直观。
(资料下载:https://jiangxiekeji.com/download.html)
1·.c文件,修改后如下:
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
int main(void)
{
/*模块初始化*/
OLED_Init(); //OLED初始化
/*OLED显示*/
OLED_ShowString(1, 3, "HelloWorld!"); //1行3列显示字符串HelloWorld!
while (1)
{
}
}
传感器功能的封装:CountSensor.c文件、CountSensor.h文件
2·起架构
CountSensor.c文件
#include "stm32f10x.h" // Device header
void CountSensor_Init(void)
{
}
CountSensor.h文件
#ifndef __COUNT_SENSOR_H
#define __COUNT_SENSOR_H
#endif
3·初始化
想要 EXTI外部中断,把如下打通路就行
第一步:配置RCC时钟、AFIO时钟
( 基本每个程序,都要做的第一步,时钟打开,外设才能工作 )
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
注意:由于GPIOB是APB2的外设,开时钟时候,选择APB2;由于参数是宏定义的,就算不对应,也不会报错,不好发现的错误,一定要细心。
注意nvic外设,时钟是一直打开的,EXIT作为独立外设,按理说要开启时钟的,但是手册上没有EXIT控制时钟的寄存器,目前不开启能用,应该是自动唤醒了,有时间可以去研究一下。。。
分清哪些需要开时钟:内核的外设,肯定不用开启时钟,譬如NVIC,它和CPU住在一起的,而RCC就是管内核之外的外设,所以RCC管不着NVIC。。。
第二步:配置GPIO
( 选择端口,配置成输入端口,给红外传感器用 )
根据手册配引脚模式GPIO_MODE,需要配置成浮空输入/带上拉输入/带下拉输入
GPIO_Initstructure.GPIO_Mode = GPIO_Mode_IPU ;//这里配带上拉的输入
第三步:配置AFIO中断引脚选择
( 选择用的某个GPIO,连接到后面的EXTI )
ST(stm32)公司没有给AFIO单独的库函数,它在GPIO库函数中
GPIO_AFIODeInit(void);//用于复位AFIO
GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//锁定GPIO配置的,防止被意外更改
GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);//不多用
GPIO_EventOutputCmd(FunctionalState NewState);//不多用
GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);//引脚重映射
GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);//选择中断引脚
GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);//以太网相关
第四步:配置EXTI
( 选择边沿触发方式,比如上升沿、下降沿、双边沿 )
(选择中断响应/中断事件,忘记了的话,请看上一节,这里选择中断响应)
个人理解:如下3个函数,外设基本都有,不用害怕和陌生,当见老朋友一样熟悉,使用起来
EXTI_DeInit(void);//配置清除,恢复成上电时状态
EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);//用于构建结构体,配置EXTI外设,初始化
EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);//把参数传递的结构体变量,赋默认值
个人理解:如下4个函数,对运行中的标志状态位,进行操作,很多模块会有的,适应起来)
EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);//软件触发外部中断
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);//查看标志位,
EXTI_ClearFlag(uint32_t EXTI_Line);//对置1的标志位清0
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);//获取中断标志位是否置1
EXTI_ClearITPendingBit(uint32_t EXTI_Line);//清除中断挂起标志位
个人理解:
在程序查看和清除标志位,用EXTI_GenerateSWInterrupt()、FlagStatus EXTI_GetFlagStatus()
在中断函数里查看和清除标志位,用ITStatus EXTI_GetITStatus()、EXTI_ClearITPendingBit()
第五步:配置NVIC
(给中断选择优先级)
最后通过NVIC,外部中断的信号,就进入CPU,执行中断函数里的中断程序。