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 典型配置流程
- 使能模块:设置 GCTRL.ENABLE = 1。
- 配置预分频:根据系统时钟频率和目标切片时钟频率计算 PRESCALER 值。例如,f_sys = 80 MHz,目标 f_CCU4 = 10 MHz,则 PRESCALER = 7(分频系数 8)。
- 设置调试行为:若需要在调试断点时保持 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 模块中的层级关系与数据流向。
3.5 寄存器配置顺序与注意事项
为确保 CCU4 模块正确初始化,寄存器配置应遵循以下顺序:
- 配置 GCTRL:设置模块使能、预分频系数和调试行为。
- 配置 CLK:使能需要使用的切片时钟门控。
- 配置 TC:设置切片工作模式、计数方向、复位源和预分频。
- 配置其他切片寄存器:如周期寄存器(PRS)、比较寄存器(CRS)、捕获寄存器(CCS)等。
- 启动定时器:设置 TC.ST = 1。
重要提醒:在修改 TC 寄存器中的 MODE、RST_M、CMOD 等关键位域时,建议先停止定时器(TC.ST = 0),待配置完成后再重新启动。在定时器运行中动态切换模式可能导致不可预测的计数行为。
3.6 寄存器对比总结
| 寄存器 | 作用范围 | 核心功能 | 典型配置时机 |
|---|---|---|---|
| GCTRL | 模块全局 | 模块使能、预分频、调试控制 | 系统初始化早期 |
| CLK | 模块全局 | 切片时钟门控使能 | GCTRL 之后,TC 之前 |
| TC | 切片本地 | 工作模式、计数方向、复位源、预分频 | 每次切片配置或模式切换时 |