1. 什么是GPIO
General Purpose Input Output,通用输入输出端口
输入 采集外部器件的信息
输入 控制外部器件工作
2. GPIO的八种模式分析
输入浮空 输入用,完全浮空,状态不定
输入上拉 输入用,用内部上拉,默认高电平
输入下拉 输入用,用内部下拉,默认低电平
模拟功能 ADC、DAC
开漏输出 软件IIC的SDL、SCL等
推挽输出 驱动能力强,25mA(max),通用输出
开漏式复用功能 片上外设功能
推挽式复用功能 片上外设功能
3. GPIO寄存器介绍
CRL、CRH 配置工作模式,输出速度
IDR 输入数据
ODR 输出数据
BSRR 设置ODR寄存器的值
BRR 不用管
LCKR 配置锁定,不怎么用
4. 通用外设驱动模型(四步法)
初始化 时钟设置、参数设置、IO设置、中断设置
读函数 从外设读取数据
写函数 从外设写入数据
中断服务函数 根据中断标志,处理外设各种中断事务
5. GPIO配置步骤
使能时钟 __HAL_RCC_GPIOx_CLK_ENABLE()
设置工作模式 HAL_GPIO_Init()
设置输出状态 HAL_GPIO_WritePin()、HAL_GPIO_TogglePin()
读取输入状态 HAL_GPIO_ReadPin()
6. 相关HAL库函数简介
6.1 __HAL_RCC_GPIOx_CLK_ENABLE()
用于启用特定GPIO端口的时钟
6.2 HAL_GPIO_Init()
函数定义 void HAL_GPIO_Init (GPIO_TypeDef * GPIOx, GPIO_InitTypeDef * GPIO_Init)
函数描述 根据GPIO_Init中指定的参数初始化GPIOx外设
参数 GPIOx: 外设选择
// 创建一个GPIO_InitTypeDef结构体并初始化
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_0; // 引脚0
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出
GPIO_InitStruct.Pull = GPIO_NOPULL; // 无上下拉电阻
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 低速输出
// 初始化GPIOA的引脚0
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
6.3 HAL_GPIO_WritePin()
函数定义 void HAL_GPIO_WritePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
函数描述 设置或清除选中的端口位
参数 GPIOx:外设选择
GPIO_Pin:指定要写入的端口位,这个参数可以是GPIO_PIN_x中的一个
PinState:指定要写入的值
// 将GPIOA的引脚0设置为高电平
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
// 将GPIOB的引脚1设置为低电平
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
6.4 HAL_GPIO_TogglePin()
函数定义 void HAL_GPIO_TogglePin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)
函数描述 翻转指定的GPIO引脚
参数 GPIOx:外设选择
GPIO_Pin:指定要写入的端口位,这个参数可以是GPIO_PIN_x中的一个
// 翻转GPIOA的引脚0状态
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);
// 翻转GPIOB的引脚1状态
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
6.5 HAL_GPIO_ReadPin()
函数定义 GPIO_PinState HAL_GPIO_ReadPin (GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)
函数描述 读取指定端口引脚
参数 GPIOx:外设选择
GPIO_Pin:指定要写入的端口位,这个参数可以是GPIO_PIN_x中的一个
返回值 输出端口引脚值