3、CCU4寄存器详解(上):全局控制寄存器(GCTRL)、时钟控制寄存器(CLK)、切片控制寄存器(TC)

CCU4 单元的功能配置与运行状态完全由其寄存器组控制。本章聚焦于三个最基础的顶层寄存器:全局控制寄存器(GCTRL)、时钟控制寄存器(CLK)和切片控制寄存器(TC)。理解这些寄存器是后续配置捕获、比较和 PWM 生成功能的前提。

3.1 全局控制寄存器(GCTRL)

GCTRL 寄存器位于 CCU4 模块的全局地址空间,控制整个模块的复位行为、调试行为和部分时钟分频。该寄存器在模块初始化时通常最先被配置。

关键提示:GCTRL 的复位值(0x0000)确保所有切片处于安全停止状态。在调试器挂起时,通过配置 GCTRL 可以决定 CCU4 是否继续运行,这对实时调试至关重要。

3.1.1 位域定义与功能

位域 名称 访问 描述
[15:8] PRESCALER R/W 模块级预分频器。分频系数 = PRESCALER + 1,范围 1~256。所有切片的 f_CCU4 时钟均基于此分频。
[3] STOP_ST R 模块停止状态位。1 表示模块处于停止状态(复位或调试挂起且配置为停止)。
[2] SUS_CFG R/W 调试暂停行为配置。0:调试挂起时模块继续运行;1:调试挂起时模块停止。
[1] T13_EXT_CLK R/W 外部时钟选择位。用于选择 T13 定时器的外部时钟源(仅部分封装支持)。
[0] ENABLE R/W 模块使能位。0:模块复位状态,所有切片停止;1:模块正常工作。

3.1.2 典型配置流程

  1. 使能模块:设置 GCTRL.ENABLE = 1。
  2. 配置预分频:根据系统时钟频率和目标切片时钟频率计算 PRESCALER 值。例如,f_sys = 80 MHz,目标 f_CCU4 = 10 MHz,则 PRESCALER = 7(分频系数 8)。
  3. 设置调试行为:若需要在调试断点时保持 PWM 输出,设置 SUS_CFG = 0;若希望停止输出以保护外设,设置 SUS_CFG = 1。
性能调优要点:PRESCALER 的配置直接影响所有切片的定时器分辨率。在需要高精度 PWM 或捕获的应用中,应尽量减小分频系数,使 f_CCU4 尽可能高。但需注意,过高的频率会增加功耗。

3.2 时钟控制寄存器(CLK)

CLK 寄存器负责为 CCU4 模块内部的各个功能单元提供门控时钟和同步控制。它决定了哪些切片或功能块可以接收时钟信号,是实现低功耗设计的关键寄存器。

3.2.1 位域定义

位域 名称 访问 描述
[15:8] GATE_SR R/W 门控状态寄存器。反映各切片的时钟门控状态(只读镜像)。
[7:0] GATE_EN R/W 时钟门控使能位。每 1 位对应一个切片(Slice 0~7)。0:切片时钟关闭(省电);1:切片时钟使能。

3.2.2 时钟门控策略

在 CCU4 模块中,即使 GCTRL.ENABLE = 1,每个切片也需要通过 CLK.GATE_EN 单独使能时钟。未使用的切片应保持时钟关闭以降低动态功耗。

  • 使能切片时钟:CLK.GATE_EN |= (1 << slice_id);
  • 关闭切片时钟:CLK.GATE_EN &= ~(1 << slice_id);
  • 读取当前门控状态:通过 CLK.GATE_SR 读取,该位域为只读,反映实际门控状态。
常见错误:在配置切片寄存器(如 TC、PRS、CRS)之前,必须确保该切片的时钟已使能。否则,对切片寄存器的写入操作可能无效,导致配置丢失。

3.3 切片控制寄存器(TC)

TC 寄存器是每个切片的核心控制寄存器,决定了该切片的工作模式(捕获、比较、单次或连续)、计数方向、定时器复位条件以及事件触发方式。每个切片拥有独立的 TC 寄存器。

3.3.1 位域详细定义

