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的正常使用。
全部0条评论
快来发表一下你的评论吧 !