[文章]OpenHarmony轻量系统开发【5】驱动之GPIO点灯

阅读量0
0
4
摘要:本文简单介绍如何操作GPIO去点灯
适合群体:适用于Hi3861开发板,L0轻量系统驱动开发

5.1点灯例程源码
先看最简单得LED灯闪烁操作
源码结构如下:


第一个BUILD.gn文件内容:
  1. static_library("led_demo") {
  2.     sources = [
  3.         "led_demo.c"
  4.     ]

  5.     include_dirs = [
  6.         "//utils/native/lite/include",
  7.         "//kernel/liteos_m/components/cmsis/2.0",
  8.         "//base/iot_hardware/peripheral/interfaces/kits",
  9.     ]
  10. }
复制代码

第二个BUILD.gn内容:
  1. # Copyright (c) 2020 Huawei Device Co., Ltd.
  2. # Licensed under the Apache License, Version 2.0 (the "License");
  3. # you may not use this file except in compliance with the License.
  4. # You may obtain a copy of the License at
  5. #
  6. #     http://www.apache.org/licenses/LICENSE-2.0
  7. #
  8. # Unless required by applicable law or agreed to in writing, software
  9. # distributed under the License is distributed on an "AS IS" BASIS,
  10. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. # See the License for the specific language governing permissions and
  12. # limitations under the License.

  13. import("//build/lite/config/component/lite_component.gni")

  14. lite_component("app") {
  15.     features = [
  16.         "led_demo:led_demo",
  17.     ]
  18. }
复制代码

led_demo.c内容:
  1. #include <unistd.h>
  2. #include "stdio.h"
  3. #include "ohos_init.h"
  4. #include "cmsis_os2.h"
  5. #include "iot_gpio.h"

  6. #define LED_TEST_GPIO 9 // for hispark_pegasus

  7. void *LedTask(const char *arg)
  8. {
  9.     //初始化GPIO
  10.     IoTGpioInit(LED_TEST_GPIO);

  11.     //设置为输出
  12.     IoTGpioSetDir(LED_TEST_GPIO, IOT_GPIO_DIR_OUT);

  13.     (void)arg;
  14.     while (1)
  15.     {
  16.         //输出低电平
  17.         IoTGpioSetDir(LED_TEST_GPIO, 0);
  18.         usleep(300000);
  19.         //输出高电平
  20.         IoTGpioSetDir(LED_TEST_GPIO, 1);
  21.         usleep(300000);
  22.     }

  23.     return NULL;
  24. }

  25. void led_demo(void)
  26. {
  27.     osThreadAttr_t attr;
  28.    
  29.     attr.name = "LedTask";
  30.     attr.attr_bits = 0U;
  31.     attr.cb_mem = NULL;
  32.     attr.cb_size = 0U;
  33.     attr.stack_mem = NULL;
  34.     attr.stack_size = 512;
  35.     attr.priority = 26;

  36.     if (osThreadNew((osThreadFunc_t)LedTask, NULL, &attr) == NULL) {
  37.         printf("[LedExample] Falied to create LedTask!n");
  38.     }
  39.    
  40. }
复制代码

编译后烧录进去,应该可以看到复位按键旁边的LED灯一直在闪烁。


5.2 驱动框架
OpenHarmony为轻量系统提供了一套简单的驱动封装接口,函数的定义相关头文件位于“baseiot_hardwareperipheralinterfaceskits”


这里只有头文件,具体的函数实现,需要在对应的soc中,具体路径定义由
deviceboardhisiliconhispark_pegasusliteos_mconfig.gni 文件中定义:

所以我们可以知道,具体的路径就是
“devicesochisiliconhi3861v100hi3861_adapterhalsiot_hardwarewifiiot_lite”
相关文件如下:

这里是代码实现,具体是将hi3861相关的驱动接口封装成鸿蒙的驱动接口。
所以我们可以总结如下:

