在GD固件庫的時鐘配置函數里看到這樣一段神秘代碼,研究分析后不得不佩服原廠固件庫里的細節(jié)處理:

查看定義是一段代碼,對AHB 2分頻后延時了一段時間:

在這段代碼后面可以看到程序將RCU_CFG0和RCU_CFG1兩個時鐘寄存器做了復位:

如果是程序復位啟動后第一次執(zhí)行這段代碼,應該是沒有什么意義的,但產品設計時一般都會有一個BootLoader和APP兩段程序,當BootLoader跳轉到APP時,MCU的時鐘已經處于一個高頻狀態(tài),直接執(zhí)行RCU的復位意味著時鐘會立刻切到內部8M運行。
而通過查看DATASHEET,可以看到MCU在最大主頻下和默認復位主頻下的電流差距是很大的:


這樣的內部電流瞬間變化一般會導致內部電源的波動,這種波動情況下執(zhí)行的指令是不可靠的,如果硬件設計時MCU去耦電容設計不合理,很可能加劇這個波動,此時如果指令錯誤了那很可能會跑飛進入hardfault。
而GD固件庫里這個神秘代碼,在高頻的情況下可以將系統(tǒng)時鐘降低一半并延時等待穩(wěn)定,最后再復位時鐘寄存器降到8M的系統(tǒng)時鐘。這樣就讓電流變化有一個過渡,避免了內部電源波動過大。

——>

——>
關鍵字:GD32 固件庫 時鐘配置
引用地址:
GD32固件庫里時鐘配置時的神秘代碼?高頻切低頻時芯片會發(fā)生什么
推薦閱讀最新更新時間:2025-07-02 08:08
STM32F7系統(tǒng)配置控制器(SYSCFG)及復位和時鐘控制(RCC)
這篇文章帶大家看一下 STM32F7的系統(tǒng)配置控制器 。系統(tǒng)配置控制器主要用于: 1、 選擇以太網PHY接口; 2、 交換FMC SDRAM存儲區(qū)域與NOR/PSRAM存儲區(qū)域; 3、 管理GPIO外部中斷線連接; 在系統(tǒng)控制寄存器里有一個bit位來選擇使用哪個選項字定義的啟動基地址來啟動。 復位類型 一共有三種復位類型,系統(tǒng)復位、電源復位和備份域復位。 系統(tǒng)復位在VDD保持正常工作電壓的前提下,有五種事件可以產生復位,分別是低功耗管理復位、軟件復位、獨立看門狗計數器溢出、窗口看門狗計數器溢出和NRST引腳上的低電平。這里低功耗管理復位指的是MCU執(zhí)行低功耗模式進入序列的時候是產生復位還是停止待機模式,這個是可以通過選
[單片機]
基于STM32F407時鐘配置學習
2F4x系列時鐘樹如下: 1、系統(tǒng)時鐘SYSCLK 在STM32F407中,除了一些特定的時鐘(例如,USB OTG FS時鐘,I2S時鐘)外,系統(tǒng)所有外設的時鐘均是通過SYSCLK來提供的。也就是說我們經常用到的外設時鐘,都是通過SYSCLK分頻得到的。下面是和SYSCLK相關的時鐘樹的圖。 由圖中可以看到,SYSCLK的來源主要有三個。 - HSI 振蕩器時鐘 - HSE 振蕩器時鐘 - 主 PLL (PLL) 時鐘 下面分別來看下系統(tǒng)時鐘SYSCLK的三個來源。 (1) 高速外部時鐘HSE(4M~26M) 高速外部時鐘是芯片內部的HSE振蕩器產生的。高速外部信號(HSE)有兩個時鐘源。 - HSE外
[單片機]
STM32F4時鐘配置
看了下時鐘樹按照http://blog.csdn.net/louyangyang91/article/details/51374924這個博文配置了,結果發(fā)現UART波特率不對,但是MOC1\2都是正常輸出(168M/5分頻輸出),蒙了很久才發(fā)現 USART_Init(USART1, &USART_InitStructure); 這個函數內部會調用RCC_GetClocksFreq(&RCC_ClocksStatus);這個函數來得到PCLK1\PCLK2等系統(tǒng)時鐘,進入這個函數看其內部發(fā)現它調用了一個HSE_VALUE的宏定義,繼續(xù)定位發(fā)現居然是 #if !defined (HSE_VALUE) #define HSE_VA
[單片機]
STM32入門學習之_SysTick_Config()函數的SysTick時鐘配置
上來就是systick定時器,因為GPIO等的基礎操作過于簡單,網上資料太多了。 這里討論的是基于STM32F10x 的基于 V3.5.0庫的庫函數配置方法。 Systick又叫系統(tǒng)嘀答定時器,是一個24位的硬件定時器。嵌入式操作系統(tǒng)常有一個類似“心跳”的定時器,來分配時間片,實現宏觀上的多任務。 其實,操作系統(tǒng)的多任務,在微觀上,CPU對多任務的管理是分時的。每個任務都給一定的時間片,就是把時間分成N個等份,優(yōu)先級高或是 重要的任務多占幾個時間片,優(yōu)先級低的或是不重要的任務就少占幾個時間片。大部分嵌入式操作系統(tǒng)基于時間片的。如ucos。 那基于STM32F10x V3.5.0庫如何操作Systick定時器呢。 首先:STM32
[單片機]
STM32F0xx_RTC實時時鐘配置詳細過程
Ⅰ、概述 今天總結RTC(Real Time Clock)實時時鐘相關的知識,順帶將BKP簡單總結一下。 STM32的RTC模塊和時鐘配置系統(tǒng)(RCC_BDCR寄存器)處于后備區(qū)域,即在系統(tǒng)復位或從待機模式喚醒后, RTC的設置和時間維持不變。 STM32F0的RTC模塊和F1的RTC模塊最大區(qū)別在于F0模塊中有“DATE”和“TIME”寄存器,也就是可以直接讀取寄存器里面的值,而F1是秒計數寄存器的值,需要通過相關算法下才能得到時間的值。 本文提供的軟件工程里面還包含一個BKP模塊,主要是用于掉電保持RTC數值(第一次上電初始化RTC,后面就不用初始化)。例程是在第一次初始化RTC值為:2016年6月5日 周七 12:00:00
[單片機]
stm32f105/107互聯(lián)性時鐘配置參考函數
/************************************************************************ ** Function Name : RCC_Configuration ** Description : 配置時鐘 ** Input Parameters : ** Output Parameters : = 1 : 保存成功 = 0 : 保存失敗 note : *********************************************************************
[單片機]