[文章]Hi3861 GPIO操作 点灯和按键实验

阅读量0
0
6
Hi3861也提供了相关得GPIO口操作
先看最简单得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/interfaces/kits/wifiiot_lite"
  9.     ]
  10. }
复制代码


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


  7. #include <hi_types_base.h>
  8. #include <hi_i2c.h>
  9. #include <hi_early_debug.h>
  10. #include <hi_stdlib.h>

  11. void *LedTask(const char *arg)
  12. {

  13.     (void)arg;
  14.     while (1)
  15.     {
  16.             GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 0);
  17.             usleep(300000);
  18.             GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_9, 1);
  19.             usleep(300000);
  20.     }

  21.     return NULL;
  22. }

  23. void led_demo(void)
  24. {
  25.     //osThreadAttr_t attr;

  26.     GpioInit();

  27.     //复用引脚为 GPIO
  28.     IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_GPIO);

  29.     //设置为输出
  30.     GpioSetDir(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_GPIO_DIR_OUT);


  31.    
  32.     attr.name = "LedTask";
  33.     attr.attr_bits = 0U;
  34.     attr.cb_mem = NULL;
  35.     attr.cb_size = 0U;
  36.     attr.stack_mem = NULL;
  37.     attr.stack_size = 512;
  38.     attr.priority = 26;

  39.     if (osThreadNew((osThreadFunc_t)LedTask, NULL, &attr) == NULL) {
  40.         printf("[LedExample] Falied to create LedTask!n");
  41.     }
  42.    
  43. }


  44. //SYS_RUN(led_demo);

  45. void oled_test(void)
  46. {

  47. }

  48. SYS_RUN(oled_test);
复制代码


另外GPIO口还可以作为输入,然后使用中断,示例代码如下:
这段示例代码用的开发板上面的user按键。

通过查阅原理图,我们可以看到Hi3861在type-C口附近有一个user按钮,如图,主要不要和复位按钮搞错了。user按钮对应的是GPIO5引脚。

  1. /* gpio callback func */
  2. hi_void my_gpio_isr_func(hi_void *arg)
  3. {
  4.     hi_unref_param(arg);
  5.     printf("----- gpio isr success -----rn");

  6. }

  7. /* 设置 按键中断响应 */
  8. hi_void my_gpio_isr_demo(hi_void)
  9. {
  10.     hi_u32 ret;

  11.     printf("----- gpio isr demo -----rn");

  12.     (hi_void)hi_gpio_init();
  13.    
  14.     hi_io_set_func(HI_IO_NAME_GPIO_5, HI_IO_FUNC_GPIO_5_GPIO); /* uart1 rx */

  15.     ret = hi_gpio_set_dir(HI_GPIO_IDX_5, HI_GPIO_DIR_IN);
  16.     if (ret != HI_ERR_SUCCESS) {
  17.         printf("===== ERROR ======gpio -> hi_gpio_set_dir1 ret:%drn", ret);
  18.         return;
  19.     }

  20.     ret = hi_gpio_register_isr_function(HI_GPIO_IDX_5, HI_INT_TYPE_EDGE,
  21.                                         HI_GPIO_EDGE_RISE_LEVEL_HIGH, my_gpio_isr_func, HI_NULL);
  22.     if (ret != HI_ERR_SUCCESS) {
  23.         printf("===== ERROR ======gpio -> hi_gpio_register_isr_function ret:%drn", ret);
  24.     }
  25. }
复制代码

回帖

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