GPIO驱动应该是所有嵌入式OS中最简单但也是最常用的底层硬件驱动。不像linux,应用层访问GPIO驱动需要使用设备文件接口(read或ioctl方法)。在eCos中,应用层访问GPIO是非常直接的,而且由于eCos驱动体系的特点——HAL共用,我们无需要再单独编写GPIO驱动。

本节通过实现控制LED灯(IO输出)和扫描按键(IO输入)功能来展示eCos中如何操作GPIO的。

eCos中对STM32 GPIO的支持

eCos最新代码中,对STM32 F系列CPU的GPIO有完备的支持,详细介绍可以参考下英文说明(建议先阅读下):http://www.ecoscentric.com/ecospro/doc/html/ref/cortexm-stm32-gpio-generic.html

对应eCos的源文件是:var_io_pins.h

应用程序中不能直接包含上述这个源文件,而应该如上述英文所说明的,头文档应该是:

#include <cyg/hal/hal_io.h>

GPIO应用

如果CPU的引脚作为GPIO使用,主要关注以下几个宏:

设置PIN是输入(IN)还是输出(OUT):

#define CYGHWR_HAL_STM32_PIN_OUT(__port,__pin,__ppod,__pupd,__speed) \
  CYGHWR_HAL_STM32_GPIO(__port,__pin,GPIO_OUT,0,__ppod,__pupd,__speed)

#define CYGHWR_HAL_STM32_PIN_IN(__port,__pin,__pupd) \
  CYGHWR_HAL_STM32_GPIO(__port,__pin,GPIO_IN,0,NA,__pupd,NA)

读取PIN的值或者往PIN上输出高电平还是低电平:

#define CYGHWR_HAL_STM32_GPIO_NONE      (0xFFFFFFFF)

// Functions and macros to configure GPIO ports.

__externC void hal_stm32_gpio_set( cyg_uint32 pin );
__externC void hal_stm32_gpio_out( cyg_uint32 pin, int val );
__externC void hal_stm32_gpio_in ( cyg_uint32 pin, int *val );

#define CYGHWR_HAL_STM32_GPIO_SET(__pin ) hal_stm32_gpio_set( __pin )
#define CYGHWR_HAL_STM32_GPIO_OUT(__pin, __val ) hal_stm32_gpio_out( __pin, __val )
#define CYGHWR_HAL_STM32_GPIO_IN(__pin,  __val ) hal_stm32_gpio_in( __pin, __val )

LED灯控制实例

void test_gpio_led(void)
{
    diag_printf("GPIO test\n");

    cyg_uint32 pin_led1 = CYGHWR_HAL_STM32_PIN_OUT(F, 6, PUSHPULL, NONE, AT_LEAST(50));
    cyg_uint32 pin_led2 = CYGHWR_HAL_STM32_PIN_OUT(F, 7, PUSHPULL, NONE, AT_LEAST(50));
    cyg_uint32 pin_led3 = CYGHWR_HAL_STM32_PIN_OUT(F, 8, PUSHPULL, NONE, AT_LEAST(50));
    cyg_uint32 pin_led4 = CYGHWR_HAL_STM32_PIN_OUT(F, 9, PUSHPULL, NONE, AT_LEAST(50));
    CYGHWR_HAL_STM32_GPIO_SET(pin_led1);
    CYGHWR_HAL_STM32_GPIO_SET(pin_led2);
    CYGHWR_HAL_STM32_GPIO_SET(pin_led3);
    CYGHWR_HAL_STM32_GPIO_SET(pin_led4);

    /* Light up all LEDs */
    CYGHWR_HAL_STM32_GPIO_OUT(pin_led1, 0);
    CYGHWR_HAL_STM32_GPIO_OUT(pin_led2, 0);
    CYGHWR_HAL_STM32_GPIO_OUT(pin_led3, 0);
    CYGHWR_HAL_STM32_GPIO_OUT(pin_led4, 0);

    TEST_OS_MSLEEP(3 * 1000);// 延时3S

    /* Unlight up all LEDs */
    CYGHWR_HAL_STM32_GPIO_OUT(pin_led1, 1);
    CYGHWR_HAL_STM32_GPIO_OUT(pin_led2, 1);
    CYGHWR_HAL_STM32_GPIO_OUT(pin_led3, 1);
    CYGHWR_HAL_STM32_GPIO_OUT(pin_led4, 1);
}

按键扫描

这个按键扫描程序,是我自己写的,在安富莱开发板上已验证OK。功能实现上有参照了安富莱开发板上的按键示例。但具体实现上有自己的特点,也是eCos应用程序一个典型应用程序。

为读取按键值,程序开了一个线程轮询扫描按键状态(频率间隔默认10ms),使用软件滤波方式去除按键抖动,实现了按键按下、按键弹起、按键长按、按键连发等按键状态的读取,并支持组合按键。读取到的按键值将保存在一个缓冲区即所谓的FIFO中,供其它模块读取(在这里是直接打印在串口上)。

下载地址:http://52ecos.net/forum.php?mod=viewthread&tid=477&page=1&extra=#pid995

总结

从以上两个应用例子可以看出,在eCos应用程序中,可以直接操作GPIO,从而大大提高了效率,减少了中间层的消耗。

» 文章出处: reille博客—http://velep.com , 如果没有特别声明,文章均为reille博客原创作品
» 郑重声明: 原创作品未经允许不得转载,如需转载请联系reille#qq.com(#换成@)
分享到:

 Leave a Reply

(必须)

(我会替您保密的)(必须)

*

This site uses Akismet to reduce spam. Learn how your comment data is processed.

   
© 2012 velep.com | reille blog | 管理| 粤ICP备12094833号-2| 谷歌地图| 百度地图| Suffusion theme|Sayontan Sinha

无觅相关文章插件,快速提升流量