基于stm32的gpio实验HAL库方式实现

本文目标:基于stm32的gpio实验

按照本文的描述,应该可以跑通实验并举一反三。

先决条件:装有编译和集成的开发环境,比如:Keil uVision5、STM32CubeMX

使用外设:USART1、GPIO

前言

这篇文章是自己有感而发,根据自己所拥有的硬件平台进行验证一下,顺便给一些初学者一些启发。

实验目的

基于stm32的gpio实验,实现按键轮询的实验,在本实验过程中,我们将涉及 STM32 的 GPIO 端口配置、USART1等。

关于实验原理图

在这里插入图片描述

在这里插入图片描述

根据我这里的硬件原理图,想要驱动LED_R亮,那么mcu的PB0低电平可以亮,给高电平灯灭。按键这里的原理图解析则是常态下都是高电平,按下按键则可以读取到低电平。基于这个原理图,准备好一个工程模板。

搭建工程

使用STM32CubeMX配置stm32的基本配置。基本的配置如下:开启swd调试,开启外部时钟。

在这里插入图片描述

在这里插入图片描述

  • 配置USART1,用于printf调试

在这里插入图片描述

  • 配置LED

在这里插入图片描述

  • 配置按键gpio

在这里插入图片描述

  • 时钟界面选项卡:

在这里插入图片描述

  • 工程选项卡:

在这里插入图片描述

在这里插入图片描述

点击右上角的的生成代码:

在这里插入图片描述

使用keil打开工程,编译工程,一切都是ok

在这里插入图片描述

编写代码实现需求

开始编写代码,首先要把串口的打印映射好,使用下面的代码片段可用正常使用printf打印

int fputc( int ch, FILE *f )
{
	USART_TypeDef* USARTx = USART1;
	while ((USARTx->SR & (1<<7)) == 0);
	USARTx->DR = ch;
	return ch;
}

接下来创建一个key.c和key.h简单粗暴的写一些代码。其中key.c的代码如下:

#include "key.h"
#include <stdio.h>

uint8_t key_even_flag = 0;  // 定义一个按键标志

/**********************************************************************
 * 函数名称: key_poll
 * 功能描述: 按键轮询检测
 * 输入参数: 无
 * 输出参数: 无
 * 返 回 值: 无
 ***********************************************************************/
void key_poll(void)
{
	if(key_even_flag == 0)
	{
		if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 0)
		{
			key_even_flag = 1; // 按键1
			HAL_Delay(500);    // 简单延迟
		}
		else if(HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == 0)
		{
			key_even_flag = 2; // 按键2
			HAL_Delay(500);    // 简单延迟
		}
		else if(HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin) == 0)
		{
			key_even_flag = 3; // 按键3
			HAL_Delay(500);    // 简单延迟
		}
		else if(HAL_GPIO_ReadPin(KEY4_GPIO_Port, KEY4_Pin) == 0)
		{
			key_even_flag = 4; // 按键4
			HAL_Delay(500);    // 简单延迟
		}
	}
	return ;
}

/**********************************************************************
 * 函数名称: key_test
 * 功能描述: 按键测试函数
 * 输入参数: 无
 * 输出参数: 无
 * 返 回 值: 无
 ***********************************************************************/
void key_test(void)
{
	if(key_even_flag == 1)
	{
		printf("the key1 down\r\n");
		key_even_flag = 0;
	}
	else if(key_even_flag == 2)
	{
		printf("the key2 down\r\n");
		key_even_flag = 0;
	}
	else if(key_even_flag == 3)
	{
		printf("the key3 down\r\n");
		key_even_flag = 0;
	}
	else if(key_even_flag == 4)
	{
		printf("the key4 down\r\n");
		key_even_flag = 0;
	}
}

key.h的内容如下:

#ifndef __KEY_H__
#define __KEY_H__

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "main.h"

void key_poll(void);
void key_test(void);


#ifdef __cplusplus
}
#endif
#endif /*__ GPIO_H__ */



在main函数中简单进行测试一下

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	key_poll();
    key_test();
  }

main.c中的编写的代码片段

在这里插入图片描述

接下来简单的对工程配置一下

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

实验现象

在这里插入图片描述

可以看到我在按下板子上的按键时都能正常输出打印信息,表明此次实验成功,使用简单直观的代码可以实现我们的小需求,对于一些实时性要求不高的场合可以考虑使用。

本文中使用的测试工程

https://download.csdn.net/download/weixin_44317448/88203801

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