You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ATSAM4S2A芯片PLL最高仅达60MHz、无法配置到120MHz问题咨询

ATSAM4S2A PLLB配置120MHz无输出故障原因分析

核心故障原因

  • 寄存器写入逻辑错误
    PLL配置寄存器REG_CKGR_PLLBR属于受保护寄存器,写入时必须同时写入密钥CKGR_PLLBR_KEY_PASSWD(值为0x37 << 24),且需要一次性写入完整的MULB、DIVB配置值。你当前使用|=分两次写入两个参数,既没有带密钥,还可能导致参数写入异常,低频率配置下容错性高未触发问题,高频率下参数校验不通过直接导致PLL不工作。
  • 未等待PLL锁定就切换时钟源
    写入PLLB配置后需要等待REG_PMC_SR的PMC_SR_LOCKB标志位置1,确认PLL输出稳定后再切换主时钟到PLLB。你当前配置完PLL参数直接切换时钟源,高频率下PLL锁定时间更长,未稳定就切换会导致时钟异常。
  • 未配置FLASH读等待周期
    ATSAM4S2A的内置FLASH在不同主频下需要配置对应的等待周期:120MHz主频下需要配置4个FLASH等待周期,你当前代码未做该配置,高主频下CPU读取FLASH指令出错直接跑飞,表现为时钟停止输出。
  • 主时钟配置寄存器操作逻辑错误
    配置REG_PMC_MCKR的时钟源选择位CSS时,直接使用|=操作会保留之前的时钟源配置位,导致写入的参数错误,正确操作应该先清空CSS字段再写入新的时钟源值。

修正后的初始化代码

// 1. 先配置FLASH等待周期,120MHz对应4个WS,提前配置避免后续高主频读FLASH出错
REG_EFC_FMR = EEFC_FMR_FWS(4);

// 2. 启动外部16MHz晶振
REG_CKGR_MOR = CKGR_MOR_KEY_PASSWD | CKGR_MOR_MOSCXTEN | CKGR_MOR_MOSCXTST(0x8);
while (!(REG_PMC_SR & PMC_SR_MOSCXTS));

// 3. 切换主时钟到外部晶振
REG_CKGR_MOR = CKGR_MOR_KEY_PASSWD | CKGR_MOR_MOSCXTEN | CKGR_MOR_MOSCSEL | CKGR_MOR_MOSCXTST(0x8);
while (!(REG_PMC_SR & PMC_SR_MOSCSELS));

REG_PMC_MCKR = (REG_PMC_MCKR & ~PMC_MCKR_CSS_Msk) | PMC_MCKR_CSS_MAIN_CLK;
while (!(REG_PMC_SR & PMC_SR_MCKRDY));

REG_PMC_MCKR = (REG_PMC_MCKR & ~PMC_MCKR_PRES_Msk) | PMC_MCKR_PRES_CLK_1;
while (!(REG_PMC_SR & PMC_SR_MCKRDY));

// 4. 配置PLLB参数,一次性写入带密钥
REG_CKGR_PLLBR = CKGR_PLLBR_KEY_PASSWD | CKGR_PLLBR_MULB(14) | CKGR_PLLBR_DIVB(2);
// 等待PLLB锁定
while (!(REG_PMC_SR & PMC_SR_LOCKB));

// 5. 切换主时钟到PLLB
REG_PMC_MCKR = (REG_PMC_MCKR & ~PMC_MCKR_CSS_Msk) | PMC_MCKR_CSS_PLLB_CLK;
while (!(REG_PMC_SR & PMC_SR_MCKRDY));

内容的提问来源于stack exchange,提问作者Daelta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 04:54:03