卓越亚马逊网站建设目的,惠安县住房和城乡建设部网站,福州百度推广电话,无货源电商软件app1.接线方式 主要是编写传感器的驱动、配合OLED#xff0c;每遮挡对射红外传感器#xff0c;OLED屏幕的计数就加一。
2.驱动编写
首先新建.c文件和.h文件#xff0c;命名为CountSensor 国际惯例#xff0c;.c文件内要包含stm32.h头文件#xff0c;然后编写 CountSensor_…1.接线方式 主要是编写传感器的驱动、配合OLED每遮挡对射红外传感器OLED屏幕的计数就加一。
2.驱动编写
首先新建.c文件和.h文件命名为CountSensor 国际惯例.c文件内要包含stm32.h头文件然后编写 CountSensor_Init()函数即传感器计数函数。一步一步来首先函数体内部要首先使能时钟没有时钟不工作。总体的函数内部需要配置的东西有
1.配置RCC时钟
2.配置GPIO端口配置为输入模式
3.配置AFIO选择GPIO链接到EXTI
4.配置EXTI选择边沿触发方式和触发的响应方式
5.配置NVIC配置中断优先级。
2.1时钟使能
void CountSensor_Init(void)
//第一步配置RCC没有时钟不行第二部配置GPIO配置端口为输入模式第三步配置AFIO选择我们的GPIO链接到EXTI//第四步配置EXTI选择边沿的触发方式和触发的响应方式。第五步配置NVIC配置中断优先级。
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//开启GPIOB的时钟因为传感器引脚接在了GPIOBRCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//AFIO时钟开启
2.2定义GPIO参数
GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_ModeGPIO_Mode_IPU;//EXTI输入推荐配置是浮空上拉或下拉GPIO_InitStructure.GPIO_PinGPIO_Pin_14;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz ;GPIO_Init(GPIOB, GPIO_InitStructure);
首先定义GPIO参数结构体GPIO_Mode选择上拉输入使能第14号管脚因为传感器的信号端接的是GPIOB_14速度万年50MHz最后调用GPIO_Init(GPIOB,结构体名称初始化GPIO14.
2.3配置AFIO选择GPIO引脚
AFIO外设没有专门分配的库函数它的库函数跟GPIO在同一个文件中在GPIO.h中的第350行开始。使用函数GPIO_EXTILineConfig()函数选择指定的GPIO引脚链接EXTI如果不知道这个函数怎么用右键然后看它的定义如下图所示 函数上面的注释中brief是函数功能简介这里说的很清楚本函数是选择GPIO管脚链接到EXTI 。函数的第一个参数是GPIO源就是GPIO哪个片区是GPIOA还是GPIOB第二个参数是具体的管脚号。我们这个例子是用GPIOB_14所以函数的调用形式为
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);
2.4.配置EXTI
首先要用结构体定义EXTI参数具体包括EXTI_Line,配置中断线EXTI_LineCmd,开启或关闭中断EXTI_Mode,选择中断模式EXTI_Trigger,触发方式选择。总体就是这么几个地方要配置最后调用EXTI_Init()函数初始化EXTI。总体代码如下
EXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_LineEXTI_Line14;//配置中断线EXTI_InitStructure.EXTI_LineCmdENABLE;//开启或关闭中断EXTI_InitStructure.EXTI_ModeEXTI_Mode_Interrupt;//定义中断模式EXTI_InitStructure.EXTI_TriggerEXTI_Trigger_Rising;//触发中断方式是下降沿还是上升沿EXTI_Init(EXTI_InitStructure);
2.5.配置NVIC
回顾上一篇讲的内容NVIC的作用是管理中断更具体地是管理中断的优先级。
首先要配置优先级分组优先级分组有6种方式这里选择第二种。
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//优先集分组定义
接下来使用结构体定义NVIC的参数包括 NVIC_IRQChannel指定NVIC通道NVIC_IRQChannelCmd使能或关闭NVIC_IRQChannelPreemptionPriority抢占优先级NVIC_IRQChannelSubPriority响应优先级。最后调用NVIC_Init函数初始化NVIC。
NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannelEXTI15_10_IRQn;//指定NVIC的通道NVIC_InitStructure.NVIC_IRQChannelCmdENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority1;NVIC_InitStructure.NVIC_IRQChannelSubPriority1;NVIC_Init(NVIC_InitStructure); 3.定义读数函数
函数的返回值是变量CountSensor_Count
uint16_t CountSensor_Get(void)
{return CountSensor_Count;}
4.定义中断函数
void EXTI15_10_IRQHandler(void)//中断函数的名字
{if (EXTI_GetITStatus(EXTI_Line14) SET){CountSensor_Count;EXTI_ClearITPendingBit(EXTI_Line14);}
}
5.主函数
#include stm32f10x.h // Device header
#include Delay.h
#include OLED.h
#include CountSensor.hint main(void)
{OLED_Init();CountSensor_Init();OLED_ShowString(1,1, Count:);while(1){OLED_ShowNum(1,7,CountSensor_Get(),5);}
}