```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
}
```
文章评论(0条评论)
登录后参与讨论