1、准备开发板
这里我选用了一块网红开发板:”小熊派“,这款板子的人气比较高,还是全国大学生物联网设计竞赛(华为杯)的华为竞赛开发板,我个人也比较喜欢用这款板子,这款板子在放在纸箱吃灰半年之后,被我重新拿了起来,并想借此写博客的机会,整理一下自己的代码。
开发板功能区分布图
开发板俯视图
外设引脚对应表
MCU引脚 |
引脚标注名 |
PC13 |
LED |
PB2 |
KEY1 |
PB3 |
KEY2 |
按键原理图
2、STM32CubeMX生成代码
搜索并选择芯片型号
配置系统时钟
配置时钟树
STM32L4的最高主频可达到80M,最后使HCLK = 80Mhz
即可:
配置GPIO引脚
修改引脚的用户标签名(相当于取另一个新名字)
配置PB2和PB3设置成上拉输入
生成工程设置
代码生成配置
生成代码
生成成功
3、在MDK中编写代码
在gpio.h文件中添加
typedef enum
{
LED_OFF = 0,
LED_ON,
LED_Toggle
} LED_ENUM;
#define LED_Set(status) status != LED_Toggle ? HAL_GPIO_WritePin( LED_GPIO_Port, LED_Pin, status != LED_ON ? GPIO_PIN_RESET : GPIO_PIN_SET): HAL_GPIO_TogglePin( LED_GPIO_Port, LED_Pin);
新建key.h文件编写以下代码
#ifndef _KEY_H
#define _KEY_H
#include "main.h"
#define KEY1 HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)//读取按键1
#define KEY2 HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin)//读取按键2
#define KEY1_PRES 1 //KEY1按下
#define KEY2_PRES 2 //KEY2按下
unsigned char KEY_Scan(unsigned char mode);
#endif
新建key.c文件编写以下代码
//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//0,没有任何按键按下
//1,KEY1按下
//2,KEY2按下
//注意此函数有响应优先级,KEY1>KEY2!!
unsigned char KEY_Scan(unsigned char mode)
{
static unsigned char key_up=1;//按键按松开标志
if(mode)key_up=1; //支持连按
if(key_up && (KEY1 == 0||KEY2 == 0))
{
HAL_Delay(10);//去抖动
key_up = 0;
if(KEY1 == 0)return KEY1_PRES;
else if(KEY2 == 0)return KEY2_PRES;
}else if(KEY1 == 1&&KEY2 == 1)key_up=1;
return 0;// 无按键按下
}
在main.c中的main函数编写以下代码
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
unsigned char key = KEY_Scan(0); //按键按下检测函数
if(key == 1)
{
LED_Set(LED_ON); //点亮LED
}
if(key == 2)
{
LED_Set(LED_OFF); //熄灭LED
}
}
/* USER CODE END 3 */
4、配置烧录器
5、烧录代码
6、实验现象
按下按键1,LED灯点亮。按下按键2,LED熄灭。