Enhance Timer Timeout

该示例使用ENH_TIM0,实现定时1s的定时功能。

为了便于观察现象,连接P0_0和LED0。

定时时间到,触发中断,在中断处理函数中翻转P0_0(LED0),实现LED0每秒闪烁。

环境需求

该示例支持以下开发套件:

开发套件

Hardware Platforms

Board Name

RTL87x2G HDK

RTL87x2G EVB

更多信息请参考快速入门

硬件连线

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

LED驱动电路如下图所示。

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

LED驱动电路图

编译和下载

该示例的工程路径如下:

Project file: samples\peripheral\enhtimer\enhtim_interrupt\proj\rtl87x2g\mdk

Project file: samples\peripheral\enhtimer\enhtim_interrupt\proj\rtl87x2g\gcc

请按照以下步骤操作构建并运行该示例:

  1. 打开工程文件。

  2. 按照 快速入门编译APP Image 给出的步骤构建目标文件。

  3. 编译成功后,在路径 mdk\bingcc\bin 下会生成 app bin app_MP_xxx.bin 文件。

  4. 按照 快速入门MP Tool 给出的步骤将app bin烧录至EVB内。

  5. 按下复位按键,开始运行。

测试验证

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

    Start enhtim interrupt test!
    
  2. 当P0_0和LED0连接后,LED0每1秒闪烁一次。

代码介绍

该章节分为以下几个部分:

  1. 源码路径

  2. 初始化函数将在 初始化 章节介绍。

  3. 初始化后的功能实现将在 功能实现 章节介绍。

源码路径

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

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

该工程的工程文件代码架构如下:

└── Project: input_polling
    └── secure_only_app
        └── Device                   includes startup code
            ├── startup_rtl.c
            └── system_rtl.c
        ├── CMSIS                    includes CMSIS header files
        ├── CMSE Library             Non-secure callable lib
        ├── Lib                      includes all binary symbol files that user application is built on
            └── rtl87x2g_io.lib
        ├── Peripheral               includes all peripheral drivers and module code used by the application
            ├── rtl_rcc.c
            ├── rtl_pinmux.c
            ├── rtl_gpio.c
            ├── rtl_nvic.c
            └── rtl_enh_tim.c
        └── APP                      includes the ble_peripheral user application implementation
            ├── main_ns.c
            └── io_enhtim_interrupt.c

初始化

初始化流程包括了 board_gpio_initdriver_gpio_initdriver_enhtim_init


board_gpio_init 中包含了PAD与PINMUX设置。

  1. 配置PAD:设置引脚、PINMUX模式、PowerOn、内部上拉。

  2. 配置PINMUX:分配引脚为GPIO功能。


driver_gpio_init 包含了对GPIO外设的初始化。

  1. 使能PCC时钟。

  2. 设置GPIO的输出引脚 GPIO_Pin 为P0_0。

  3. 在GPIO初始化中,设置 GPIO_Dir 为输出模式。

RCC_PeriphClockCmd(APBPeriph_GPIOA, APBPeriph_GPIOA_CLOCK, ENABLE);
...
GPIO_InitStruct.GPIO_Pin  = GPIO_PIN;
GPIO_InitStruct.GPIO_Dir  = GPIO_DIR_OUT;

driver_enhtim_init 包含了对ENHTIM外设的初始化。

  1. 使能PCC时钟。

  2. 设置 ENHTIM_ClockDivENHTIM_CLOCK_DIVIDER_1 ,即一分频模式。

  3. 设置 ENHTIM_PWMOutputEn 为DISABLE,即关闭ENHTIM的PWM功能。

  4. 设置 ENHTIM_MaxCount 为ENHTIM_PERIOD,即设置ENHTIM的周期。

  5. 设置 ENHTIM_ModeENHTIM_MODE_PWM_MANUAL ,即用户自定义手动模式。

  6. 配置ENHTIM中断;使能ENHTIM计时中断;使能ENHTIM外设。

RCC_PeriphClockCmd(APBPeriph_ENHTIMER, APBPeriph_ENHTIMER_CLOCK, ENABLE);
...
ENHTIM_InitStruct.ENHTIM_ClockDiv               = ENHTIM_CLOCK_DIVIDER_1;
ENHTIM_InitStruct.ENHTIM_PWMOutputEn            = DISABLE;
ENHTIM_InitStruct.ENHTIM_MaxCount               = ENHTIM_PERIOD;
ENHTIM_InitStruct.ENHTIM_Mode                   = ENHTIM_MODE_PWM_MANUAL;
ENHTIM_Init(ENHTIMER_NUM, &ENHTIM_InitStruct);

/*  Enable ENHTIM IRQ  */
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = ENHTIMER_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPriority = 3;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);

ENHTIM_ClearINTPendingBit(ENHTIMER_NUM, ENHTIM_INT_TIM);
ENHTIM_INTConfig(ENHTIMER_NUM, ENHTIM_INT_TIM, ENABLE);
ENHTIM_Cmd(ENHTIMER_NUM, ENABLE);

功能实现

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);
}