描述 #
该文件定义了 CH32V00x 系列微控制器的系统级初始化接口与全局时钟变量,提供系统时钟配置、更新和外设时钟管理的函数原型。通过 SystemInit() 初始化系统时钟源(HSI/HSE)及 PLL,通过 SystemCoreClockUpdate() 动态读取当前时钟配置,确保软件运行时能准确获取核心时钟频率。该模块是所有外设驱动的时钟基础,必须在应用初始化阶段优先调用。
常量 #
SYSCLK_FREQ_xxx
#
用于选择系统主时钟源和目标频率,仅可启用其中一项,未启用时默认使用 HSI 作为系统时钟源。这些宏定义在 system_ch32v00x.c 中通过条件编译控制时钟配置函数的调用,实现灵活的时钟方案切换。
| 名称 | 值 | 简述 |
|---|---|---|
SYSCLK_FREQ_8MHz_HSI |
8000000 |
使用 HSI(内部高速时钟)作为系统时钟,频率为 8MHz |
SYSCLK_FREQ_24MHZ_HSI |
HSI_VALUE |
使用 HSI 作为系统时钟,频率为 24MHz(默认值为 24MHz) |
SYSCLK_FREQ_48MHZ_HSI |
48000000 |
使用 HSI 经 PLL 倍频至 48MHz 作为系统时钟 |
SYSCLK_FREQ_8MHz_HSE |
8000000 |
使用外部高速晶振(HSE)作为系统时钟,频率为 8MHz |
SYSCLK_FREQ_24MHz_HSE |
HSE_VALUE |
使用 HSE 作为系统时钟,频率为 24MHz(默认值为 24MHz) |
SYSCLK_FREQ_48MHz_HSE |
48000000 |
使用 HSE 经 PLL 倍频至 48MHz 作为系统时钟 |
注:
HSI_VALUE和HSE_VALUE在ch32v00x.h中定义为 24000000,表示内部和外部时钟的默认标称频率。实际运行频率可能因晶振精度或内部 RC 校准而略有偏差。
枚举 #
无
结构体 #
无
函数 #
SystemInit
#
void SystemInit(void)
初始化系统时钟、Flash 延时和外设时钟门控。该函数在芯片复位后由启动代码自动调用,是系统启动流程的核心部分。它首先复位 RCC 寄存器,校准 HSI 内部振荡器,然后根据编译时定义的 SYSCLK_FREQ_xxx 宏调用对应的时钟配置函数(如 SetSysClockTo_48MHz_HSE),最终完成系统时钟源、PLL、AHB 预分频器的配置。
参数:
无
返回值:
无
实现要点:该函数不仅配置时钟,还通过
RCC_AdjustHSICalibrationValue()对内部 RC 振荡器进行校准,提升 HSI 频率精度;同时在配置 48MHz 时钟时,会读取CFG0_PLL_TRIM寄存器中的出厂校准值,确保 PLL 稳定性。
SystemCoreClockUpdate
#
void SystemCoreClockUpdate(void)
动态读取 RCC 寄存器当前配置,更新全局变量 SystemCoreClock 的值,以反映实际运行的系统时钟频率。该函数适用于在运行时动态切换时钟源(如从 HSI 切换到 HSE)后,重新同步软件对时钟频率的认知,确保延时函数、UART 波特率等依赖时钟的模块能正确运行。
参数:
无
返回值:
无
实现逻辑:函数通过读取
RCC->CFGR0中的SWS位判断当前系统时钟源(HSI/HSE/PLL),再根据 PLL 是否启用及输入源(HSI/HSE)计算最终频率,最后结合AHBPrescTable表计算 HCLK(即SystemCoreClock)。特别注意:当 AHB 预分频器值大于 7 时,使用右移运算而非除法,以提高效率。
SystemCoreClock
#
extern uint32_t SystemCoreClock;
全局变量,表示当前系统核心时钟频率(单位:Hz),由 SystemCoreClockUpdate() 自动维护。所有需要精确时序的模块(如定时器、串口、USB)都应读取此变量进行参数计算,而非硬编码时钟值。
类型: uint32_t
简述: 当前系统核心时钟频率,单位为 Hz,由系统时钟配置自动更新。
使用建议:在初始化完成后应立即调用
SystemCoreClockUpdate()以确保变量值准确,尤其在使用动态时钟切换的应用中,必须在每次切换后调用此函数。
SetSysClock
#
static void SetSysClock(void)
内部静态函数,根据编译时定义的时钟配置宏,调用对应的时钟设置函数。该函数在 SystemInit() 中被调用,负责配置 Flash 延时、AHB 预分频器,并启用 PLL(如需要)。它还包含对 GPIO 引脚的临时配置(如关闭 PA0/PA1 的复用功能以避免干扰 HSE 晶振),确保外部晶振稳定启动。
参数:
无
返回值:
无
关键细节:该函数在配置 HSE 时会先禁用 PA0/PA1 的复用功能(通过
AFIO->PCFR1),防止这些引脚被误配置为复用功能导致外部晶振负载异常,从而影响启动稳定性。这是嵌入式系统中常见的硬件兼容性处理。
SetSysClockTo_xxx 系列函数
#
一组静态内部函数,用于实现不同频率下的时钟配置逻辑,仅在对应宏定义启用时编译。每个函数负责配置 Flash 延时、AHB 预分频器、PLL 使能与切换,并等待时钟稳定。
| 函数名 | 简述 |
|---|---|
SetSysClockTo_8MHz_HSI |
使用 HSI 作为系统时钟,频率 8MHz,Flash 延时 0,AHB 预分频器为 DIV3 |
SetSysClockTo_24MHZ_HSI |
使用 HSI 作为系统时钟,频率 24MHz,Flash 延时 0,AHB 预分频器为 DIV1 |
SetSysClockTo_48MHZ_HSI |
使用 HSI 经 PLL 倍频至 48MHz,Flash 延时 1,AHB 预分频器为 DIV1,PLL 输入为 HSI×2 |
SetSysClockTo_8MHz_HSE |
使用 HSE 作为系统时钟,频率 8MHz,Flash 延时 0,AHB 预分频器为 DIV3 |
SetSysClockTo_24MHz_HSE |
使用 HSE 作为系统时钟,频率 24MHz,Flash 延时 0,AHB 预分频器为 DIV1 |
SetSysClockTo_48MHz_HSE |
使用 HSE 经 PLL 倍频至 48MHz,Flash 延时 1,AHB 预分频器为 DIV1,PLL 输入为 HSE×2 |
共性处理:所有 HSE 相关函数均包含 HSE 启动超时检测(
HSE_STARTUP_TIMEOUT),防止因晶振故障导致系统死锁;所有 PLL 配置均包含“等待 PLL 就绪”和“等待 PLL 成为系统时钟源”的状态轮询,确保切换安全可靠。
Flash 延时配置:当系统时钟超过 24MHz 时,Flash 访问需增加等待状态(
FLASH_ACTLR_LATENCY_1),否则可能导致指令读取错误。这是基于芯片 Flash 存取速度的硬性限制,必须严格遵守。