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

发布者:码梦创想最新更新时间:2018-07-09 来源: eefocus关键字:STM32  GPIO操作  按键控制  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熄灭。


关键字:STM32  GPIO操作  按键控制  LED灯 引用地址:STM32(二)之GPIO操作(2)——通过按键控制LED灯的开关

上一篇:STM32 的gpio mode set 详解
下一篇:STM32入门学习之GPIO(STM32F030F4P6基于CooCox IDE)(三)

推荐阅读最新更新时间:2024-03-16 16:08

单片机STM32时钟详解
众所周知STM32有5个时钟源HSI、HSE、LSI、LSE、PLL,其实他只有四个,因为从上图中可以看到PLL都是由HSI或HSE提供的。 其中,高速时钟(HSE和HSI)提供给芯片主体的主时钟.低速时钟(LSE和LSI)只是提供给芯片中的RTC(实时时钟)及独立看门狗使用,图中可以看出高速时钟也可以提供给RTC。内部时钟是在芯片内部RC振荡器产生的,起振较快,所以时钟在芯片刚上电的时候,默认使用内部高速时钟。而外部时钟信号是由外部的晶振输入的,在精度和稳定性上都有很大优势,所以上电之后我们再通过软件配置,转而采用外部时钟信号. 高速外部时钟(HSE):以外部晶振作时钟源,晶振频率可取范围为4~16MHz,我们一般采用
[单片机]
单片机<font color='red'>STM32</font>时钟详解
STM32的DMA串口直通
搞这个,起因呢,公司产品里ZigBee模块固件版本不对,一大批产品需要二次升级。 需要升级的ZigBee模块是直接与stm32相连的,没有引出升级口,所以得搞个串口直通程序,通过232转MCU再转ZigBee,来进行升级。 一开始直接中断互通,结果呢,通倒是可以通,一升级固件就不行了,大概是因为数据量较大吧。 所以用了DMA,之前也没用过DMA,就慢慢学慢慢模仿着改呗。 这里要涉及到一个点,DMA的外设到外设,经常写的是,DMA只有外设到内存、内存到外设、内存到内存三种模式。 实际上,DMA是可以外设直接到外设的,而且用法非常非常简单,直接设置成外设到内存或内存到外设模式,然后把内存直接改成外设的地址,就可以了。
[单片机]
<font color='red'>STM32</font>的DMA串口直通
STM32】串口通信出现乱码(使用官方标准库)
开发板:stm32f407VET6 开发环境:keil5 MDK 为了使文章的内容完整,增加了一下原因的叙述,没有兴趣的话可以直接跳转到 问题解决 问题产生 最近学习了一下32的串口通信,串口配置还是很简单的,不过后面串口调试助手上面出现的乱码。很让人头疼。 当然第一时间去百度寻求解决办法。 百度搜索总结: 在程序不出现问题的情况下,一定是外部晶振设置的问题。但是也要排查下面
[单片机]
【<font color='red'>STM32</font>】串口通信出现乱码(使用官方标准库)
STM32——I2C
一、I2C协议 I 2 C (Inter-Integrated Circuit)协议是由 Philips 公司开发的,由于它具备引脚少、硬件实现简单、可扩展性强、不需要如 USART、CAN 的外部收发设备等特点,现在被广泛地使用在系统内多个集成电路(IC)间的通信。 1、物理层 (1)它只使用两条总线线路 :一条双向串行数据线(SDA) ,一条串行时钟线 (SCL)。 (2)每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问。 (3)多主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。 (4)具有三种传输模式 :标准模式的传 输速率为 100 Kbit/s ,快速
[单片机]
<font color='red'>STM32</font>——I2C
按键控制流水灯程序
最近有很多学弟来问我流水灯该怎么做,程序怎么写,现在在这里统一说下,很多时候没有时间让你们白跑一趟了,O( _ )O~。 首先就说到单片机了,单片机对于你们来说是个新概念,可能以前都没听说过。我想说的是它不是传统意义上的集成电路,只能按照特定的焊接来能工作,而是一块类似电脑CPU的芯片,对于一块正常的单片机,只要你提供合适的工作电源(4V都5.5V左右)、复位电路 、起振电路它就可以工作了。所有的输入输出口(以P开头的)都是可以灵活配置的,可以根据你焊接的硬件电路写程序,也可以根据你写的程序焊接硬件电路。所以没有必要死板硬套。前天没事写了一下,仿真了一下还可以用。源码贴于下方供入门者参考,高手勿嘲笑,大家都是从流水灯程序写起的
[单片机]
STM32中单独设置GPIO端口高8位/低8位的方法
stm32的IO端口都是16位的, 如果要单独操作某高8位或低8位, 则不是那么简单, 先看两张BSRR/BRR寄存器的图: 据官方数据手册上面说, 这两个寄存器用于专门对ODR进行原子操作的位操作, 都是在置1的时候对某位有影响. 举例说下怎么对IO端口赋值: 1.对高8位/低8位/全部清零 很明显, 这个只需要操作BRR寄存器即可: 对高8位清零:GPIOA- BRR = 0xFF00 对低8位清零:GPIOA- BRR = 0x00FF 全部清零: GPIOA- BRR = 0xFFFF 或 GPIOA- ODR = 0x0000 当然了, 使用下面2,3的两个宏也可以完全该清零操作~ stm
[单片机]
<font color='red'>STM32</font>中单独设置<font color='red'>GPIO</font>端口高8位/低8位的方法
STM32学习笔记11——HardFault_Handler处理方法
根据网络资料及自己调试经验总结如下: STM32 出现 HardFault_Handler 故障的原因主要有两个方面: 1、内存溢出或者访问越界。这个需要自己写程序的时候规范代码,遇到了需要慢慢排查。 2、堆栈溢出。增加堆栈的大小。 排查方法: 发生异常之后可首先查看 LR 寄存器中的值,确定进入异常前一刻使用的堆栈为 MSP 或 PSP,然后找到相应堆栈的指针? 注:在 HardFault_Handler(void)中断里第一条语句打断点,进入中断后,查看 LR 寄存器的值,如果是 0XFFFFFFF9,那么中断前使用的是 MSP,如果是 0XFFFFFFFD,那么中断前使用的是 PSP; 根据找到的堆栈指针, 在内存中查
[单片机]
<font color='red'>STM32</font>学习笔记11——HardFault_Handler处理方法
新款STM32U5:让便携产品拥有惊艳图效
凝聚ST超低功耗微控制器技术精华的STM32U5于2021年问世,是一款堪称可改变游戏规则的低功耗MCU。 作为STM32高性能低功耗系列旗舰产品, STM32U5延续STM32F2/F4/F7的应用范围,同时又有更低的能耗,具有更高的性价比。 在工业控制系统中,U5可以承担主控器、系统监控以及图形显示等核心职能。 高性能,低功耗,丰富的数字外设和更高性能的模拟接口,强大的安全特性,以及支持图形加速,让STM32U5在工业控制、工业表计和医疗健康,个人穿戴设备等应用领域取得良好的表现,为泛工业系统创新赋能。在这个视觉统治一切的时代,人们对图形效果的追求永远没有止境,同时也希望实现起来更简单快速,性价比更高。“如果只
[单片机]
新款STM32U5:让便携产品拥有惊艳图效
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved