找回密码
 立即注册
查看: 280|回复: 9

STC32G144K246--关于时钟咨询与确认

[复制链接]

19

主题

85

回帖

1128

积分

金牌会员

积分
1128
发表于 2026-9-23 04:07:34 | 显示全部楼层 |阅读模式
你好,
请问, STC32G144K246的BASECLK是根据CLKSEL切换的对吧, 且BASECLK可以是外部时钟?
--通过第8章节看, BASECLK就是可以选择为外部晶振的。
      咨询了AI助手,但是也不能有准确回答。


  谢谢。


AI助手咨询结果

AI助手咨询结果
回复

使用道具 举报 送花

已绑定手机

51

主题

2750

回帖

9613

积分

论坛元老

积分
9613
发表于 2026-9-23 09:05:12 | 显示全部楼层
从规格书里的时钟结构图可以看出,BASECLK可以从以下4个时钟源选择:
0:HIRC 内部高速时钟
1:XOSC 外部高速晶振
2:X32K 外部32K晶振
3:LIRC 内部低速时钟

截图202609230903009881.jpg
回复

使用道具 举报 送花

已绑定手机

872

主题

1万

回帖

2万

积分

管理员

积分
25432
发表于 2026-9-23 10:41:35 | 显示全部楼层
截图202609231041291390.jpg
回复

使用道具 举报 送花

已绑定手机

872

主题

1万

回帖

2万

积分

管理员

积分
25432
发表于 2026-9-23 10:41:52 | 显示全部楼层

好的,我看到了您上传的这张 STC32G144K246 系列单片机的系统时钟结构图。下面我基于这张图为您梳理一下该芯片的时钟体系。

一、时钟源(图中左侧三个模块)

1. 内部高速 IRC(上半红框)

  • 载入 IRCBAND[1:0] 选择频段,可选 16M / 27M / 44M / 72M 四档,经分频后得到 48M,输出为 HIRC。
  • 使能位为 HIRCCR[7],频段选择为 IRCBAND[1:0]。

2. 外部高速晶振 XOSC(左下红框)

  • 使能位 XOSCCR[7],输出 48M(EXT48M)。

3. 内部低速 IRC(LIRC)/ 外部 32K 晶振(X32K)

  • 外部 32.768kHz 晶振使能位 X32KCR[7];
  • 内部低速 IRC 使能位 IRC32KCR[7];
  • 两者与 48M 一起经 IRCCLKCR[4:0] 选择,得到 IRC48M。

二、主时钟 MCLK 与系统时钟 SYSCLK

  • MCLKSEL[1:0] 选择 HIRC / XOSC / IRC48M / …,输出 BASECLK(图中红色标注)。
  • MCLK2SEL 选择 BASECLK 或 HIR(CLKUSL[3:2]),得到主时钟 MCLK。
  • 另有一路经 HIR 滤波器 /2/3... 得到 MCLKODIV[7:0],由 MCLKO_S[7:0] 选择后分别输出到 P5.4 / P1.6(MCLKOCR[7:0] 使能)。
  • 主时钟 MCLK 再经 CLKDIV[1:0] 的分频(/1/2/3...),得到 系统时钟 SYSCLK。
  • 系统时钟 SYSCLK 供:系统时钟 SYSCLK、CPU/A 时钟、其它外设时钟、IRC48M → USB 时钟。

三、高速外设时钟 HSCLK(右侧)

由 HSI2SCK(HSCLKCR[6:5]) 选择:

  • 一路来自 MCLK / HIR / HCLKDIV ;
  • 一路来自 HPLL1(HPLL1CR[7] 使能,HPLLP[V7:0] 为倍频参数);
  • 一路来自 HPLL2(HPLL2CR[7] 使能,HPLL2PD[V7:0] 为倍频参数)。

HPLL1/HPLL2 的输入来自 HPLLCKI(HPLCR[4]) 选择的 BASECLK 或 IRC48M。

HSCLK 再经 HSCLKDIV[1:0] 分频后,供给:

  • I2S 时钟(I2S_CLKDIV[7:0] → I2S1/I2S2 时钟)
  • PWM 时钟(PWMA/B/C/D/E/F_CLKDIV[7:0] → 对应的 PWM 时钟)
  • SPI 时钟(SPI_CLKDIV[7:0] → SPI1/2/3/4 时钟)
  • TFPU 时钟(TFPU_CLKDIV[7:0])

四、RTC 与定时器 11 时钟

  • RTC 时钟:RTCCKS(RTCCR[1]) 选择 X32K 或 LIRC。
  • 定时器 11 时钟:T11CS(T11CR[3:2]) 选择 SYSCLK / HIRC / X32K / LIRC。

五、三个独立 IRC 模块(图注)

  1. 48MHz 频段的 HIRC(一般用作 CPU 时钟源);
  2. IRC32K(一般用作掉电唤醒定时器时钟源);
  3. IRC48M(一般用作 USB 专用时钟源)。

