以正点原子精英版为例:
一.创建HAL库模块
二.GPIO输出
1.自己编写
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电平