tag 标签: HPM5300点灯主程序

相关博文
  • 热度 3
    2024-2-12 16:24
    343 次阅读|
    0 个评论
    ```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 } ```