Timeout

该示例使用 ENHTIM ,实现每 1 秒产生一次超时中断。

为了便于观察,在 EVB 板上将 P0_0 引脚连接到 LED0。

当计时时间达到 1 秒时,会触发中断。在中断处理函数中,程序会翻转 P0_0 引脚的电平,改变 GPIO 的输出极性,进而实现 LED0 每秒闪烁一次的效果。

这是 enhtimer timeout.

Enhance-Timer 超时框图

用户可以通过不同的宏配置来修改引脚信息,定时时间等。具体宏配置详见 配置选项

环境需求

该示例的环境需求,可参考 环境需求

硬件连线

连接 P0_0 和 EVB 板上的 LED0 小灯。

LED 驱动电路如下图所示。

这里应该是LED驱动电路图片

LED 驱动电路图

配置选项

  1. 可配置如下宏修改引脚定义。

    #define OUTPUT_PIN          P0_0
    #define GPIO_PIN            GPIO_GetPin(OUTPUT_PIN)
    #define GPIO_PORT           GPIO_GetPort(OUTPUT_PIN)
    
  2. 可配置如下宏修改定时时间。

    #define ENHTIM_UINT          40                            /*< 40M source clock is divided to get unit: 1us */
    #define ENHTIM_ING           1000000                       /*< Set this macro to 1000000, with a timer duration of 1s. the unit for this macro is in microseconds (us). */
    #define ENHTIM_PERIOD        ENHTIM_ING * ENHTIM_UINT
    

编译和下载

该示例的编译和下载流程,可参考 编译和下载

测试验证

  1. 当 EVB 启动后,在 Debug Analyzer 工具内观察如下 log。

    Start enhtim interrupt test!
    
  2. 使能 ENHTIM 后,每计时时间达到 1s,会触发 ENHTIM 中断,在中断函数内翻转 P0_0 输出电平,可观察到 LED0 每 1 秒闪烁一次。

代码介绍

该章节主要介绍示例中的初始化和相应功能实现的代码和流程说明

源码路径

工程文件和源码路径如下:

  • 工程路径: sdk\samples\peripheral\enhtimer\enhtim_interrupt\proj

  • 源码路径: sdk\samples\peripheral\enhtimer\enhtim_interrupt\src

初始化

外设的初始化流程可参考 General Introduction 中的 初始化流程 部分。

  1. 调用 Pad_Config()Pinmux_Config(),配置对应引脚的 PAD 和 PINMUX 。

    void board_gpio_init(void)
    {
        Pad_Config(OUTPUT_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_NONE, PAD_OUT_ENABLE, PAD_OUT_HIGH);
    
        Pinmux_Config(OUTPUT_PIN, DWGPIO);
    }
    
  2. 调用 RCC_PeriphClockCmd() ,开启 GPIO 时钟。

  3. 对 GPIO 外设进行初始化:

    1. 定义 GPIO_InitTypeDef 类型 GPIO_InitStruct ,调用 GPIO_StructInit()GPIO_InitStruct 预填默认值。

    2. 根据需求修改 GPIO_InitStruct 参数,GPIO 的初始化参数配置如下表。调用 GPIO_Init(),初始化 GPIO 外设。

GPIO 初始化参数

GPIO Hardware Parameters

Setting in the GPIO_InitStruct

GPIO

GPIO pin

GPIO_InitTypeDef::GPIO_Pin

GPIO_PIN

GPIO direction

GPIO_InitTypeDef::GPIO_Dir

GPIO_DIR_OUT

GPIO interrupt

GPIO_InitTypeDef::GPIO_ITCmd

DISABLE

  1. 调用 RCC_PeriphClockCmd() ,开启 ENHTIM 时钟。

  2. 对 ENHTIM 外设进行初始化:

    1. 定义 ENHTIM_InitTypeDef 类型 ENHTIM_InitStruct ,调用 ENHTIM_StructInit()ENHTIM_InitStruct 预填默认值。

    2. 根据需求修改 ENHTIM_InitStruct 参数,ENHTIM 的初始化参数配置如下表。调用 ENHTIM_Init(),初始化 ENHTIM 外设。

    3. 调用 NVIC_Init() ,配置 NVIC。NVIC 相关配置可参考 中断配置

    4. 调用 ENHTIM_ClearINTPendingBit()ENHTIM_INTConfig() ,清除 ENHTIM 中断,使能 ENHTIM 中断。

ENHTIM 初始化参数

ENHTIM Hardware Parameters

Setting in the ENHTIM_InitStruct

ENHTIM

Counter mode

ENHTIM_InitTypeDef::ENHTIM_Mode

ENHTIM_MODE_PWM_MANUAL

PWM mode

ENHTIM_InitTypeDef::ENHTIM_PWMOutputEn

DISABLE

Count value

ENHTIM_InitTypeDef::ENHTIM_MaxCount

ENHTIM_PERIOD

  1. 调用 ENHTIM_Cmd() 使能 ENHTIM 外设。

功能实现

使能 ENHTIM 外设后,ENHTIM 开始定时。ENH_TIM0 定时时间到,触发中断,进入中断处理函数 Enhanced_Timer0_Handler

  1. 清除 ENH_TIM0 中断,失能 ENH_TIM0。

  2. 判断当前 LED 状态,翻转 LED0 电平。

void Enhanced_Timer0_Handler()
{
    ENHTIM_ClearINTPendingBit(ENHTIMER_NUM, ENHTIM_INT_TIM);
    ENHTIM_Cmd(ENHTIMER_NUM, DISABLE);
    if (!LED_Status)
    {
        GPIO_WriteBit(GPIO_PORT, GPIO_PIN, (BitAction)(1));
        LED_Status = 1;
    }
    else
    {
        GPIO_WriteBit(GPIO_PORT, GPIO_PIN, (BitAction)(0));
        LED_Status = 0;
    }
    //Add user code here
    ENHTIM_Cmd(ENHTIMER_NUM, ENABLE);
}