一、软件设计
与固件库点亮LED相同,我们需要一个工程模板详情可以用看(1条消息) STM32固件库点亮LED灯_学c入门到入土的博客-CSDN博客
1、编程要点
1)使能GPIO端口时钟。
2)初始化GPIO目标引脚,并设置为输入模式(浮空输入模式)如果想要知道底层逻辑详情可以看(1条消息) STM32-GPIO外设详解_学c入门到入土的博客-CSDN博客。
3)编写简单测试程序,检测KEY按键的状态,实现按键控制LED 。
LED头文件
#ifndef _LED_H_ //判断标号_LED_H_是否被定义,如果没有则#ifndef到#endif代码有效
#define _LED_H_
#include <stm32f10x.h>
#define LED_GPIO_PORT GPIOA //LED的GPIO端口
#define LED_GPIO_CLK RCC_APB2Periph_GPIOA //LED相对应的时钟端口开启
#define LED_GPIO_PIN GPIO_Pin_0 //LED的GPIO引脚号
void LED_GPIO_Config(void); //LEDGPIO端口初始化函数
#endif
LED.C文件
#include "led.h"
void LED_GPIO_Config(void)
{
RCC_APB2PeriphClockCmd(LED_GPIO_CLK,ENABLE);
/*开启LED相关的GPIO外设时钟*/
GPIO_InitTypeDef GPIO_InitStructure;
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
/*设置引脚模式为通用推挽输出*/
GPIO_InitStructure.GPIO_Pin=LED_GPIO_PIN;
/*选择要控制的引脚*/
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
/*设置引脚速率为50MHz*/
GPIO_Init(LED_GPIO_PORT,&GPIO_InitStructure);
/*调用库函数初始化GPIO*/
}
KEY头文件
#ifndef _KEY_H_ //判断标号_KEY_H_是否被定义,如果没有则#ifndef到#endif代码有效
#define _KEY_H_
#include <stm32f10x.h>
#define KEY_GPIO_PORT GPIOB
//KEY的GPIO端口
#define KEY_GPIO_CLK RCC_APB2Periph_GPIOB
//KEY相对应的时钟端口开启
#define KEY_GPIO_PIN GPIO_Pin_0
//KEY的GPIO引脚号
#define KEY_ON 0 //不一定低电平就是按下,这样可以根据自己需要所更改
//KEY按键状态:按下
#define KEY_OFF 1
//KEY按键状态:按键未按下
void KEY_GPIO_Config(void);
//KEY GPIO端口初始化函数
void delay_ms(unsigned int ms);
//延时函数
uint8_t KEY_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);
/*功能:检查是否有按键被按下
*输入参数1:GPIOx:具体的端口,x可以是(A~G)
*输入参数2:GPIO_Pin:具体的端口:GPIO_Pin_x(x可以是0~15)
*返回值:按键状态
*KEY_ON:按键按下
*KEY_OFF:按键未按下
*/
#endif
KEY.C文件
#include "KEY.h"
void KEY_GPIO_Config(void)
{
RCC_APB2PeriphClockCmd(KEY_GPIO_CLK,ENABLE);
/*开启KEY相关的GPIO外设时钟*/
GPIO_InitTypeDef GPIO_InitStructure;
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
/*设置引脚模式为浮空输入模式*/
GPIO_InitStructure.GPIO_Pin=KEY_GPIO_PIN;
/*选择要控制的引脚*/
GPIO_Init(KEY_GPIO_PORT,&GPIO_InitStructure);
/*调用库函数初始化GPIO*/
}
void delay_ms(unsigned int ms) //延时函数
{
unsigned int i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
uint8_t KEY_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{
/*检测按键是否被按下*/
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==KEY_ON)
{
/*按键去抖动*/ //如果你使用的是硬件有按键去抖处理那么这部分可以去掉
delay_ms(50);
/*再次确定按键是真的被按下去了*/
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==KEY_ON)
{
/*等待按键释放*/
while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==KEY_ON);
return KEY_ON;
}
else
return KEY_OFF;
}
else
return KEY_OFF;
}
main.C文件
#include "led.h"
#include "key.h"
int main()
{
LED_GPIO_Config();
//调用LED初始化函数
KEY_GPIO_Config();
//调用KEY初始化函数
while(1)
{
//调用按键判断函数,使用固件库函数拉高LED引脚电平
if(KEY_Scan(KEY_GPIO_PORT,KEY_GPIO_PIN)==KEY_ON)
{
GPIO_SetBits(LED_GPIO_PORT,LED_GPIO_PIN);
}
//调用按键判断函数,使用固件库函数拉低LED引脚电平
if(KEY_Scan(KEY_GPIO_PORT,KEY_GPIO_PIN)==KEY_ON)
{
GPIO_ResetBits(LED_GPIO_PORT,LED_GPIO_PIN);
}
}
}
这个小程序就完了,没有什么特别介绍的,只是吧我们前面所学的知识组合了一下 这里面使用到了一个新的固件库函数
函数名 | GPIO_ReadInputDataBit() |
函数原型 | u8 GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin) |
功能描述 | 读取指定端口引脚的输入 |
输入参数 1 | GPIOx:x可以是A,B,C,D,来选择GPIO外设 |
输入参数 2 | GPIO_Pin:待读取端口位 该参数可以取GPIO_Pin_x(x可以是0到15的任意组合) |
返回值 | 输入端口引脚值 |
函数基本原理就是读取GPIO-IDR(端口输入数据寄存器)的状态并进行返回值处理。
关注我下面我会继续更新GPIO外设输入输出的实际小程序,来帮助大家更好的理解GPIO外设的功能,后面还会更新STM32的所有特色外设。