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) 分别短接起来
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()。