1. 概述
GPIO(General Purpose Input/Output)是YTM32B1M微控制器最基础的外设之一,负责管理芯片的数字输入输出引脚。本文档详细解析YTM32B1M SDK中GPIO驱动的实现,包括文件组织、数据结构、API接口和应用方法。
2. 文件组织结构
2.1 头文件
-
pins_driver.h: GPIO驱动的主要头文件,定义了所有公共接口、数据结构和枚举类型
-
pins_gpio_hw_access.h: GPIO硬件访问层头文件(底层硬件操作)
-
pins_port_hw_access.h: 端口控制硬件访问层头文件(引脚复用控制)
2.2 源文件
-
pins_driver.c: GPIO驱动的主要实现文件,提供高层API接口
-
pins_gpio_hw_access.c: GPIO硬件访问层实现(底层寄存器操作)
-
pins_port_hw_access.c: 端口控制硬件访问层实现
2.3 架构层次
应用层 ↓ pins_driver.h/c (高层API) ↓ pins_gpio_hw_access.h/c + pins_port_hw_access.h/c (硬件抽象层) ↓ 寄存器定义 (YTM32B1ME0.h) ↓ 硬件寄存器
3. 核心数据结构解析
3.1 基础类型定义
// GPIO通道类型 - 用于表示引脚编号 typedef uint32_t pins_channel_type_t; // GPIO电平类型 - 用于表示引脚电平状态 typedef uint8_t pins_level_type_t;
3.2 引脚方向枚举
typedef enum { GPIO_INPUT_DIRECTION = 0x0U, // 输入方向 GPIO_OUTPUT_DIRECTION = 0x1U, // 输出方向 GPIO_UNSPECIFIED_DIRECTION = 0x2U // 未指定方向 } pin_direction_t;
3.3 引脚复用选择枚举
typedef enum { PCTRL_PIN_DISABLED = 0U, // 引脚禁用(模拟功能) PCTRL_MUX_AS_GPIO = 1U, // 配置为GPIO功能 PCTRL_MUX_ALT2 = 2U, // 复用功能2 PCTRL_MUX_ALT3 = 3U, // 复用功能3 PCTRL_MUX_ALT4 = 4U, // 复用功能4 PCTRL_MUX_ALT5 = 5U, // 复用功能5 PCTRL_MUX_ALT6 = 6U, // 复用功能6 PCTRL_MUX_ALT7 = 7U, // 复用功能7 // 根据芯片特性可能支持更多复用选项 } port_mux_t;
3.4 中断配置枚举
typedef enum { PCTRL_DMA_INT_DISABLED = 0x0U, // 中断/DMA禁用 PCTRL_DMA_RISING_EDGE = 0x1U, // DMA上升沿触发 PCTRL_DMA_FALLING_EDGE = 0x2U, // DMA下降沿触发 PCTRL_DMA_EITHER_EDGE = 0x3U, // DMA双边沿触发 PCTRL_INT_LOGIC_ZERO = 0x8U, // 逻辑0中断 PCTRL_INT_RISING_EDGE = 0x9U, // 上升沿中断 PCTRL_INT_FALLING_EDGE = 0xAU, // 下降沿中断 PCTRL_INT_EITHER_EDGE = 0xBU, // 双边沿中断 PCTRL_INT_LOGIC_ONE = 0xCU, // 逻辑1中断 } gpio_interrupt_config_t;
3.5 引脚配置结构体
typedef struct { PCTRL_Type *base; // 端口控制基地址 uint32_t pinPortIdx; // 引脚索引号 port_pull_config_t pullConfig; // 内部上下拉配置 port_slew_rate_t rateSelect; // 转换速率选择 bool passiveFilter; // 被动滤波器使能 port_open_drain_t openDrain; // 开漏输出配置 port_drive_strength_t driveSelect; // 驱动强度选择 port_mux_t mux; // 引脚复用选择 bool pinLock; // 引脚锁定 gpio_interrupt_config_t intConfig; // 中断配置 bool clearIntFlag; // 清除中断标志 bool digitalFilter; // 数字滤波器使能 gpio_digital_filter_config_t filterConfig; // 数字滤波器配置 GPIO_Type *gpioBase; // GPIO基地址 pin_direction_t direction; // 引脚方向 pins_level_type_t initValue; // 初始值 } pin_settings_config_t;
4. 数据结构关系图
pin_settings_config_t (引脚配置结构体) ├── PCTRL_Type *base (端口控制寄存器) ├── GPIO_Type *gpioBase (GPIO寄存器) ├── port_mux_t mux (复用选择) ├── pin_direction_t direction (方向配置) ├── gpio_interrupt_config_t intConfig (中断配置) ├── gpio_digital_filter_config_t filterConfig (滤波器配置) └── 其他配置参数...
5. 核心API接口详解
5.1 初始化接口
status_t PINS_DRV_Init(uint32_t pinCount, const pin_settings_config_t config[]);
功能: 根据配置结构体数组初始化多个引脚 参数:
-
pinCount
: 要配置的引脚数量 -
config[]
: 引脚配置结构体数组
返回值: STATUS_SUCCESS
表示成功
5.2 引脚方向控制
// 设置单个引脚方向 void PINS_DRV_SetPinDirection(GPIO_Type *const base, pins_channel_type_t pin, pin_direction_t direction); // 设置整个端口引脚方向 void PINS_DRV_SetPinsDirection(GPIO_Type *const base, pins_channel_type_t pins); // 获取端口引脚方向配置 pins_channel_type_t PINS_DRV_GetPinsDirection(const GPIO_Type *const base);
5.3 引脚输出控制
// 写单个引脚 void PINS_DRV_WritePin(GPIO_Type *const base, pins_channel_type_t pin, pins_level_type_t value); // 写整个端口 void PINS_DRV_WritePins(GPIO_Type *const base, pins_channel_type_t pins); // 设置引脚为高电平 void PINS_DRV_SetPins(GPIO_Type *const base, pins_channel_type_t pins); // 清除引脚为低电平 void PINS_DRV_ClearPins(GPIO_Type *const base, pins_channel_type_t pins); // 翻转引脚状态 void PINS_DRV_TogglePins(GPIO_Type *const base, pins_channel_type_t pins);
5.4 引脚输入读取
// 读取端口输入状态 pins_channel_type_t PINS_DRV_ReadPins(const GPIO_Type *const base); // 获取端口输出状态 pins_channel_type_t PINS_DRV_GetPinsOutput(const GPIO_Type *const base);
5.5 引脚复用配置
// 设置引脚复用模式 void PINS_DRV_SetMuxModeSel(PCTRL_Type *const base, uint32_t pin, port_mux_t mux);
5.6 中断配置
// 设置引脚中断配置 void PINS_DRV_SetPinIntSel(GPIO_Type *const base, uint32_t pin, gpio_interrupt_config_t intConfig); // 获取引脚中断配置 gpio_interrupt_config_t PINS_DRV_GetPinIntSel(const GPIO_Type *const base, uint32_t pin); // 清除单个引脚中断标志 void PINS_DRV_ClearPinIntFlagCmd(GPIO_Type *const base, uint32_t pin); // 获取端口中断标志 uint32_t PINS_DRV_GetPortIntFlag(const GPIO_Type *const base); // 清除端口中断标志 void PINS_DRV_ClearPortIntFlagCmd(GPIO_Type *const base);
6. 外设应用描述
6.1 基本GPIO应用
GPIO驱动主要用于:
-
数字输入: 读取按键、开关、传感器数字信号
-
数字输出: 控制LED、继电器、数字信号输出
-
中断输入: 检测外部事件,如按键按下、信号变化
-
引脚复用: 将GPIO引脚配置为其他外设功能
6.2 典型应用场景
-
LED控制
// 配置PA0为输出,控制LED pin_settings_config_t ledConfig = { .base = PCTRL_A, .pinPortIdx = 0, .mux = PCTRL_MUX_AS_GPIO, .gpioBase = GPIOA, .direction = GPIO_OUTPUT_DIRECTION, .initValue = 0 }; PINS_DRV_Init(1, &ledConfig); // 点亮LED PINS_DRV_SetPins(GPIOA, 1 << 0);
-
按键检测
// 配置PB1为输入,检测按键 pin_settings_config_t keyConfig = { .base = PCTRL_B, .pinPortIdx = 1, .pullConfig = PCTRL_INTERNAL_PULL_UP_ENABLED, .mux = PCTRL_MUX_AS_GPIO, .gpioBase = GPIOB, .direction = GPIO_INPUT_DIRECTION }; PINS_DRV_Init(1, &keyConfig); // 读取按键状态 uint32_t keyState = PINS_DRV_ReadPins(GPIOB); if (!(keyState & (1 << 1))) { // 按键被按下 }
-
中断检测
// 配置PC2为中断输入 pin_settings_config_t intConfig = { .base = PCTRL_C, .pinPortIdx = 2, .mux = PCTRL_MUX_AS_GPIO, .gpioBase = GPIOC, .direction = GPIO_INPUT_DIRECTION, .intConfig = PCTRL_INT_FALLING_EDGE, .clearIntFlag = true }; PINS_DRV_Init(1, &intConfig);
7. 与数据手册的对应关系
根据YTM32B1ME0数据手册中的GPIO章节:
-
PCTRL寄存器: 对应引脚控制寄存器,用于配置引脚复用、上下拉、驱动能力等
-
GPIO寄存器: 对应通用输入输出寄存器,用于控制引脚的输入输出状态
-
中断系统: 与NVIC中断控制器配合,实现GPIO中断功能
-
时钟控制: GPIO模块需要相应的时钟使能才能正常工作
8. 最佳实践建议
-
初始化顺序: 先配置PCTRL(引脚复用),再配置GPIO(方向和初值)
-
中断处理: 及时清除中断标志,避免中断重复触发
-
功耗优化: 未使用的引脚应配置为适当的状态以降低功耗
-
EMC考虑: 合理配置驱动强度和转换速率,平衡性能和EMC
-
调试支持: 利用数字滤波器功能消除信号毛刺
9. 总结
YTM32B1M的GPIO驱动提供了完整的引脚控制功能,支持灵活的配置选项和丰富的功能特性。通过合理使用这些API接口,可以实现各种数字输入输出应用,是嵌入式系统开发的基础模块。
本文档基于YTM32B1M SDK v1.0,如有更新请参考最新版本文档。