#2020征文-开发板#Hi3861开发板的交通灯样例注释

LegendOfTiger
发布于 2021-1-29 09:47
浏览
1收藏

在系统开发前,必须修改vendor\hisi\hi3861\hi3861\build\config\usr_config.mk,找到# CONFIG_UART_DMA_SUPPORT is not set,修改为CONFIG_PWM_SUPPORT=y。否则编译报错:

#2020征文-开发板#Hi3861开发板的交通灯样例注释-鸿蒙开发者社区这个交通灯,依旧是官方样例修改。系统开始,先红绿蓝三色闪烁几次,然后通过交通板的按键,控制三个灯分别显示,以及蜂鸣器的开和关。LED程序中,已经有的注释这里不再继续加注释了。好了,贴代码

#include <stdio.h>
#include <unistd.h>

#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wifiiot_gpio.h"
#include "wifiiot_gpio_ex.h"
#include "wifiiot_watchdog.h"
#include "wifiiot_pwm.h"

// 三色灯的状态数组,每个值代表某个颜色显示还是不显示
static int g_ledStates[3] = {0, 0, 0};
// 当前灯序号
static int g_currentBright = 0;
// 蜂鸣器开关状态
static int g_beepState = 0;

// 按键回调。每按一下,亮某个颜色,其他颜色不亮。同时控制蜂鸣器状态
static void OnButtonPressed(char *arg) {
  (void) arg;

  for (int i = 0; i < 3; i++) {
    if (i == g_currentBright) {
      g_ledStates[i] = 1;
    } else {
      g_ledStates[i] = 0;
    }
  }
  g_currentBright++;

  if (g_currentBright == 3) g_currentBright = 0;

  g_beepState = !g_beepState;
}

static void *LightTask(const char *arg) {
  (void) arg;
  
  WifiIotGpioIdx pins[] = {WIFI_IOT_GPIO_IDX_10, WIFI_IOT_GPIO_IDX_11, WIFI_IOT_GPIO_IDX_12};

  // 先每个灯闪烁一下,亮2秒灭1秒,2遍
  for (int i = 0; i <= 1; i++) {
    for (int j = 0; j < 3; j++) {
      GpioSetOutputVal(pins[j], WIFI_IOT_GPIO_VALUE1);
      usleep(200 * 1000);
      GpioSetOutputVal(pins[j], WIFI_IOT_GPIO_VALUE0);
      usleep(100 * 1000);
    }
  }

  while (1) {
    // 每个灯的状态输出到GPIO
    for (int j = 0; j < 3; j++) {
      GpioSetOutputVal(pins[j], g_ledStates[j]);
    }

    // 根据蜂鸣器状态控制
    if (g_beepState) {
      // 第二个参数duty分频系数,第三个参数freq,160M时钟,
      // freq,选择40K,占空达到一半,输出的是4K频率
      PwmStart(WIFI_IOT_PWM_PORT_PWM0, 20*1000, 40*1000);
    } else {
      PwmStop(WIFI_IOT_PWM_PORT_PWM0);
    }
  }

  return NULL;
}

// 三色显示+蜂鸣。交通灯板,三色对应GPIO10-12,蜂鸣器GPIO09/PWM0,按键GPIO08
static void LightEntry(void) {
  GpioInit();

  WatchDogDisable();

  IoSetFunc(WIFI_IOT_IO_NAME_GPIO_10, WIFI_IOT_IO_FUNC_GPIO_10_GPIO);
  GpioSetDir(WIFI_IOT_IO_NAME_GPIO_10, WIFI_IOT_GPIO_DIR_OUT);
  IoSetFunc(WIFI_IOT_IO_NAME_GPIO_11, WIFI_IOT_IO_FUNC_GPIO_11_GPIO);
  GpioSetDir(WIFI_IOT_IO_NAME_GPIO_11, WIFI_IOT_GPIO_DIR_OUT);
  IoSetFunc(WIFI_IOT_IO_NAME_GPIO_12, WIFI_IOT_IO_FUNC_GPIO_12_GPIO);
  GpioSetDir(WIFI_IOT_IO_NAME_GPIO_12, WIFI_IOT_GPIO_DIR_OUT);

  IoSetFunc(WIFI_IOT_IO_NAME_GPIO_8, WIFI_IOT_IO_FUNC_GPIO_8_GPIO);
  GpioRegisterIsrFunc(WIFI_IOT_IO_NAME_GPIO_8, WIFI_IOT_INT_TYPE_EDGE, WIFI_IOT_GPIO_EDGE_FALL_LEVEL_LOW, OnButtonPressed, NULL);

  IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_PWM0_OUT);
  GpioSetDir(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_GPIO_DIR_OUT);
  // 初始化PWM设备,这里是蜂鸣器
  PwmInit(WIFI_IOT_PWM_PORT_PWM0);

  // 设置线程属性
  osThreadAttr_t attr;
  attr.name = "TrafficTask";
  attr.attr_bits = 0U;
  attr.cb_mem = NULL;
  attr.cb_size = 0U;
  attr.stack_mem = NULL;
  attr.stack_size = 1024;
  attr.priority = osPriorityNormal;

  // 开启线程,执行LED任务。开启线程,避免主线程阻塞
  if (osThreadNew((osThreadFunc_t)LightTask, NULL, &attr) == NULL) {
    printf("SunLaoTest-Fail Create");
  }
}

SYS_RUN(LightEntry);
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.

 

 

已于2021-2-1 14:54:02修改
2
收藏 1
回复
举报
2
2
1
2条回复
按时间正序
/
按时间倒序
Whyalone
Whyalone

感谢,官方的样例有时候没有那么清楚,加上注解确实能明白很多

回复
2021-1-29 09:55:35
txwtech
txwtech

博主好,鸿蒙开发板hi3861 hispark code 2.0 canary金丝雀版本,gpio如何上拉电阻呢?

code 2.0 LTS支持,canary没有这个功能呢

IoSetPull(WIFI_IOT_IO_NAME_GPIO_8, WIFI_IOT_IO_PULL_UP);

谢谢

回复
2021-8-19 09:15:43


回复
    相关推荐