描述 #
该文件定义了CH32V00x系列微控制器复位与时钟控制(RCC)外设的所有常量、枚举、结构体及函数原型。RCC模块负责系统时钟源的选择、分频、PLL配置、外设时钟使能、时钟安全系统(CSS)管理以及复位标志的读取与清除。通过本库函数,开发者可灵活配置系统主频、AHB/APB总线分频、ADC时钟源、MCO输出时钟等关键参数,是系统初始化和低功耗管理的核心模块。所有时钟配置均需遵循芯片时序约束,例如HSE不能在作为系统时钟时被关闭,PLL不能在作为系统时钟时被禁用。
常量 #
HSE_configuration
#
外部高速晶振(HSE)配置选项,用于启用、关闭或旁路外部晶振。HSE是高精度时钟源,常用于系统主时钟或PLL输入。旁路模式允许使用外部时钟信号直接驱动芯片,适用于已有时钟源的系统。
| 名称 | 值 | 简述 |
|---|---|---|
RCC_HSE_OFF |
0x00000000 |
关闭HSE振荡器 |
RCC_HSE_ON |
0x00010000 |
开启HSE振荡器 |
RCC_HSE_Bypass |
0x00040000 |
旁路HSE振荡器,使用外部时钟输入 |
以上所有值都强制转换为
uint32_t
PLL_entry_clock_source
#
PLL输入时钟源选择,决定PLL的参考频率。必须在启用PLL前配置,且仅支持HSI或HSE的2倍频输入。选择HSE作为PLL源可获得更高精度和稳定性,适合对时钟精度要求高的应用。
| 名称 | 值 | 简述 |
|---|---|---|
RCC_PLLSource_HSI_MUL2 |
0x00000000 |
使用HSI(内部高速时钟)作为PLL输入,倍频2倍 |
RCC_PLLSource_HSE_MUL2 |
0x00010000 |
使用HSE(外部高速晶振)作为PLL输入,倍频2倍 |
以上所有值都强制转换为
uint32_t
System_clock_source
#
系统时钟(SYSCLK)源选择,决定CPU运行频率的来源。系统时钟可由HSI、HSE或PLL提供,切换时需确保目标时钟已稳定,否则可能导致系统异常。
| 名称 | 值 | 简述 |
|---|---|---|
RCC_SYSCLKSource_HSI |
0x00000000 |
选择HSI作为系统时钟源 |
RCC_SYSCLKSource_HSE |
0x00000001 |
选择HSE作为系统时钟源 |
RCC_SYSCLKSource_PLLCLK |
0x00000002 |
选择PLL输出作为系统时钟源 |
以上所有值都强制转换为
uint32_t
AHB_clock_source
#
AHB总线时钟(HCLK)分频系数,控制AHB外设(如DMA、SRAM)的工作频率。分频值范围从1到256,需根据外设性能需求合理配置,避免过快导致数据错误或过慢影响性能。
| 名称 | 值 | 简述 |
|---|---|---|
RCC_SYSCLK_Div1 |
0x00000000 |
HCLK = SYSCLK |
RCC_SYSCLK_Div2 |
0x00000010 |
HCLK = SYSCLK/2 |
RCC_SYSCLK_Div3 |
0x00000020 |
HCLK = SYSCLK/3 |
RCC_SYSCLK_Div4 |
0x00000030 |
HCLK = SYSCLK/4 |
RCC_SYSCLK_Div5 |
0x00000040 |
HCLK = SYSCLK/5 |
RCC_SYSCLK_Div6 |
0x00000050 |
HCLK = SYSCLK/6 |
RCC_SYSCLK_Div7 |
0x00000060 |
HCLK = SYSCLK/7 |
RCC_SYSCLK_Div8 |
0x00000070 |
HCLK = SYSCLK/8 |
RCC_SYSCLK_Div16 |
0x000000B0 |
HCLK = SYSCLK/16 |
RCC_SYSCLK_Div32 |
0x000000C0 |
HCLK = SYSCLK/32 |
RCC_SYSCLK_Div64 |
0x000000D0 |
HCLK = SYSCLK/64 |
RCC_SYSCLK_Div128 |
0x000000E0 |
HCLK = SYSCLK/128 |
RCC_SYSCLK_Div256 |
0x000000F0 |
HCLK = SYSCLK/256 |
以上所有值都强制转换为
uint32_t
RCC_Interrupt_source
#
RCC中断源标识,用于使能或查询特定时钟就绪或故障中断。中断机制可实现无轮询的时钟状态监控,提升系统响应效率。
| 名称 | 值 | 简述 |
|---|---|---|
RCC_IT_LSIRDY |
0x01 |
LSI时钟就绪中断 |
RCC_IT_HSIRDY |
0x04 |
HSI时钟就绪中断 |
RCC_IT_HSERDY |
0x08 |
HSE时钟就绪中断 |
RCC_IT_PLLRDY |
0x10 |
PLL时钟就绪中断 |
RCC_IT_CSS |
0x80 |
时钟安全系统(CSS)故障中断 |
以上所有值都强制转换为
uint8_t
ADC_clock_source
#
ADC时钟(ADCCLK)分频系数,由APB2时钟(PCLK2)分频得到。ADC采样精度对时钟稳定性敏感,建议使用较低分频比以保证采样时间充足。
| 名称 | 值 | 简述 |
|---|---|---|
RCC_PCLK2_Div2 |
0x00000000 |
ADCCLK = PCLK2/2 |
RCC_PCLK2_Div4 |
0x00004000 |
ADCCLK = PCLK2/4 |
RCC_PCLK2_Div6 |
0x00008000 |
ADCCLK = PCLK2/6 |
RCC_PCLK2_Div8 |
0x0000C000 |
ADCCLK = PCLK2/8 |
RCC_PCLK2_Div12 |
0x0000A000 |
ADCCLK = PCLK2/12 |
RCC_PCLK2_Div16 |
0x0000E000 |
ADCCLK = PCLK2/16 |
RCC_PCLK2_Div24 |
0x0000A800 |
ADCCLK = PCLK2/24 |
RCC_PCLK2_Div32 |
0x0000E800 |
ADCCLK = PCLK2/32 |
RCC_PCLK2_Div48 |
0x0000B000 |
ADCCLK = PCLK2/48 |
RCC_PCLK2_Div64 |
0x0000F000 |
ADCCLK = PCLK2/64 |
RCC_PCLK2_Div96 |
0x0000B800 |
ADCCLK = PCLK2/96 |
RCC_PCLK2_Div128 |
0x0000F800 |
ADCCLK = PCLK2/128 |
以上所有值都强制转换为
uint32_t
AHB_peripheral
#
AHB总线外设时钟使能位掩码,用于控制DMA1和SRAM的时钟开关。SRAM时钟仅在睡眠模式下可安全关闭,否则可能导致数据丢失。
| 名称 | 值 | 简述 |
|---|---|---|
RCC_AHBPeriph_DMA1 |
0x00000001 |
DMA1外设时钟 |
RCC_AHBPeriph_SRAM |
0x00000004 |
SRAM存储器时钟 |
以上所有值都强制转换为
uint32_t
APB2_peripheral
#
高速APB2总线外设时钟使能位掩码,覆盖AFIO、GPIO、ADC、TIM1、SPI1、USART1等关键外设。APB2时钟频率通常与HCLK相同,用于高速外设。
| 名称 | 值 | 简述 |
|---|---|---|
RCC_APB2Periph_AFIO |
0x00000001 |
复用功能I/O时钟 |
RCC_APB2Periph_GPIOA |
0x00000004 |
GPIOA端口时钟 |
RCC_APB2Periph_GPIOC |
0x00000010 |
GPIOC端口时钟 |
RCC_APB2Periph_GPIOD |
0x00000020 |
GPIOD端口时钟 |
RCC_APB2Periph_ADC1 |
0x00000200 |
ADC1模数转换器时钟 |
RCC_APB2Periph_TIM1 |
0x00000800 |
TIM1高级定时器时钟 |
RCC_APB2Periph_SPI1 |
0x00001000 |
SPI1串行外设接口时钟 |
RCC_APB2Periph_USART1 |
0x00004000 |
USART1通用同步/异步收发器时钟 |
以上所有值都强制转换为
uint32_t
APB1_peripheral
#
低速APB1总线外设时钟使能位掩码,覆盖TIM2、WWDG、I2C1、PWR等常用外设。APB1时钟频率通常为HCLK的1/2或更低,适用于低速通信和控制。
| 名称 | 值 | 简述 |
|---|---|---|
RCC_APB1Periph_TIM2 |
0x00000001 |
TIM2通用定时器时钟 |
RCC_APB1Periph_WWDG |
0x00000800 |
窗口看门狗时钟 |
RCC_APB1Periph_I2C1 |
0x00200000 |
I2C1串行通信接口时钟 |
RCC_APB1Periph_PWR |
0x10000000 |
电源控制时钟 |
以上所有值都强制转换为
uint32_t
Clock_source_to_output_on_MCO_pin
#
MCO(微控制器时钟输出)引脚时钟源选择,用于将内部时钟信号输出到外部引脚,便于示波器测量或同步外部设备。
| 名称 | 值 | 简述 |
|---|---|---|
RCC_MCO_NoClock |
0x00 |
MCO引脚无时钟输出 |
RCC_MCO_SYSCLK |
0x04 |
输出系统时钟(SYSCLK) |
RCC_MCO_HSI |
0x05 |
输出HSI内部时钟 |
RCC_MCO_HSE |
0x06 |
输出HSE外部晶振时钟 |
RCC_MCO_PLLCLK |
0x07 |
输出PLL时钟 |
以上所有值都强制转换为
uint8_t
RCC_Flag
#
RCC状态标志位,用于检测各种时钟就绪、复位源和故障状态。标志位由硬件自动置位,需通过RCC_ClearFlag()清除复位相关标志。
| 名称 | 值 | 简述 |
|---|---|---|
RCC_FLAG_HSIRDY |
0x21 |
HSI时钟就绪标志 |
RCC_FLAG_HSERDY |
0x31 |
HSE时钟就绪标志 |
RCC_FLAG_PLLRDY |
0x39 |
PLL时钟就绪标志 |
RCC_FLAG_LSIRDY |
0x61 |
LSI时钟就绪标志 |
RCC_FLAG_PINRST |
0x7A |
外部复位引脚触发复位 |
RCC_FLAG_PORRST |
0x7B |
上电/掉电复位 |
RCC_FLAG_SFTRST |
0x7C |
软件复位 |
RCC_FLAG_IWDGRST |
0x7D |
独立看门狗复位 |
RCC_FLAG_WWDGRST |
0x7E |
窗口看门狗复位 |
RCC_FLAG_LPWRRST |
0x7F |
低功耗复位 |
以上所有值都强制转换为
uint8_t
SysTick_clock_source
#
SysTick定时器时钟源选择,决定系统滴答定时器的计数频率。通常用于操作系统调度或延时函数,建议使用HCLK以获得精确时间基准。
| 名称 | 值 | 简述 |
|---|---|---|
SysTick_CLKSource_HCLK_Div8 |
0xFFFFFFFB |
SysTick时钟 = HCLK/8 |
SysTick_CLKSource_HCLK |
0x00000004 |
SysTick时钟 = HCLK |
以上所有值都强制转换为
uint32_t
枚举 #
无
结构体 #
RCC_ClocksTypeDef
#
RCC时钟频率信息结构体,用于通过RCC_GetClocksFreq()函数获取系统各时钟的实际运行频率。该结构体在初始化后由函数自动填充,可用于动态调整系统性能或功耗策略。
| 名称 | 类型 | 简述 |
|---|---|---|
SYSCLK_Frequency |
uint32_t |
系统时钟(CPU主频)频率,单位Hz |
HCLK_Frequency |
uint32_t |
AHB总线时钟频率,单位Hz |
PCLK1_Frequency |
uint32_t |
APB1总线时钟频率,单位Hz |
PCLK2_Frequency |
uint32_t |
APB2总线时钟频率,单位Hz |
ADCCLK_Frequency |
uint32_t |
ADC转换时钟频率,单位Hz |
函数 #
RCC_DeInit
#
void RCC_DeInit(void)
将RCC寄存器恢复为上电复位后的默认状态,包括关闭所有时钟源、禁用PLL、清除中断标志。常用于系统初始化或异常恢复流程,确保时钟配置处于已知安全状态。
参数:
无
返回值:
无
RCC_HSEConfig
#
void RCC_HSEConfig(uint32_t RCC_HSE)
配置外部高速晶振(HSE)的工作模式。支持关闭、开启或旁路模式。调用前需确保HSE未被用作系统时钟或PLL输入,否则配置无效。开启HSE后需调用RCC_WaitForHSEStartUp()等待稳定。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
RCC_HSE |
uint32_t |
HSE配置选项,取值为RCC_HSE_OFF、RCC_HSE_ON或RCC_HSE_Bypass |
返回值:
无
RCC_WaitForHSEStartUp
#
ErrorStatus RCC_WaitForHSEStartUp(void)
等待HSE振荡器稳定并进入就绪状态。该函数轮询RCC_FLAG_HSERDY标志,超时后返回状态。必须在启用HSE后调用,否则可能因时钟未就绪导致后续配置失败。
参数:
无
返回值:
| 值 | 说明 |
|---|---|
READY |
HSE已稳定,可安全使用 |
NoREADY |
超时仍未稳定,可能晶振故障或连接异常 |
RCC_AdjustHSICalibrationValue
#
void RCC_AdjustHSICalibrationValue(uint8_t HSICalibrationValue)
微调内部高速振荡器(HSI)的校准值,以补偿温度、电压变化引起的频率偏差。校准值范围0~0x1F,出厂默认为0x10。建议在系统启动后根据实测频率进行微调。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
HSICalibrationValue |
uint8_t |
校准值,范围0 |
返回值:
无
RCC_HSICmd
#
void RCC_HSICmd(FunctionalState NewState)
启用或禁用内部高速振荡器(HSI)。HSI是系统默认时钟源,常用于上电初始阶段或低功耗模式。禁用HSI前需确保系统时钟已切换至其他源。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
NewState |
FunctionalState |
ENABLE(开启)或DISABLE(关闭) |
返回值:
无
RCC_PLLConfig
#
void RCC_PLLConfig(uint32_t RCC_PLLSource)
配置PLL的输入源(HSI或HSE)并启用2倍频。必须在启用PLL前调用,且仅支持2倍频。配置后需调用RCC_PLLCmd(ENABLE)激活PLL。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
RCC_PLLSource |
uint32_t |
PLL输入源,取值为RCC_PLLSource_HSI_MUL2或RCC_PLLSource_HSE_MUL2 |
返回值:
无
RCC_PLLCmd
#
void RCC_PLLCmd(FunctionalState NewState)
启用或禁用PLL。PLL不能在作为系统时钟时被禁用,否则会导致系统崩溃。建议在切换系统时钟源后再禁用PLL以释放功耗。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
NewState |
FunctionalState |
ENABLE(开启)或DISABLE(关闭) |
返回值:
无
RCC_SYSCLKConfig
#
void RCC_SYSCLKConfig(uint32_t RCC_SYSCLKSource)
切换系统时钟源(SYSCLK)。支持HSI、HSE、PLL三种源。切换时需确保目标时钟已稳定,否则可能引发系统异常。函数内部会根据PLL源自动调整HSI校准值以优化性能。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
RCC_SYSCLKSource |
uint32_t |
系统时钟源,取值为RCC_SYSCLKSource_HSI、RCC_SYSCLKSource_HSE或RCC_SYSCLKSource_PLLCLK |
返回值:
无
RCC_GetSYSCLKSource
#
uint8_t RCC_GetSYSCLKSource(void)
读取当前系统时钟源。返回值为寄存器CFGR0中SWS字段的值,用于确认时钟切换是否成功。
参数:
无
返回值:
| 值 | 说明 |
|---|---|
0x00 |
HSI为当前系统时钟 |
0x04 |
HSE为当前系统时钟 |
0x08 |
PLL为当前系统时钟 |
RCC_HCLKConfig
#
void RCC_HCLKConfig(uint32_t RCC_SYSCLK)
配置AHB总线时钟(HCLK)分频系数。分频值影响DMA、SRAM等高速外设性能。建议根据外设最大工作频率设置,避免超频。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
RCC_SYSCLK |
uint32_t |
AHB分频系数,取值为RCC_SYSCLK_Div1至RCC_SYSCLK_Div256 |
返回值:
无
RCC_ITConfig
#
void RCC_ITConfig(uint8_t RCC_IT, FunctionalState NewState)
使能或禁用RCC中断源。支持LSI、HSI、HSE、PLL就绪中断和CSS故障中断。中断触发后可通过RCC_GetITStatus()查询。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
RCC_IT |
uint8_t |
中断源,取值为RCC_IT_LSIRDY、RCC_IT_HSIRDY、RCC_IT_HSERDY、RCC_IT_PLLRDY或RCC_IT_CSS |
NewState |
FunctionalState |
ENABLE或DISABLE |
返回值:
无
RCC_ADCCLKConfig
#
void RCC_ADCCLKConfig(uint32_t RCC_PCLK2)
配置ADC时钟(ADCCLK)分频系数。ADCCLK由PCLK2分频得到,建议选择≤12分频以保证采样精度。过高的分频可能导致转换时间不足。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
RCC_PCLK2 |
uint32_t |
ADC分频系数,取值为RCC_PCLK2_Div2至RCC_PCLK2_Div128 |
返回值:
无
RCC_LSICmd
#
void RCC_LSICmd(FunctionalState NewState)
启用或禁用内部低速振荡器(LSI)。LSI常用于独立看门狗(IWDG)或RTC低功耗时钟。禁用LSI前需确保IWDG未运行,否则会触发复位。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
NewState |
FunctionalState |
ENABLE或DISABLE |
返回值:
无
RCC_GetClocksFreq
#
void RCC_GetClocksFreq(RCC_ClocksTypeDef *RCC_Clocks)
获取系统各时钟的实际频率值。该函数基于寄存器配置和预定义常量(如HSI_VALUE、HSE_VALUE)计算频率,结果可能因晶振实际频率偏差而略有误差。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
RCC_Clocks |
RCC_ClocksTypeDef * |
指向结构体的指针,函数将填充各时钟频率值 |
返回值:
无
RCC_AHBPeriphClockCmd
#
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState)
使能或禁用AHB总线外设时钟。仅支持DMA1和SRAM。SRAM时钟仅在睡眠模式下可安全关闭,否则可能造成数据丢失。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
RCC_AHBPeriph |
uint32_t |
AHB外设,取值为RCC_AHBPeriph_DMA1或RCC_AHBPeriph_SRAM |
NewState |
FunctionalState |
ENABLE或DISABLE |
返回值:
无
RCC_APB2PeriphClockCmd
#
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
使能或禁用APB2总线外设时钟。APB2外设包括GPIO、ADC、TIM1等高速外设,必须在使用前使能时钟。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
RCC_APB2Periph |
uint32_t |
APB2外设,取值为RCC_APB2Periph_AFIO、RCC_APB2Periph_GPIOA等 |
NewState |
FunctionalState |
ENABLE或DISABLE |
返回值:
无
RCC_APB1PeriphClockCmd
#
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
使能或禁用APB1总线外设时钟。APB1外设包括TIM2、I2C1、WWDG等低速外设,使用前必须使能时钟。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
RCC_APB1Periph |
uint32_t |
APB1外设,取值为RCC_APB1Periph_TIM2、RCC_APB1Periph_I2C1等 |
NewState |
FunctionalState |
ENABLE或DISABLE |
返回值:
无
RCC_APB2PeriphResetCmd
#
void RCC_APB2PeriphResetCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
对APB2外设执行复位操作。复位后外设寄存器恢复默认值,常用于初始化或异常恢复。复位期间外设不可用。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
RCC_APB2Periph |
uint32_t |
APB2外设,取值同RCC_APB2PeriphClockCmd |
NewState |
FunctionalState |
ENABLE(复位)或DISABLE(释放复位) |
返回值:
无
RCC_APB1PeriphResetCmd
#
void RCC_APB1PeriphResetCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
对APB1外设执行复位操作。复位后外设寄存器恢复默认值,常用于初始化或异常恢复。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
RCC_APB1Periph |
uint32_t |
APB1外设,取值同RCC_APB1PeriphClockCmd |
NewState |
FunctionalState |
ENABLE(复位)或DISABLE(释放复位) |
返回值:
无
RCC_ClockSecuritySystemCmd
#
void RCC_ClockSecuritySystemCmd(FunctionalState NewState)
启用或禁用时钟安全系统(CSS)。CSS在检测到HSE失效时自动切换至HSI并触发中断,防止系统因时钟丢失而失控。建议在使用HSE或PLL时始终启用。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
NewState |
FunctionalState |
ENABLE或DISABLE |
返回值:
无
RCC_MCOConfig
#
void RCC_MCOConfig(uint8_t RCC_MCO)
配置MCO引脚输出的时钟源。MCO可用于调试或同步外部设备,输出频率等于所选源频率(无分频)。输出引脚需在GPIO中配置为复用推挽模式。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
RCC_MCO |
uint8_t |
MCO时钟源,取值为RCC_MCO_NoClock至RCC_MCO_PLLCLK |
返回值:
无
RCC_GetFlagStatus
#
FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG)
查询RCC状态标志位。用于检测时钟是否就绪、复位源类型等。标志位由硬件自动置位,需手动清除复位相关标志。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
RCC_FLAG |
uint8_t |
要查询的标志,取值为RCC_FLAG_HSIRDY等 |
返回值:
| 值 | 说明 |
|---|---|
SET |
标志被置位 |
RESET |
标志未置位 |
RCC_ClearFlag
#
void RCC_ClearFlag(void)
清除所有复位标志(PINRST、PORRST、SFTRST、IWDGRST、WWDGRST、LPWRRST)。调用后标志位被清零,仅在复位后需调用一次,避免误清。
参数:
无
返回值:
无
RCC_GetITStatus
#
ITStatus RCC_GetITStatus(uint8_t RCC_IT)
查询RCC中断是否发生。用于中断服务程序中判断具体中断源,如PLL就绪或CSS故障。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
RCC_IT |
uint8_t |
要查询的中断源,取值为RCC_IT_LSIRDY等 |
返回值:
| 值 | 说明 |
|---|---|
SET |
中断已触发 |
RESET |
中断未触发 |
RCC_ClearITPendingBit
#
void RCC_ClearITPendingBit(uint8_t RCC_IT)
清除指定RCC中断的挂起位。必须在中断服务程序中调用,否则中断会持续触发。仅支持LSIRDY、HSIRDY、HSERDY、PLLRDY、CSS。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
RCC_IT |
uint8_t |
要清除的中断源,取值为RCC_IT_LSIRDY等 |
返回值:
无