Blog:
适用于韬睿计算机模块(CoM)的 Gpio 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 |
为了方便程序开发人员,我们定义一个数据类型 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
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.