如果您是想基于这张图配置某个具体的时钟输出(比如系统主频、PWM 时钟、I2S 时钟),请告诉我具体要实现的时钟频率和用途,我可以帮您给出对应的寄存器配置步骤和代码。另外,若您方便,也可以说明一下具体型号(如 STC32G144K246),我可以进一步查阅对应手册章节核实各寄存器的位定义后再给出配置。

请问您这张图具体是想解决什么问题?


🔍 搜索 "STC 单片机 论坛 帖子"

⏱️ 查找用时 0.8s | 总回答用时 5.6s

回复

使用道具 举报 送花

19

主题

85

回帖

1128

积分

金牌会员

积分
1128
 楼主| 发表于 2026-9-24 06:26:53 | 显示全部楼层
感谢,经过测试。已经处理了。之前主要是考虑外部晶振用于倍频的选择。
回复

使用道具 举报 送花

19

主题

85

回帖

1128

积分

金牌会员

积分
1128
 楼主| 发表于 2026-9-24 06:27:46 | 显示全部楼层
但是昨天,我有发现一个新的疑问。在数据手册和AI也没有找到准确信息。

技术咨询 :  STC32G144K246 外部晶振进 PLL 90M 掉电唤醒不稳定----手册 10.4 降频条款适用性确认

我们正在用 STC32G144K246 开发商用车 12V PDU 配电系统(样机阶段),掉电唤醒遇到一个不稳定问题,想请教:

问题概述:系统时钟 = 外部晶振 12MHz 进 HPLL1 -》 90MHz(非内部 IRC)。
采用掉电唤醒定时器(WKT,IRC32K)从 PD=1 睡眠中唤醒时,"90M 直睡"(睡前不切频)唤醒时好时坏——大部分成功,但偶发彻底卡死。

配置:
唤醒链路:WKT_PD_SLEEP() (PD=1)-》到点自动唤醒 -》 程序从 PD 语句下一条继续
IRCDB:当前由 clock 库(自编)按主频自动写入(90M 对应写 195,等待 194 个时钟);此前手动设 0x80(上电默认值,等待 127 个时钟)测试也能唤醒
进睡眠前看门狗已关闭计数影响(睡眠期间 WDT 暂停,与唤醒无关)

手册 10.4 原文:
第 1 条:"芯片使用内部高速 IRC 时钟作为系统时钟时,从主时钟停振/省电模式被唤醒后,系统会等待 IRCDB 寄存器设置的等待时钟数,再将时钟提供给 CPU"
第 3 条:"如果用户的工作频率高于 33.1776MHz 时,建议用户程序在进入主时钟停振/省电模式前将内部高速 IRC 频率调低……"

当前测试的两条路线的实测对比(同一套代码,仅屏蔽/使能"睡前切内部 IRC 24M"一步):
路线 A:完整三步 | 睡前切内部 IRC 24M 直出(PLL 全关)-》 PD=1 睡 5s -》唤醒后切回 XOSC+PLL 90M ---- 多次实测 成功
路线 B:90M 直睡 | 不切频直接 PD=1 睡 5s -》 唤醒后切回 90M |----大部分成功(偶然出出现唤醒后串口无任何输出、LED 无响应,需重新上电恢复)

局部代码:
if(pd_sleep)                    /* 60s 到睡 5s(睡眠期间 WDT 暂停) */
{
     pd_sleep = 0;
     printf("\r\nENTER_PD_5S\r\n");
     // sysclk_init(SYSCLK_PLLIN_HIRC, SYS_FRE_24M, HPLL1_0M, HPLL2_0M);   /* 取消该屏蔽就是A 路线:睡前 PLL 90M 切内部 IRC 24M  */
     WKT_PD_SLEEP();             /* 进省电睡 5s(当前 B 路线:90M 直睡) */
     /* 唤醒后主时钟恢复起振(IRC,IRCDB 等待后稳定),程序从 WKT_PD_SLEEP() 下一条继续(不产生中断) */
     sysclk_init(SYSCLK_PLLIN_XOSC, SYS_FRE_90M, HPLL1_360M, HPLL2_0M);     /* 唤醒后切回外部晶振 PLL 90M(此步不可省略,实测省略后无法恢复运行) */
     printf("\r\nPD_WAKE_5S RESUME\r\n");
}

疑问:
1. 手册 10.4 的描述是否只针对"内部 IRC 作为系统时钟"的场景?我的项目系统时钟 = 外部晶振 XOSC 进 PLL(非 IRC),第 3 条的降频要求字面上是否适用于本场景?
2. 掉电唤醒后 CPU 时钟的恢复机制是什么:是先以内部 IRC 起振供 CPU(此时 IRCDB 等待相关),还是直接等 XOSC/PLL 恢复?若唤醒瞬间 CPU 跑在内部 IRC,而 IRCDB 是按 PLL 高主频(90M)配置的(等待 194 个时钟 ≈ 4µs@48M),这个等待时间对 48M IRC 起振稳定是否不足?会不会就是 B 路线偶发卡死的原因(样本少,暂不能确认)?
3. 若唤醒后 CPU 以内部 IRC(48M,>33.1776MHz)起振,10.4 第 3 条"进省电前把 IRC 调低"是否实际指的是   "唤醒后起振的 IRC 档位" 而非睡前系统时钟?若是,A 路线稳定(睡前切 24M 档)、B 路线偶发失败(唤醒后 IRC 48M 档)是否正好吻合?
4. 针对"外部晶振进 PLL 高主频"工程,掉电唤醒推荐的有保证的标准配置流程是什么?IRCDB 在非 IRC 系统时钟场景下应如何取值?

