【STM32F103】按键检测(GPIO输入)

发布者:Qianfeng最新更新时间:2019-04-09 来源: eefocus关键字:STM32F103  按键检测  GPIO输入 手机看文章 扫描二维码
随时随地手机看文章

按键硬件电路:


分析电路:按键K1按下,接通高电平3.3V,为了保护GPIO,加了限流电阻(R7),没按下的时候是接地的,上升沿输入。


PA0具有自动唤醒的功能(必须上升沿才能唤醒),电容C6用以硬件消抖(电容不断充放电),这样软件就不用延时来消抖,


K2电路同。


GPIO输入:GPIO数据输入寄存器IDR,只要读取这个寄存器就可以。


bsp_key.c 按键初始化:


#include "bsp_key.h"

 

 

void KEY_GPIO_Config(void)

{

GPIO_InitTypeDef  GPIO_InitStruct;

RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK, ENABLE);

RCC_APB2PeriphClockCmd(KEY2_GPIO_CLK, ENABLE);

GPIO_InitStruct.GPIO_Pin = KEY1_GPIO_PIN;

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStruct);

 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStruct);

}

 

uint8_t Key_Scan(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin)

{

if( GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON )

{

// ËÉÊÖ¼ì²â

while( GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON );

return KEY_ON;

}

else return KEY_OFF;

}

 

bsp_key.h


#ifndef __BSP_KEY_H

#define __BSP_KEY_H

 

#include "stm32f10x.h"

 

#define  KEY_ON      1

#define  KEY_OFF     0

 

#define KEY1_GPIO_PIN              GPIO_Pin_0

#define KEY1_GPIO_PORT             GPIOA

#define KEY1_GPIO_CLK              RCC_APB2Periph_GPIOA

 

#define KEY2_GPIO_PIN              GPIO_Pin_13

#define KEY2_GPIO_PORT             GPIOC

#define KEY2_GPIO_CLK              RCC_APB2Periph_GPIOC

 

void KEY_GPIO_Config(void);

uint8_t Key_Scan(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin);

 

#endif /* __BSP_KEY_H */

 

main.c


#include "stm32f10x.h"   // 

#include "bsp_led.h"

#include "bsp_key.h"

 

void Delay( uint32_t count )

{

for(; count!=0; count--);

}

 

int main(void)

{

LED_GPIO_Config();

KEY_GPIO_Config();

while(1)

{

if( Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) ==KEY_ON )

LED_G(1)

if( Key_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN) ==KEY_ON )

LED_G(0)

// if

}

}

 

 

led_bsp.c与led_bsp.h参考上一篇使用库函数点亮LED。


以此我们能够通过这个程序检测按钮是否按下,并将值输入到对应PORT,保存在GPIO数据输入寄存器IDR中。


主函数通过读取对应PORT的值来控制灯的亮灭,KEY1按下时灯点亮,KEY2按下时灯熄灭。效果很明显,图片不方便展示。

关键字:STM32F103  按键检测  GPIO输入 引用地址:【STM32F103】按键检测(GPIO输入)

上一篇:STM32F103+HAL+PWM+DMA+WS2812
下一篇:STM32F103ZET6 — WWDG

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

