STM32按键点灯的实现需要用到STM32的GPIO外设,不同开发板的LED外设不同,本文将采用野火STM32mini开发板来实现按键点灯。
1.首先,我们要想使用mini开发板按键控制小灯,就需要找到它的原理图,查找到板载的led和按键是用的哪一个引脚。
下图为led的板载引脚图,从图中我们可以知道mini板的两个led灯连接的是PC2、PC3引脚。且为低电平点亮、高电平熄灭
下图为mini板的按键引脚图,从图中我们也可以知道两个按键的引脚为PA0、PC13。且为高电平驱动,低电平阻断。
所以当我们在使用不同的STM32开发板时,led和按键的引脚以及驱动方式是不同的,这就需要我们必须使用相应开发板的原理图这里我把mini板的原理图奉上,希望能帮助到有缘人。
2.代码驱动
首先我们需要创建一个led的驱动文件以及按键的驱动文件。
key.c
#include "stm32f10x.h" // Device header
void delay(uint32_t ms)//毫秒延时
{
uint32_t i, j;
for (i = 0; i < ms; i++)
{
for (j = 0; j < 5000; j++)
{
__NOP(); // 空操作,不做任何事情,占用一个CPU周期
}
}
}
void Key_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);//开启GPIOA、GPIOC时钟
GPIO_InitTypeDef GPIO_InitStructure;//初始化GPIO引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//输入上拉模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//时钟频率
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC
}
uint8_t Key_GetNum(void)
{
uint8_t KeyNum = 0;
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 1)
{
delay(20);
while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 1);
delay(20);
KeyNum = 1;
}
if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 1)
{
delay(20);
while (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 1);
delay(20);
KeyNum = 2;
}
return KeyNum;
}
key.h
#ifndef __KEY_H
#define __KEY_H
void Key_Init(void);
uint8_t Key_GetNum(void);
void delay(uint32_t ms);
#endif
led.c
#include "stm32f10x.h" // Device header
void LED_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//开启GPIOA、GPIOC时钟
GPIO_InitTypeDef GPIO_InitStructure;//初始化GPIO引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;//使能引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设置GPIO的速度
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC
GPIO_SetBits(GPIOC, GPIO_Pin_2 | GPIO_Pin_3);//给PC2、PC3
}
void LED1_ON(void)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_2);
}
void LED1_OFF(void)
{
GPIO_SetBits(GPIOC, GPIO_Pin_2);
}
void LED2_ON(void)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_3);
}
void LED2_OFF(void)
{
GPIO_SetBits(GPIOC, GPIO_Pin_3);
}
led.h
#ifndef __LED_H
#define __LED_H
void LED_Init(void);
void LED1_ON(void);
void LED1_OFF(void);
void LED2_ON(void);
void LED2_OFF(void);
#endif
main.c
#include "stm32f10x.h" // Device header
#include "LED.h"
#include "Key.h"
uint8_t KeyNum;
int main(void)
{
LED_Init();
Key_Init();
while (1)
{
KeyNum = Key_GetNum();
if (KeyNum == 1)//按key1键led1亮
{
LED1_ON();
}
if (KeyNum == 2)//按key2键小灯2亮一秒熄灭
{
LED2_ON();
delay(1000);
LED2_OFF();
}
}
}