历史上的今天
返回首页

历史上的今天

今天是:2024年10月19日(星期六)

正在发生

2021年10月19日 | stm32专题二:GPIO输入—按键检测

2021-10-19 来源:eefocus

新建板级支持包bsp_key.c和bsp_key.h


GPIO输入配置过程:


定义初始化结构体;

开启RCC时钟,非常重要;

写入引脚和模式配置,不需要配置速度;

调用初始化函数,将初始化结构体写入对应的GPIO端口。

bsp_key.c包含两个函数,一个是初始化函数,另一个是按键扫描函数,会按键被按下时,返回按键的状态。


bsp_key.c


#include "bsp_key.h"

 

/**

  * @brief 按键初始化函数

  */

void KEY_GPIO_Config(void)

{

    // 定义GPIO初始化结构体

    GPIO_InitTypeDef GPIO_InitStruct;

 

    // 开启RCC时钟,非常关键

    RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK | 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_Pin = KEY2_GPIO_PIN;

    GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStruct);

}

 

/**

  * @brief 按键扫描函数

  * @param GPIOx 扫描的GPIO口

  * @param GPIO_Pin 扫描的GPIO引脚

  */

uint8_t key_scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

{

    uint8_t key_status;

 

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

    {

        // 松手检测

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

        key_status = KEY_ON;

    }

    else

    {

        key_status = KEY_OFF;

    }

    return key_status;

}

 

bsp_key.h中对按键的硬件参数,按键的状态都进行了宏定义封装,提高程序的可移植性。


bsp_key.h


#ifndef __BSP_KEY_H

#define __BSP_KEY_H

 

#include "stm32f10x.h"

 

// 硬件封装宏

#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

 

// 按键状态宏

#define KEY_ON      1

#define KEY_OFF     0  

 

void KEY_GPIO_Config(void);

uint8_t key_scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);

 

#endif /* __BSP_KEY_H */

 

 

在主函数中while循环中进行调用


main.c


#include "stm32f10x.h"

#include "bsp_led.h"

#include "bsp_key.h"

 

void delay(uint32_t count);

 

int main(void)

{

LED_GPIO_Config();

KEY_GPIO_Config();

 

while (1)

{

// 第一个按键按下(红灯反转)

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

{

LED_R_TOGGLE;

LED_B_OFF;

}

// 第二个按键按下(蓝灯反转)

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

{

LED_R_OFF;

LED_B_TOGGLE;

}

}

}

 

void delay(uint32_t count)

{

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

}


推荐阅读

史海拾趣

Connection One公司的发展小趣事

随着技术的不断成熟,Connection One公司开始寻求与其他企业的战略合作。通过与全球知名的电子设备制造商合作,公司的芯片产品得以广泛应用于各类电子设备中。这种合作不仅拓展了公司的市场份额,还提升了其品牌知名度。

Adaptive Interconnect Electronics, Inc. [AIE]公司的发展小趣事

AIE公司始终将品质管理作为企业发展的核心。公司建立了严格的质量管理体系,从原材料采购到产品生产、销售等各个环节都进行严格的监控和管理。同时,AIE还注重与客户的沟通和反馈,及时了解客户的需求和意见,不断改进产品和服务。这种对品质的执着追求和对客户的尊重赢得了客户的广泛信任和支持。

AAC [American Accurate Components]公司的发展小趣事

随着业务的不断发展和规模的持续扩大,AAC公司在2005年成功在香港交易所上市。这一里程碑式的事件为AAC带来了更多的资本支持和市场认可。此后,AAC加快了全球扩张的步伐,不仅在欧洲、北美等地设立了分支机构,还与众多国际知名品牌建立了长期稳定的合作关系。

Dynachip Corp公司的发展小趣事

Dynachip Corp深知品质对于电子产品的重要性,因此他们建立了严格的质量管理体系,从原材料采购到生产过程再到成品检测,每一个环节都严格把控。他们还引进了先进的生产设备和技术,确保产品的稳定性和可靠性。这种对品质的坚持使Dynachip Corp的产品在市场上获得了广泛认可,客户群逐渐扩大。

