GPIO Wakeup
GPIO Wakeup示例实现了GPIO的外部输入中断将系统从WFI/WFE中唤醒。
当GPIO配置为外部输入中断模式并使能中断时,通过IO上电平的变化(上升/下降沿,高/低电平)触发中断处理程序。
GPIO Wakeup示例的源代码和工程文件位于SDK_Folder\projects\peripheral\gpio\gpio_wakeup,其中工程文件在文件夹Keil_5下。
代码理解
示例工程流程图如图 12所示:
- 配置GPIO模块外部中断。
gpio_init_t gpio_config = GPIO_DEFAULT_CONFIG; gpio_config.mode = GPIO_MODE_IT_FALLING; gpio_config.pin = GPIO_KEY0 | GPIO_KEY1; gpio_config.pull = GPIO_PULLUP; hal_gpio_init(GPIO_KEY_PORT, &gpio_config);- GPIO配置参数细节请参考GPIO Input & Output。其中mode配置为GPIO_MODE_IT_FALLING,pin配置为GPIO_KEY0和GPIO_KEY1即GPIO_PIN_12和GPIO_PIN_13。
- mux为pin_mux配置,参考GR551x Datasheet中的pin_mux配置表,外部中断输入时需配置为GPIO_MUX_7。
- 调用hal_nvic_clear_pending_irq()和hal_nvic_enable_irq()清除并使能中断。代码如下所示:
hal_nvic_clear_pending_irq(GPIO_GET_IRQNUM(GPIO_KEY_PORT)); hal_nvic_enable_irq(GPIO_GET_IRQNUM(GPIO_KEY_PORT)); - 系统进入睡眠模式。代码如下:
while (!g_exit_flag) { printf("\r\nEnter sleep at counter = %d\r\n", sleep_count); SCB->SCR |= 0x04; __WFI(); printf("Wakeup from sleep at counter = %d\r\n", sleep_count++); } - 按GPIO_KEY0(对应开发板UP键)唤醒系统,按GPIO_KEY1(对应开发板Down键)唤醒系统并退出示例工程程序。
测试验证
- 用GProgrammer下载gpio_wakeup.bin至开发板。
- 将开发板串口连接至PC端,打开并配置GRUart。
- 在GRUart的Receive Data窗口中将会显示GPIO将CPU从WFI/WFE模式中唤醒的调试信息。