写在前面:
本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。
GPIO的时钟来源是来自 IPG clock,如下图:
当 IOMUX设置为 GPIO模式时,GPIO信号可以用作通用输入 / 输出。 使用 GPIO方向寄存器(GPIO_GDIR),可以将每个 GPIO信号独立配置为输入或输出。
DSE 驱动能力
DSE 可以调整芯片内部与引脚串联电阻 R0 的大小, 从而改变引脚的驱动能力。例如, R0 的初始值为 260 欧姆,在 3.3V 电压下其电流驱动能力为 12.69mA,通过 DSE 可以把 R0 的值配置为原值的 1/2、 1/3…1/7 等。
SRE 压摆率配置
压摆率是指电压转换速率,可理解为电压由波谷升到波峰的时间。增大压摆率可减少输出电压的上升时间。 RT1052 的引脚通过 SRE 支持低速和高速压摆率这两种配置。 压摆率是大信号特性,下面的带宽是小信号特性。
SPEED 带宽配置
通过 SPEED 可以设置 IO 的带宽,分别可设置为 50MHz、 100MHz 以及 200MHz。
带宽的意思是能通过这个 IO 口最高的信号频率,通俗点讲就是方波不失真,如果超过这个频率方波就变正弦波。但是这个带宽要区别于 IO 的翻转速率, IO 的翻转速率的信号来自于 GPIO 这个外设,而 IO 的带宽只是限制了 IO 口引脚的物理特性, IO 口的信号可以来自于内部定时器输出的 PWM 信号,也可以来自于GPIO 翻转输出的信号,两者相比之下, PWM 信号的频率是远远高于 GPIO 翻转输出的信号频率。
ODE 开漏输出配置
通过 ODE 可以设置引脚是否工作在开漏输出模式。在该模式时引脚可以输出高阻态和低电平,输出高阻态时可由外部上拉电阻拉至高电平。开漏输出模式常用在一些通讯总线中,如 I2C。
PUS 上下拉配置
PUS 可配置项可选为 100K 欧下拉以及 22K 欧、 47K 欧及 100K 欧上拉。
PUE 上下拉、保持器选择
上下拉功能和保持器功能是二选一的,可以通过 PUE 来选择。
PKE 上下拉、保持器配置
上下拉功能和保持器还通过 PKE 来控制是否使能。
引脚的控制逻辑中还包含了上下拉(Pull up/down)和保持器(Keeper)的功能;当启用 Keeper时,将禁用上拉和下拉功能,PAD 的输出值取决于 Keeper。 输出保持器由 OVDD 供电。 当核心 VDD 掉电或第一个反相器处于三态时,PAD 的状态可以保持。
注意:不能同时启用 Keeper 和 Pull。
开漏是一种电路技术,它允许多个设备通过一条电线进行双向通信。 开漏驱动器通常与外部或内部上拉电阻一起工作,该电阻将信号线保持在高电平,直到设备吸收足够的电流以将线拉低为止,通常用于具有多个设备的总线。
GPIO功能通过八个寄存器,一个边沿检测电路和中断生成逻辑提供。
这八个寄存器是:
RT1052 的芯片每个 GPIO 都通过 IOMUX 支持多种功能。
IOMUX 由 IOMUX Controller(IOMUXC)控制, IOMUXC 与 IOMUX 一起使 IC 可以将一个 PAD共享给多个功能块。 这种共享是通过多路复用 PAD的输入和输出信号来完成的。
系统中的 IOMUX / IOMUXC 连接图:
IOMUXC 提供了:
从上面可知,IOMUXC 可分成 MUX Control(IO 模式控制)以及 PAD Settings(PAD 配置)两个部分供用户配置(以 GPIO_AD_B0_09 为例):
MUX Control 配置
MUX Mode 就是用来配置引脚的复用功能,按上面的例子,看下图,即是具体是用于网络外设 ENET 的数据接收(ENET_RX_DATA02),还是用于 PWM 外设的输出引脚(FLEXPWM2_PWM3_A),当然,也可以配置成普通的 IO 口(GPIO1_IO09),仅用于控制输出高低电平。
Pad Settings 配置
Pad Settings 用于配置引脚的属性,例如驱动能力,是否使用上下拉电阻,是否使用保持器,是否使用开漏模式以及使用施密特模式还是 CMOS 模式等。例子可以看下图:
(依然以 GPIO_AD_B0_09 为例)
在代码中,MUX Control 配置是用函数库里面的 IOMUXC_SetPinMux();函数配置的,它的参数配置以及原型:
IOMUXC_SetPinMux(
IOMUXC_GPIO_AD_B0_09_GPIO1_IO09, /* GPIO_AD_B0_09 is configured as GPIO1_IO09 */
0U); /* Software Input On Field: Input Path is determined by functionality */
其中,宏 IOMUXC_GPIO_AD_B0_09_GPIO1_IO09为:
#define IOMUXC_GPIO_AD_B0_09_GPIO1_IO09 0x401F80E0U, 0x5U, 0, 0, 0x401F82D0U
它所执行的结果是:
#define IOMUXC_SW_MUX_CTL_PAD_MUX_MODE_MASK (0x7U)
#define IOMUXC_SW_MUX_CTL_PAD_MUX_MODE_SHIFT (0U)
#define IOMUXC_SW_MUX_CTL_PAD_MUX_MODE(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SW_MUX_CTL_PAD_MUX_MODE_SHIFT)) & IOMUXC_SW_MUX_CTL_PAD_MUX_MODE_MASK)
#define IOMUXC_SW_MUX_CTL_PAD_SION_MASK (0x10U)
#define IOMUXC_SW_MUX_CTL_PAD_SION_SHIFT (4U)
#define IOMUXC_SW_MUX_CTL_PAD_SION(x) (((uint32_t)(((uint32_t)(x)) << IOMUXC_SW_MUX_CTL_PAD_SION_SHIFT)) & IOMUXC_SW_MUX_CTL_PAD_SION_MASK)
/*!
* @brief Sets the IOMUXC pin mux mode.
* @note The first five parameters can be filled with the pin function ID macros.
*
* @param muxRegister The pin mux register.
* @param muxMode The pin mux mode.
* @param inputRegister The select input register.
* @param inputDaisy The input daisy.
* @param configRegister The config register.
* @param inputOnfield Software input on field.
*/
static inline void IOMUXC_SetPinMux(uint32_t muxRegister,
uint32_t muxMode,
uint32_t inputRegister,
uint32_t inputDaisy,
uint32_t configRegister,
uint32_t inputOnfield)
{
*((volatile uint32_t *)muxRegister) =
IOMUXC_SW_MUX_CTL_PAD_MUX_MODE(muxMode) | IOMUXC_SW_MUX_CTL_PAD_SION(inputOnfield);
if (inputRegister)
{
*((volatile uint32_t *)inputRegister) = inputDaisy;
}
}
可以看到,IOMUXC_SetPinMux();函数,执行的是配置了 0x401F80E0U地址的第 0 ~ 2位为 0x5U,第 4位为 0;而 0x401F80E0U所指向的地址就是上面在描述 MUX Control 配置所给出的图。
而在 Pad Settings 配置中,则用 IOMUXC_SetPinConfig();库函数来选择配置的;它的参数配置以及原型:
IOMUXC_SetPinConfig(
IOMUXC_GPIO_AD_B0_09_GPIO1_IO09, /* GPIO_AD_B0_09 PAD functional properties : */
0x10B0U); /* Slew Rate Field: Slow Slew Rate
Drive Strength Field: R0/6
Speed Field: medium(100MHz)
Open Drain Enable Field: Open Drain Disabled
Pull / Keep Enable Field: Pull/Keeper Enabled
Pull / Keep Select Field: Keeper
Pull Up / Down Config. Field: 100K Ohm Pull Down
Hyst. Enable Field: Hysteresis Disabled */
这里的 0x10B0U 就是设置为 转化速率慢,驱动强度为 R0/6,速度 100MHz,关闭开漏,开启拉 /保持器,选择为保持,100K下拉,关闭滞回。这样看你可能会懵逼,如果让你每个 IO都这样填,那就头都大咯;所幸的是,这是用官方的 MCUXpresso Config Tools配置软件配置的;又或者可以像以下那样进行手动配置:
// 转换速率 0 慢 1 快
// 驱动强度 0 无 1 R0 2 R0/2 3 R0/3 4 R0/4 5 R0/5 6 R0/6 7 R0/7
// 输出速度 0 50MHz 1 100MHz 2 100MHz 3 200MHz
// 开漏输出 0 关闭 1 开启
// 拉/保持器 0 关闭 1 开启
// 拉/保持器设置 0 保持 1 拉
// 上下拉电阻 0 100K下拉 1 47K上拉 2 100K上拉 3 22K上拉
// 滞回器设置 0 关闭 1 开启
IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_09_GPIO1_IO09,
IOMUXC_SW_PAD_CTL_PAD_SRE(0) // 转换速率慢
|IOMUXC_SW_PAD_CTL_PAD_DSE(6) // 驱动强度 R0/6
|IOMUXC_SW_PAD_CTL_PAD_SPEED(2) // 速度 100MHz
|IOMUXC_SW_PAD_CTL_PAD_ODE(0) // 关闭开漏
|IOMUXC_SW_PAD_CTL_PAD_PKE(1) // 拉/保持器开启
|IOMUXC_SW_PAD_CTL_PAD_PUE(0) // 选择为保持
|IOMUXC_SW_PAD_CTL_PAD_PUS(0) // 100K下拉
|IOMUXC_SW_PAD_CTL_PAD_HYS(0)); // 关闭滞回
对应的配置位字段可以看上面的 Pad Settings 配置中的图。因为它的函数原型如下:
/*!
* @brief Sets the IOMUXC pin configuration.
* @note The previous five parameters can be filled with the pin function ID macros.
*
* @param muxRegister The pin mux register.
* @param muxMode The pin mux mode.
* @param inputRegister The select input register.
* @param inputDaisy The input daisy.
* @param configRegister The config register.
* @param configValue The pin config value.
*/
static inline void IOMUXC_SetPinConfig(uint32_t muxRegister,
uint32_t muxMode,
uint32_t inputRegister,
uint32_t inputDaisy,
uint32_t configRegister,
uint32_t configValue)
{
if (configRegister)
{
*((volatile uint32_t *)configRegister) = configValue;
}
}
而传入的 0x401F82D0U数据,对应的地址就是所说的图中的地址。