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,从而大大提高了效率,减少了中间层的消耗。
スーパーは時計をコピーしますブランド偽物、偽物ブランド、ルイヴィトンコピー、 ロレックスコピー、シャネルコピー、グッチコピー、エルメスコピー、 ボッテガヴェネタコピー、 バーバリーコピー、ミュウミュウコピー、トリーバーチコピー、バレンシアガコピー、ディオールコピー、ブルガリコピー、ブラダコピー、 ドルチェ&ガッバーナコピー、オメガコピー、フランク ミュラーコピー、gagaコピー。 }}}}}}
https://www.bagssjp.com/product/detail-10651.html