Blog:
适用于韬睿计算机模块(CoM)的 Gpio Library

2015年9月18日星期五
Library

Library 控制一个 LED 以及更多的功能

还记得那个使用 8 位单片机的时代吗?控制一个数字 IO 是你做过最简单的任务,所有你知道的是,用一个位控制输入输出方向,另外一个位设置或者读取引脚电平。

如今的 Arm 处理器是一个具有丰富功能的系统,提供诸多选项用于控制 IO。不仅有方向和电平,还有翻转速率、上拉和下拉电阻以及在运行时可以选择的复用功能。正确配置所有的寄存器已经不再是简单的任务,特别是在现代操作系统,例如 Windows Embedded 或者 Linux 中。

IO 示例
使用计算机模块,您可能会遇到更多的挑战。例如,你想要翻转 IO #12 电平。那么 12 是 GPIO 序号,CPU 引脚还是模块的引脚?亦或是整个嵌入式设备连接器上的引脚序号?所以为了避免以上的混淆,仔细定义引脚是很好的习惯。

为了使用 Toradex Gpio Library,首先是要了解 IO 是如何被表示的。所有的 IO 序号用 32 位的整数编排,高 16 位用于定义 IO 的类型(SODIMM pin / GPIO),低16 位表示真实的序号。例如,Colibri SODIMM pin 17 用 32 位整数表示为 0x00200011:

Bits 31..16 Bits 15..0
0x0020 0x0011
这是一个 SODIMM 引脚,序号为 17.

为了方便程序开发人员,我们定义一个数据类型 ulo,以及一些 C 宏,来处理 ulo 引脚定义。需要注意的是,有两类宏定义,一个用于变量静态初始化,例如:

uIo myPin = COLIBRI_PIN(17);

另一个则可以在程序中动态使用,例如:

myPin.GenericDefinition = IOCOLIBRIPIN(17);

由于 C 编译器的限制,无法为两种不同的用法定义同一个宏。

库文件的主要功能
现在,你已经知道 IO 是如何被表示的,那么接下来让我看看我们可以如何使用。Gpio 一个主要的功能就是修改 IO: Gpio_SetConfigString()。您仅需要一个字符串就可以定义所有需要修改的参数。例如, “dir=out, lvl=1, pull=up100k” ,是不是很简单?您所需要做的就是查看 Gpio library 文档中正确的关键字。

有两个类似的函数,可以读取当前 IO 配置, Gpio_GetConfigString()Gpio_GetConfigInt()

更加高效
上面提到的就是全部功能?当然不是。正如您所知道的,我们为一般的函数传递字符串需要一定的 CPU 开销。考虑到现代 Arm 处理器的高性能,通常情况下这是可以接受的。特别是当您只是要点亮一个 LED 。对于更高性能的要求,我们提单独的函数用于配置和读取 IO 电平和输入输出方向。

下面函数的效果

Gpio_SetConfigString(handle, io, NULL, L”lvl=1”, StoreVolatile);

等同于

Gpio_SetLevel(handle, io, ioHigh);

但是后者执行更快。

让我猜猜您下一个问题:我们为什么还要使用 Gpio_SetConfigString() ? 这看起来更加复杂,执行较慢,使用这个函数的好处是什么?

更加灵活
首先,这是一种通用的方法。我们需要使用 Gpio_SetConfigString() 函数来传递更加复杂的参数,如上下拉电阻值和翻转速度。所以,使用同样的字符串来配置整个引脚的功能,包括方向和电平,这是一种简单明了的解决方案。

其次,我们支持在注册表中保持这些引脚的配置。无论您使用程序代码创建注册表条目,或者在每一个设备中单独配置,这都将无关紧要。

你可以为 Gpio_Init() 提供注册表路径。当随后调用 Gpio_Open()函数时,Gpio 库会在该路径中搜索 IO 配置,并据此配置相应的硬件。以下面为例,插入如下的注册表值:

[HKLM\SOFTWARE\myGpio]
colibripin_133=”altfn=-1, dir=in, pull=down”

一旦你调用

h = Gpio_Init(L”HKLM\\SOFTWARE\\myGpio”);
Gpio_Open(h);

模块上的 Pin 133 自动配置为 GPIO,input 以及使用默认的下来电阻。

总结
Gpio library 旨在为您嵌入式应用设备提供一个简单而又灵活的工具。在写这篇文章的时候,Gpio library 已经支持所有基于飞思卡尔处理器的模块,包括从Colibri VF50 到 Apalis iMX6 四核计算机模块。

我们使用 Gpio library 作为我们自己 Windows CE 驱动和工具的基础,为所有 GPIO 相关的代码提供统一的标记。

所有的库文件以及示例代码都可以免费下载。示例代码包括配置GPIO 的命令行工具:
http://developer.toradex.com/knowledge-base/windows-ce-libraries-and-code-samples

作者: Andy Kiser, Senior Development Engineer, Toradex AG

1 comments

Chitresh Gupta - 8 years 5 months | Reply

A great blog to introduce Toradex customers with new concept of GPIO library, succeeding the blog on "Evolution of the Toradex CE Libraries". I am sure it will clear away any ambiguity that Toradex customers might have with xxx_Set/GetConfigString() functions too.

评论

Please login to leave a comment!
Have a Question?