1. GPIO简介
MT6577提供232个通用输入/输出引脚(GPIO,GPIO0~GPIO231),通过设置它们的控制寄存器,MCU软件可以控制它们的方向(输入/输出)、输出值(低/高)和读取这些引脚的值(输入)。为了减少GPIO引脚的数量,MT6577的GPIO采用多路复用的设计机制,这点和freescale的IMX系列类似。
2. GPIO特性(features)
图1
常用的寄存器如下:
(1) GPIO_MODE寄存器组
包括有GPIO_MODE0~46、GPIO_MODE_SET0~46和GPIO_MODE_RESET0~46这些寄存器,最常用的是GPIO_MODE0~46,每个GPIO通过编程GPIO_MODE_SELx(x=0~46)命令寄存器来控制辅助模式(auxiliary mode),其实此寄存器就是用于配置GPIO模式的,比如下面我们以PWM1引脚来说明此寄存器的意义:
图2
就是说PWM1引脚(232个GPIO引脚之一),在内部可以通过软件编程来选择接通GPIO67、PWM1、EINT9、IRDA_PDN、MD_TXD2、USB_DRVVBUS、DBG_OUT1[16]之一,比如如果要让PWM1引脚作为GPIO67功能,我们来看GPIO_MODE_SEL13的设置:
图3
结合图2和图3,只需要设置GPIO_MODE_SEL13[8:6]=0就选通了GPIO67。
(2) GPIODIR寄存器组
包括有GPIODIR0~14、GPIODIR_SET0~14和GPIODIR_RESET0~14这些寄存器,最常用的是GPIODIR0~14,每个寄存器配置一个GPIO为输入(0)/输出(1),如下图:
图4
(3) PULLEN寄存器组
包括有PULLEN0~14、PULLEN_SET0~14、PULLEN_RESET0~14和PULLSEL0~14,最常用的是PULLEN0~14和PULLSEL0~14,分别用于disable(0)/enable(1)引脚上拉下拉功能,选择上拉还是下拉功能
图5
(4) GPIO_INV寄存器组
包括有GPI_INV0~14、GPI_INV_SET0~14和GPI_INV_RESET0~14,最常用的是GPI_INV0~14,用于控制是否反转(invert)GPIO的值,如下图:
图6
(5) GPO寄存器组
包括有GPO0~14、GPO_SET0~14和GPO_RESET0~14,最常用的是GPO0~14,用于控制GPIO引脚的输出电平,如下图:
图7
(6) GPI寄存器组
GPI0~14,通过此寄存器可以获取到连接到此IO口的输入状态,如下图:
图8
3. GPIO寄存器对应的一些枚举类型定义
- /*----------------------------------------------------------------------------*/
- #defineMAX_GPIO_PIN 232
- /******************************************************************************
- * Enumeration forGPIO pin
- ******************************************************************************/
- typedef enumGPIO_PIN
- {
- GPIO_UNSUPPORTED = -1,
- GPIO0 , GPIO1 , GPIO2 , GPIO3 , GPIO4 , GPIO5 , GPIO6 , GPIO7 ,
- GPIO8 , GPIO9 , GPIO10 , GPIO11 ,GPIO12 , GPIO13 , GPIO14 , GPIO15 ,
- GPIO16 , GPIO17 , GPIO18 , GPIO19 , GPIO20, GPIO21 , GPIO22 , GPIO23 ,
- GPIO24 , GPIO25 , GPIO26 , GPIO27 , GPIO28, GPIO29 , GPIO30 , GPIO31 ,
- GPIO32 , GPIO33 , GPIO34 , GPIO35 , GPIO36, GPIO37 , GPIO38 , GPIO39 ,
- GPIO40 , GPIO41 , GPIO42 , GPIO43 , GPIO44, GPIO45 , GPIO46 , GPIO47 ,
- GPIO48 , GPIO49 , GPIO50 , GPIO51 , GPIO52, GPIO53 , GPIO54 , GPIO55 ,
- GPIO56 , GPIO57 , GPIO58 , GPIO59 , GPIO60, GPIO61 , GPIO62 , GPIO63 ,
- GPIO64 , GPIO65 , GPIO66 , GPIO67 , GPIO68, GPIO69 , GPIO70 , GPIO71 ,
- GPIO72 , GPIO73 , GPIO74 , GPIO75 , GPIO76, GPIO77 , GPIO78 , GPIO79 ,
- GPIO80 , GPIO81 , GPIO82 , GPIO83 , GPIO84, GPIO85 , GPIO86 , GPIO87 ,
- GPIO88 , GPIO89 , GPIO90 , GPIO91 , GPIO92, GPIO93 , GPIO94 , GPIO95 ,
- GPIO96 , GPIO97 , GPIO98 , GPIO99 ,GPIO100, GPIO101, GPIO102, GPIO103,
- GPIO104, GPIO105, GPIO106, GPIO107,GPIO108, GPIO109, GPIO110, GPIO111,
- GPIO112, GPIO113, GPIO114, GPIO115,GPIO116, GPIO117, GPIO118, GPIO119,
- GPIO120, GPIO121, GPIO122, GPIO123,GPIO124, GPIO125, GPIO126, GPIO127,
- GPIO128, GPIO129, GPIO130, GPIO131,GPIO132, GPIO133, GPIO134, GPIO135,
- GPIO136, GPIO137, GPIO138, GPIO139,GPIO140, GPIO141, GPIO142, GPIO143,
- GPIO144, GPIO145, GPIO146, GPIO147,GPIO148, GPIO149, GPIO150, GPIO151,
- GPIO152, GPIO153, GPIO154, GPIO155,GPIO156, GPIO157, GPIO158, GPIO159,
- GPIO160, GPIO161, GPIO162, GPIO163,GPIO164, GPIO165, GPIO166, GPIO167,
- GPIO168, GPIO169, GPIO170, GPIO171,GPIO172, GPIO173, GPIO174, GPIO175,
- GPIO176, GPIO177, GPIO178, GPIO179,GPIO180, GPIO181, GPIO182, GPIO183,
- GPIO184, GPIO185, GPIO186, GPIO187,GPIO188, GPIO189, GPIO190, GPIO191,
- GPIO192, GPIO193, GPIO194, GPIO195, GPIO196,GPIO197, GPIO198, GPIO199,
- GPIO200, GPIO201, GPIO202, GPIO203,GPIO204, GPIO205, GPIO206, GPIO207,
- GPIO208, GPIO209, GPIO210, GPIO211,GPIO212, GPIO213, GPIO214, GPIO215,
- GPIO216, GPIO217, GPIO218, GPIO219,GPIO220, GPIO221, GPIO222, GPIO223,
- GPIO224, GPIO225, GPIO226, GPIO227,GPIO228, GPIO229, GPIO230, GPIO231,
- GPIO_MAX
- }GPIO_PIN;
- /******************************************************************************
- * Enumeration forClock output
- ******************************************************************************/
- /* GPIO MODECONTROL VALUE*/
- typedef enum {
- GPIO_MODE_GPIO = 0,
- GPIO_MODE_00 = 0,
- GPIO_MODE_01 = 1,
- GPIO_MODE_02 = 2,
- GPIO_MODE_03 = 3,
- GPIO_MODE_04 = 4,
- GPIO_MODE_05 = 5,
- GPIO_MODE_06 = 6,
- GPIO_MODE_07 = 7,
- GPIO_MODE_MAX,
- GPIO_MODE_DEFAULT = GPIO_MODE_01,
- } GPIO_MODE;
- /*----------------------------------------------------------------------------*/
- /* GPIO DIRECTION*/
- typedef enum {
- GPIO_DIR_IN = 0,
- GPIO_DIR_OUT = 1,
- GPIO_DIR_MAX,
- GPIO_DIR_DEFAULT = GPIO_DIR_IN,
- } GPIO_DIR;
- /*----------------------------------------------------------------------------*/
- /* GPIO PULLENABLE*/
- typedef enum {
- GPIO_PULL_DISABLE = 0,
- GPIO_PULL_ENABLE = 1,
- GPIO_PULL_EN_MAX,
- GPIO_PULL_EN_DEFAULT = GPIO_PULL_ENABLE,
- } GPIO_PULL_EN;
- /*----------------------------------------------------------------------------*/
- /* GPIOPULL-UP/PULL-DOWN*/
- typedef enum {
- GPIO_PULL_DOWN = 0,
- GPIO_PULL_UP = 1,
- GPIO_PULL_MAX,
- GPIO_PULL_DEFAULT = GPIO_PULL_DOWN
- } GPIO_PULL;
- /*----------------------------------------------------------------------------*/
- /* GPIO INVERSION*/
- typedef enum {
- GPIO_DATA_UNINV = 0,
- GPIO_DATA_INV = 1,
- GPIO_DATA_INV_MAX,
- GPIO_DATA_INV_DEFAULT = GPIO_DATA_UNINV
- } GPIO_INVERSION;
- /*----------------------------------------------------------------------------*/
- /* GPIO OUTPUT */
- typedef enum {
- GPIO_OUT_ZERO = 0,
- GPIO_OUT_ONE = 1,
- GPIO_OUT_MAX,
- GPIO_OUT_DEFAULT = GPIO_OUT_ZERO,
- GPIO_DATA_OUT_DEFAULT = GPIO_OUT_ZERO, /*compatible with DCT*/
- } GPIO_OUT;