基于HAL库的GPIO配置

  1. 背景
  2. 初始化
    1. 初始化步骤
    2. 例程
  3. I/O读写
    1. 例程

背景

在STM32中,最常用到的功能莫过于GPIO(General Purpose Input Output 、通用输入/输出)了,在STM32中,除了除去ADC以外的复用功能,剩下的几乎就是GPIO了。

初始化

初始化步骤

  • 声明一个GPIO属性结构体,设置各成员属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
typedef struct
{
uint32_t Pin;
  /*指定的引脚号,右值表达式可以是GPIO_PIN_0到~GPIO_PIN_15任意相或 */
uint32_t Mode;
  /*
    模式
    GPIO_MODE_INPUT       输入模式
    GPIO_MODE_OUTPUT_PP    推挽输出模式(输出较大电流)
    GPIO_MODE_OUTPUT_OD    开漏输出模式(一般外接上拉电阻)
    GPIO_MODE_AF_PP       复用推挽输出模式
    GPIO_MODE_OUTPUT_OD    复用开漏输出模式
    GPIO_MODE_ANALOG      复用模拟输入输出模式(ADC/DAC专用)
  */
uint32_t Pull;
  /*
    上/下拉模式
      上拉电阻是指当pin接到VCC(高电平)时所接的电阻即为Pull up 电阻,
      反之亦然,pin接地时所接的电阻即pull down电阻
    GPIO_NOPULL   无
    GPIO_PULLUP   上拉
    GPIO_PULLDOWN 下拉
  */
uint32_t Speed;
  /*
    IO口速率(I/O口驱动电路的速度)
    当STM32的GPIO端口设置为输出模式时,有三种速度可以选择:2MHz、10MHz和50MHz,用来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。
    高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能。
    STM32F429的端口输出速率为括号内容

    GPIO_SPEED_LOW;    (2)   2MHz注意:
    GPIO_SPEED_MEDIUM;  (25)  12.5MHz ~ 50MHz
    GPIO_SPEED_FAST;   (50)  25MHz ~ 100 MHz
    GPIO_SPEED_HIGH;   (100)  50MHz ~ 200MHz

  */

uint32_t Alternate;
  /*
    复用功能,本节省略不讲
   */
}GPIO_InitTypeDef;
  • 使能GPIOx对应的时钟(如果没有使能将会导致配置无效)
1
__HAL_RCC_GPIOB_CLK_ENABLE(void);           //开启GPIOB时钟
  • 调用void HAL_GPIO_Init(GPIO_TypeDef GPIOx, GPIO_InitTypeDef GPIO_Init) 函数

例程

1
2
3
4
5
6
7
8
9
10
11
12
13
void LED_Init(void)
{
  // 初始化函数
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOB_CLK_ENABLE(); //开启GPIOB时钟

GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1; //PB1,0
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速

HAL_GPIO_Init(GPIOB,&GPIO_Initure);
}

I/O读写

1
2
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
Pxin(GPIO_Pin);   // x 可以是ABCD等端口

1
2
3
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
  Pxout(GPIO_Pin);   // x 可以是ABCD等端口
  void HAL_GPIO_TogglePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin);

例程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "stm32f4xx.h"
#define LED0 PAout(0)
int main(void)
{
  HAL_Init(); //初始化
  Stm32_Clock_Init(360,8,2,8); //设置时钟,180Mhz
  delay_init(180); //初始化延时函数
  LED_Init(); //初始化LED
  while(1)
  {
    LED0=0;     //LED0亮
    delay_ms(500);
    LED0=1;        //LED0灭
delay_ms(500);
}
}

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 yxhlfx@163.com

文章标题:基于HAL库的GPIO配置

本文作者:红尘追风

发布时间:2019-05-01, 12:05:21

原始链接:http://www.micernel.com/2019/05/01/%E5%9F%BA%E4%BA%8EHAL%E5%BA%93%E7%9A%84GPIO%E9%85%8D%E7%BD%AE/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录