文章目录
- GPIO资源
- GPIO资料
- GPIO复用器IOMUX
- GPIO的控制块
- GPIO配置
- 宏定义的使用
- GPIO函数使用
- GPIO_PinRead 函数
- GPIO_WritePinOutput函数
GPIO资源
- 图中 P2、P3 和 P6 为 MCU 主 IO 引出口,这三组排针共引出了 97 个 IO 口,另外,通过:P4(P112&P113)和 P8(P300&P301)等 2 组排针引出 4 个 IO 口
- P112 ,P113 之类的,是指:GPIO1_IO12 ,GPIO1_IO13 ,是 GPIO 的简化
叫法
- P112 ,P113 之类的,是指:GPIO1_IO12 ,GPIO1_IO13 ,是 GPIO 的简化
- 底板上总共引出了 101个 IO。RT1052 总共有 127 个 IO,剩下的 26 个 IO,主要用在了 SDRAM、FlexSPI 等外设上面。
RT1052 的 IO 口总共分成 5 组:GPIO1~GPIO5
- 其中:GPIO1、GPIO2 和 GPIO4 每组 32个 IO,GPIO3 只有 28 个 IO,GPIO5 最少,只有 3 个 IO,这样总共是 127 个 IO 口
GPIO资料
RT1052IO 有关知识的学习需要参考 RT1052 参考手册中的两章内容:《Chapter 34: IOMUXController(IOMUXC)》和《Chapter 32: General Purpose Controller(GPIO)》。
- 第 34 章讲解怎么将一个指定的 IO 设置为你想要的功能
- 第 32 章讲的是如果你要将一个 IO 用作 GPIO 的话该如何配置和使用。
GPIO复用器IOMUX
GPIO_AD_B0_03 是 LED0 使用的 IO的名字,这个 IO 有很多的功能,具体选择什么样的功能通过 IO 复用功能选择器(IOMUXC)来设置,这个就是前面说的第 34 章的内容
GPIO的控制块
RT1052 的 IO 口可以有很多个 Block(控制块),每个 Block 其实就是一个复用功能,GPIO功能也属于这些 Block 里面的一个。
- IO 口通过一个叫 IOMUXC 的 IO 复用选择器来选择具体的功能(具体连接到那个 Block 上面),看一下 RT1052 的 IO 复用功能框图
图中①处,是一个 PAD(标记为 PAD1),也就是 RT1052 的一个 IO 引脚,每个 PAD 有 5路信号:
-
input_on,是输入开关信号,用于控制是否开启强制输入功能(用 SW_MUX_CTL_PAD 寄存器的 SION 位设置)。如果开启强制输入,则不管 IO 口选择哪个复用模式(ALT0~7),总是可以通过 GPIO_PSR 读取这个 IO 口的状态。
-
Dir,是方向控制信号,控制 IO 的输入/输出方向。
-
Data_out,是数据输出信号,用于控制 IO 口输出高/低电平。
-
Data_in,是数据输入信号,用于读取 IO 口的高/低电平。
注意:Dir、Data_out 和 Data_in 是由 IOMUXC 控制连接到具体哪个 Block 上面的,不一定是由 GIPO Block 控制,比如也可以由 SEMC Block 控制。
最后,下方的控制信号,来自 SW_PAD_CTL_PAD 寄存器(IO 引脚控制寄存器),它控制了这个 PAD 的具体属性(上拉/下拉/保持/速率/驱动能力等,在下一个知识点介绍)。
GPIO配置
gpio_pin_config_t key_config;
//SNVS_WAKEUP 配置为 ALT5,即 GPIO5_00
IOMUXC_SetPinMux(IOMUXC_SNVS_WAKEUP_GPIO5_IO00,0);
//配置 KEY 相关 IO 的功能
//低转换速度,关闭输出驱动,速度为 100Mhz,关闭开路功能,使能 pull/keepr
//选择 pull 功能,上拉 22K Ohm,关闭 Hyst
IOMUXC_SetPinConfig(IOMUXC_SNVS_WAKEUP_GPIO5_IO00,0xF080);
//KEY_UP 默认电平设置
key_config.direction=kGPIO_DigitalInput; //输入
key_config.interruptMode=kGPIO_NoIntmode; //不使用中断功能
key_config.outputLogic=1; //默认高电平
GPIO_PinInit(GPIO5,0,&key_config); //初始化 GPIO5_00
注意:当 IO 口初始化成 GPIO(ALT5 ),且 GPIO 设置成输入模式(GPIO_MODE_IN )时,输出缓冲器 失 能,相关配置(SPEED 、DSE 、SRE 、ODE 等)全部失效
宏定义的使用
这 4 个宏定义中的KEY0的值会跟随函数的变化而变化。
#define KEY0 GPIO_PinRead(GPIO1,5) //KEY0 按键 GPIO1_05
#define KEY1 GPIO_PinRead(GPIO5,1) //KEY1 按键 GPIO5_01
#define KEY2 GPIO_PinRead(GPIO3,26) //KEY2 按键 GPIO3_26
#define WK_UP GPIO_PinRead(GPIO5,0) //WK_UP 按键 GPIO5_00
一种485引脚定义的使用方法。
#define 485_DIR PCout(8);
485_DIR = 1;
这是跟上述用法相反的一种用法。
GPIO函数使用
GPIO_PinRead 函数
Reads the current input value of the GPIO port.
GPIO_PinRead(GPIO_Type * base, uint32_t pin)
GPIO_PinRead(GPIO1,5)
GPIO_WritePinOutput函数
Sets the output level of the individual GPIO pin to logic 1 or 0。
设置输出电平
GPIO_WritePinOutput(GPIO_Type * base, uint32_t pin, uint8_t output)