历史上的今天
今天是:2025年07月09日(星期三)
2018年07月09日 | STM32(二)之GPIO操作(2)——通过按键控制LED灯的开关
2018-07-09 来源:eefocus
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熄灭。
史海拾趣
|
今天早上5点中突然醒了,好像有个概念不知道什么时候出现在我大脑------编译器代码优化。前两天一直解决不了的程序乱跳和代码优化有没有关系,立马翻看工具手册提到了4种代码优化级别,编译器默认最好的优化,最好的优化,是最差的调试视图。我改了 ...… 查看全部问答> |
|
拿到了心仪已久的X86系列的NTC929板子,打开包装,给人的感觉总是那么舒心和愉悦。拿到手了,进行简单测评一下。 本板式一款高性能、低功耗3.5’的嵌入式工业主板,该板采用了Intel Siliverthorn+Poulsbo芯片组,板载IntelSilverthorn(Intel Atom ...… 查看全部问答> |
|
我的WINCE系统 可以PING通局域网内其他PC的IP 但是 连接外网的时候就不行, 我主要是想在局网内打印(特性目录中PCL Print driver添加进去了) ,打印IE浏览器的时候 点 file/print 没反应! 我用的是HP的激光打印机支持PCL的!是不是 ...… 查看全部问答> |
|
程序在WM5.0的设备上运行时,如果菜单项超过两项时,菜单栏的颜色就会变成淡蓝色,而不是原来默认的颜色。 请问有没有办法是菜单栏的颜色不改变或是将菜单栏的颜色设置一下呢?? 用C++… 查看全部问答> |
|
activesync4.2无法通过usb连接pc与wince5.0 我使用致远(周立功) MagicARM2410教学实验开发平台及配套光盘中的wince镜像 按照试验指导书安装evc4.0 及activesync4.2及相关软件 但pc机始终无法使用activesync4.2通过usb与wince建立连接 pc端的activesync4.2会显示正在连接 但约一分钟后 会显 ...… 查看全部问答> |
|
请问:我在运行evc的工程时,提示我说sdk 不能运行在emulator device,这是什么原因呀? 错误为: an application targeting a Standard SDK for Windows CE.NET and built for the MIPSII_FP CPU cannot be run on the Emulator device.In order to run this application on any CPU other than the Emulator,you will have to install ...… 查看全部问答> |
|
用stm32l152芯片控制mma7455l遇到的一个问题! 我使用stm32l152模拟IIC接口控制mma7455l加速的传感器。 iic驱动程序,对加速的传感器的0x16控制寄存器的访问是完全正确,例如先向0x16寄存器写入0x45,然后可以正确的读取到0x45。 但是读取数据寄存器0x06、0x07、0x08和地址寄存器0x0d的时候却不 ...… 查看全部问答> |




