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

  • 26
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值