原创 HPM5300点灯主程序

2024-2-12 16:24 342 3 3 分类: 物联网 文集: 学习分享
```c
/*
 * Copyright (c) 2021 HPMicro
 *
 * SPDX-License-Identifier: BSD-3-Clause
 *
 */

#include "board.h" // 引入板级支持库头文件
#include "hpm_gpio_drv.h" // 引入GPIO驱动库头文件

#define GPIO_TOGGLE_COUNT 5 // 定义GPIO切换次数为5

void isr_gpio(void) // 定义GPIO中断服务函数
{
    gpio_clear_pin_interrupt_flag(BOARD_APP_GPIO_CTRL, BOARD_APP_GPIO_INDEX, BOARD_APP_GPIO_PIN); // 清除GPIO中断标志位
#ifdef BOARD_LED_GPIO_CTRL // 如果定义了BOARD_LED_GPIO_CTRL宏
    gpio_toggle_pin(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX, BOARD_LED_GPIO_PIN); // 切换LED引脚状态
    printf("toggle led pin output
"); // 打印信息
#else
#if defined(GPIO_SOC_HAS_EDGE_BOTH_INTERRUPT) && (GPIO_SOC_HAS_EDGE_BOTH_INTERRUPT == 1) // 如果定义了GPIO_SOC_HAS_EDGE_BOTH_INTERRUPT宏且值为1
    if (gpio_read_pin(BOARD_APP_GPIO_CTRL, BOARD_APP_GPIO_INDEX, BOARD_APP_GPIO_PIN) == false) { // 读取GPIO引脚状态
        printf("user key pressed
"); // 打印信息
    } else {
        printf("user key released
"); // 打印信息
    }
#else
    printf("user key pressed
"); // 打印信息
#endif
#endif
}
SDK_DECLARE_EXT_ISR_M(BOARD_APP_GPIO_IRQ, isr_gpio) // 声明外部中断服务函数

void test_gpio_input_interrupt(void) // 定义测试GPIO输入中断函数
{
    gpio_interrupt_trigger_t trigger; // 定义GPIO中断触发类型变量

    printf("input interrupt
"); // 打印信息
#ifdef BOARD_LED_GPIO_CTRL // 如果定义了BOARD_LED_GPIO_CTRL宏
    printf("user led will be switched on off based on user switch
"); // 打印信息
    gpio_set_pin_output(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX, BOARD_LED_GPIO_PIN); // 设置LED引脚为输出模式
#endif
    gpio_set_pin_input(BOARD_APP_GPIO_CTRL, BOARD_APP_GPIO_INDEX, BOARD_APP_GPIO_PIN); // 设置GPIO引脚为输入模式
#if defined(GPIO_SOC_HAS_EDGE_BOTH_INTERRUPT) && (GPIO_SOC_HAS_EDGE_BOTH_INTERRUPT == 1) // 如果定义了GPIO_SOC_HAS_EDGE_BOTH_INTERRUPT宏且值为1
    trigger = gpio_interrupt_trigger_edge_both; // 设置中断触发类型为双边沿触发
#else
    trigger = gpio_interrupt_trigger_edge_falling; // 设置中断触发类型为下降沿触发
#endif
    gpio_config_pin_interrupt(BOARD_APP_GPIO_CTRL, BOARD_APP_GPIO_INDEX, BOARD_APP_GPIO_PIN, trigger); // 配置GPIO引脚中断
    gpio_enable_pin_interrupt(BOARD_APP_GPIO_CTRL, BOARD_APP_GPIO_INDEX, BOARD_APP_GPIO_PIN); // 使能GPIO引脚中断
    intc_m_enable_irq_with_priority(BOARD_APP_GPIO_IRQ, 1); // 使能中断控制器的中断,并设置优先级为1
    while (1) {
        __asm("wfi"); // 进入等待中断状态
    }
}

#ifdef BOARD_LED_GPIO_CTRL // 如果定义了BOARD_LED_GPIO_CTRL宏
void test_gpio_toggle_output(void) // 定义测试GPIO切换输出函数
{
    printf("toggling led %u times in total
", GPIO_TOGGLE_COUNT); // 打印信息
    gpio_set_pin_output(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX, BOARD_LED_GPIO_PIN); // 设置LED引脚为输出模式
    gpio_write_pin(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX, BOARD_LED_GPIO_PIN, board_get_led_gpio_off_level()); // 设置LED引脚输出低电平

    for (uint32_t i = 0; i < GPIO_TOGGLE_COUNT; i++) { // 循环切换LED引脚状态
        gpio_toggle_pin(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX, BOARD_LED_GPIO_PIN); // 切换LED引脚状态
        board_delay_ms(500); // 延时500毫秒
        gpio_toggle_pin(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX, BOARD_LED_GPIO_PIN); // 切换LED引脚状态
        board_delay_ms(500); // 延时500毫秒
        printf("toggling led %u/%u times
", i + 1, GPIO_TOGGLE_COUNT); // 打印信息
    }
}
#endif

int main(void) // 主函数
{
    board_init(); // 初始化板级支持库
    board_init_gpio_pins(); // 初始化GPIO引脚
    printf("gpio example
"); // 打印信息

#ifdef BOARD_LED_GPIO_CTRL // 如果定义了BOARD_LED_GPIO_CTRL宏
    test_gpio_toggle_output(); // 调用测试GPIO切换输出函数
#endif
    test_gpio_input_interrupt(); // 调用测试GPIO输入中断函数

    while (1); // 无限循环
    return 0; // 返回0
}
```

作者: 丙丁先生, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-3996156.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

文章评论0条评论)

登录后参与讨论
我要评论
0
3
关闭 站长推荐上一条 /2 下一条