5.3 GPIO相关接口函数
(1)相关枚举:
  1. /**
  2.   * [url=home.php?mod=space&uid=2666770]@Brief[/url] 枚举 GPIO 电平值。
  3.   */
  4. 类型定义枚举 {
  5.      /** 低 GPIO 电平 */
  6.      IOT_GPIO_VALUE0 = 0,
  7.      /** 高 GPIO 电平 */
  8.      IOT_GPIO_VALUE1
  9. } IotGpioValue;

  10. /**
  11.   * @brief 枚举 GPIO 方向。
  12.   */
  13. 类型定义枚举 {
  14.      /** 输入 */
  15.      IOT_GPIO_DIR_IN = 0,
  16.      /** 输出 */
  17.      IOT_GPIO_DIR_OUT
  18. } IotGpioDir;

  19. /**
  20.   * @brief 枚举 GPIO 中断触发模式。
  21.   */
  22. 类型定义枚举 {
  23.      /** 电平敏感中断 */
  24.      IOT_INT_TYPE_LEVEL = 0,
  25.      /** 边缘敏感中断 */
  26.      IOT_INT_TYPE_EDGE
  27. } IotGpioIntType;

  28. /**
  29.   * @brief 枚举 I/O 中断极性。
  30.   */
  31. 类型定义枚举 {
  32.      /** 低电平或下降沿中断 */
  33.      IOT_GPIO_EDGE_FALL_LEVEL_LOW = 0,
  34.      /** 高电平或上升沿中断 */
  35.      IOT_GPIO_EDGE_RISE_LEVEL_HIGH
  36. } IotGpioIntPolarity;
复制代码

(2)普通GPIO相关API
  1. /**
  2. * @brief 表示 GPIO 中断回调。
  3. *
  4. */
  5. typedef void (*GpioIsrCallbackFunc) (char *arg);

  6. /**
  7. * @brief 初始化一个 GPIO 设备。
  8. *
  9. * [url=home.php?mod=space&uid=3142012]@param[/url] id 表示 GPIO 引脚号。
  10. * [url=home.php?mod=space&uid=1141835]@Return[/url] 如果 GPIO 设备已初始化,则返回 {[url=home.php?mod=space&uid=41289]@Link[/url] IOT_SUCCESS};
  11. * 否则返回 {@link IOT_FAILURE}。其他返回值详见芯片说明。
  12. * @从 2.2 开始
  13. * @2.2 版
  14. */
  15. unsigned int IoTGpioInit(unsigned int id);

  16. /**
  17. * @brief 取消初始化 GPIO 设备。
  18. *
  19. * @param id 表示 GPIO 引脚号。
  20. * @return 如果 GPIO 设备被取消初始化,则返回 {@link IOT_SUCCESS};
  21. * 否则返回 {@link IOT_FAILURE}。其他返回值详见芯片说明。
  22. * @从 2.2 开始
  23. * @2.2 版
  24. */
  25. unsigned int IoTGpioDeinit(unsigned int id);

  26. /**
  27. * @brief 设置 GPIO 引脚的方向。
  28. *
  29. * @param id 表示 GPIO 引脚号。
  30. * @param dir 指示 GPIO 输入/输出方向。
  31. * @return 如果设置了方向,则返回 {@link IOT_SUCCESS};
  32. * 否则返回 {@link IOT_FAILURE}。其他返回值详见芯片说明。
  33. * @从 2.2 开始
  34. * @2.2 版
  35. */
  36. unsigned int IoTGpioSetDir(unsigned int id, IotGpioDir dir);

  37. /**
  38. * @brief 获取 GPIO 引脚的方向。
  39. *
  40. * @param id 表示 GPIO 引脚号。
  41. * @param dir 指示指向 GPIO 输入/输出方向的指针。
  42. * @return 如果获取到方向,则返回 {@link IOT_SUCCESS};
  43. * 否则返回 {@link IOT_FAILURE}。其他返回值详见芯片说明。
  44. * @从 2.2 开始
  45. * @2.2 版
  46. */
  47. unsigned int IoTGpioGetDir(unsigned int id, IotGpioDir *dir);

  48. /**
  49. * @brief 设置 GPIO 引脚的输出电平值。
  50. *
  51. * @param id 表示 GPIO 引脚号。
  52. * @param val 表示输出电平值。
  53. * @return 如果设置了输出级别值,则返回 {@link IOT_SUCCESS};
  54. * 否则返回 {@link IOT_FAILURE}。其他返回值详见芯片说明。
  55. * @从 2.2 开始
  56. * @2.2 版
  57. */
  58. unsigned int IoTGpioSetOutputVal(unsigned int id,IotGpioValue val);

  59. /**
  60. * @brief 获取 GPIO 引脚的输出电平值。
  61. *
  62. * @param id 表示 GPIO 引脚号。
  63. * @param val 表示指向输出电平值的指针。
  64. * @return 如果获得输出电平值,则返回 {@link IOT_SUCCESS};
  65. * 否则返回 {@link IOT_FAILURE}。其他返回值详见芯片说明。
  66. * @从 2.2 开始
  67. * @2.2 版
  68. */
  69. unsigned int IoTGpioGetOutputVal(unsigned int id, IotGpioValue *val);

  70. /**
  71. * @brief 获取 GPIO 引脚的输入电平值。
  72. *
  73. * @param id 表示 GPIO 引脚号。
  74. * @param val 表示指向输入电平值的指针。
  75. * @return 如果获得输入电平值,则返回 {@link IOT_SUCCESS};
  76. * 否则返回 {@link IOT_FAILURE}。其他返回值详见芯片说明。
  77. * @从 2.2 开始
  78. * @2.2 版
  79. */
  80. unsigned int IoTGpioGetInputVal(unsigned int id, IotGpioValue *val);
