[CW32F030系列] CW32主频超24MHz必做的一步:配置Flash等待周期

[复制链接]
16|0
jcky001 发表于 2026-9-2 21:47 | 显示全部楼层 |阅读模式
从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下调试器完全连不上,折腾了两天才发现是这行代码漏了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1843

主题

7952

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部
0