GPIO与IOMUX:实现多重功能的高效技术
GPIO与IOMUX
1 GPIO
1.1 何为GPIO?
GPIO只是一个CPU内提供的一种功能外设,CPU外部的I/O引脚会被赋予一种功能(GPIO、UART、I2C等);该功能由CPU内外设提供,具体是什么功能由IOMUX单元(I/O复用选择器)控制。
GPIO(General Purpose Input/Output)是芯片内的外设功能模块 ,每个GPIO外设连接到了外部的I/O引脚上,和GPIO外设相连的I/O引脚(I/O引脚相较于GPIO更加远离CPU) 起着通用输入输出的功能,所以被称为 GPIO 引脚。
但是,I/O引脚不仅和GPIO外设相连,还可以和芯片内部其它外设相连,比如和UART、IIC、SPI等外设相连作为通信外设的接口引脚,和定时器相连作为PWM输出引脚,等等。
1.2 GPIO常用寄存器
GPIO特性:
通用输入/输出逻辑功能:
• 使用数据寄存器进行特定数据输出(GPIO_DR)
• 控制信号方向(GPIO_GDIR)
• 使能核心通过读取pad寄存器对应的采样输入通讯信号(GPIO_PSR).
GPIO interrupt capabilities:
• 支持32种中断
• 定义中断沿
1.2.1 GPIO direction register (GPIOx_GDIR)
A GPIO signal can operate as a general-purpose input/output when the IOMUX is set to GPIO mode.
GPIO direction register (GPIO_GDIR)来确定是GPIO是输入还是输出。当为输入模式bit=0,对应输入情况由GPIO_PSR位读取确定。
1.2.2 GPIO data register (GPIOx_DR)
32位寄存器储存数据,时刻准备加载到output line中。
GPIO模式由IOMUX确定,由GPIO_GDIR确定输入还是输出;DR寄存器数据加载入output中。
• If GDIR[n] is set and IOMUXC input mode is GPIO, then reading DR[n] returns the contents of DR[n].
• If GDIR[n] is cleared and IOMUXC input mode is GPIO, then reading DR[n] returns the corresponding input signal’s value.
• If GDIR[n] is set and IOMUXC input mode is not GPIO, then reading DR[n] returns the contents of DR[n].
• If GDIR[n] is cleared and IOMUXC input mode is not GPIO, then reading DR[n] always returns zero.
1.2.3 GPIO pad status register (GPIOx_PSR)
GPIO_PSR is a read-only register. Each bit stores the value of the corresponding input signal (as configured in the IOMUX). This register is clocked with the ipg_clk_s clock, meaning that the input signal is sampled only when accessing this location. Two wait states are required any time this register is accessed for synchronization.
1.3 GPIO时钟
- 先查阅手册,找到GPIO的时钟隶属于哪一组;
- 去到Clock章节寻找对应的clock name:IPG_CLK_S
- 去查对应的寄存器,以CCM_CCGR0为例:
1.4 GPIO逻辑结构
- PADx:它代表了芯片上的一个内部引脚。
- IOMUX复用选择器:芯片的每个PAD通过IOMUXC中的MUX寄存器和PAD寄存器设置,可以支持多种功能(如GPIO、IIC、USART…)。每一个PAD的功能都需要有IOMUXC决定;被设置完功能的PAD就体现为外部IO引脚。
- Block外设功能控制块:例如具有PWM输出功能的引脚,它需要PWM外设的支持。
- GPIO外设:GPIO模块是每个PAD都具有的外设,但不一定每一个PAD都会使用。当需要赋予PAD引脚GPIO功能时,就要在通过IOMUX沛公功能后,再配置GPIO外设中的各个寄存器(DR、GDIR、PSR…)。
- 与其它引脚的连接:这里是另一个引脚PAD2,它与PAD1有一根信号线连接,表示部分引脚的输出可以作为另一个引脚的输入。
- 外部IO = 内部PAD + 外设。
2 IOMUX
2.1 何为IOMUX
它是CPU内部的控制器,负责给PAD赋予不同功能,使得PAD在外部展现出不同的功能;而PAD的外部就是IO引脚;因此实现IO复用。
2.2 IOMUX逻辑图
2.2.1 IOMUX和PAD
- 一个PAD可以去链接多个模块(module),从而实现PAD输入输出信号的复用功能;这里说明一个PAD可能有几种ALT。
- 当需要链接一个模块并实现功能时,首先需要给PAD赋予功能(SW_MUX_CTL_PAD_x);在赋予功能后(如GPIO后)启动那些功能属性(SW_PAD_CTL_PAD_x)。
- 每一个PIN是PAD在IOMUXC确定后,通过IOMUX Cell链接对应module之后对外展现的引脚。
- 每一个PAD都有很多个外设模块可以链接,每一种外设模块对应PAD的一种ALT。
2.2.2 PAD和Module
- 每一个PAD都有一个IOMUIX Cell对应用于控制它;但是并不是每一个PAD会配有自己独立的模块;模块是共用的。
- PAD的复用是通过IOMUX Cell去分配这个PAD接受/输出数据是经过哪一个模块;
- PAD复用后(ALT选择后),与模块实例下的某一个端口相连;
3 IOMUX设置PAD为GPIO实例
3.1 寻找实例和对应的PAD
位于手册 Muxing Options:
从左到右分别为:实例(功能)、实例端口、PAD、PAD应该被设置为ALTx。
外部信号按模块实例分组的,每个信号的复用选项以及用于将信号路由到所选 PAD 的寄存器。
- 当你需要PIN(外部引脚)实现一个功能时,这个功能是由模块(CPU内外设)实现的;而PAD负责传输数据;实际信号流动顺序:外部信号(IO引脚)—module—PAD。
- 实际使用中根据需要的功能去找实例和实例端口,再由端口去找可以链接这个模块端口的PAD;并完成对PAD的设置。
以实例GPIO1组下端口IO1为例:Pad为GPIO1_IO01,模式为ALT5。
3.1.1 设置SW_MUX_CTL_PAD_GPIO1_IO00
所有的Pad设置均是如此,先设置SW_MUX_CTL_PAD_xxx。
查手册,因此寄存器通过位运算设置低四位为:0101
3.1.2 设置SW_PAD_CTL_PAD_GPIO1_IO00
设置这个Pad的属性,比如驱动能力、是否使用上下拉电阻等。
3.1.3 设置实例GPIO1全组属性
注意:对于单个引脚(IO和Pad)需要设置它的功能(属于哪个module)和引脚属性,但是设置只是针对当前引脚的功能和属性;每一个引脚隶属于一个Instance(本质上是module外设),需要设置整个module(实例组)的属性。
GPIO实例需要设定的属性:
GPIOx_GDIR:每一个bit位的0/1表示一个GPIO实例的属性。