1、IOMUXC_SetPinMux 函数 – 设置 IO 的复用功能
此函数是用来设置 IO 的复用选择器的,用来选择 IO 的功能的,比如本实验的
GPIO_AD_B0_03 要设置为 GPIO1_IO03,本函数原型如下:
static inline void IOMUXC_SetPinMux ( uint32_t muxRegister,
uint32_t muxMode,
uint32_t inputRegister,
uint32_t inputDaisy,
uint32_t configRegister,
uint32_t inputOnfield);
可以看到此函数的参数蛮多的,一共 6 个参数,这 6 个参数的含义如下:
muxRegister:要设置的 IO 的 MUX 寄存器地址,比如 GPIO_AD_B0_03 指的就是寄存器
IOMUXC_SW_MUX_CTL_PAD_AD_B0_03 的地址,这个寄存器的地址在 RT1052 的参考手册
上有写为:0X401F80C8。
muxMode:选择复用的模式,本实验设置 GPIO_AD_B0_03 这个 IO 为 GPIO1_IO03,也就
是 ALT5,所以此处就是 0X5。
inputRegister:选择的输入寄存器,本实验没有,因此为 0。
inputDaisy:DAISY 位,前面讲过,此处只是用作普通 GPIO,因此为 0。
configRegister:配置寄存器,对于GPIO_AD_B0_03来说就是IOMUX_SW_PAD_CTL_PAD_GPIO_AD_B0_03 这个寄存器,寄存器地址为 0X401F82B8。
inputOnfield:设置是否为强制输入,此处不需要,因此为 0。
经过上面分析,我们如果要将 GPIO_AD_B0_03 设置为 GPIO1_IO03 的话此函数调用如下:
IOMUXC_SetPinMux ( 0x401F80C8, 0x5, 0, 0, 0x401F82B8,0 );
是不是感觉很复杂?还要自己去找寄存器地址?不需要的!这些工作 FSL 库已经给我们设
置好了,GPIO_AD_B0_03 这个 IO 有八个功能,这八个功能在 FSL 库中已经列出来了
在fsl_iomuxc.h 中有如下图 6.3.3.2 所示宏定义:
![[Pasted image 20240731163820.png]]
图 6.3.3.2 GPIO_AD_B0_0 引脚功能定义
可以看到在图 6.3.3.2 中就有个宏定义: IOMUXC_GPIO_AD_B0_03_GPIO1_IO03,这个宏
定 义 有 五 个 数 字 , 这 五 个 数 字 就 是 函 数 IOMUXC_SetPinMux 的 前 五 个 参 数 。 设 置
GPIO_AD_B0_03 为 GPIO1_IO03 的代码就可以改为如下形式:
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_03_GPIO1_IO03,0);
如果你要将 GPIO_AD_B0_03 用作其他的功能,比如串口 6 的接收(RX)引脚的话就可以使
用宏 IOMUXC_GPIO_AD_B0_03_LPUART6_RX,代码如下:
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_03_LPUART6_RX,0);
2、IOMUXC_SetPinConfig 函数
此函数用来配置 IO 的驱动能力、速度、驱动能力等这些的,对于 GPIO_AD_B0_03 来说就
是设置寄存器 IOMUX_SW_PAD_CTL_PAD_GPIO_AD_B0_03 的值,此函数原型如下:
static inline void IOMUXC_SetPinConfig ( uint32_t muxRegister,
uint32_t muxMode,
uint32_t inputRegister,
uint32_t inputDaisy,
uint32_t configRegister,
uint32_t configValue)
此函数也有 6 个参数,但是前五个参数和函数 IOMUXC_SetPinMux 是一样的,因此此函
数也可以时候用图 6.3.3.2 中的宏,

唯独最后一个参数 configValue 不一样,最后一个参数就是
写入到寄存器 IOMUX_SW_PAD_CTL_PAD_GPIO_AD_B0_03 中的值(对于 GPIO_AD_B0_03 来
说,其他 IO 参考相应的寄存器)。这个值就需要我们对照着指定 IO 的相应寄存器来写了,没有
捷径可循。
3、GPIO_PinInit 函数
此函数用来设置指定 GPIO 引脚的功能的,比如 GPIO_AD_B0_03 设置为 GPIO_IO03 以后
就需要初始化 GPIO1_IO03 了:输入还是输出?用不用中断?默认电平是什么?此函数原型如下:
void GPIO_PinInit( GPIO_Type *base, uint32_t pin, const gpio_pin_config_t *Config );
base:要设置的 GPIO 组,GPIO1_IO03 就是 GPIO1 组的。
pin:组内编号,比如 GPIO1_IO03 就是 GPIO1 组中的 3 号 IO。
Config:配置参数,使用结构体来设置指定 GPIO 的配置参数,此结构体如下:
{ typedef struct _gpio_pin_config
gpio_pin_direction_t direction;
//方向,输入还是输出?
uint8_t outputLogic;
//默认输出电平
gpio_interrupt_mode_t interruptMode;
//中断模式
} gpio_pin_config_t;
其中 direction 可以设置为 kGPIO_DigitalInput 或者 kGPIO_DigitalOutput,分别对应输入和
输出,outputLogic 可以设置为 0 或者 1,分别对应低电平和高电平。interruptMode 有 6 中设置
选项,后面讲解中断的时候再说,本章实验设置为 kGPIO_NoIntmode,即不使用中断功能。
4、GPIO_PinWrite 函数
设置指定的 GPIO 的输出电平,函数原型如下:
void GPIO_PinWrite(GPIO_Type *base, uint32_t pin, uint8_t output);
base:要设置的 GPIO 组,GPIO1_IO03 就是 GPIO1 组的。
pin:组内编号,比如 GPIO1_IO03 就是 GPIO1 组中的 3 号 IO。
output:输出电平,1 为高电平,0 为低电平。
5、GPIO_PinRead 函数
此函数用于读取一个指定 IO 的电平,函数原型如下:
static inline uint32_t GPIO_PinRead(GPIO_Type *base, uint32_t pin)
base:要设置的 GPIO 组,GPIO1_IO03 就是 GPIO1 组的。
pin:组内编号,比如 GPIO1_IO03 就是 GPIO1 组中的 3 号 IO。
返回值:读到的指定 IO 的电平值,1 为高电平,0 为低电平
实际可由xpresso config tools产生管脚配置文件 pinmux.c/.h
1238

被折叠的 条评论
为什么被折叠?



