小熊派季GPIO、PWM、中断综合实验

要求编写程序,按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);

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄铎彦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值