STM32课堂实验二:按钮控制LED灯
前言
继上次通过对I/O端口的写操作点亮LED灯后,这次我们将要通过按钮来控制LED灯的亮灭以及闪烁。
一、实验内容
实验器材是正点原子STM32开发板:
利用STM32CubeMX对MCU进行配置
生成基于MDK-ARM集成开发环境的初始化代码
添加功能逻辑,完成应用开发,编译并运行
二、实验步骤
1.创建工程
打开CubeMX新建工程,选择MCU型号F103ZET6;
2.配置系统参数
进入配置界面,首先打开system core,选择sys,选择调试模式为serial wire串口调试,选择后可看到PA13和PA14两个端口被占用;
选择系统高速时钟由外部晶振提供;
随后打开Clock Configuration对时钟树进行配置。
3.配置I/O端口
由开发板电路图可知:
开发板自带两个LED,相应的I/O端口号分别为PB5和PE5,输出低电平即可点亮;
开发板自带三个按钮,KEY0/KEY1/WKUP,相应的I/O端口号分别为PE3/PE4/PA0,K0/K1按钮按下为低电平,WKUP按下为高电平。
选择PB5和PE5端口,将其设置为GPIO_Output输出模式。
引脚配置为推挽输出模式,默认高电平
选择PE3/PE4/PA0端口,设置为GPIO_Input输入模式。
K0/K1按钮按下为低电平,PE3/PE4端口设置为默认高电平(上拉)
WKUP按下为高电平,PA0端口设置为默认低电平(下拉):
4.生成工程文件
点击ProjectManager,重命名项目文件,选择生成MDK工程文件,打开Code Generator勾选每一个外设初始化都生成一对的“.c/.h”文件。
最后点击Generate Code生成项目文件,选择open project
5.修改main.c
打开Keil软件后,打开Application/user/core目录下的main.c文件
本次实验对对应用到的函数有:
读取按钮电平HAL_GPIO_ReadPin,电平翻转输出HAL_GPIO_TogglePin,和HAL_Delay。
HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);//读取按钮电平
HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);//电平翻转
HAL_Delay(uint32_t Delay);//延时
为提高代码的可读性,在User Code 0代码段中添加各个按钮对应的操作函数而在while主循环中直接调用:
/* USER CODE BEGIN 0 */
//定义交替闪烁函数,变量为闪烁次数
void Blink(uint16_t t)
{
int i = 0;
while(i<= t)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
HAL_Delay(200);
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);
HAL_Delay(200);
HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);
i = i + 1;
}
}
//定义按钮KEY_0的动作
void KEY_0()
{
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3) == 0)
{
HAL_Delay(100);//延迟100ms后检测按钮KEY_0电平,消抖
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3) == 0)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);//PB5电平翻转
while (HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3) == 0);
}
}
}
//定义按钮KEY_1的动作
void KEY_1()
{
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4) == 0)
{
HAL_Delay(100);
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4) == 0)
{
HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);
while (HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4) == 0);
}
}
}
//定义按钮KEY_2的动作
void KEY_2()
{
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == 1)
{
HAL_Delay(100);
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == 1)
{
Blink(4);
while (HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == 1);
}
}
}
/* USER CODE END 0 */
在while中调用:
/* USER CODE BEGIN WHILE */
while (1)
{
KEY_0();
KEY_1();
KEY_2();
/* USER CODE END WHILE */
}
最后编译和烧录即可
最后按下按钮KEY_0/KEY_1,分别打开或关闭LED0/LED1,按下KEY_2则两者交替闪烁。
总结
了解了最基础的读和写操作后,接下来将会是更进一步的模拟量与数字量的互化(ADC/DAC),利用STM32内置的转换模块,将信号进行采集和传输。