TIM_MODE = 0b101,依赖 CLK_SEL。手册 13.4.2.6。
1. 一句话说明
按可编程的固定周期(N 个 CMU 时钟周期)周期性地采样输入信号,周期值可"飞行中"动态修改。类似定时轮询采样。
2. 时钟来源与选择
|------|------------------------|--------------------------------------------|
| 项目 | 来源 | 说明 |
| 采样时钟 | CMU 时钟 | CTRL.CLK_SEL 选择 CCMi_CLK_RES0..7 |
| 时钟选择 | CTRL.CLK_SEL [26:24] | 决定采样周期分辨率 |
采样周期 = (CNTS+1) × CMU 时钟周期。
3. 计数模式
-
CNT 按 CMU 时钟递增,与 CNTS 比较:
CNT >= CNTS→ 触发采样(NEWVAL),更新 GPR0/GPR1,CNT 清零;
- 否则 CNT++;
CNTS=0表示 1 个时钟周期触发一次,CNTS=1表示 2 个周期,依此类推;
- GPR1 作为 CNTS 的影子寄存器:CPU 写入 GPR1,可动态改变下一采样周期("on the fly")。
门控:DSL/ISL 可选择在特定输入电平/边沿时才计数(详见 Table 22),实现"门控"采样。
4. 外部读取的内容
|----------|--------------------------------------------|
| 寄存器 | 内容 |
| GPR0 | 由 GPR0_SEL 配置(可选时间戳、CNT、ECNT、INP_VAL 输入快照) |
| GPR1 | 影子:上次 CNTS 值,可写入新周期 |
| CNTS | 当前采样周期配置 |
特殊:GPR0_SEL=0b11, EGPR0_SEL=0 且通道 0 时,可选 Filter F_OUT 作为输入;GPR0 可捕获全部 8 路输入电平(TGPS 通道 0)。
ECNT_RESET:=1 时每次周期到期 ECNT 清零,否则回绕。
5. 对应中断
|------------|----------------------|
| 中断 | 触发 |
| NEWVAL | 每个采样周期到期(CNT>=CNTS) |
| ECNTOFL | ECNT 溢出 |
| GPROFL | 数据溢出覆盖 |
| CNTOFL | 永不置位 |
6. 应用场景
- 周期性采样:按固定节拍采集输入电平(如按键/开关去抖后的周期扫描);
- 周期可调的采样:通过写 GPR1 动态调整采样率;
- 电平监测:配合 GPR0 捕获 8 路输入电平做批量状态轮询。
7. 关键寄存器配置
CTRL.TIM_MODE = 0b101 // TGPS
CTRL.CLK_SEL = 选择 CMU 分辨率
CNTS = N // 采样周期 = (N+1) 个时钟
CTRL.GPR0_SEL = 按需(时间戳/CNT/INP_VAL)
CTRL.ECNT_RESET = 0/1
CTRL.TIM_EN = 1
8. 信号路径框图
CMU_CLK_RES[CLK_SEL]──► CNT 递增
│ CNT >= CNTS ?
▼
┌──────────────────────────┐
│ 是: NEWVAL, GPR更新, CNT=0 │
│ 否: CNT++ │
└──────────────────────────┘
│
(可选门控 DSL/ISL + 输入电平)
│
TIM_IN[x] ─►INPUTSRC─►FLT─►F_OUT────────────────► 采样快照
│
▼
┌────────────────────┐
│ GPR0=采样值/时间戳 │──► CPU/ARU
│ GPR1=影子周期(可写) │──► NEWVAL_IRQ
└────────────────────┘
时序示意(CNTS=2, 每3个时钟采样一次):
CLK: ┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐
CNT: 0 1 2 0 1 2 0 1 2 ...
▲ ▲
└采样 └采样 (NEWVAL)