[产品应用] CW32系列系统时钟超过24MHz时,FLASH等待周期如何正确配置

[复制链接]
3|0
classroom 发表于 2026-9-18 22:25 | 显示全部楼层 |阅读模式
CW32系列MCU的FLASH存储器最高支持24MHz的零等待访问频率。当系统时钟(HCLK)超过24MHz时,必须通过FLASH控制寄存器FLASH_CR2的WAIT位域插入等待周期,否则CPU访问FLASH时读出的指令或数据会出错,导致程序跑飞甚至无法连接调试器。

等待周期的配置规则
根据武汉芯源官方用户手册和多个技术论坛的验证,等待周期的设置需要匹配实际的HCLK频率:
197346aacfd5adca8b.png
需要留意的是,不同型号或不同版本的手册中,WAIT位域的具体编码值可能略有差异。例如CW32L012的手册中,对应“>24MHz且≤48MHz”的设置值为1,而论坛中针对CW32F030的实操案例则使用FLASH_SetLatency(FLASH_Latency_2)来设置2个等待周期。建议以你所用型号的最新官方用户手册为准。

操作顺序与代码示例
配置FLASH等待周期的核心原则是在切换系统时钟之前完成设置。如果先切换到高频时钟,CPU在切换瞬间就会以高速访问FLASH,程序会立即崩溃。

以下是一个典型的48MHz时钟切换配置流程(以CW32F030为例):

c
#include "cw32f030.h"

void SystemClock_Config(void)
{
    // 1. 使能FLASH时钟
    __RCC_FLASH_CLK_ENABLE();

    // 2. 配置FLASH等待周期为2(48MHz所需)
    //    必须在切换时钟前完成
    FLASH_SetLatency(FLASH_Latency_2);

    // 3. 配置PLL倍频(假设HSI 8MHz * 6 = 48MHz)
    RCC->HSI_CR |= RCC_HSI_CR_HSION;
    while (!(RCC->HSI_CR & RCC_HSI_CR_HSIRDY));

    RCC->PLL_CR = (6 << RCC_PLL_CR_PLLMUL_Pos) | RCC_PLL_CR_PLLEN;
    while (!(RCC->PLL_CR & RCC_PLL_CR_PLLRDY));

    // 4. 切换系统时钟到PLL
    RCC->CFGR = (RCC->CFGR & ~RCC_CFGR_SW_Msk) | RCC_CFGR_SW_PLL;
    while ((RCC->CFGR & RCC_CFGR_SWS_Msk) != RCC_CFGR_SWS_PLL);
}
如果使用HSE外部晶振倍频,同样遵循“先配FLASH等待,再开PLL并切换”的顺序。有开发者分享的CW32L083切换HSE的代码中,在RCC_PLL_Enable之后、RCC_SysClk_Switch之前调用了FLASH_SetLatency(FLASH_Latency_3),并注明“频率大于24M需要配置FlashWait”。

如果程序已经跑飞了
如果忘记配置等待周期导致芯片无法连接,可以通过硬件复位或将BOOT引脚拉高进入ISP模式来恢复芯片,擦除FLASH后重新烧录正确的程序。调试时也可以尝试在Keil中勾选“Connect under Reset”,让调试器在复位期间接管芯片。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

751

主题

6519

帖子

2

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