按键与库函数
按键与库函数编程
- 上一节讲的是寄存器的编程,这一节回顾一下,并补充一个按键
-
目录
按键与库函数编程
一、按键的寄存器编程
二、库函数编程
1、寄存器工程变为库工程
2、库函数的原理
3、库函数的使用
一、按键的寄存器编程
- 先看原理图
-- 知道是输入,并且选择哪种输入模式都是一样的。为什么呢?
首先,输入模式总共有四种:
上拉输入:空闲状态下(没有信号输入),增加高电平的驱动能力;
下拉输入:空闲状态下,增加低电平的驱动能力;
浮空输入:空闲状态下,不具备高低电平驱动能力,直接输入的电压进行转换;
模拟输入:检测模拟电压,数据传给ADC做转换;
- 根据以上理解,这里将按键设置为三种输入模式均可,我们以浮空输入为例。
-- 看原理图得知控制按键的引脚
- 然后查找手册,找到对应寄存器
-- 初始化函数,时钟和配置模式
void key_init(void)
{RCC->APB2ENR |= (0x1<<2)|(0x1<<4);//RCC->APB2ENR |= (0x1<<4);GPIOA->CRH &= ~(0xf<<0);GPIOA->CRH |= (0x4<<0);GPIOC->CRH &= ~(0xfff<<16);GPIOC->CRH |= (0x444<<16);
}
-- 应用函数,读取按键状态
#define key1 (GPIOA->IDR & (0x1<<0))#define key2 (GPIOC->IDR & (0x1<<4))
#define key3 (GPIOC->IDR & (0x1<<5))
#define key4 (GPIOC->IDR & (0x1<<6))//uint8_t uint16_t uint32_t int8_t int16_t int32_tuint8_t get_key(void)
{if(key1){Delay_nms(15);//延时消抖if(key1){while(key1)//等待按键抬起{}return 1;}}if(!key2){Delay_nms(15);//延时消抖if(key2){while(key2)//等待按键抬起{}return 2;}}return 0;}
二、库函数编程
1、寄存器工程变为库工程
标准库源文件(.c和.h)
将..\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver下的2个文件夹拷贝到工程目录下,如下:-- inc --存放.h文件
-- src --存放.c文件
将..\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template下的stm32f10x_conf.h文件夹拷贝到user目录下,如下:
添加.c文件
包含头文件路径
添加使用库函数的宏定义
2、库函数的原理
- 库函数就是把底层寄存器配置进行封装,用户只需要根据库函数传递参数,不用理会寄存器的位置。
3、库函数的使用
- 首先,打开stm32固件库使用手册
- 先找到时钟(RCC)
-
想快速知道他的用法,直接看例子即可
-
将例子直接复制到工程中,然后修改参数即可。
-
同样的,再去找配置GPIO的函数
-
同样直接看例子
-
然后在工程中改参数,初始化函数就写好了
void key_init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);GPIO_InitTypeDef GPIO_InitStructure = {0}; //定义结构体变量,并且将结构体变量赋初值GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //引脚GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空模式GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6; //引脚GPIO_Init(GPIOC, &GPIO_InitStructure);//如果要将模式也改了,就直接改,不用再定义结构体变量
}
-
下面找存放输入进MCU数据的函数
-
将例子直接更改
#define key1 GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)
#define key2 GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_4)
#define key3 GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5)
#define key4 GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6)
-
然后判断宏定义的值,即可判断按键是否按下
-
可以参考官方示例程序,里面有很多例子,可以参考