GPIO

Overview

以 AC638N 为例,提供GPIO应用示例、工程配置、API 介绍和常见问题。

应用示例

  • 具体的GPIO源代码详见 sdk/bsp/AC638N/src/gpio.c

  • 具体的引脚中断源代码详见 sdk/bsp/AC638N/src/port_wkup.c

  • gpio 参考示例如下,需将下面的参考示例代码添加到 gpio.c

    #include "asm/gpio.h"
    
    extern void port_wkup_interrupt_init(u32 port, u8 trigger_edge, void (*cbfun)(void));
    
    void port_irq_cbfunc(void)  //中断响应函数
    {
        printf("Hello world !\n");
    }
    
    void gpio_test(void)
    {
    
        gpio_direction_input(IO_PORTB_01);       //GPIO输入   同一组引脚之间没有互斥, 针对用户有高速度要求, 并且不需要考虑同一组引脚之间操作互斥才允许使用
        gpio_set_pull_up(IO_PORTB_01, 1);        //上拉配置
    
        gpio_direction_input(IO_PORTB_02);       //GPIO输入
        gpio_set_pull_down(IO_PORTB_02, 1);      //下拉配置
    
        gpio_direction_output(IO_PORTB_03, 1);   //GPIO输出
    
        gpio_direction_output(IO_PORTB_03, 1);   //GPIO输出
        gpio_set_hd(IO_PORTB_03, 1);             //强驱配置,电流变大增强输出
    
        mdelay(10);
    
        gpio_direction_output(IO_PORT_USB_DPA, 1);
        gpio_direction_output(IO_PORT_USB_DMA, 1);  //特殊引脚如USB/配置为GPIO使用方法
    
        mdelay(10);
    
        port_wkup_interrupt_init(IO_PORTA_01, 0, port_irq_cbfunc);//上升沿触发PA01的外部中断
        port_wkup_interrupt_init(IO_PORTA_02, 1, port_irq_cbfunc);//下降沿触发PA02的外部中断
    }
    

工程配置

  • sdk/apps/main.c 中函数 user_main() 添加如下工程代码:

    int user_main()
    {
        extern void gpio_test(void);
        gpio_test();
    }
    
  • 编译下载后,用逻辑分析仪或者万用表测量示例代码对应引脚的电平,在对应中断引脚接上升或下降沿电平,中断响应函数会打印出 hello world

常见问题

  • gpio引脚映射问题,uart/i2c/spi的相关引脚可以映射到任意引脚吗?

    答:可以通过CrossBar功能实现引脚的映射,具体引脚映射示例和接口如下:

    //=================================================================================//
    //@brief: CrossBar 输出设置 API, 将指定IO口设置为某个外设的输出
    //@input:
    //              gpio: 需要输出外设信号的IO口;
    //              fun_index: 需要输出到指定IO口的外设信号, 可以输出外设信号列表请查看io_omap.h文件;
    //              dir_ctl: IO口方向由外设控制使能, 常设为1;
    //              data_ctl: IO口电平状态由外设控制使能, 常设为1;
    //@return:
    //              1)0: 执行正确;
    //              2)-EINVAL: 传参出错;
    //@note: 所映射的IO需要在设置IO状态为输出配置;
    //@example: 将UART0的Tx信号输出到IO_PORTA_05口:
    //                      gpio_direction_output(IO_PORTA_05, 1); //设置IO为输出状态
    //                      gpio_set_fun_output_port(IO_PORTA_05, FO_UART0_TX, 1, 1); //将UART0的Tx信号输出到IO_PORTA_05口
    //=================================================================================//
    int gpio_set_fun_output_port(u32 gpio, u32 fun_index, u8 dir_ctl, u8 data_ctl);
    
    //=================================================================================//
    //@brief: CrossBar 输入设置 API, 将某个外设的输入设置为从某个IO输入
    //@input:
    //              gpio: 需要输入外设信号的IO口;
    //              pfun: 需要从指定IO输入的外设信号, 可以输入的外设信号列表请查看gpio.h文件enum PFI_TABLE枚举项;
    //@return:
    //              1)0: 执行正确;
    //              2)-EINVAL: 传参出错;
    //@note: 所映射的IO需要在设置IO状态为输入配置;
    //@example: 将UART0的Rx信号设置为IO_PORTA_05口输入:
    //                      gpio_set_die(data->rx_pin, 1);          //数字输入使能
    //                      gpio_set_pull_up(data->rx_pin, 1);  //上拉输入使能
    //                      gpio_direction_input(IO_PORTA_05);  //设置IO为输入状态
    //                      gpio_set_fun_input_port(IO_PORTA_05, PFI_UART0_RX); //将UART0的Rx信号设置为IO_PORTA_05口输入
    //=================================================================================//
    int gpio_set_fun_input_port(u32 gpio, enum PFI_TABLE pfun);
    

