#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);

 

 

已于2021-2-1 14:54:02修改
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
回复
    相关推荐