编程要点:
1)使能GPIO端口时钟;
2)初始化GPIO目标引脚为输入模式(浮空输入);
3)编写简单测试程序,检测按键的状态,实现按键控制LED灯;
bsp_led.h文件
#ifndef T_LED_H_
#define T_LED_H_
#include "stm32f10x.h"
//R-红色
#define LED1_GPIO_PORT GPIOB
#define LED1_GPIO_CLK RCC_APB2Periph_GPIOB
#define LED1_GPIO_PIN GPIO_Pin_5
//G-绿色
#define LED2_GPIO_PORT GPIOB
#define LED2_GPIO_CLK RCC_APB2Periph_GPIOB
#define LED2_GPIO_PIN GPIO_Pin_0
//B-蓝色
#define LED3_GPIO_PORT GPIOB
#define LED3_GPIO_CLK RCC_APB2Periph_GPIOB
#define LED3_GPIO_PIN GPIO_Pin_1
以上代码分别把控制LED灯的GPIO端口,GPIO引脚号以及GPIO端口时钟封装起来了。在实际控制的时候我们就可以直接使用这些宏,以达到应用代码与硬件无关的效果。
/*直接操作寄存器的方法控制IO*/
#define digitalHi(p,i) {p->BSRR=i;}//输出高电平
#define digitalLo(p,i) {p->BRR=i;}//输出低电平
#define digitalToggle(p,i) {p->ODR^=i;}//输出反转状态
/*定义控制IO的宏*/
#define LED1_TOGGLE digitalToggle(LED1_GPIO_PORT,LED1_GPIO_PIN)//红灯反转
#define LED1_OFF digitalHi(LED1_GPIO_PORT,LED1_GPIO_PIN)//红灯灭
#define LED1_ON digitalLo(LED1_GPIO_PORT,LED1_GPIO_PIN)//红灯亮
#define LED2_TOGGLE digitalToggle(LED2_GPIO_PORT,LED2_GPIO_PIN)//绿灯反转
#define LED2_OFF digitalHi(LED2_GPIO_PORT,LED2_GPIO_PIN)//绿灯灭
#define LED2_ON digitalLo(LED2_GPIO_PORT,LED2_GPIO_PIN)//绿灯亮
#define LED3_TOGGLE digitalToggle(LED3_GPIO_PORT,LED3_GPIO_PIN)//蓝灯反转
#define LED3_OFF digitalHi(LED3_GPIO_PORT,LED3_GPIO_PIN)//蓝灯灭
#define LED3_ON digitalLo(LED3_GPIO_PORT,LED3_GPIO_PIN)//蓝灯亮
//红
#define LED_RED LED1_ON;LED2_OFF;LED3_OFF //红
#define LED_GREEN LED1_OFF;LED2_ON;LED3_OFF //绿
#define LED_BLUE LED1_OFF;LED2_OFF;LED3_ON //蓝
#define LED_YELLOW LED1_ON;LED2_ON;LED3_OFF //黄
#define LED_PURPLE LED1_ON;LED2_OFF;LED3_ON //紫
#define LED_CYAN LED1_OFF;LED2_ON;LED3_ON //青
#define LED_WHITE LED1_ON;LED2_ON;LED3_ON //白
#define LED_RGBOFF LED1_OFF;LED2_OFF;LED3_OFF //黑
void LED_GPIO_Config(void);
#endif /*T_LED_H_*/
bsp_led.c文件:
#include "bsp_led.h"
void LED_GPIO_Config(void)
{
//定义一个GPIO_InitTypeDef类型的结构体变量
GPIO_InitTypeDef GPIO_InitStructure;
//开启LED相关的GPIO外设时钟
RCC_APB2PeriphClockCmd( LED1_GPIO_CLK | LED2_GPIO_CLK | LED3_GPIO_CLK, ENABLE);
//选择引脚模式为通用推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
//设置引脚速率为50MHz
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//选择要控制的GPIO引脚
GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;
//初始化GPIO端口
GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);
//初始化GPIO引脚
GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN;
//初始化GPIO端口
GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
//初始化GPIO引脚
GPIO_InitStructure.GPIO_Pin = LED3_GPIO_PIN;
//初始化GPIO端口
GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure);
//关灯
GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
//关灯
GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);
//关灯
GPIO_SetBits(LED3_GPIO_PORT, LED3_GPIO_PIN);
}
bsp_key.h文件
#ifndef __KEY_H
#define __KEY_H
#include "stm32f10x.h"
// 引脚定义
#define KEY1_GPIO_CLK RCC_APB2Periph_GPIOA
#define KEY1_GPIO_PORT GPIOA
#define KEY1_GPIO_PIN GPIO_Pin_0
#define KEY2_GPIO_CLK RCC_APB2Periph_GPIOC
#define KEY2_GPIO_PORT GPIOC
#define KEY2_GPIO_PIN GPIO_Pin_13
#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 /* __KEY_H */
bsp_key.c文件
#include "bsp_key.h"
void Key_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*开启按键端口的时钟*/
RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK|KEY2_GPIO_CLK,ENABLE);
//选择按键的引脚
GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_PIN;
//选择按键的引脚为浮空输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
//使用结构体初始化按键
GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);
//选择按键的引脚
GPIO_InitStructure.GPIO_Pin = KEY2_GPIO_PIN;
//选择按键的引脚为浮空输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
//使用结构体初始化按键
GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStructure);
}
/*
检测是否有按键按下函数
*/
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;
}
main.c文件
#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_key.h"
int main(void)
{
/*LED端口初始化 */
LED_GPIO_Config();
/*按键初始化*/
Key_GPIO_Config();
/*查询按键是否按下,若按下LED反转*/
while(1)
{
if( Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY_ON )
{
/*LED1反转*/
LED1_TOGGLE;
}
if( Key_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN) == KEY_ON )
{
/*LED2反转*/
LED2_TOGGLE;
}
}
}