利用STM32实现按键控制LED灯
利用野火开发版,一下是说明
/*********************************************************************************************/
【*】程序简介
-工程名称:GPIO输入--按键
-实验平台: 野火STM32 F429 开发板
-MDK版本:5.16
-ST固件库版本:1.5.1
【 !】功能简介:
使用两个按键控制彩灯的红、绿灯反转,按一下KEY1 红灯反转一次,按一下KEY2,绿灯反转一次。
学习目的:学会检测GPIO引脚输入的基本方法。
【 !!】注意事项:
跳线帽:彩灯需要用跳线帽连接J35 (出厂默认已连接,J35位置在彩灯附近)
/*********************************************************************************************/
【*】 引脚分配
KEY:
两个按键均有硬件去抖,按下的时候均为高电平,不按时为低电平。
KEY1<--->PA0
KEY2<--->PC13
LED:
RGB彩灯的三个阴极接到STM32三个引脚上,LED低电平亮。
R<--->PH10
G<--->PH11
B<--->PH12
LED4<--->PD11
/*********************************************************************************************/
【*】 时钟
A.晶振:
-外部高速晶振:25MHz
-RTC晶振:32.768KHz
B.各总线运行时钟:
-系统时钟 = SYCCLK = AHB1 = 180MHz
-APB2 = 90MHz
-APB1 = 45MHz
C.浮点运算单元:
不使用
main代码
/**
******************************************************************************
* @file main.c
* @author fire
* @version V1.0
* @date 2015-xx-xx
* @brief 使用按键控制彩灯
******************************************************************************
* @attention
*
* 实验平台:野火 STM32 F429 开发板
* 论坛 :http://www.firebbs.cn
* 淘宝 :https://fire-stm32.taobao.com
*
******************************************************************************
*/
#include "stm32f4xx.h"
#include "./led/bsp_led.h"
#include "./key/bsp_key.h"
/**
* @brief 主函数
* @param 无
* @retval 无
*/
int main(void)
{
/* LED 端口初始化 */
LED_GPIO_Config();
/*初始化按键*/
Key_GPIO_Config();
/* 轮询按键状态,若按键按下则反转LED */
while(1)
{
if( Key_Scan(KEY1_GPIO_PORT,KEY1_PIN) == KEY_ON )
{
/*LED1反转*/
LED1_TOGGLE;
}
if( Key_Scan(KEY2_GPIO_PORT,KEY2_PIN) == KEY_ON )
{
/*LED2反转*/
LED2_TOGGLE;
}
}
}
/*********************************************END OF FILE**********************/
LED文件
/**
******************************************************************************
* @file bsp_led.c
* @author fire
* @version V1.0
* @date 2015-xx-xx
* @brief led应用函数接口
******************************************************************************
* @attention
*
* 实验平台:野火 STM32 F429 开发板
* 论坛 :http://www.firebbs.cn
* 淘宝 :https://fire-stm32.taobao.com
*
******************************************************************************
*/
#include "./led/bsp_led.h"
/**
* @brief 初始化控制LED的IO
* @param 无
* @retval 无
*/
void LED_GPIO_Config(void)
{
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitTypeDef GPIO_InitStructure;
/*开启LED相关的GPIO外设时钟*/
RCC_AHB1PeriphClockCmd ( LED1_GPIO_CLK|
LED2_GPIO_CLK|
LED3_GPIO_CLK, ENABLE);
/*选择要控制的GPIO引脚*/
GPIO_InitStructure.GPIO_Pin = LED1_PIN;
/*设置引脚模式为输出模式*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
/*设置引脚的输出类型为推挽输出*/
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
/*设置引脚为上拉模式*/
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
/*设置引脚速率为2MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
/*调用库函数,使用上面配置的GPIO_InitStructure初始化GPIO*/
GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);
/*选择要控制的GPIO引脚*/
GPIO_InitStructure.GPIO_Pin = LED2_PIN;
GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
/*选择要控制的GPIO引脚*/
GPIO_InitStructure.GPIO_Pin = LED3_PIN;
GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure);
/*关闭RGB灯*/
LED_RGBOFF;
}
/*********************************************END OF FILE**********************/
按键文件
/**
******************************************************************************
* @file bsp_key.c
* @author fire
* @version V1.0
* @date 2015-xx-xx
* @brief 按键应用bsp(扫描模式)
******************************************************************************
* @attention
*
* 实验平台:野火 STM32 F429 开发板
* 论坛 :http://www.firebbs.cn
* 淘宝 :https://fire-stm32.taobao.com
*
******************************************************************************
*/
#include "./key/bsp_key.h"
/// 不精确的延时
void Key_Delay(__IO u32 nCount)
{
for(; nCount != 0; nCount--);
}
/**
* @brief 配置按键用到的I/O口
* @param 无
* @retval 无
*/
void Key_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*开启按键GPIO口的时钟*/
RCC_AHB1PeriphClockCmd(KEY1_GPIO_CLK|KEY2_GPIO_CLK,ENABLE);
/*选择按键的引脚*/
GPIO_InitStructure.GPIO_Pin = KEY1_PIN;
/*设置引脚为输入模式*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
/*设置引脚不上拉也不下拉*/
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
/*使用上面的结构体初始化按键*/
GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);
/*选择按键的引脚*/
GPIO_InitStructure.GPIO_Pin = KEY2_PIN;
/*使用上面的结构体初始化按键*/
GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStructure);
}
/**
* @brief 检测是否有按键按下
* @param GPIOx:具体的端口, x可以是(A...K)
* @param GPIO_PIN:具体的端口位, 可以是GPIO_PIN_x(x可以是0...15)
* @retval 按键的状态
* @arg KEY_ON:按键按下
* @arg KEY_OFF:按键没按下
*/
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;
}
/*********************************************END OF FILE**********************/
/**
******************************************************************************
* @file bsp_key.c
* @author fire
* @version V1.0
* @date 2015-xx-xx
* @brief 按键应用bsp(扫描模式)
******************************************************************************
* @attention
*
* 实验平台:野火 STM32 F429 开发板
* 论坛 :http://www.firebbs.cn
* 淘宝 :https://fire-stm32.taobao.com
*
******************************************************************************
*/
#include "./key/bsp_key.h"
/// 不精确的延时
void Key_Delay(__IO u32 nCount)
{
for(; nCount != 0; nCount--);
}
/**
* @brief 配置按键用到的I/O口
* @param 无
* @retval 无
*/
void Key_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*开启按键GPIO口的时钟*/
RCC_AHB1PeriphClockCmd(KEY1_GPIO_CLK|KEY2_GPIO_CLK,ENABLE);
/*选择按键的引脚*/
GPIO_InitStructure.GPIO_Pin = KEY1_PIN;
/*设置引脚为输入模式*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
/*设置引脚不上拉也不下拉*/
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
/*使用上面的结构体初始化按键*/
GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);
/*选择按键的引脚*/
GPIO_InitStructure.GPIO_Pin = KEY2_PIN;
/*使用上面的结构体初始化按键*/
GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStructure);
}
/**
* @brief 检测是否有按键按下
* @param GPIOx:具体的端口, x可以是(A...K)
* @param GPIO_PIN:具体的端口位, 可以是GPIO_PIN_x(x可以是0...15)
* @retval 按键的状态
* @arg KEY_ON:按键按下
* @arg KEY_OFF:按键没按下
*/
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;
}
/*********************************************END OF FILE**********************/