API参考

ADC常用相关API介绍,具体软件代码见 sdk/bsp/AC638N/src/gpio.c

Functions

void usb_iomode(u32 enable)

usb_iomode, usb引脚设为普通IO

Parameters:

enable – 1,使能;0,关闭

void usb1_iomode(u32 enable)

usb1_iomode, usb1引脚设为普通IO

Parameters:

enable – 1,使能;0,关闭

struct gpio_reg *gpio2reg(u32 gpio)

gpio2reg,获取引脚序号对应的端口寄存器地址

Parameters:

gpio – 参考宏IO_PORTx_xx,如IO_PORTA_00

Returns:

端口寄存器地址,如JL_PORTA,JL_PORTB,,,

int gpio_set_direction(u32 gpio, u32 value)

gpio_set_direction,设置引脚方向

Parameters:
  • gpio – 参考宏IO_PORTx_xx,如IO_PORTA_00

  • value – 1,输入;0,输出

Returns:

0:成功 非0:失败

int gpio_read(u32 gpio)

gpio_read & gpio_read_input_value,读取引脚的输入电平,引脚为输入模式时才有效

Parameters:

gpio – 参考宏IO_PORTx_xx,如IO_PORTA_00

Returns:

电平值

int gpio_read_input_value(u32 gpio)
int gpio_direction_input(u32 gpio)

gpio_direction_input,将引脚直接设为输入模式

Parameters:

gpio – 参考宏IO_PORTx_xx,如IO_PORTA_00

Returns:

0:成功 非0:失败

int gpio_write(u32 gpio, u32 value)

gpio_write & gpio_set_output_value,设置引脚输出的电平,引脚为输出模式时才有效

Parameters:
  • gpio – 参考宏IO_PORTx_xx,如IO_PORTA_00

  • value – 1,输出1, 0,输出0

Returns:

0:成功 非0:失败

int gpio_set_output_value(u32 gpio, u32 value)
int gpio_direction_output(u32 gpio, u32 value)

gpio_direction_output,设置引脚的方向为输出,并设置一下电平

Parameters:
  • gpio – 参考宏IO_PORTx_xx,如IO_PORTA_00

  • value – 1,输出1;0,输出0

Returns:

0:成功 非0:失败

int gpio_set_pull_up(u32 gpio, u32 value)

gpio_set_pull_up,设置引脚的上拉,上拉电阻10K,当引脚为输入模式时才有效

Parameters:
  • gpio – 参考宏IO_PORTx_xx,如IO_PORTA_00

  • value – 1,上拉;0,不上拉

Returns:

0:成功 非0:失败

int gpio_set_pull_down(u32 gpio, u32 value)

gpio_set_pull_down,设置引脚的下拉,下拉电阻10K,当引脚为输入模式时才有效

Parameters:
  • gpio – 参考宏IO_PORTx_xx,如IO_PORTA_00

  • value – 1,下拉;0,不下拉

Returns:

0:成功 非0:失败

int gpio_set_hd0(u32 gpio, u32 value)

gpio_set_hd0, 设置引脚的内阻,当引脚为输出模式时才有效

Parameters:
  • gpio – 参考宏IO_PORTx_xx,如IO_PORTA_00

  • value – 1,关闭内阻增强输出 0,存在内阻,芯片默认的

Returns:

0:成功 非0:失败

int gpio_set_hd(u32 gpio, u32 value)

gpio_set_hd, 设置引脚的输出电流,当引脚为输出模式时才有效

Parameters:
  • gpio – 参考宏IO_PORTx_xx,如IO_PORTA_00

  • value – 1,电流变大增强输出; 0,默认电流

Returns:

0:成功 非0:失败

int gpio_set_die(u32 gpio, u32 value)

gpio_set_die,设置引脚为数字功能还是模拟功能,比如引脚作为ADC的模拟输入,则die要置0

Parameters:
  • gpio – 参考宏IO_PORTx_xx,如IO_PORTA_00

  • value – 1,数字功能,即01信号; 0,跟电压先关的模拟功能

Returns:

0:成功 非0:失败

int gpio_set_dieh(u32 gpio, u32 value)

gpio_set_dieh, 设置引脚为数字功能还是模拟功能,但模拟功能时,跟die的不一样而已

Parameters:
  • gpio – 参考宏IO_PORTx_xx,如IO_PORTA_00

  • value – 1,数字功能,即01信号; 0,跟电压先关的模拟功能

Returns:

0:成功 非0:失败

u32 get_gpio(const char *p)

get_gpio, 解析字符串,获取引脚对应的序号

Parameters:

p – 引脚字符串,如“PA00”, “PA01”,,,,

Returns:

引脚对应的序号. 如传入“PB01”,返回17