历史上的今天
今天是: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--);
}
史海拾趣
|
高分求解!大牛请进!如何在驱动中加载模块并使用(像程序加载dll那样)[200分] 我正在开发一个基于驱动的软件,该软件实现了多个功能,基于各方面的考虑(内存使用、易扩展性...),我希望将每一个功能分别封装在一个模块(sys)中,在需要时才加载入内存,而只将与Ring3通信的部分和组件管理等通用组件封装于一个主模块(sys)中,常驻内存 ...… 查看全部问答> |
|
这些日子在用COM口调程序,发现MS 的Hyper Terminal实在是不好用。在网上找了个串口调试助手,抓抓输出信息觉得还行,但是没有搜索功能,而且不支持模拟输出。今天找到这个叫COM Catcher的东东,感觉用得很顺,搜索和模拟输出功能都很强,最让我意 ...… 查看全部问答> |
|
我用PC13作为外部中断输入,总是莫名其妙的中断,我看外部中断只能区分中断是来自哪个EXTI不能区分具体是哪个引脚,如果我允许EXTI13中断,是不是PC13(程序允许)和PA13(默认JTAG调试)都可以产生中断?… 查看全部问答> |
|
刚刚接触视频编码,求助达人。现有以下要求:简单来讲,从摄像头采集到的原始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 ...… 查看全部问答> |




