[文章]如何通过调用OpenHarmony的NDK接口,实现对GPIO控制,达到LED闪烁的效果

阅读量0
1
5
概述
OpenHarmony  WLAN模组基于Hi3861平台提供了丰富的外设操作能力,包含I2C、I2S、ADC、UART、SPI、SDIO、GPIO、PWM、FLASH等。本文介绍如何通过调用OpenHarmony的NDK接口,实现对GPIO控制,达到LED闪烁的效果。其他的IOT外设控制,开发者可根据API指导文档完成,此处不逐一介绍。

开发
  • 请先完成《Hi3861快速入门》。LED控制参考示例存放于applications/sample/wifi-iot/app/iothardware/led_example.c文件中。
  • 实现IOT外设控制,首先需要通过查阅原理图明确接线关系。经过查阅,hispark pegasus的LED与芯片的9号管脚相连。
  • 使用GPIO前,需要完成GPIO管脚初始化,明确管脚用途,并创建任务,使LED周期性亮灭,达到闪烁的效果。
  1. #define LED_TEST_GPIO 9

  2. static void LedExampleEntry(void)
  3. {
  4.     osThreadAttr_t attr;

  5.     /* 管脚初始化 */
  6.     IoTGpioInit(LED_TEST_GPIO);
  7.     /* 配置9号管脚为输出方向 */
  8.     IoTGpioSetDir(LED_TEST_GPIO, IOT_GPIO_DIR_OUT);

  9.     attr.name = "LedTask";
  10.     attr.attr_bits = 0U;
  11.     attr.cb_mem = NULL;
  12.     attr.cb_size = 0U;
  13.     attr.stack_mem = NULL;
  14.     attr.stack_size = LED_TASK_STACK_SIZE;
  15.     attr.priority = LED_TASK_PRIO;

  16.     /* 启动任务 */
  17.     if (osThreadNew((osThreadFunc_t)LedTask, NULL, &attr) == NULL) {
  18.         printf("[LedExample] Failed to create LedTask!
  19. ");
  20.     }
  21. }
复制代码
   4.在循环任务中通过周期性亮灭形式实现LED闪烁。
  1. static void *LedTask(const char *arg)
  2. {
  3.     (void)arg;
  4.     while (1) {
  5.         switch (g_ledState) {
  6.             case LED_ON:
  7.                 IoTGpioSetOutputVal(LED_TEST_GPIO, 1);
  8.                 usleep(LED_INTERVAL_TIME_US);
  9.                 break;
  10.             case LED_OFF:
  11.                 IoTGpioSetOutputVal(LED_TEST_GPIO, 0);
  12.                 usleep(LED_INTERVAL_TIME_US);
  13.                 break;
  14.             case LED_SPARK:
  15.                 IoTGpioSetOutputVal(LED_TEST_GPIO, 0);
  16.                 usleep(LED_INTERVAL_TIME_US);
  17.                 IoTGpioSetOutputVal(LED_TEST_GPIO, 1);
  18.                 usleep(LED_INTERVAL_TIME_US);
  19.                 break;
  20.             default:
  21.                 usleep(LED_INTERVAL_TIME_US);
  22.                 break;
  23.         }
  24.     }
  25.     return NULL;
  26. }

  27. SYS_RUN(LedExampleEntry);

  28. import("//build/lite/config/component/lite_component.gni")
  29. lite_component("app") {
  30.     features = [
  31.         "iothardware:led_example"
  32.     ]
  33. }
复制代码
   5.在代码最下方,使用OpenHarmony启动恢复模块接口SYS_RUN()启动业务。(SYS_RUN定义在ohos_init.h文件中)
  1. SYS_RUN(LedExampleEntry);
复制代码
   6.修改applications/sample/wifi-iot/app/BUILD.gn文件,使led_example.c参与编译。
  1. import("//build/lite/config/component/lite_component.gni")
  2. lite_component("app") {
  3.     features = [
  4.         "iothardware:led_example"
  5.     ]
  6. }
复制代码

验证
编译过程请参考《Hi3861快速入门-源码编译》,烧录过程请参考《Hi3861快速入门-镜像烧录》。

完成以上两步后,按下RST键复位模组,可发现LED在周期性闪烁,与预期相符,验证完毕。

图 1  LED闪烁图


回帖

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