1. GPIO
Overview
以 AC638N 为例,提供GPIO应用示例、工程配置、API 介绍和常见问题。
1.1. 应用示例
具体的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的外部中断 }
1.2. 工程配置
在 sdk/apps/main.c 中函数
user_main()
添加如下工程代码:int user_main() { extern void gpio_test(void); gpio_test(); }
编译下载后,用逻辑分析仪或者万用表测量示例代码对应引脚的电平,在对应中断引脚接上升或下降沿电平,中断响应函数会打印出
hello world !
。
1.3. 常见问题
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);
1.4. 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