文章目录
GPIO
初始化
HAL
库初始化
/* 初始化HAL库,进行任何操作之前必须初始化HAL库 */
HAL_Init();
RCC
时钟使能
/* GPIOx时钟使能(注意,开头是两个"_",即"__") */
__HAL_RCC_GPIOx_CLK_ENABLE();
/* GPIOX时钟失能(注意,开头是两个"_",即"__") */
__HAL_RCC_GPIOx_CLK_DISABLE();
Pin
初始化
GPIO_InitTypeDef
typedef struct {
/* GPIO引脚,取值为:
GPIO_PIN_0 ~ GPIO_PIN_15 (配置单个引脚);
GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 (同时配置部分引脚);
GPIO_PIN_ALL (同时配置所有引脚). */
uint32_t Pin;
/* GPIO模式,取值为:
GPIO_MODE_INPUT (Floating 浮空输入);
GPIO_MODE_OUTPUT_PP (Push-Pull 推挽输出);
GPIO_MODE_OUTPUT_OD (Open Drain 开漏输出);
GPIO_MODE_AF_PP (复用推挽输出);
GPIO_MODE_AF_OD (复用开漏输出);
GPIO_MODE_ANALOG (ADC 模拟输入);
GPIO_MODE_IT_RISING (外部中断,上升沿触发);
GPIO_MODE_IT_FALLING (外部中断,下降沿触发);
GPIO_MODE_IT_RISING_FALLING (外部中断,上升沿 或 下降沿触发);
GPIO_MODE_EVT_RISING (外部事件,上升沿触发);
GPIO_MODE_EVT_FALLING (外部事件,下降沿触发);
GPIO_MODE_EVT_RISING_FALLING (外部事件,上升沿 或 下降沿触发). */
uint32_t Mode;
/* GPIO拉电阻模式,无拉/上拉/下拉。取值为:
GPIO_NOPULL (无拉电阻);
GPIO_PULLUP (上拉模式);
GPIO_PULLDOWN (下拉模式). */
uint32_t Pull;
/* GPIO最大电平翻转频率,取值为:
GPIO_SPEED_FREQ_LOW (低翻转频率,2MHz);
GPIO_SPEED_FREQ_MEDIUM (中翻转频率,12.5MHz ~ 50MHz);
GPIO_SPEED_FREQ_HIGH (高翻转频率,25MHz ~ 100MHz);
GPIO_SPEED_FREQ_VERY_HIGH (极高翻转频率,50MHz ~ 200MHz). */
uint32_t Speed;
/* 配置GPIO的具体复用功能,例:
GPIO_Init.Alternate = GPIO_AF7_USART1;
GPIO复用为 USART1. */
uint32_t Alternate;
} GPIO_InitTypeDef;
HAL_GPIO_Init()
/* 使用 GPIO_Init结构体初始化GPIOx. */
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx,GPIO_InitTypeDef *GPIO_Init);
/* 将所选的 GPIOx 的 GPIO_Pin 所有参数重设为缺省值。 */
void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin);
GPIO
初始化示例
/* 初始化结构体成员 */
GPIO_InitTypeDef GPIO_Init = {0};
GPIO_Init.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2;
GPIO_Init.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Init.Pull = GPIO_PULLUP;
GPIO_Init.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOC,&GPIO_Init);
或:
/* 注意:初始化结构体成员的值必须与成员对应,且不可缺项 */
GPIO_InitTypeDef GPIO_Init = {
GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2,
GPIO_Init.Mode = GPIO_MODE_OUTPUT_PP,
GPIO_Init.Pull = GPIO_PULLUP,
GPIO_Init.Speed = GPIO_SPEED_FREQ_HIGH,
0
};
HAL_GPIO_Init(GPIOC,&GPIO_Init);
GPIO
基本电平设置
常用设置
/* 读取指定 GPIOx 的 GPIO_Pin 的电平状态(高/低).
返回:
(GPIO_PinState)GPIO_PIN_RESET (低电平);
(GPIO_PinState)GPIO_PIN_SET (高电平).
注意:GPIO引脚模式为 读或写 都可使用此函数读取电平状态 */
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);
/* 设置指定 GPIOx 的 GPIO_Pin 的电平状态(高/低).
参数PinState:
(GPIO_PinState)GPIO_PIN_RESET (低电平);
(GPIO_PinState)GPIO_PIN_SET (高电平).
注意:
此函数仅在GPIO 写 模式下使用 */
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin,GPIO_PinState PinState);
/* 切换(Toggle)指定 GPIOx 的 GPIO_Pin 的电平状态 */
void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);
示例
main.c
#include "stm32f4xx.h"
#define LED_Port GPIOC
#define LED_Pin GPIO_PIN_0
#define true 1
#define false 0
// 函数声明
void LED_Init(void);
void LED_Twinkle(int delay_ms);
int main() {
// 初始化HAL库
HAL_Init();
LED_Init();
while(true) {
LED_Twinkle(500);
}
}
void LED_Init() {
// 初始化指定GPIO的RCC时钟
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitTypeDef LED_InitStructure = {0};
LED_InitStructure.Pin = LED_Pin;
// Open Drain 开漏输出模式
LED_InitStructure.Mode = GPIO_MODE_OUTPUT_OD;
// 无拉电阻
LED_InitStructure.Pull = GPIO_NOPULL;
LED_InitStructure.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LED_Port,&LED_InitStructure);
// GPIO初始为高电平
HAL_GPIO_WritePin(LED_Port,LED_Pin,GPIO_PIN_SET);
}
void LED_Twinkle(int delay_ms) {
HAL_GPIO_TogglePin(LED_Port,LED_Pin);
// HAL库中的毫秒级延时函数
HAL_Delay(delay_ms);
}