目录
硬件知识
一、LED
二、按键
函数库知识
一、例程解析
二、函数解析
代码编写
一、小灯闪烁
二、按键开关灯
硬件知识
一、LED知识
①原理
LED:当阳极电平>阴极电平时,LED导通发光
在图中:LED阴极接地,则
- A1为高电平时,小灯发光
- A1为低电平时,小灯不发光
②初始化设置
选择A1为输出模式
通过左边的设置界面找到GPIO,然后设置参数
有关参数如下
- output level:输出电平
- low:开机后为低电平
- High:开机后为高电平
剩余三个都这样调,以后都是这样、
暂不做要求,记住就好
二、按键知识
①原理
当按键按下后,两端导通
在图中,按键接地
按下后相当于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)
- 首先看这个短小精悍的 HAL_Delay(100);
- 上面说了delay100ms
- 很明显括号里是多少,他就延时多少毫秒,记住就好
- 然后就是HAL_GPIO_TogglePin(LED2_GPIO_PORT, LED2_PIN);
- 意思就是LED2电平翻转
二、函数库讲解
右键跳转一下定义
可以看到这样一个库
接下来讲解里面重要的函数
- 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为低电平,就……
代码编写
一、小灯闪烁
①初始化
复制模板改名
然后按上面说的那样子,配好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);
}
}
其实加完也没稳定太多,图个心理安慰
补充:专属库的改进文章来源:https://www.toymoban.com/news/detail-803676.html
官方代码太长了不想复制那么多,我一般这样改文章来源地址https://www.toymoban.com/news/detail-803676.html
/*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();
}
}
到了这里,关于hal库学习笔记(二):GPIO的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!