EM9280的GPIO特色及应用

 2012-7-4              

        EM9280是英创公司即将推出的新型工控主板产品。与英创公司的其他主板产品一样,EM9280带有32位通用数字IO(以下简称GPIO)。EM9280的各位GPIO的接口电平均为3.3V TTL电平,上电后均处于输入状态;各位GPIO的方向均可独立可设置,以方便使用。EM9280提供有标准的设备驱动程序API,应用程序可直接通过这些API函数来操作这些GPIO,EM9280的资料光盘上提供有GPIO操作的C/C++和C#的范例程序。对GPIO的操作的基本方法是打开GPIO的设备驱动文件“PIO1:”,然后通过调用DeviceIoContrtol来对GPIO进行设置或读取GPIO管脚的输入状态。其具体的操作定义在bsp_drivers.h中:

 

        #define GPIO_IOCTL_OUT_ENABLE  // 激活指定GPIO的输出功能 
        #define GPIO_IOCTL_OUT_DISABLE  // 禁止指定GPIO的输出功能
        #define GPIO_IOCTL_OUT_SET  // GPIO输出高电平
        #define GPIO_IOCTL_OUT_CLEAR  // GPIO输出低电平
        #define GPIO_IOCTL_PIN_STATE  // 读取指定GPIO的输入状态

 

        尽管EM9280的GPIO可以按统一的API函数来操作,但由于各位GPIO的实现机制的不同,其相应速度是有所区别的。EM9280的GPIO按相应速度分成低速和高速两类。具体分类如下表所示:

 


GPIO管脚

类型

简要说明

 GPIO0 - GPIO1 高速GPIO API函数执行时间大约10us
 GPIO2 - GPIO5 低速GPIO API函数执行时间大约100us
 GPIO6 - GPIO7 高速GPIO API函数执行时间大约10us
 GPIO8 - GPIO9 低速GPIO API函数执行时间大约100us
 GPIO10 - GPIO11 高速GPIO API函数执行时间大约10us
 GPIO12 - GPIO19 低速GPIO API函数执行时间大约100us
 GPIO20 - GPIO31 高速GPIO API函数执行时间大约10us


 

        由于存在比较大的执行时间的差异,因此在执行读取GPIO状态操作时,也要求指定需要具体读取的是哪几位GPIO。指定的方法是把需要读取的GPIO对应位置1,不需要读取的则为0,例如:

 

        UINT32 u32StateBits = GPIO0; // 指定需要读取的GPIO,这里为GPIO0
        UINT32 u32StateRead;

        if (!DeviceIoControl(hGpio, // file handle to the driver
                GPIO_IOCTL_PIN_STATE, // I/O control code
                &u32StateBits, // in buffer
                sizeof(UINT32), // in buffer size
                &u32StateRead, // out buffer
                sizeof(UINT32), // out buffer size 
                NULL, // pointer to number of bytes returned
                NULL)) // ignored (=NULL)
        {
                // 出错处理……
        }

        // u32StateRead包含读取的GPIO状态

 

        在大多数具体应用中,每次往往只需要读取一位GPIO的状态,因此只指定所需的GPIO即可,以保证API函数执行时间最快。对其他的GPIO设置操作,只需要设置需操作的GPIO位信息,没有返回参数。

 

        为了提高管脚的利用率,EM9280的高速GPIO部分还复用了其他的接口功能,具体复用的情况如下表所示:

 


管脚

复用功能

简要说明

 GPIO0 CTS2# 与COM2口的CTS#复用管脚
 GPIO1 RTS2# 与COM2口的RTS#复用管脚
 GPIO2  低速GPIO
 GPIO3  低速GPIO
 GPIO4  低速GPIO
 GPIO5  低速GPIO
 GPIO6 PWM1 与PWM1复用管脚
 GPIO7 PWM2 与PWM2复用管脚
 GPIO8  低速GPIO
 GPIO9  低速GPIO
 GPIO10 RXD6 与COM6口的RXD复用管脚
 GPIO11 TXD6 与COM6口的TXD复用管脚
 GPIO12  低速GPIO
 GPIO13  低速GPIO
 GPIO14  低速GPIO
 GPIO15  低速GPIO
 GPIO16  低速GPIO
 GPIO17  低速GPIO
 GPIO18  低速GPIO
 GPIO19  低速GPIO
 GPIO20 PWM3 与PWM3复用管脚
 GPIO21 PWM4 与PWM4复用管脚
 GPIO22 I2C_SDA 与I2C总线的SDA复用管脚
 GPIO23 I2C_SCL 与I2C总线的SCL复用管脚
 GPIO24 IRQ1 与IRQ1复用管脚
 GPIO25 IRQ2 与IRQ2复用管脚
 GPIO26 IRQ3 与IRQ3复用管脚
 GPIO27 IRQ4 与IRQ4复用管脚
 GPIO28 SPI_MISO 与SPI接口的数据串入MISO复用管脚
 GPIO29 SPI_MOSI 与SPI接口的数据串出MOSI复用管脚
 GPIO30 SPI_SCLK 与SPI接口的同步时钟SCLK复用管脚
 GPIO31 SPI_CS0N 与SPI接口的片选控制CS0N复用管脚


 

        从上表可见,对最常用的异步串口(UART)的功能,与GPIO复用的不多,这样可最大限度的保证EM9280的串口及GPIO的可用性。对COM2如果不需要硬件流控功能,GPIO0 – GPIO1都仍然可以作为标准GPIO使用,而不会影响COM2的正常使用。