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
相关产品推荐
相关产品推荐

