从CW32F030切到48MHz那一刻,程序直接跑飞,调试器再也连不上。这种现象在CW32开发群里几乎每周都有人遇到,问题根源出在Flash访问速度跟不上CPU频率。
CW32F030内部的Flash存储器最高只支持24MHz的零等待访问。一旦你把HCLK提高到48MHz,CPU以两倍速度去取指令,Flash响应不过来,读出来的数据全是错的,程序自然跑飞。解决方法是在切换时钟之前,先给Flash插入等待周期,让它有时间缓冲数据。
具体配置规则很明确:HCLK频率小于等于24MHz,等待周期为0;大于24MHz且小于等于48MHz,需要插入2个等待周期;大于48MHz则需要3个等待周期。以48MHz为例,代码里这么写
c
void SystemClock_Config(void)
{
// 第一步,先把Flash等待周期配好
__RCC_FLASH_CLK_ENABLE(); // 使能Flash时钟
FLASH_SetLatency(FLASH_Latency_2); // 48MHz配2个等待周期
// 第二步,再切换系统时钟到48MHz
RCC_HSI_Enable(RCC_HSIOSC_DIV1);
while (!RCC_GetFlagStatus(RCC_FLAG_HSIRDY));
RCC_SysClk_Switch(RCC_SYSCLKSRC_HSI);
}
这个顺序绝对不能反。如果先切时钟再配等待周期,CPU在切换到高速时钟的瞬间就会去访问没有等待周期的Flash,程序当场崩溃,调试器也识别不到芯片。已经跑飞的板子只能通过硬件复位或者把BOOT0拉高进入ISP模式来救砖。
同样的原则也适用于外部晶振场景。用HSE倍频到48MHz时,同样要在PLL使能之前把FLASH_CR2寄存器的WAIT位域配好。有开发者在论坛里分享过教训,忘记配等待周期,48MHz下调试器完全连不上,折腾了两天才发现是这行代码漏了。
|