电子产业一站式赋能平台

PCB联盟网

搜索
查看: 640|回复: 0
收起左侧

HarmonyOS 驱动平台GPIO---使用指导

[复制链接]

2607

主题

2607

帖子

7472

积分

高级会员

Rank: 5Rank: 5

积分
7472
发表于 2020-9-16 19:57:04 | 显示全部楼层 |阅读模式
HarmonyOS 驱动平台GPIO---使用指导,   
使用流程 GPIO标准API通过GPIO管脚号来操作指定管脚,使用GPIO的一般流程如图1所示。
图1 GPIO使用流程图





确定GPIO管脚号 不同SOC芯片由于其GPIO控制器型号、参数、以及控制器驱动的不同,GPIO管脚号的换算方式不一样。

  • Hi3516DV300 控制器管理12组GPIO管脚,每组8个。 GPIO号 = GPIO组索引 (0~11) * 每组GPIO管脚数(8) + 组内偏移 举例:GPIO10_3的GPIO号 = 10 * 8 + 3 = 83  
  • Hi3518EV300 控制器管理10组GPIO管脚,每组10个。 GPIO号 = GPIO组索引 (0~9) * 每组GPIO管脚数(10) + 组内偏移 举例:GPIO7_3的GPIO管脚号 = 7 * 10 + 3 = 73
      

使用API操作GPIO管脚

  • 设置GPIO管脚方向 在进行GPIO管脚读写前,需要先通过如下函数设置GPIO管脚方向: int32_t GpioSetDir(uint16_t gpio, uint16_t dir); 表1 GpioSetDir参数和返回值描述
      
    参数 参数描述
    gpio 待设置的GPIO管脚号
    dir 待设置的方向值,取值参考 GpioDirType
    返回值 返回值描述
    0 设置成功
    负数 设置失败,取值参考 HDF_STATUS

  • 读写GPIO管脚 如果要读取一个GPIO管脚电平,通过以下函数完成: int32_t GpioRead(uint16_t gpio, uint16_t *val); 表2 GpioRead参数和返回值描述
      
    参数 参数描述
    gpio 待读取的GPIO管脚号
    val 接收读取电平值的指针,取值参考 GpioValue
    返回值 返回值描述
    0 读取成功
    负数 读取失败,取值参考 HDF_STATUS
    如果要向GPIO管脚写入电平值,通过以下函数完成: int32_t GpioWrite(uint16_t gpio, uint16_t val); 表3 GpioWrite参数和返回值描述
      
    参数 参数描述
    gpio 待写入的GPIO管脚号
    val 待写入的电平值, 取值参考 GpioValue
    返回值 返回值描述
    0 写入成功
    负数 写入失败,取值参考 HDF_STATUS
    示例代码:

      

         
    • int32_t ret;
         
    • uint16_t val;
         
    • /* 将3号GPIO管脚配置为输出 */
         
    • ret = GpioSetDir(3, GPIO_DIR_OUT);
         
    • IF (ret != 0) {
         
    •     HDF_LOGE(“GpioSerDir: faiLED, ret %d\n“, ret);
         
    •     return;
         
    • }
         
    • /* 向3号GPIO管脚写入低电平GPIO_VAL_LOW */
         
    • ret = GpioWrite(3, GPIO_VAL_LOW);
         
    • if (ret != 0) {
         
    •     HDF_LOGE(“GpioWrite: failed, ret %d\n“, ret);
         
    •     return;
         
    • }
         
    • /* 将6号GPIO管脚配置为输入 */
         
    • ret = GpioSetDir(6, GPIO_DIR_IN);
         
    • if (ret != 0) {
         
    •     HDF_LOGE(“GpioSetDir: failed, ret %d\n“, ret);
         
    •     return;
         
    • }
         
    • /* 读取6号GPIO管脚的电平值 */
         
    • ret = GpioRead(6, &val);
        
        



  • 设置GPIO中断 如果要为一个GPIO管脚设置中断响程序,使用如下函数: int32_t GpioSetirq(uint16_t gpio, uint16_t mode, GpioIrqFunc func, void *arg); 表4 GpioSetIrq参数和返回值描述
      
    参数 参数描述
    gpio GPIO管脚号
    mode 中断触发模式,取值参考 OSAL_IRQ_trigger_MODE
    func 中断服务程序,类型参考 GpioIrqFunc
    arg 传递给中断服务程序的入参
    返回值 返回值描述
    0 设置成功
    负数 设置失败,取值参考 HDF_STATUS
    注意
    同一时间,只能为某个GPIO管脚设置一个中断服务函数,如果重复调用GpioSetIrq函数,则之前设置的中断服务函数会被取代。 当不再需要响应中断服务函数时,使用如下函数取消中断设置: int32_t GpioUnSetIrq(uint16_t gpio); 表5 GpioUnSetIrq参数和返回值描述
      
    参数 参数描述
    gpio GPIO管脚号
    返回值 返回值描述
    0 取消成功
    负数 取消失败,取值参考 HDF_STATUS
    在中断服务程序设置完成后,还需要先通过如下函数使能GPIO管脚的中断: int32_t GpioEnableIrq(uint16_t gpio); 表6 GpioEnableIrq参数和返回值描述
      
    参数 参数描述
    gpio GPIO管脚号
    返回值 返回值描述
    0 使能成功
    负数 使能失败,取值参考 HDF_STATUS
    注意
    必须通过此函数使能管脚中断,之前设置的中断服务函数才能被正确响应。 如果要临时屏蔽此中断,可以通过如下函数禁止GPIO管脚中断: int32_t GpioDisableIrq(uint16_t gpio); 表7 GpioDisableIrq参数和返回值描述
      
    参数 参数描述
    gpio GPIO管脚号
    返回值 返回值描述
    0 禁止成功
    负数 禁止失败,取值参考 HDF_STATUS
    示例代码:

      

         
    • /* 中断服务函数,其类型参考 GpioIrqFunc
         
    • */
         
    • int32_t MyCallBackFunc(uint16_t gpio, void *data)
         
    • {
         
    •     HDF_LOGI(“%s: gpio:%u interrupt service in! data=%p\n“, __func__, gpio, data);
         
    •     return 0;
         
    • }
         

    •    
    • int32_t ret;
         
    • /* 设置中断服务程序为MyCallBackFunc,入参为NULL,中断触发模式 OSAL_IRQ_TRIGGER_MODE 为上升沿触发 */
         
    • ret = GpioSetIrq(3, OSAL_IRQF_TRIGGER_RISING, MyCallBackFunc, NULL);
         
    • if (ret != 0) {
         
    •     HDF_LOGE(“GpioSetIrq: failed, ret %d\n“, ret);
         
    •     return;
         
    • }
         

    •    
    • /* 使能3号GPIO管脚中断 */
         
    • ret = GpioEnableIrq(3);
         
    • if (ret != 0) {
         
    •     HDF_LOGE(“GpioEnableIrq: failed, ret %d\n“, ret);
         
    •     return;
         
    • }
         

    •    
    • /* 禁止3号GPIO管脚中断 */
         
    • ret = GpioDisableIrq(3);
         
    • if (ret != 0) {
         
    •     HDF_LOGE(“GpioDisableIrq: failed, ret %d\n“, ret);
         
    •     return;
         
    • }
         

    •    
    • /* 取消3号GPIO管脚中断服务程序 */
         
    • ret = GpioUnSetIrq(3);
         
    • if (ret != 0) {
         
    •     HDF_LOGE(“GpioUnSetIrq: failed, ret %d\n“, ret);
         
    •     return;
         
    • }
        
        

回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表