复制代码




(3)按键中断相关API
  1. /**
  2. * @brief 启用 GPIO 引脚的中断功能。
  3. *
  4. * 该函数可用于设置GPIO引脚的中断类型、中断极性和中断回调。
  5. *
  6. * @param id 表示 GPIO 引脚号。
  7. * @param intType 表示中断类型。
  8. * @param intPolarity 指示中断极性。
  9. * @param func 表示中断回调函数。
  10. * @param arg 表示指向中断回调函数中使用的参数的指针。
  11. * @return 如果启用中断功能,则返回 {@link IOT_SUCCESS};
  12. * 否则返回 {@link IOT_FAILURE}。其他返回值详见芯片说明。
  13. * @从 2.2 开始
  14. * @2.2 版
  15. */
  16. unsigned int IoTGpioRegisterIsrFunc(unsigned int id,IotGpioIntType intType,IotGpioIntPolarity intPolarity,
  17.                                     GpioIsrCallbackFunc fun,char *arg);

  18. /**
  19. * @brief 禁用 GPIO 引脚的中断功能。
  20. *
  21. * @param id 表示 GPIO 引脚号。
  22. * @return 如果中断功能被禁用,则返回 {@link IOT_SUCCESS};
  23. * 否则返回 {@link IOT_FAILURE}。其他返回值详见芯片说明。
  24. * @从 2.2 开始
  25. * @2.2 版
  26. */
  27. unsigned int IoTGpioUnregisterIsrFunc(unsigned int id);

  28. /**
  29. * @brief 屏蔽 GPIO 引脚的中断功能。
  30. *
  31. * @param id 表示 GPIO 引脚号。
  32. * @param mask 表示中断函数是否被屏蔽。
  33. * 值<b>1</b>表示屏蔽中断功能,<b>0</b>表示不屏蔽中断功能。
  34. * @return 如果中断功能被屏蔽,则返回 {@link IOT_SUCCESS};
  35. * 否则返回 {@link IOT_FAILURE}。其他返回值详见芯片说明。
  36. * @从 2.2 开始
  37. * @2.2 版
  38. */
  39. unsigned int IoTGpioSetIsrMask(unsigned int id, unsigned char mask);

  40. /**
  41. * @brief 设置 GPIO 引脚的中断触发模式。
  42. *
  43. * 此函数根据中断类型和中断极性配置 GPIO 引脚。
  44. *
  45. * @param id 表示 GPIO 引脚号。
  46. * @param intType 表示中断类型。
  47. * @param intPolarity 指示中断极性。
  48. * @return 如果设置了中断触发模式,则返回 {@link IOT_SUCCESS};
  49. * 否则返回 {@link IOT_FAILURE}。其他返回值详见芯片说明。
  50. * @从 2.2 开始
  51. * @2.2 版
  52. */
  53. unsigned int IoTGpioSetIsrMode(unsigned int id, IotGpioIntType intType, IotGpioIntPolarity intPolarity);
复制代码


回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友