grace under pressure
分类: LINUX
2012-08-13 13:45:24
GPIO
学习一个新片子,我们往往是从流水灯开始跑起,一者是简单,二者,入门之前没点成就感,很容易产生放弃的心理,一位大师曾经说过,所谓兴趣就是我们对我们所做的事能做的很好,享受其中的乐趣(当然,也有人能做好他当前做的事,但是没兴趣,这样的人毕竟很少,至少不再普通人行列)。万事开头难,因此,在开始的时候,还是老老实实的先从基本做起,我学习MQX也是一样,大概看了一下MQX的IO驱动架构后,便开始从GPIO入手,不管如何,先把系统跑起来,不管多简单,然后能修改代码实现自己想要的功能。这过程中,我们基本能熟悉一个新的片子,最起码是有个了解。下面是我学习MQX_GPIO的笔记,测试代码就不上传了,比较简单,确实需要的可以留言索要。
一、安装:
_io_gpio_install(“gpio:”)
注:在BSPCFG_ENABLE_GPIO在user_config.h中被置1时,自动安装
二、打开:
file=fopen(”gpio:write/gpio:read”,(char_ptr)&pin_table)
其中:
1、file是MQX系统的文件结构,定义为
MQX_FILE_PTR file
下面是mqx文件结构的结构体定义
typedef struct mqx_file
{
/* The address of the Device for this stream */
struct io_device_struct _PTR_ DEV_PTR;
/* Device Driver specific information */
pointer DEV_DATA_PTR;
/* General control flags for this stream */
_mqx_uint FLAGS;
/* The current error for this stream */
_mqx_uint ERROR;
/* The current position in the stream */
_file_size LOCATION;
/* The current size of the file */
_file_size SIZE;
/* The following 2 implement undelete */
boolean HAVE_UNGOT_CHARACTER;
_mqx_int UNGOT_CHARACTER;
} MQX_FILE, _PTR_ MQX_FILE_PTR;
2、gpio:write和gpio:read决定文件是输出还是输入
3、pin_table是GPIO结构体GPIO_PIN_STRUCT,以GPIO_LIST_END结尾,对GPIO_PIN_STRUCT的描述如下:
对了GPIO的打开,还有另外一种方式:
file=fopen(“gpio:write/gpio:read”,(char_ptr)NULL)
ioctl(file,GPIO_IOCTL_ADD_PINS,&pins)
三、操作:
1、输出操作(以LED为例测试)
file1=fopen(”gpio:write”,(char_ptr)&pins_led)
ioctl(file1,GPIO_IOCTL_WRITE_LOG0,NULL) //对file打开的pins_led里所有IO输出0
ioctl(file1,GPIO_IOCTL_WRITE_LOG1,&pins1_led) //pins1_led是pins_led中的部分IO的结构体,这里是对pins_led中部分引脚输出1
pins_led:
GPIO_PIN_STRUCT pins_led[] = {
/* when opening, explicitly set output to 0 */
BSP_LED2 | GPIO_PIN_STATUS_0,
/* when opening, explicitly set output to 1 */
BSP_LED3 | GPIO_PIN_STATUS_1,
/* when opening, implicitly set output to 0 */
BSP_LED4,
GPIO_LIST_END
};
2、输入操作:(以按键为例测试)
1)、查询方式
file2=fopen(”gpio:read”,(char_ptr)&pins_button)
ioctl(file2,GPIO_IOCTL_READ,&pins_button) //读取按键状态,并将状态存到pins_button中
pins_button[n]&GPIO_PIN_STATUS //pins_button中第n个按键状态
pins_button:
GPIO_PIN_STRUCT pins_button[] = {
BSP_BUTTON1,
BSP_BUTTON2,
GPIO_LIST_END
};
2)、中断方式
file3= fopen(“gpio:read”, (char_ptr) &pins_int )
ioctl(file3,GPIO_IOCTL_SET_IRQ_FUNCTION, (pointer)int_callback)
pins_int:
GPIO_PIN_STRUCT pins_int[] = {
BSP_BUTTON1 | GPIO_PIN_IRQ_FALLING,
GPIO_LIST_END
};
注意:一个文件使用完毕后,最好关掉这个文件,使用的函数
fclose(file)