艾谱科(Epticore)公司的发展小趣事

艾谱科公司始终将产品质量放在首位。公司建立了严格的质量管理体系,从原材料采购到生产制造的每一个环节都进行严格的质量控制。同时,艾谱科还注重售后服务,为客户提供全方位的技术支持和解决方案。这种对品质的执着追求,赢得了客户的信任和好评,也为公司的长期发展提供了有力保障。

Crowd_Supply__Inc.公司的发展小趣事

Crowd Supply Inc.深知社区是其发展的核心动力。因此,公司不仅在产品开发上积极吸纳社区意见,还在市场推广、技术支持等方面与社区紧密合作。通过举办线上线下的技术交流活动、设立社区奖励机制等方式,公司成功吸引并留住了一批忠实的社区成员。这些成员不仅为公司带来了稳定的用户基础,还通过口碑传播扩大了公司的品牌影响力。

问答坊 | AI 解惑

高分求解!大牛请进!如何在驱动中加载模块并使用(像程序加载dll那样)[200分]

我正在开发一个基于驱动的软件,该软件实现了多个功能,基于各方面的考虑(内存使用、易扩展性...),我希望将每一个功能分别封装在一个模块(sys)中,在需要时才加载入内存,而只将与Ring3通信的部分和组件管理等通用组件封装于一个主模块(sys)中,常驻内存 ...…

查看全部问答>

大家平时用什么COM口调试工具?

这些日子在用COM口调程序,发现MS 的Hyper Terminal实在是不好用。在网上找了个串口调试助手,抓抓输出信息觉得还行,但是没有搜索功能,而且不支持模拟输出。今天找到这个叫COM Catcher的东东,感觉用得很顺,搜索和模拟输出功能都很强,最让我意 ...…

查看全部问答>

现在我们用的GSM的速率是多少?

GSM phase 1 是 9.6kbps,现在是phase几啊?…

查看全部问答>

STM32F的JTAG调试会不会引起EXTI13中断?

我用PC13作为外部中断输入,总是莫名其妙的中断,我看外部中断只能区分中断是来自哪个EXTI不能区分具体是哪个引脚,如果我允许EXTI13中断,是不是PC13(程序允许)和PA13(默认JTAG调试)都可以产生中断?…

查看全部问答>

freescale imx51+wince的视频编码

刚刚接触视频编码,求助达人。现有以下要求:简单来讲,从摄像头采集到的原始YUV数据存入到imx51板的内存中,需要实现的是从内存读取数据进行压缩编码为avi文件。 freescale发布了一个demo,那位大侠可否发来参照看看。…

查看全部问答>

新手菜鸟,求助各位大哥大姐

刚学UCOS两天,看的是任哲老师的书,但是我按书上的步骤去把目标文件连接成可执行文件的时候老是报错,书上把目标文件连接成可执行文件的操作是这样的:tlink c:\\bc\\lib\\c0l.obj test.obj, test,test,c:\\bc\\lib\\cl.lib   &nbs ...…

查看全部问答>

猎头在寻找精英-美资半导体巨头招聘高级技术市场工程师和其他技术和销售管理职位

标题:猎头在寻找精英 – 美资半导体巨头招聘高级技术市场工程师和其他技术和销售管理职位     美资半导体巨头急招一名高级技术市场工程师和以下的技术和销售管理职位。因受到本帖文字篇幅和URL限制,各位如需了解以下职位的详细描述 ...…

查看全部问答>

TIVA C Launchpad的相关程序(周计划之第五周)

在main.c中包含头文件,编写中断函数KeyISR和主函数/* * main.c */#include \"inc/hw_memmap.h\"#include \"inc/hw_types.h\"#include \"driverlib/sysctl.h\"#include \"driverlib/gpio.h\"#include \"driverlib/interrupt.h\"#include \"inc/hw_i ...…

查看全部问答>

关于zigbee的VB上位机代码

哪位大侠有关于zigbee的VB上位机代码?江湖救急 …

查看全部问答>