Hal库学习笔记(二):探索GPIO的强大功能
目录
硬件知识
一、LED
二、按键
函数库知识
一、例程解析
二、函数解析
代码编写
一、小灯闪烁
二、按键开关灯
硬件知识
一、LED知识
①原理
LED:当阳极电平>阴极电平时,LED导通发光
在图中:LED阴极接地,则
②初始化设置
选择A1为输出模式
通过左边的设置界面找到GPIO,然后设置参数
有关参数如下
剩余三个都这样调,以后都是这样、
暂不做要求,记住就好
二、按键知识
①原理
当按键按下后,两端导通
在图中,按键接地
按下后相当于B0接地,会变成低电平
若接3.3v正极,按下后变为高电平
②初始化设置
B0选Input
参数设置
选择pull-up上拉,上拉就是往电平往上拉
代表B0平时为高电平
函数库知识
一、例程解析
①例程描述
按这个路径慢慢找就好
先点开这个readme看看
找到最重要的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函数,看看写了啥
这是主函数里面一堆初始化,无视就好
死循环里的才是重点
HAL_GPIO_TogglePin(LED2_GPIO_PORT, LED2_PIN);
/* Insert delay 100 ms */
HAL_Delay(100)
二、函数库讲解
右键跳转一下定义
可以看到这样一个库
接下来讲解里面重要的函数
{
GPIO_PIN_RESET = 0u, //低电平
GPIO_PIN_SET //高电平
} GPIO_PinState;
例:HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1,GPIO_PIN_RESET );
A1写入低电平
代码编写
一、小灯闪烁
①初始化
复制模板改名
然后按上面说的那样子,配好A1
这里我顺手配了B0,问题不大
②在主文件死循环里加个和例程差不多的
像这样快速定位要引用的函数
复制到死循环内
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_1);
HAL_Delay(500);
然后下载
实验现象:A1红灯每500ms亮灭一次
二、按键开关小灯
①初始化
②代码编写
刚刚说了按键原理,那么基本思路就是
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();
}
}