GPIO即通用型输入输出,通常GPIO的控制器都是通过分组的形式进行管理GPIO管脚的,比如:STM32中通常会将GPIO分组为A、B、C组等由不同的控制器进行管理。通过对每个IO所对应的的寄存器进行读写就可以完成对GPIO管脚的相应操作。包括:
1、设置IO口的方向:输入或者输出,Harmony的这个板子暂不支持高阻态;
2、设置IO口的模式:上拉、下拉、浮空等;
3、读写IO口的电平值:完成逻辑电平的读取或者输出;
4、设置外部中断:设置IO口的中断响应函数,以及相应的触发方式,同样的可以进行中断的禁止或者使能。
在HarmonyOS中常用的驱动API的接口函数如下:
功能 | API函数名 | 描述 |
GPIO读 | GpioRead | 读管脚电平值 |
GPIO写 | GpioWrite | 写管脚电平值 |
GPIO配置1 | GpioSetDir | 设置管脚方向 |
GPIO配置2 | GpioGetDir | 获取管脚方向 |
GPIO中断配置1 | GpioSetirq | 设置管脚对应的中断服务函数 |
GPIO中断配置2 | GpioUnSetIrq | 取消管脚对应的中断服务函数 |
GPIO中断配置3 | GpioEnableIrq | 使能管脚中断 |
GPIO中断配置4 | GpioDisableIrq | 禁止管脚中断
|
1)如何根据原理图确定IO的引脚号
由上图,LED使用的引脚是GPIO2_3,不同SOC芯片由于其GPIO控制器型号、参数、以及控制器驱动的不同,GPIO管脚号的换算方式不一样。
Hi3516DV300 控制器管理12组GPIO管脚,每组8个。
GPIO号 = GPIO组索引 (0~11) * 每组GPIO管脚数(8) + 组内偏移
由此可得:
GPIO2_3的GPIO号 = 2* 8 + 3 = 19
2)关于GPIO驱动API接口函数的使用
编译的时候通过了,但是在链接的时候出现了错误,ld.lld:error:undefined symbol:xxxxxx,未定义error,
参考:https://device.harmonyos.com/cn/docs/develop/drive/oem_drive_gpio_des-0000001050058978 中的介绍,GPIO的驱动API接口仅限在内核态使用,不支持在用户态使用,所以即使编译通过了,在进行程序链接的时候也会因为没有相关的定义而failed。