当前页面为 开发中 版本,查看特定版本的文档,请在页面左下角的下拉菜单中进行选择。

TIMER

1 功能概述

本例程演示 Timer Driver 的基本用法:

  • 选择 Timer0 的时钟源

  • 配置为周期计数模式(Periodic)

  • 设置比较值(Compare Value)产生超时事件

  • 使能 NVIC 与 Timer 中断,在中断服务函数中清除标志并打印 Log

例程代码入口:samples\drivers\timer\src\main.c

2 环境准备

  • 硬件设备与线材:

    • PAN271x EVB 核心板底板各一块

    • JLink 仿真器(用于烧录例程程序)

    • USB-TypeC 线一条(用于底板供电和查看串口打印 Log)

    • 杜邦线数根或跳线帽数个(用于连接各个硬件设备)

  • 硬件接线:

    • 将 EVB 核心板插到底板上

    • 连接串口转USB调试模块:

      • 使用 USB-TypeC 线,将 PC USB 插口与 EVB 底板 USB->UART 插口相连

      • 使用杜邦线或跳线帽将 EVB 底板 J8 排针对 (P06 & TXD) 和 J9 排针对 (P05 & RXD) 分别短接起来

      • 本例程使用 UART0:P0.5 为 TX,P0.6 为 RX

    • 连接 Jlink,使用杜邦线将 JLink 仿真器的:

      • SWD_CLK 引脚与 EVB 底板的 P00 排针相连

      • SWD_DAT 引脚与 EVB 底板的 P01 排针相连

      • SWD_GND 引脚与 EVB 底板的 GND 排针相连

    • 使用杜邦线或跳线帽将 EVB 底板 J13 排针对 (P13) 和 J10 排针对 (P14) 分别短接起来

3 编译和烧录

例程位置:<PAN271x-DK>\01_SDK\samples\drivers\timer

双击 Keil Project 文件打开工程,编译并下载到芯片。

4 例程演示说明

4.1 串口输出示例

烧录完成并复位后,例程会启动 Timer0 并打印:

Start Timer0.

随后进入 Timer0 中断并周期性输出:

TIMER0 interrupt.
TIMER0 interrupt.
TIMER0 interrupt.
...

说明:本例程无交互菜单,不需要串口输入。

4.2 主要流程代码(main.c 节选)

void TMR0_IRQHandler(void)
{
    if (TIMER_GetTFFlag(TIMER0))
    {
        TIMER_ClearTFFlag(TIMER0, TIMER_CTL_TIMER_FLAG_Msk);
        LOG("TIMER0 interrupt.\n");
    }
}

int main(void)
{
    Clock_Init();
    Sys_Init();

    CLK_SetTmrClkSrc(CLK_APB1_TMR0SEL_APB1CLK);
    TIMER_SetWorkMode(TIMER0, TIMER_PERIOD_WORK_MODE);
    TIMER_SetCmpValue(TIMER0, 24000000);

    TIMER_EnableInt(TIMER0);
    NVIC_EnableIRQ(TMR0_IRQn);

    LOG("Start Timer0.\n");
    TIMER_Start(TIMER0);

    while (1);
}

4.3 周期配置与计算

  • 定时周期近似为:T CompareValue / f_timer(其中 f_timer 为 Timer 时钟频率)

  • 例程按 f_timer = 48 MHz 估算:T 24000000 / 48000000 = 500ms

注意:CompareValue 的有效位宽由寄存器字段决定(最大为 0x1FFFFFF)。若设置值超出位宽会被截断,导致周期不符合预期。

4.4 主要 API 说明

  • CLK_SetTmrClkSrc(sel):选择 Timer 时钟源(例程选择 APB1CLK)。

  • TIMER_SetWorkMode(timer, mode):设置工作模式(Periodic / Continuous)。

  • TIMER_SetCmpValue(timer, value):设置比较值,达到比较值触发超时事件。

  • TIMER_EnableInt(timer) / NVIC_EnableIRQ(irqn):分别使能外设中断与 NVIC。

  • TIMER_GetTFFlag(timer) / TIMER_ClearTFFlag(timer, flag):查询/清除超时标志;中断里必须清除标志。

  • TIMER_Start(timer):启动计数。

4.5 常见修改

  • 修改周期:调整 TIMER_SetCmpValue() 的 CompareValue(按 4.3 公式换算)。

  • 修改时钟源:调整 CLK_SetTmrClkSrc() 的选择(降低 f_timer 可获得更长周期)。

  • 关闭中断:调用 TIMER_DisableInt()NVIC_DisableIRQ(),再按需 TIMER_Stop()