安信可A9G-Pudding开发板 GPIO功能使用及固件开发

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yichu5074/article/details/82535030

1.编译烧录运行

两颗LED同时闪烁

2.源代码解析

GPIO_TestTask()

 

 

GPIO (General Purpose Input Output)通用输入输出接口

要保证引脚功能可以正常使用,在配置IO之前必须将对应IO口的电源打开,使用

bool PM_PowerEnable(Power_Type_t powerType, bool isOn)
```c
函数来打开对应的IO口电源,不同IO口对应的电源如下:
```c
typedef enum{
    POWER_TYPE_VPAD = 0,            // GPIO0  ~ GPIO7  and GPIO25 ~ GPIO36    2.8V   //always on
    POWER_TYPE_MMC,                 // GPIO8  ~ GPIO13                        1.9V
    POWER_TYPE_LCD,                 // GPIO14 ~ GPIO18                        1.9V
    POWER_TYPE_CAM,                 // GPIO19 ~ GPIO24                        1.9V
    POWER_TYPE_MAX
}Power_Type_t;

比如:

  • 需要使用GPIO5,则需要调用PM_PowerEnable(POWER_TYPE_VPAD,true);
  • 需要调用I2C2,因为I2C2是复用IO19和20,所以调用PM_PowerEnable(POWER_TYPE_CAM,true);

模组引脚除了通用IO功能外,部分引脚还有复用功能,具体见开发板中的引脚图

例示代码请参考CSDK demo/gpio


1. 枚举类型

1.1. GPIO_PIN

引脚

typedef enum{
    GPIO_PIN0 = 0, //IO 可中断
    GPIO_PIN1,     //IO 可中断
    GPIO_PIN2,     //IO 可中断
    GPIO_PIN3,     //IO 可中断
    GPIO_PIN4,     //IO 可中断
    GPIO_PIN5,     //IO 可中断
    GPIO_PIN6,     //IO 可中断
    GPIO_PIN7,     //IO 可中断
    GPIO_PIN8,
    GPIO_PIN9,
    GPIO_PIN10,
    GPIO_PIN11,
    GPIO_PIN12,
    GPIO_PIN13,
    GPIO_PIN14,
    GPIO_PIN15,
    GPIO_PIN16,
    GPIO_PIN17,
    GPIO_PIN18,
    GPIO_PIN19,
    GPIO_PIN20,
    GPIO_PIN21,
    GPIO_PIN22,
    GPIO_PIN23,
    GPIO_PIN24,
    GPIO_PIN25,
    GPIO_PIN26,
    GPIO_PIN27,
    GPIO_PIN28,
    GPIO_PIN29,
    GPIO_PIN30,
    GPIO_PIN31,
    GPIO_PIN32,
    GPIO_PIN33,
    GPIO_PIN34,
    GPIO_PIN_MAX
}GPIO_PIN;

1.2. GPIO_MODE

IO模式

typedef enum{
    GPIO_MODE_OUTPUT = 0,   // 输出模式
    GPIO_MODE_INPUT,        // 输入模式
    GPIO_MODE_INPUT_INT,    // 中断模式
    GPIO_MODE_MAX
}GPIO_MODE;

1.3. GPIO_LEVEL

高低电平

typedef enum{
    GPIO_LEVEL_LOW  = 0,  //低电平
    GPIO_LEVEL_HIGH = 1   //高电平
}GPIO_LEVEL;

1.4. GPIO_INT_TYPE

中断类型

typedef enum {
    GPIO_INT_TYPE_HIGH_LEVEL = 0,      //高电平中断
    GPIO_INT_TYPE_LOW_LEVEL,           //低电平中断
    GPIO_INT_TYPE_RISING_EDGE,         //上升沿中断
    GPIO_INT_TYPE_FALLING_EDGE,        //下降沿中断
    GPIO_INT_TYPE_RISING_FALLING_EDGE, //上升沿和下降沿中断
    GPIO_INT_TYPE_MAX
}GPIO_INT_TYPE;

2. 结构体类型

2.1. GPIO_INT_callback_param_t

中断回调函数参数类型

typedef struct{
    GPIO_PIN pin;
}GPIO_INT_callback_param_t;

2.2. PCallbackINT

中断回调函数类型

typedef void (*PCallbackINT)(GPIO_INT_callback_param_t* param);

2.3. GPIO_INT_config_t

中断配置选项