需要的帮助:
1. 确认 B 路线(90M 直睡)偶发死机的确切机制(唤醒瞬间时钟源与 IRCDB 的关系)
2. 确认 XOSC+PLL 主时钟工程下,进省电前是否必须/建议先切内部 IRC 低频(手册 10.4 第 3 条适用范围)
3. 给出该场景下稳定唤醒的推荐配置(含 IRCDB 取值)

BR



点评

死机问题大多是因为高主频下,耗电较大。芯片从掉电唤醒状态下,外设所需电流过大给内部LDO电压拉到过低导致的 在Vcore引脚上挂电容和降频都可以有效解决。IRCDB只能解决不稳定的等待时间,直接给LDO拉死就卡住了,  详情 回复 发表于 2026-9-24 16:32
回复

使用道具 举报 送花

已绑定手机
已实名认证

148

主题

4098

回帖

1万

积分

超级版主

积分
10914
发表于 2026-9-24 16:32:13 | 显示全部楼层
Mike*** 发表于 2026-9-24 06:27
但是昨天,我有发现一个新的疑问。在数据手册和AI也没有找到准确信息。

技术咨询 :  STC32G144K246 外部晶 ...

死机问题大多是因为高主频下,耗电较大。芯片从掉电唤醒状态下,外设所需电流过大给内部LDO电压拉到过低导致的
在Vcore引脚上挂电容和降频都可以有效解决。IRCDB只能解决不稳定的等待时间,直接给LDO拉死就卡住了,所以此时没法受到IRCDB影响
此问题为内核供电通用问题,无论外部时钟还是内部时钟,均可参考
建议优先降低频率即可,频率和耗电呈比例下降
回复

使用道具 举报 送花

19

主题

85

回帖

1128

积分

金牌会员

积分
1128
 楼主| 发表于 2026-9-24 17:36:58 | 显示全部楼层
王*** 发表于 2026-9-24 16:32
死机问题大多是因为高主频下,耗电较大。芯片从掉电唤醒状态下,外设所需电流过大给内部LDO电压拉到过低 ...

Hi Wang ,
   你提到“死机问题大多是因为高主频下,耗电较大。芯片从掉电唤醒状态下,外设所需电流过大给内部LDO电压拉到过低导致的” 。似乎不是我咨询的问题,可能我理解有问题。
    但是我实际是:
    我在睡眠前,是通过外部晶振倍频到90M作为主时钟 ;    现在需要睡眠;    我当前是先把90M降低为内部HIRC 24M ,然后再睡眠, 醒了后,再切换到外部晶振且重新倍频到90M.

    那是不是这可以这样理解:
    无论使用的是外部晶振还是内部晶振去倍频后给主频 ,
     在睡眠前,都需要将主频降低;
     然后再进入睡眠;
     睡眠后,我再把频率倍频到我之前的主频。
     这样对么?
     也就是采用路线A的方式更加可靠?
BR


点评

是的,方式A比较好 如果想要纯用外部时钟睡眠+唤醒,内部时钟虽然不用,但是唤醒的时候会有一个启动动作,也会造成电流下冲 如果是想要不切回内部RC,那么也需要内部时钟设置为一个较小值 我觉得较为简单的办法是通  详情 回复 发表于 2026-9-24 19:05
回复

使用道具 举报 送花

已绑定手机
已实名认证

148

主题

4098

回帖

1万

积分

超级版主

积分
10914
发表于 2026-9-24 19:05:19 | 显示全部楼层
Mike*** 发表于 2026-9-24 17:36
Hi Wang ,
   你提到“死机问题大多是因为高主频下,耗电较大。芯片从掉电唤醒状态下,外设所需电流过大 ...

是的,方式A比较好
如果想要纯用外部时钟睡眠+唤醒,内部时钟虽然不用,但是唤醒的时候会有一个启动动作,也会造成电流下冲
如果是想要不切回内部RC,那么也需要内部时钟设置为一个较小值
我觉得较为简单的办法是通过外部时钟PLL下,睡眠前先给PLL关掉,然后休眠即可(取决于实际的外部晶振频率,如果较高还需要再分频一下),唤醒后再给PLL打开即可
回复

使用道具 举报 送花

19

主题

85

回帖

1128

积分

金牌会员

积分
1128
 楼主| 发表于 2026-9-25 00:48:51 | 显示全部楼层
王*** 发表于 2026-9-24 19:05
是的,方式A比较好
如果想要纯用外部时钟睡眠+唤醒,内部时钟虽然不用,但是唤醒的时候会有一个启动动作 ...

Hi Wang,
  好的,感谢。  目前测试比较可靠的确认也是A路线更加可靠。   那么我们现在就固定策略,执行A路线。
BR
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-11-8 03:08 , Processed in 0.079848 second(s), 94 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表