要求编写程序,按F1使LED变亮,按F2使LED变暗。
程序使用OpenHarmony官网提供的SDK,采用纯Windows环境编译烧录。
目前由于华为云链接失效,DevEco无法下载Windows下的Hi3861 SDK,我已经在华为设备开发论坛发帖。我是使用八月份的SDK备份编程的。
其他同学使用小熊派社区的SDK编程,出现了打印栈回退并重启开发板的错误。问题单链接:根据样例B1、B2和B3,设计通过按F1和F2调节灯亮度的程序运行后,系统崩溃,打印栈回退信息并重启 · Issue #I8RW1U · 小熊派开源社区/BearPi-HM_Nano - Gitee.com
下面是我写的代码,采用样例各模块复制粘贴的方式拼凑而成。
/* 不知道这边 include 的是啥玩意 */
#include <unistd.h>
#include "iot_gpio_ex.h"
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "iot_gpio.h"
#include "iot_watchdog.h"
#include "iot_pwm.h"
#define IOT_PWM_PORT_PWM0 0
#define IOT_PWM_PORT_PWM1 1
#define IOT_PWM_PORT_PWM2 2
#define IOT_PWM_PORT_PWM3 3
#define IOT_FREQ 65535
#define DELYA_MS 100
static int g_duty = 20;
// 一种错误是在中断里面调 PWM。中断只能做加加减减!
static void F1(char* arg)
{
(void)arg;
printf("F1\n");
++g_duty;
printf("g_duty = %d\n", g_duty);
}
static void F2(char* arg)
{
(void)arg;
printf("F2\n");
if (g_duty > 0) {
--g_duty;
}
printf("g_duty = %d\n", g_duty);
}
void PwmMain(void)
{
/* 初始化 LED 灯和 PWM */
IoTGpioInit(IOT_IO_NAME_GPIO_2);
IoSetFunc(IOT_IO_NAME_GPIO_2, IOT_IO_FUNC_GPIO_2_PWM2_OUT);
IoTGpioSetDir(IOT_IO_NAME_GPIO_2, IOT_GPIO_DIR_OUT);
IoTPwmInit(IOT_PWM_PORT_PWM2);
/* 初始化 F1 按钮并设置为下降沿中断 */
IoTGpioInit(IOT_IO_NAME_GPIO_11);
IoSetFunc(IOT_IO_NAME_GPIO_11, IOT_IO_FUNC_GPIO_11_GPIO);
IoTGpioSetDir(IOT_IO_NAME_GPIO_11, IOT_GPIO_DIR_IN);
IoSetPull(IOT_IO_NAME_GPIO_11, IOT_IO_PULL_UP);
IoTGpioRegisterIsrFunc(IOT_IO_NAME_GPIO_11, IOT_INT_TYPE_EDGE,
IOT_GPIO_EDGE_FALL_LEVEL_LOW, F1, NULL);
/* 初始化 F2 按钮并设置为下降沿中断 */
IoTGpioInit(IOT_IO_NAME_GPIO_12);
IoSetFunc(IOT_IO_NAME_GPIO_12, IOT_IO_FUNC_GPIO_12_GPIO);
IoTGpioSetDir(IOT_IO_NAME_GPIO_12, IOT_GPIO_DIR_IN);
IoSetPull(IOT_IO_NAME_GPIO_12, IOT_IO_PULL_UP);
IoTGpioRegisterIsrFunc(IOT_IO_NAME_GPIO_12, IOT_INT_TYPE_EDGE,
IOT_GPIO_EDGE_FALL_LEVEL_LOW, F2, NULL);
while (1) {
IoTPwmStart(IOT_PWM_PORT_PWM2, g_duty, IOT_FREQ);
}
}
void GA12N20SampleEntry(void)
{
osThreadAttr_t attr;
IoTWatchDogDisable();
attr.name = "PwmMain";
attr.attr_bits = 0U;
attr.cb_mem = NULL;
attr.cb_size = 0U;
attr.stack_mem = NULL;
attr.stack_size = 1024 * 5; // 堆栈大小为1024*5,stack size 1024*5
attr.priority = osPriorityNormal;
if (osThreadNew((osThreadFunc_t)PwmMain, NULL, &attr) == NULL) {
printf("[PwmMain] Failed to create Hcsr04SampleTask!\n");
}
}
APP_FEATURE_INIT(GA12N20SampleEntry);