typedef struct{
    uint16_t        debounce; //去抖时间(ms)
    GPIO_INT_TYPE   type    ;
    PCallbackINT    callback;
}GPIO_INT_config_t;

2.4. GPIO_config_t

GPIO配置选项

typedef struct{
    GPIO_PIN          pin         ;  //引脚
    GPIO_MODE         mode        ;  //模式
    GPIO_LEVEL        defaultLevel;  //默认电平
    GPIO_INT_config_t intConfig   ;  //中断配置(中断模式需要配置)
}GPIO_config_t;

3. 功能函数接口

3.1. GPIO_Init

bool GPIO_Init(GPIO_config_t config);

功能

初始化IO

参数

  • config:初始化配置

返回值

  • bool:配置成功/失败

3.2. GPIO_GetConfig

void GPIO_GetConfig(GPIO_PIN pin,GPIO_config_t* config);

功能

获取GPIO配置

参数

  • config:GPIO配置变量地址

返回值


3.3. GPIO_SetLevel

bool GPIO_SetLevel(GPIO_config_t gpioConf, GPIO_LEVEL  level);

功能

设置GPIO电平

参数

  • gpioConf:GPIO初始化配置变量
  • level:电平高低

返回值

  • bool:是否设置成功

3.4. GPIO_Set

bool GPIO_Set(GPIO_PIN pin, GPIO_LEVEL  level);

功能

设置GPIO电平,与GPIO_SetLevel功能一样,只是参数不一样

参数

  • pin:GPIO口
  • level:电平高低

返回值

  • bool:是否设置成功

3.5. GPIO_GetLevel

bool GPIO_GetLevel(GPIO_config_t gpioConf, GPIO_LEVEL* level);

功能

获取GPIO电平

参数

  • gpioConf:GPIO初始化配置变量
  • level:电平高低结果返回值,变量指针

返回值

  • bool:是否获取成功

3.6. GPIO_Get

bool GPIO_Get(GPIO_PIN pin, GPIO_LEVEL* level);

功能

获取GPIO电平,功能与GPIO_GetLevel一样,只是参数不同

参数

  • pin:GPIO口
  • level:电平高低结果返回值,变量指针

返回值

  • bool:是否获取成功

3.7. GPIO_Close

bool GPIO_Close(GPIO_PIN pin);

功能

关闭GPIO口,复位GPIO到默认状态

参数

  • pin:GPIO口

返回值

  • bool:是否成功

 

展开阅读全文

求助,2440的开发板,怎么使用GPIO

02-21

GPIO的寄存器定义是在哪个头文件呢?rnrn没找错,是用下面这些API吧:rnvoid s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function);rn作用:配置GPIO引脚功能,即是配置相应的CON位rnunsigned int s3c2410_gpio_getcfg(unsigned int pin);rn作用:该函数根据引脚获得指定引脚配置的功能值rnvoid s3c2410_gpio_pullup(unsigned int pin, unsigned int to);rn作用:设置相应GPIO口的上拉电阻rnvoid s3c2410_gpio_setpin(unsigned int pin, unsigned int to);rn作用:该函数给指定的引脚位写入0或1,即是配置相应的DAT位。rnvoid s3c2410_gpio_getpin(unsigned int pin);rn作用:该函数读取指定引脚的状态 返回0或 1,即是读取相应的DAT位。rnrn那个参数pin,我在内核代码里找到一个regs-gpio.h,在linux-2.6.32.2\arch\arm\mach-s3c2410\include\mach里,里面定义的是GPIO口。rnrn我写测试程序:[code=C/C++]rn#include rn#include rn#include rn#include rn#include rn#include rn#include rn#include rn#include rn#include rnrnint main(void)rn{rn int i = 55;rnrn i = s3c2410_gpio_getcfg (S3C2410_GPA2); //不知道参数用得对不对。rnrn printf("test-ok?---%d\n",i);rnrnrn[/code]rn编译出错rngpio_test.c:53: error: 'S3C2410_GPA2' undeclared (first use in this function)rngpio_test.c:53: error: (Each undeclared identifier is reported only oncerngpio_test.c:53: error: for each function it appears in.)rnmake: *** [gpios] Error 1rnrn假如我包含mach/regs-gpio.h的话,会提示找不到这个文件,是不是要把内核放在linux下的某个位置的?我的/usr/include下是没有gpio等头文件的。rnrn请问怎么用那些接口,如果要读某一个IO口怎么写怎么用呢?请举个例子,谢谢!~ 论坛

没有更多推荐了,返回首页