历史上的今天
返回首页

历史上的今天

今天是:2025年04月09日(星期三)

正在发生

2019年04月09日 | 【STM32F103】按键检测(GPIO输入)

2019-04-09 来源:eefocus

按键硬件电路:


分析电路:按键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按下时灯熄灭。效果很明显,图片不方便展示。

推荐阅读

史海拾趣

Hirect公司的发展小趣事
检查控制电路中的元器件(如电阻、电容、二极管等)是否损坏或失效,确认控制信号是否正确传输。
HANA Micron公司的发展小趣事

为了更好地服务全球客户,Hama积极实施国际化战略,在全球范围内设立了多家子公司。这些子公司不仅负责当地市场的销售和服务工作,还积极参与技术研发和产品创新活动。通过全球子公司的协同作战,Hama成功实现了资源的优化配置和市场的深度覆盖。目前,Hama在全球拥有约2500名员工、5亿欧元的业务和19家全球子公司,已成为国际知名的电子配件供应商之一。未来,随着全球市场的不断变化和发展,Hama将继续加强全球子公司的建设和布局,为公司的长远发展奠定坚实基础。

Efficient Power Conversion公司的发展小趣事

随着EPC公司在氮化镓技术领域的领先地位日益稳固,一些竞争对手开始试图通过不正当手段获取其技术。为了维护自身的合法权益,EPC公司积极寻求法律途径来保护其专利。2023年,EPC公司向美国联邦法院和美国国际贸易委员会提起诉讼,指控英诺赛科(珠海)科技有限公司及其子公司侵犯了其基础专利组合中的四项专利。这一诉讼引起了行业的广泛关注,也再次证明了EPC公司对专利保护的重视。

GE Sensing ( Amphenol Advanced Sensors )公司的发展小趣事

EPC公司成立于2007年,由三位拥有六十年先进功率管理技术经验的资深工程师共同创立。公司的创始人们认识到,随着技术的不断发展,传统的硅功率技术已接近其性能极限。他们决定专注于氮化镓技术的研究与开发,这是一种新型的半导体材料,具有比硅更高的电子迁移率和更低的电阻。经过数年的研究和试验,EPC公司成功开发出了基于氮化镓的高效功率半导体器件,这一突破性的技术为公司的未来发展奠定了坚实的基础。

Holtek(合泰)公司的发展小趣事

随着EPC公司在氮化镓技术领域的领先地位日益稳固,一些竞争对手开始试图通过不正当手段获取其技术。为了维护自身的合法权益,EPC公司积极寻求法律途径来保护其专利。2023年,EPC公司向美国联邦法院和美国国际贸易委员会提起诉讼,指控英诺赛科(珠海)科技有限公司及其子公司侵犯了其基础专利组合中的四项专利。这一诉讼引起了行业的广泛关注,也再次证明了EPC公司对专利保护的重视。

COTO TECHNOLOGY公司的发展小趣事

COTO TECHNOLOGY的故事始于1917年,当时它在美国罗德岛州的普罗维登斯以Coto Coil Incorporated的名字诞生,专注于线圈绕组的设计与制造。这个初创公司凭借对技术的深入理解和对质量的执着追求,逐渐在电子行业中崭露头角。它的线圈绕组产品以高精度、高稳定性而受到市场的青睐,为公司的初步发展奠定了坚实的基础。

问答坊 | AI 解惑

映射的意思【经典】

扫地只是我的表面工作,我真实的身份是一位研究憎。    电脑圈圈确实是厉害啊,能够把映射解释的如此贴切,小弟真是佩服。 映射,相当于重定位(remap)的意思 例如,本来我每次去买ARM芯片,都是去找Philips的,所以我从0x00000000路 ...…

查看全部问答>

Verilog HDL 高级数字设计源码

Verilog HDL 高级数字设计源码…

查看全部问答>

内核态驱动和用户态驱动的区别

RT,写wince驱动有一段时间了,但是很惭愧,到现在还没搞清楚内核态驱动和用户态驱动的区别,特来请教…

查看全部问答>

有偿求助,MCP2510驱动

内核为Linux2.6.8.1 CPU为S3C2410 价格好说 联系QQ:195550435…

查看全部问答>

常见的信息终端有哪些?

常见的信息终端有哪些? 请大侠们告知?…

查看全部问答>

6410串口COM2,3都不通?

友坚的UT-6410的开发板,GPIO通过驱动初始化后都已经写寄存器配置成串口模式了,但COM2,3用串口调试助手发送都没有信号,更不用说接受了,我用自发自收23脚相连,也没信号,请大侠帮忙看看怎么回事?…

查看全部问答>

急问 LCD和超级终端双显示shell命令

小弟毕设是实验箱的LCD上和超级终端上双显示shell命令。我在移植内核后,如果使用带QT的文件即root-qtopia-china.cramfs-320x240usb.tar.bz2,则可以在超级终端上用exec 1>/dev/tty1命令重定向使LCD上显示shell命令,但是超级终端上不能显示。若用 ...…

查看全部问答>

请问1PG控制伺服回原点没有爬行停止而是立即停止是何原因?

我在用1PG定位模块控制伺服在原点回归时,当到达DOG开关时,伺服没有爬行停止而是立即停止,而PGO信号灯也没有亮,我在程序里已经设置了#BMF 11为500,已经设置了回零爬行速度,况且我其他台也是这样接线而用同一控制程序,都没有问题,只是此台设 ...…

查看全部问答>

STM32的SPI传输DR寄存器不能赋值

大家好,我是刚开始接触STM32的开发板,主芯片是stm32f103zet6 在做spi通信的时候,用KEIL MDK来做单步调试,执行SPI_I2S_SendData(SPI2, 0x88); 函数后,SPIx->DR的值始终为0,不知道问题出在哪? 请哪位朋友帮忙出些点子? 谢谢啊!…

查看全部问答>