GPIO HAL库+CubeMX

以正点原子精英版为例:

GPIO HAL库+CubeMX_第1张图片     GPIO HAL库+CubeMX_第2张图片

一.创建HAL库模块 

GPIO HAL库+CubeMX_第3张图片

GPIO HAL库+CubeMX_第4张图片 二.GPIO输出

1.自己编写

GPIO HAL库+CubeMX_第5张图片

void led_init(void)
{
    GPIO_InitTypeDef gpio_init_struct;
    
    __HAL_RCC_GPIOB_CLK_ENABLE();
    
    gpio_init_struct.Pin = GPIO_PIN_5;
    gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP;
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOB, &gpio_init_struct);

    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
}

2.cubeMX生成

void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOE_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET);

  /*Configure GPIO pins : PEPin PEPin */
  GPIO_InitStruct.Pin = KEY0_Pin|KEY1_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  /*Configure GPIO pin : PtPin */
  GPIO_InitStruct.Pin = LED1_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(LED1_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pin : PtPin */
  GPIO_InitStruct.Pin = KEY_UP_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  HAL_GPIO_Init(KEY_UP_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pin : PtPin */
  GPIO_InitStruct.Pin = LED0_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(LED0_GPIO_Port, &GPIO_InitStruct);

}

3.编写自己的需要的LED驱动文件(BSP)

/*.h文件中*/
#ifndef __DRIVER_LED_H__
#define __DRIVER_LED_H__


#define LED0_ON() do{HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET);}while(0)
#define LED1_ON() do{HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);}while(0)
#define LED0_TogglePin() do{HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);}while(0);
#define LED1_TogglePin() do{HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);}while(0);

void LED0_Twinkling();
void LED1_Twinkling();
#endif
/*.c文件中*/
#include "driver_led.h"
#include "main.h"

void LED0_Twinkling()
{
    LED0_TogglePin();
    HAL_Delay(500);
}
void LED1_Twinkling()
{
    LED1_TogglePin();
    HAL_Delay(500);
}

三.GPIO输入

/*.h文件中*/
#include "main.h"
#ifndef __DRIVER_KEY_H__
#define __DRIVER_KEY_H__

#define KEY0 HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) /* 读取 KEY0 引脚 */
#define KEY1 HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) /* 读取 KEY1 引脚 */
#define WK_UP HAL_GPIO_ReadPin(KEY_UP_GPIO_Port, KEY_UP_Pin) /* 读取 WKUP 引脚 */
#define KEY0_PRES 1 /* KEY0 按下 */
#define KEY1_PRES 2 /* KEY1 按下 */
#define WKUP_PRES 3 /* KEY_UP 按下(即 WK_UP) */


uint8_t key_scan(uint8_t mode);
#endif
/*.c文件中*/
uint8_t key_scan(uint8_t mode)
{
    static uint8_t key_up = 1; /* 按键按松开标志 */
    uint8_t keyval = 0;
    if (mode) key_up = 1; /* 支持连按 */
    if (key_up && (KEY0 == 0 || KEY1 == 0 || WK_UP == 1))
    { /* 按键松开标志为 1, 且有任意一个按键按下了 */
        HAL_Delay(10);
        key_up = 0;
        if (KEY0 == 0) keyval = KEY0_PRES;
        if (KEY1 == 0) keyval = KEY1_PRES;
        if (WK_UP == 1) keyval = WKUP_PRES;
    }
        else if (KEY0 == 1 && KEY1 == 1 && WK_UP == 0)
        { /* 没有任何按键按下, 标记按键松开 */
        key_up = 1;
    }
    return keyval; /* 返回键值 */
}

四.GPIO相关函数

__HAL_RCC_GPIOx_CLK_ENABLE() //开启GPIO时钟
HAL_GPIO_Init()              //初始化GPIO
HAL_GPIO_WritePin()          //控制IO输出高/低电平
HAL_GPIO_TogglePin()         //每次调用IO输出电平翻转一次
HAL_GPIO_ReadPin()           //读取IO电平

你可能感兴趣的:(HAL库+CubeMX,单片机,嵌入式硬件)