stm32f103】stm32 外部中断(寄存器版)
中断分类 STM32的EXTI控制器支持19 个外部中断/ 事件请求。每个中断设有状态位,每个中断/ 事件都有独立的触发和屏蔽设置。 STM32的19个外部中断对应着19路中断线,分别是EXTI_Line0-EXTI_Line18: 线0~15:对应外部 IO口的输入中断。 线16:连接到 PVD 输出。 线17:连接到 RTC 闹钟事件。 线18:连接到 USB 唤醒事件。 触发方式:STM32 的外部中断是通过边沿来触发的,不支持电平触发。 外部中断分组:STM32 的每一个GP
[单片机]
【<font color='red'>stm32f103</font>】stm32 外部中断(寄存器版)
STM32f103USB移植之USB鼠标
这几天闲着没事开始折腾起32的USB了,USB协议内容有这么复杂,看了几天只吧大概的流程看懂了,具体的实现和数据传输就没有去深究了.stm32USB模块的资料在网上找到了许多,不过每个都只是讲了一部分,在这里把自己移植的过程和我的理解写下来,给自己做个备忘也给大家参考一下。 / **************************************不吵嗦的分割线***** ********* / 移植准备:ST官方提供的USB库之JoyStickMouse 开发环境:keil 5.11 使用芯片:STM32F103VE 参考资料:https ://blog.
[单片机]
<font color='red'>STM32f103</font>USB移植之USB鼠标
基于STM32F103ZET6主控平台实现定时器TIM3的驱动
定时器描述:定时器的运用主要是对重装载值和预分频的配置,这两个寄存器配置决定定时器定时的时长,接下来是开启定时器中断,当设置的时长溢出便会进入中断,在相应的中断服务函数中编写要执行的程序即可实现隔一段时间执行一次程序的效果,例如LED的亮灭。 第一步:编写tim.h头文件 #ifndef __TIM_H #define __TIM_H #include sys.h void TIM3_Init(u16 arr,u16 psc);//定时器3初始化 #endif 第二步:编写tim.c文件 #include tim.h #include led.h void TIM3_IRQHandler(void) { if
[单片机]
STM32F103ZET6 — USART
串口通信介绍 UART串口通信,使用三线即可进行最基本的数据收发传送: 在数据线上的 Timing 遵循标准的串口通信协议,由起始位,数据,校验位,停止位组成,数据传输 LSB - MSB: 板载 USART 资源介绍 当然,由于电平不一样,使用 RS232 标准进行串口数据传送,需要增加 MAX3232 进行电平转换,再接PC: 单板上的 T1IN 和 R1OUT 接到了 STM32 芯片的 USART1 的 TXD/RXD 管脚,故单板上使用了 USART1 来作为 RS232 和 PC 机进行数据传送: USART 初始化配置 既然确定了使用了芯片上的 USART1,要正确使用该功能,需要进行如下配置:
[单片机]
<font color='red'>STM32F103</font>ZET6 — USART
STM32f103c8t6作USBCDC的尝试
闲着无聊就倒腾stm32,实验室资源太多也搞不完,前些天搞了一点dsp,fpga,发现这些芯片难免有点无聊,于是又回来搞stm32的东西。倒腾了一天,下午先是弄了个FreeRTOS的例程,看了一点资料,发现一下没那么好上手,于是下午上完课以后就开始折腾USB,一晚上,搞了个USB的CDC。 本来是想用USB做个模拟串口控制led灯的,后来搞了一下没成功,可能是因为USB进了中断,也就懒得深究,直接就放弃led了,就直接发送接收数据,拿串口助手调试。 也废话少说,直接贴代码 /* Includes --------------------------------------------------------------
[单片机]
关于STM32F103C8T6移植FreeRTOS时进入HardFault_Handler的解决方案
最近在学习FreeRTOS的使用,在移植第一个工程的过程中就出现了问题,在按照教程进行一直完成之后,程序不能成功进行调度和运行,经仿真发现程序进入的HardFault_Handler的死循环中。 查找了很多资料以及各种方案才找到解决方案: 将FreeRTOSConfig.h 中的系统总的堆栈空间configTOTAL_HEAP_SIZE 调小就好了,其原因是C8T6芯片内部RAM较小,不能成功申请到那么多的内存空间才报错的。
[单片机]
使用STM32F103采集Si7021温湿度传感器数据
一、传感器电路连接 Si7021的外围电路非常简单,如图1所示: 图1 Si7021传感器外围电路 Si7021采用的是IIC接口,最高支持400KHz的通信速率,0~100%RH的湿度量程和最大-40℃~+125℃的温度量程,150μA低功耗,超小体积。可提供精确,低功耗,工厂校准的数字解决方案,适用于测量湿度,露点和温度,适用于从HVAC / R和资产跟踪到工业和消费者平台的各种应用。 二、时序和协议分析 首先看看Si7021的IIC通信时序,图2展示了Si7021的IIC时序图和各个时序时间的参数表。 图2 传感器IIC通信时序 其实这个IIC时序我个人认为没啥特别的,感觉就是一个比较常
[单片机]
使用<font color='red'>STM32F103</font>采集Si7021温湿度传感器数据
DDS技术在高频石英晶体测试系统中的应用
0 引言 石英晶体谐振器(以下简称石英晶体)广泛用作时间频率基准和为时序逻辑电路提供同步脉冲。石英晶体的测试方法主要有阻抗计法、π网络最大传输法、π网络零相位法,其中π网络零相位法是国际电工委员会(IEC)推荐的标准方法。π网络零相位法石英晶体测试设备在发达国家已广泛使用。典型仪器是美国S&A公司生产的250B零相位测试系统,其测试频率范围为0.5~200 MHz,串联谐振频率测试精度±2 ppm。阻抗计型石英晶体测试设备在中国仍然占主导地位。阻抗计型石英晶体测试设备具有制造成本较低,操作简单的特点。但其串联谐振频率测量范围较小,测量精度较低。因此,研制宽范围、高精度的石英晶体频率测试系统,具有服务生产的实际意义。 π网络零相位法
[单片机]
DDS技术在高频石英晶体测试系统中的应用
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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