嵌入式:STM32课堂实验二

STM32课堂实验二:按钮控制LED灯


前言

继上次通过对I/O端口的写操作点亮LED灯后,这次我们将要通过按钮来控制LED灯的亮灭以及闪烁。


一、实验内容

实验器材是正点原子STM32开发板:
利用STM32CubeMX对MCU进行配置
生成基于MDK-ARM集成开发环境的初始化代码
添加功能逻辑,完成应用开发,编译并运行

二、实验步骤

1.创建工程

打开CubeMX新建工程,选择MCU型号F103ZET6;新建工程选择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内置的转换模块,将信号进行采集和传输。

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值