STM32(二)之GPIO操作(2)——通过按键控制LED灯的开关

      STM32是一款低功耗的芯片,所以其外设均有一个与之对应的时钟,而在芯片刚上电的时候这些时钟是被关闭的,所以如果想要外设工作,便必须将与之对应的时钟打开。

      本文介绍如何基于GPIO来通过按键控制LEN灯的开关。

     (1)按键的控制


      上图所示为按键的电路,在按键未被按下的时候,KEY2的输出信号为低电平(按键所在的电路不通,其与地相连);在按键按下时,KEY2的输出状态为高电平(按键所在的电路导通,其与3.3V的电源相连)。因此,通过对引脚的电平进行检测便可以判断按键是否按下。

       按键的机械触点断开、闭合时,由于触点的弹性作用,按键开关不会马上稳点接通或断开,其会产生如下图所示的带波纹信号,需要使用软件消抖处理滤波,不方便输入检测。此外,硬件也可实现消抖功能,如上图所示,硬件的消抖功能便是通过C61的充放电实现延时从而消除了波纹,从而简化的软件的处理,使软件只需检测引脚的电平便可。

      

      如上文所说,首先是开启GPIO的时钟,使其外设可工作。本文使用STM32的库函数来编写代码:



//启动按键端口(端口A)的时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

//定义一个结构体,用于配置PA0管脚的设置
GPIO_InitTypeDef GPIO_InitStructure;

//将结构体的引脚设为 0
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

//将结构体的模式设为浮空输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

//将结构体设为A端口,即将PA0管脚设为 浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);


      上述代码便是先填好GPIO的结构体,再通过函数GPIO_Init()往对应的GPIO寄存器写入参数,完成GPIO的初始化。

      然后便是检测按键的状态,其代码如下:

//检测按键是否按下

if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == KEY_ON) {

//检测按键是否已经放开

      while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == KEY_ON);

//后续为按键后的代码处理         

............................................

}

(二)GPIO输出

       与GPIO输入类似,GPIO输出的代码如下:


//定义一个GPIO_InitTypeDef类型的结构体

GPIO_InitTyopeDef GPIO_InitStructure;

//开启GPIO相关的外设时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

//选择要控制的GPIO引脚

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

//设置GPIO引脚的输出模式为推挽输出

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

//设置引脚速率为50MHZ

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHZ;

//调用库函数初始化GPIO

GPIO_Init(GPIOB, &GPIO_InitStructure);


      在使用上述代码设置后,便可以在主函数中对LED灯进行控制。

      将GPIOB->BSRR置1从而输出高电平来点亮LED灯,而通过GPIOB->BRR置1来输出低电平从而将LED熄灭。

      

猜你喜欢

转载自blog.csdn.net/qwe15954250805/article/details/78368775