当前位置:   article > 正文

hal库学习笔记(二):GPIO_hal_gpio_togglepin

hal_gpio_togglepin

目录

硬件知识

一、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

  1. @par Example Description //例程描述
  2. How to configure and use GPIOs through the HAL API.
  3. PA.05 IO (configured in output pushpull mode) toggles in a forever loop.
  4. On STM32F103RB-Nucleo board this IO is connected to LED2.
  5. 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

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

死循环里的才是重点

  1. HAL_GPIO_TogglePin(LED2_GPIO_PORT, LED2_PIN);
  2. /* Insert delay 100 ms */
  3. 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

复制到死循环内

  1. HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_1);
  2. HAL_Delay(500);

 然后下载

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

二、按键开关小灯

①初始化4eed907571944f95896ff37358e5c6b4.png

②代码编写

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

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

  1. if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) ==GPIO_PIN_RESET){
  2. HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_1);
  3. }

简单如斯

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

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

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

  1. if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) ==GPIO_PIN_RESET){
  2. HAL_Delay(20);
  3. if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) ==GPIO_PIN_RESET){
  4. HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_1);
  5. }
  6. }

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

补充:专属库的改进

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

  1. /*Mine.h*/
  2. #include "main.h"
  3. #define Red GPIO_PIN_1
  4. #define Green GPIO_PIN_5
  5. #define Key1 GPIO_PIN_0
  6. #define Key2 GPIO_PIN_1
  7. #define Key3 GPIO_PIN_10
  8. #define Key4 GPIO_PIN_11
  9. #define Pressed GPIO_PIN_RESET
  10. #define Red_On() HAL_GPIO_Writein(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
  11. #define Red_Off() HAL_GPIO_Writein(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
  12. #define Red_Toggle() HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_1);
  13. GPIO_PinState ReadPin(uint16_t GPIO_Pin) ;
  1. /*Mine.c*/
  2. #include "Mine.h"
  3. GPIO_PinState ReadPin(uint16_t GPIO_Pin) {
  4. return HAL_GPIO_ReadPin(GPIOB, GPIO_Pin);
  5. }
  1. /* Mine.h*/
  2. /* USER CODE BEGIN Includes */
  3. #include "Mine.h"
  4. /* USER CODE END Includes */
  5. if(ReadPin(GPIO_PIN_0) == Pressed){
  6. HAL_Delay(20);
  7. if(ReadPin(GPIO_PIN_0) == Pressed){
  8. Red_Toggle();
  9. }
  10. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/126112
推荐阅读
  

闽ICP备14008679号