各个操作模块使用操作指南:
GPIO 通用输入输出模块
GPIO模块用来输出高低电平,或者读取外部的高低电平信号
源代码浏览
• gpio.c
• gpio.h
入门
一个最简单的输出高低电平的例子,初始化一个GPIO引脚 并且输出高电平
/* 初始化一个引脚 设置为推挽输出 比如点亮一个小灯 */
GPIO_QuickInit(HW_GPIOE, 6, kGPIO_Mode_OPP);
GPIO_WriteBit(HW_GPIOE, 6, 1);
你可以用 GPIO_QuickInit来快速初始化一个GPIO,也可以用普通初始化,普通初始化一般以结构体的形式来填写参数,然后在XXX_Init()函数中传入结构体的地址以完成初始化。
但是无论快速初始化还是普通初始化,一次都只能初始化一个GPIO。
一个使用普通初始化的例子:
GPIO_InitTypeDef GPIO_InitStruct1;
GPIO_InitStruct1.instance = HW_GPIOE;
GPIO_InitStruct1.mode = kGPIO_Mode_OPP; /* 推挽输出 */
GPIO_InitStruct1.pinx = 6;
GPIO_Init(&GPIO_InitStruct1);
数据读写
让GPIO引脚输出/读入高低电平 以下几个函数可以控制GPIO来输出电平
void GPIO_WriteBit(uint32_t instance, uint8_t pinIndex, uint8_t data);
uint8_t GPIO_ReadBit(uint32_t instance, uint8_t pinIndex);
uint32_t GPIO_ReadPort(uint32_t instance);
void GPIO_WritePort(uint32_t instance, uint32_t data);
通常情况下 GPIO_WriteBit GPIO_ReadBit 比 WritePort ReadPort 更加常用,WriteBit ReadBit 是指写入或者读出一位数据(一个引脚), 而 WritePort ReadPort是写入/读出 这个端口的数据(32位)
下面是一个读取一个引脚电平的例子:
uint8_t pin_status;
GPIO_QuickInit(HW_GPIOE, 6, kGPIO_Mode_IPD);
pin_status= GPIO_ReadBit(HW_GPIOE, 6);
printf("status:%d\r\n, pin_status");
GPIO支持的输入输出方式
GPIO 支持如下几种模式: 他们在gpio.h中被定义成枚举量
typedef enum
{
kGPIO_Mode_IFT = 0x00,
kGPIO_Mode_IPD = 0x01,
kGPIO_Mode_IPU = 0x02,
kGPIO_Mode_OOD = 0x03,
kGPIO_Mode_OPP = 0x04,
}GPIO_Mode_Type;
几种工作模式解释如下
• IFT: 浮空输入 一般用于AD等模拟应用
• IPD: 下拉输入 芯片内部连接一200K左右的电阻至GND
• IPU: 上拉输入 芯片内部连接一200K左右的电阻至VCC
• OOD: 开漏输出 一般用于驱动外部设备
• OPP: 推挽输出 一般用于驱动外部设备
使用位带操作控制GPIO
GPIO内存域处于ARM-CM4的Bitband区域内,因此可以使用位带操作来控制GPIO.
一个使用位带操作来控制GPIO输出高电平的例子
GPIO_QuickInit(HW_GPIOE, 6, kGPIO_Mode_OPP);
PEout(6) = 1;
同时,也可以使用位带操作来读入某个引脚的电平:
GPIO_QuickInit(HW_GPIOE, 6, kGPIO_Mode_IPD);
status = PEin(6);
但是无论是使用函数还是位带操作,一定要在使用之前初始化
|