CN / EN
文档反馈
感谢关注汇顶文档,期待您的宝贵建议!
感谢您的反馈,祝您愉快!

GPIO Wakeup

GPIO Wakeup示例实现了GPIO的外部输入中断将系统从WFI/WFE中唤醒。

当GPIO配置为外部输入中断模式并使能中断时,通过IO上电平的变化(上升/下降沿,高/低电平)触发中断处理程序。

GPIO Wakeup示例的源代码和工程文件位于SDK_Folder\projects\peripheral\gpio\gpio_wakeup,其中工程文件在文件夹Keil_5下。

代码理解

示例工程流程图如图 12所示:

图 12 GPIO Wakeup示例工程流程图(WFI/WFE)
  1. 配置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。
  2. 调用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));
    
  3. 系统进入睡眠模式。代码如下:
    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++);
    }
    
  4. 按GPIO_KEY0(对应开发板UP键)唤醒系统,按GPIO_KEY1(对应开发板Down键)唤醒系统并退出示例工程程序。

测试验证

  1. 用GProgrammer下载gpio_wakeup.bin至开发板。
  2. 将开发板串口连接至PC端,打开并配置GRUart。
  3. 在GRUart的Receive Data窗口中将会显示GPIO将CPU从WFI/WFE模式中唤醒的调试信息。

扫描关注

打开微信,使用“扫一扫”即可关注。