Hal库学习笔记(二):探索GPIO的强大功能

目录

硬件知识

一、LED

二、按键

函数库知识

一、例程解析

二、函数解析

代码编写

一、小灯闪烁

二、按键开关灯

硬件知识

一、LED知识

①原理

fa58ebf99be84829afc4b521d00d2910.png

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

 在图中:LED阴极接地,则

  • A1为高电平时,小灯发光
  • A1为低电平时,小灯不发光
  • ②初始化设置

    选择A1为输出模式c1e748ed48d6494993afba57c3d58132.png

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

    334cadd3e4f54706b7864beadbcbea06.png

    有关参数如下a66cfecb3cb344a7ace296a950a51253.png

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

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

    暂不做要求,记住就好

    二、按键知识

    ①原理

    e050a09b698b478fac41b125efc08ebb.png

    当按键按下后,两端导通

    在图中,按键接地

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

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

    ②初始化设置

    B0选Input

    1cfeaee0d328492f883c9626e6e277b1.png

     参数设置0c7449d81eac4f1397f195d4eeb728ac.png

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

    代表B0平时为高电平

    函数库知识

    一、例程解析

    ①例程描述

    按这个路径慢慢找就好044defd9ccdc49ea84854e170f315972.png

    先点开这个readme看看f2f773c2e61d49c7bd64510400242ac0.png

    找到最重要的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函数,看看写了啥e2fa2dc9cf7f45cfa03b9f664c9b098f.png

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

    死循环里的才是重点

       HAL_GPIO_TogglePin(LED2_GPIO_PORT, LED2_PIN);
        /* Insert delay 100 ms */
        HAL_Delay(100)
  •  首先看这个短小精悍的    HAL_Delay(100);
  • 上面说了delay100ms
  • 很明显括号里是多少,他就延时多少毫秒,记住就好
  • 然后就是HAL_GPIO_TogglePin(LED2_GPIO_PORT, LED2_PIN);
  • 意思就是LED2电平翻转
  • 二、函数库讲解

    右键跳转一下定义

    35498ddedfdf4e0f9ce1bf5979b21d10.png

     可以看到这样一个库ebb74aff2c1e4d5a9eb0d7fe5d89ab27.png

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

  • 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为低电平,就……
  • 代码编写

    一、小灯闪烁

    ①初始化

    复制模板改名85c3d6b7290542559f25be741be0bbf0.png

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

    ba4af9c2a31c4aefab9ed06834e54fb9.png

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

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

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

    c87cbbf8e96244f5b08f4e64c861ab82.png

    复制到死循环内

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

     然后下载

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

    二、按键开关小灯

    ①初始化4eed907571944f95896ff37358e5c6b4.png

    ②代码编写

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

    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();
    				
    			}
    		}

    物联沃分享整理
    物联沃-IOTWORD物联网 » Hal库学习笔记(二):探索GPIO的强大功能

    发表评论