好的,我已经查到了 STC32G 手册「时钟管理」章节中 CLKSEL 寄存器的完整定义。这里给这位坛友(以及看到此贴的朋友)做一个明确解答。
问题解答:CLKSEL 的 B1/B0 与 B3/B2 到底有什么不同?
先直接给结论:这两组不是"功能一样",而是两级串联的时钟选择开关,级别和优先级不同。 位描述文字看着相似,是因为它们确实是"同一类动作(选时钟源)",但作用的对象不一样。
1. CLKSEL 寄存器的实际位分配
| 符号 |
地址 |
B7 |
B6 |
B5 |
B4 |
B3 |
B2 |
B1 |
B0 |
| CLKSEL |
7EFE00H |
CKMS |
HSIOCK |
- |
- |
MCK2SEL[1:0] |
|
MCKSEL[1:0] |
|
- B1、B0:
MCKSEL[1:0] —— 低位组
- B3、B2:
MCK2SEL[1:0] —— 高位组
2. 两者的本质区别
MCKSEL[1:0](B1、B0)—— 选择"基础时钟源"
| MCKSEL[1:0] |
主时钟源 |
| 00 |
内部高精度IRC |
| 01 |
外部高速晶振 |
| 10 |
外部32KHz晶振 |
| 11 |
内部32KHz低速IRC |
MCK2SEL[1:0](B3、B2)—— 选择"最终主时钟 MCLK"
| MCK2SEL[1:0] |
主时钟源 |
| 00 |
MCKSEL 选择的时钟源 |
| 01 |
内部 PLL 输出 |
| 10 |
内部 PLL 输出 / 2 |
| 11 |
内部 48MHz 高速 IRC |
3. 关键:B3/B2 的 "00" 才指回 B1/B0
看 MCK2SEL 的 00 项写的是"MCKSEL 选择的时钟源"——这就是两组的联系与区别所在:
- MCKSEL(B1、B0):先把 4 个候选基础时钟源(内部高精度IRC / 外部高速晶振 / 外部32K晶振 / 内部32K低速IRC)选出一个。
- MCK2SEL(B3、B2):决定最终主时钟 MCLK 是"用上面选出来的那个基础时钟",还是"绕过它改用 PLL 或内部 48MHz 高速IRC"。
也就是说:
- 当
MCK2SEL = 00 时,B1/B0 的设置才生效,MCLK = MCKSEL 选中的时钟源;
- 当
MCK2SEL = 01/10/11 时,MCLK 直接取 PLL 输出、PLL/2 或 48MHz 高速IRC,此时 B1/B0 的选择对 MCLK 已不起作用。
所以这两组是"候选源选择"与"最终源选择"的关系,并不是重复定义。描述文字相近,是因为 MCK2SEL 的 00 档正好要引用 MCKSEL 的结果。
4. 补充说明
- 到这里选出来的还只是 主时钟 MCLK。系统时钟 SYSCLK 还需要经 CLKDIV 寄存器再分频(SYSCLK = MCLK/CLKDIV),这一级别漏了。
- 另外 CKMS(B7)是选 PLL 输出 96MHz 还是 144MHz,HSIOCK(B6)是选高速 I/O 时钟源,这两个跟 B3/B2、B1/B0 是并列的不同功能,别混在一起看。
一句话总结:B1/B0 选"用哪个基础时钟",B3/B2 选"最终 MCLK 到底用基础时钟还是 PLL/48M高速IRC",后者为 00 时才用到前者。
如果您在实际配置中遇到 MCLK 没切换到预期频率的情况,可以把您写的 CLKSEL 赋值和期望频率发出来,我帮您核对一下。
信息来源:STC32G 系列手册「时钟管理,芯片上电工作过程,外部晶振抗干扰」章节之系统时钟选择寄存器(CLKSEL)。
🔍 搜索 "STC 单片机 论坛 帖子"
⏱️ 查找用时 4.6s | 总回答用时 9.7s