在GD固件库的时钟配置函数里看到这样一段神秘代码,研究分析后不得不佩服原厂固件库里的细节处理:

查看定义是一段代码,对AHB 2分频后延时了一段时间:

在这段代码后面可以看到程序将RCU_CFG0和RCU_CFG1两个时钟寄存器做了复位:

如果是程序复位启动后第一次执行这段代码,应该是没有什么意义的,但产品设计时一般都会有一个BootLoader和APP两段程序,当BootLoader跳转到APP时,MCU的时钟已经处于一个高频状态,直接执行RCU的复位意味着时钟会立刻切到内部8M运行。
而通过查看DATASHEET,可以看到MCU在最大主频下和默认复位主频下的电流差距是很大的:


这样的内部电流瞬间变化一般会导致内部电源的波动,这种波动情况下执行的指令是不可靠的,如果硬件设计时MCU去耦电容设计不合理,很可能加剧这个波动,此时如果指令错误了那很可能会跑飞进入hardfault。
而GD固件库里这个神秘代码,在高频的情况下可以将系统时钟降低一半并延时等待稳定,最后再复位时钟寄存器降到8M的系统时钟。这样就让电流变化有一个过渡,避免了内部电源波动过大。

——>

——>
关键字:GD32 固件库 时钟配置
引用地址:
GD32固件库里时钟配置时的神秘代码?高频切低频时芯片会发生什么
推荐阅读最新更新时间:2026-03-20 12:08
【STM32 HAL库】 STM32H743的电源配置和时钟配置
文章内容偏向HAL库的移植和使用,以个人观点及了解为主,若与事实不符,则以www.st.com、www.stmcu.org.cn等平台为准。 使用的软件: VSCode(1.36版,带C/C++ IntelliSense插件) Keil MDK(5.26版) 芯片:STM32H743ZIT6(Nucleo-H743平台) 所使用的库:STM32Cube_FW_H7_V1.3.0,下载地址:https://www.st.com/content/st_com/en/products/embedded-software/mcu-mpu-embedded-software/stm32-emb
[单片机]
RTC时钟和BKP的配置stm32
RTC和后备寄存器通过一个开关供电,在VDD有效的时候选择VDD供电,否则选择VBAT引脚供电. 后备寄存器(10个16位的寄存器),可以用于在关闭VDD时,保存20个字节的用户应用数据(中容量和小容量产品,大容量和互联性产品有84字节). RTC和后备寄存器不会被系统或电源复位源复位;当从待机模式唤醒时,也不会被复位. RTC的作用: 日历时钟功能; 闹钟中断; 阶段性中断; RTC时钟源: 外部晶体32.768kHz振荡器;内部低功耗RC振荡器; 高速的外部时钟经128分频. 复位后,对备份寄存器和RTC的访问被禁止,并且备份域被保护,以防止可能存在的意外的操作. 执行下面操作,可以是能对备份寄存器和RTC的访问: 打
[单片机]
STM32 MCO时钟输出配置实验
STM32的PA.8引脚具有复用功能——时钟输出(MCO), 该功能能将STM32内部的时钟通过PA.8输出. 操作流程: 1)、设置PA.8为复用AF模式。 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
[单片机]
时钟初始化配置函数
在前面推文的介绍中,我们知道STM32系统复位后首先进入SystemInit函数进行时钟的设置,然后进入主函数main。那么我们就来看下SystemInit()函数到底做了哪些操作,首先打开我们前面使用库函数编写的LED程序,在system_stm32f10x.c文件中可以找到SystemInit()函数,SystemInit()代码如下: void SystemInit (void) { /* Reset the RCC clock configuration to the default reset state(for debug purpose) / / Set HSION bit / RCC- CR |
[单片机]
系统时钟的配置
对Figure7-4的说明: 上电时,PLL没被启动,FCLK等于外部输入时钟,称为Fin。 1 上电几毫秒后,晶振(OSC)输出稳定,FCLK = Fin,nRESET恢复高电平后,CPU开始执行指令。 2 设置MPLL,等待Lock Time(使MPLL输出稳定),MPLL稳定输出,CPU工作于新的工作频率(在Lock Time期间,FCLK停震,CPU停止工作)。 具体的配置的步骤: 1 设置Lock Time; 2 设置时钟比例(FCLK:HCLK:PCLK); 3 如果CLKDIVN寄存器的位HDIVN非0,CPU的总线模式应该从 fast bus mode 变为 asynchronous
[单片机]
mini2440学习之2440时钟配置解
在移植Nboot时,发现串口输出乱码,检查串口配置没问题后,觉得应该是时钟配置没配好,修改后果然ok,所以补习一下! 2440时钟配置详细说明,以上电为顺序讲述: 一、S3C2440A时钟概述 1、S3C2440A的电源管理有4种模式:NORMAL,SLOW,IDLE,SLEEP。 2、 有4种时钟:FCLK,HCLK,PCLK,UCLK具体分工如下: FCLK is used by ARM920T. HCLK is used for AHB bus, which is used by the ARM920T, the memory controller, the interrupt controller, the LCD con
[单片机]
STM32单片机外部晶振配置时钟设置
学习野火的固件库UART1串口案例时,用的是SIM9008模块应用板上的STM32103F103RB芯片,使用的外部晶振是12M。 串口读取的是乱码 默认的外部晶振是8M 由于STM32的库默认是外部晶振8M的情况下实现的,所以配置串口波特率的时候也是按8M,包括主频。 如果采用外部晶振8M或12M,配置时钟为72MHZ 。 1)在system32_stm32f10x.c文件中的void SetSysClockTo72(void)里这样改: 8M: RCC-》CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);//8*9=72 12M: RCC-》CFGR
[单片机]
LPC824-时钟配置
要让LPC824正常工作,首先要对它的时钟源进行配置。LPC824的最高工作频率为30MHz,因此给它的主时钟频率最大不能超过30MHz。实际上,通常都是使用频率较低的晶振,以降低外部电磁干扰,然后再通过内部倍频的方式把主时钟频率提高。根据管方手册给出的数据,外部晶振的频率范围是1MHz~25MHz,一般情况下使用12MHz晶振,然后内部进行2倍频,主时钟工作频率为24MHz。 要对LPC824的时钟进行配置,必须要了解它的时钟结构,先来看一下它的时钟结构图,如下图所示。 首先来看主时钟,给主时钟(main clock)提供选择有4个源,分别是:内部RC振荡器、未倍频之前的PLL时钟、内部看门狗时钟、经过PLL倍频之后的
[单片机]