位域 名称 访问 描述
[15] CMOD R/W 计数模式。0:边缘对齐计数(向上/向下);1:中心对齐计数(向上/向下)。
[14] DIR R/W 计数方向(仅在 CMOD=0 时有效)。0:向上计数;1:向下计数。
[13:12] MODE R/W 切片工作模式。00:比较模式(定时器/PWM);01:捕获模式;10:单次模式;11:保留。
[11:10] RST_M R/W 复位触发源选择。00:软件复位(写 RST 位);01:周期匹配复位;10:比较匹配复位;11:外部事件复位。
[9:8] EV_M R/W 事件触发模式。00:上升沿触发;01:下降沿触发;10:双边沿触发;11:电平触发。
[7] RST W 软件复位位。写 1 立即复位定时器计数器(TMR)为 0。
[6] ST R/W 启动/停止控制。0:停止定时器;1:启动定时器。
[5:4] EXT_TRIG R/W 外部触发源选择。00:无外部触发;01:输入信号 A;10:输入信号 B;11:输入信号 C。
[3:0] PRESC R/W 切片级预分频器。分频系数 = 2^PRESC,范围 1~32768。仅在 GCTRL 预分频之后再次分频。

3.3.2 工作模式配置示例

以下示例展示如何将 Slice 0 配置为比较模式(PWM 生成),向上计数,周期匹配复位,上升沿触发。

// 假设 CCU4 基地址为 0x40010000,Slice 0 偏移 0x0000
#define CCU4_BASE    0x40010000
#define SLICE0_TC    (*(volatile uint32_t *)(CCU4_BASE + 0x0000))

// 配置 TC 寄存器
uint32_t tc_val = 0;
tc_val |= (0 << 15);   // CMOD = 0: 边缘对齐
tc_val |= (0 << 14);   // DIR = 0: 向上计数
tc_val |= (0 << 12);   // MODE = 00: 比较模式
tc_val |= (1 << 10);   // RST_M = 01: 周期匹配复位
tc_val |= (0 << 8);    // EV_M = 00: 上升沿触发
tc_val |= (0 << 4);    // EXT_TRIG = 00: 无外部触发
tc_val |= (0 << 0);    // PRESC = 0: 不分频

SLICE0_TC = tc_val;

// 启动定时器
SLICE0_TC |= (1 << 6);  // ST = 1

3.4 寄存器层级关系图

下图展示了 GCTRL、CLK 和 TC 在 CCU4 模块中的层级关系与数据流向。

CCU4 寄存器层级与时钟分配关系 f_sys 系统时钟 GCTRL 寄存器 PRESCALER 配置 CLK 寄存器 GATE_EN 门控使能 f_CCU4 = f_sys / (PRESCALER+1) Slice 0 TC 寄存器 PRESC 切片预分频 Slice 1 TC 寄存器 PRESC 切片预分频 Slice 2 TC 寄存器 PRESC 切片预分频 说明:GCTRL 提供模块级预分频,CLK 控制切片时钟门控,TC 配置切片工作模式与切片级预分频

3.5 寄存器配置顺序与注意事项

为确保 CCU4 模块正确初始化,寄存器配置应遵循以下顺序:

  1. 配置 GCTRL:设置模块使能、预分频系数和调试行为。
  2. 配置 CLK:使能需要使用的切片时钟门控。
  3. 配置 TC:设置切片工作模式、计数方向、复位源和预分频。
  4. 配置其他切片寄存器:如周期寄存器(PRS)、比较寄存器(CRS)、捕获寄存器(CCS)等。
  5. 启动定时器:设置 TC.ST = 1。
重要提醒:在修改 TC 寄存器中的 MODE、RST_M、CMOD 等关键位域时,建议先停止定时器(TC.ST = 0),待配置完成后再重新启动。在定时器运行中动态切换模式可能导致不可预测的计数行为。

3.6 寄存器对比总结

寄存器 作用范围 核心功能 典型配置时机
GCTRL 模块全局 模块使能、预分频、调试控制 系统初始化早期
CLK 模块全局 切片时钟门控使能 GCTRL 之后,TC 之前
TC 切片本地 工作模式、计数方向、复位源、预分频 每次切片配置或模式切换时