#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。否则编译报错:
这个交通灯,依旧是官方样例修改。系统开始,先红绿蓝三色闪烁几次,然后通过交通板的按键,控制三个灯分别显示,以及蜂鸣器的开和关。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
回复
相关推荐
感谢,官方的样例有时候没有那么清楚,加上注解确实能明白很多
博主好,鸿蒙开发板hi3861 hispark code 2.0 canary金丝雀版本,gpio如何上拉电阻呢?
code 2.0 LTS支持,canary没有这个功能呢
IoSetPull(WIFI_IOT_IO_NAME_GPIO_8, WIFI_IOT_IO_PULL_UP);
谢谢