目录

硬件知识

一、LED

二、按键

函数库知识

一、例程解析

二、函数解析

代码编写

一、小灯闪烁

二、按键开关灯

硬件知识

一、LED知识

①原理

Android gpio控制 gpio_togglepin_Red

 LED:当阳极电平>阴极电平时,LED导通发光

 在图中:LED阴极接地,则

  • A1为高电平时,小灯发光
  • A1为低电平时,小灯不发光

②初始化设置

选择A1为输出模式

Android gpio控制 gpio_togglepin_嵌入式硬件_02

 通过左边的设置界面找到GPIO,然后设置参数

Android gpio控制 gpio_togglepin_初始化_03

有关参数如下

Android gpio控制 gpio_togglepin_Red_04

  • output level:输出电平
  • low:开机后为低电平
  • High:开机后为高电平

Android gpio控制 gpio_togglepin_嵌入式硬件_05

 剩余三个都这样调,以后都是这样、

暂不做要求,记住就好

二、按键知识

①原理

Android gpio控制 gpio_togglepin_Android gpio控制_06

当按键按下后,两端导通

在图中,按键接地

按下后相当于B0接地,会变成低电平

若接3.3v正极,按下后变为高电平

②初始化设置

B0选Input

Android gpio控制 gpio_togglepin_#define_07

 参数设置

Android gpio控制 gpio_togglepin_嵌入式硬件_08

选择pull-up上拉,上拉就是往电平往上拉

代表B0平时为高电平

函数库知识

一、例程解析

①例程描述

按这个路径慢慢找就好

Android gpio控制 gpio_togglepin_#define_09

先点开这个readme看看

Android gpio控制 gpio_togglepin_Red_10

找到最重要的Example Description

@par Example Description	//例程描述	

How to configure and use GPIOs through the HAL API.

PA.05 IO (configured in output pushpull mode) toggles in a forever loop.
On STM32F103RB-Nucleo board this IO is connected to LED2.

In this example, HCLK is configured at 64 MHz.

Toggle:翻转

API:可以理解为函数集

stm32……:官方的板子,我们用的是stm32f103c8t6最小系统板

HCLK:不知道是什么,当做系统运行频率吧

大意翻译:怎么配置和使用GPIO,通过HAL里的函数

A5调好了输出模式,会在死循环内不停翻转电平

在官方板子里这个IO口连接LED2

这里,HCLK的频率为64MHZ

很明显,这个例程的现象就是A5连着的灯亮个不停

②主函数

点开main函数,看看写了啥

Android gpio控制 gpio_togglepin_Red_11

 这是主函数里面一堆初始化,无视就好

死循环里的才是重点

HAL_GPIO_TogglePin(LED2_GPIO_PORT, LED2_PIN);
    /* Insert delay 100 ms */
    HAL_Delay(100)
  • 上面说了delay100ms
  • 很明显括号里是多少,他就延时多少毫秒,记住就好
  • 然后就是HAL_GPIO_TogglePin(LED2_GPIO_PORT, LED2_PIN);
  • 意思就是LED2电平翻转

二、函数库讲解

右键跳转一下定义

Android gpio控制 gpio_togglepin_嵌入式硬件_12

 可以看到这样一个库

Android gpio控制 gpio_togglepin_初始化_13

接下来讲解里面重要的函数

  • void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
  • 刚刚说的已经很清楚了,翻转电平
  • 参数设置
  • GPIO_TypeDef *GPIOx:端口,如GPIOA,GPIOB等
  • uint16_t GPIO_Pin:引脚,如GPIO_PIN_1,GPIO_PIN_13等
  • 例:HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1);
  • 翻转一次A1的电平
  • void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
  • 上面是翻转这边是写入
  • 参数:
  • GPIO & GPIO_Pin:同上
  • GPIO_PinState:引脚状态,是官方采用枚举列举的
  • typedef enum
    {
      GPIO_PIN_RESET = 0u,              //低电平
      GPIO_PIN_SET                            //高电平
    } GPIO_PinState;
  • 例:HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1,GPIO_PIN_RESET );
  • A1写入低电平
  • GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
  • 读取引脚,返回引脚状态,如低电平或高电平
  • 其他参数同上
  • 例:if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) ==GPIO_PIN_RESET ){……}
  • 如果A1为低电平,就……

代码编写

一、小灯闪烁

①初始化

复制模板改名

Android gpio控制 gpio_togglepin_Android gpio控制_14

然后按上面说的那样子,配好A1

Android gpio控制 gpio_togglepin_初始化_15

这里我顺手配了B0,问题不大

②在主文件死循环里加个和例程差不多的

像这样快速定位要引用的函数

Android gpio控制 gpio_togglepin_嵌入式硬件_16

复制到死循环内

HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_1);
		HAL_Delay(500);

 然后下载

实验现象:A1红灯每500ms亮灭一次

二、按键开关小灯

①初始化

Android gpio控制 gpio_togglepin_#define_17

②代码编写

刚刚说了按键原理,那么基本思路就是

if(按键按下){翻转A1电平},代码如下

if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) ==GPIO_PIN_RESET){
			
			HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_1);
			
		}

简单如斯

但实际上,按键和手都可以是劣质的

你按下后B0不一定为低电平,你偶尔按了没反应

所以我们一般在外面加个延时

if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) ==GPIO_PIN_RESET){
			HAL_Delay(20);
			
			if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) ==GPIO_PIN_RESET){
				
				HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_1);
				
			}
		}

其实加完也没稳定太多,图个心理安慰

补充:专属库的改进

官方代码太长了不想复制那么多,我一般这样改

/*Mine.h*/

#include "main.h"




#define Red 				GPIO_PIN_1
#define Green 				GPIO_PIN_5


#define Key1					GPIO_PIN_0
#define Key2	 				GPIO_PIN_1
#define Key3					GPIO_PIN_10
#define Key4	 				GPIO_PIN_11


#define Pressed 								GPIO_PIN_RESET


#define Red_On() 			HAL_GPIO_Writein(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
#define Red_Off() 		HAL_GPIO_Writein(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
#define Red_Toggle() 	HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_1);


GPIO_PinState ReadPin(uint16_t GPIO_Pin) ;
/*Mine.c*/

#include "Mine.h"


GPIO_PinState ReadPin(uint16_t GPIO_Pin) {



		return HAL_GPIO_ReadPin(GPIOB,  GPIO_Pin);

}
/* Mine.h*/


/* USER CODE BEGIN Includes */
#include "Mine.h"
/* USER CODE END Includes */

		
if(ReadPin(GPIO_PIN_0) == Pressed){
			HAL_Delay(20);
			
			if(ReadPin(GPIO_PIN_0) == Pressed){
				
				Red_Toggle();
				
			}
		}