OpenMCU(五):STM32F103時鐘樹初始化分析

概述

????????本文主要描述了STM32F103初始化過程系統時鐘的初始化,主要描述了系統時鐘的初始化,AHB總線時鐘,APB總線時鐘等的初始化。

硬件板卡3d圖

時鐘樹

STM32F103的時鐘樹,如下所示:

時鐘源選擇

從STM32F103的時鐘樹框圖,我們可以看到:

1、有可選的1路高速外部時鐘接口,作為系統時鐘的時鐘源;

2、1路32.768的可選低速時鐘,作為系統RTC和watchdog的時鐘源;

3、1路內部的可選8M 高速時鐘,作為系統時鐘的時鐘源;

系統時鐘選擇

根據時鐘樹所示,可選的系統的時鐘選擇,如下所示:

1、內部8M的HSI直接作為系統的時鐘源,如果使用HSI作為系統時鐘源的話,最大SYSCLK只能輸出到64MHz;

2、HSI或者HSE的通過PLL的倍頻后,作為系統時鐘源;

3、HSE的輸出,直接作為系統的時鐘源;

通過系統時鐘源的來源描述,系統的時鐘源可以根據硬件板卡的制作情況,進行選擇;作者自己設計的PCB板子上,因為沒有連接外部晶振,因此將HSI作為系統的時鐘源選擇。后續的時鐘初始化代碼分析,會講解怎么將HSI設置為系統的時鐘源;

其他外設時鐘

根據STM32F103的時鐘樹,其他外設控制器的時鐘的來源如下所示:

1、USB控制器的時鐘,直接來源于PLLCLK,然后經過USB預分頻,最終達到48M的時鐘輸出,作為USB控制器的時鐘;

2、I2S音頻控制器的時鐘,直接來源于SYSCLK, 和SYSCLK的時鐘相同;

3、SDIO, FSMC, HCLK 等時鐘,直接來自于AHB總線的時鐘輸出;

4、剩余外設的時鐘自于APB1或者APB2,這里不再這里詳細描述;

時鐘初始化設置

由于作者自己設計的硬件板子,使用了內部的8M作為整個CPU的時鐘源,因此,下面以使用內部8M的高速時鐘的情況,進行源碼講解,設置源碼如下所示:

void SystemClock_Config(void)
{RCC_ClkInitTypeDef clkinitstruct = {0};RCC_OscInitTypeDef oscinitstruct = {0};/* Configure PLL ------------------------------------------------------*//* PLL configuration: PLLCLK = (HSI / 2) * PLLMUL = (8 / 2) * 16 = 64 MHz *//* PREDIV1 configuration: PREDIV1CLK = PLLCLK / HSEPredivValue = 64 / 1 = 64 MHz *//* Enable HSI and activate PLL with HSi_DIV2 as source */oscinitstruct.OscillatorType  = RCC_OSCILLATORTYPE_HSI;     /* HSI作為系統時鐘源 */oscinitstruct.HSEState        = RCC_HSE_OFF;                /* 關閉HSE時鐘 */oscinitstruct.LSEState        = RCC_LSE_OFF;                /* 關閉LSE時鐘 */oscinitstruct.HSIState        = RCC_HSI_ON;                 /* 開啟HSI時鐘 */oscinitstruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;oscinitstruct.HSEPredivValue    = RCC_HSE_PREDIV_DIV1;oscinitstruct.PLL.PLLState    = RCC_PLL_ON;oscinitstruct.PLL.PLLSource   = RCC_PLLSOURCE_HSI_DIV2;oscinitstruct.PLL.PLLMUL      = RCC_PLL_MUL16;if (HAL_RCC_OscConfig(&oscinitstruct)!= HAL_OK){/* Initialization Error */while(1);}/* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2clocks dividers 將PLL的輸出,作為系統時鐘*/clkinitstruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);clkinitstruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;clkinitstruct.AHBCLKDivider = RCC_SYSCLK_DIV1;clkinitstruct.APB2CLKDivider = RCC_HCLK_DIV1;clkinitstruct.APB1CLKDivider = RCC_HCLK_DIV2;if (HAL_RCC_ClockConfig(&clkinitstruct, FLASH_LATENCY_2)!= HAL_OK){/* Initialization Error */while(1);}
}

????????由于作者為了減少PCB板子的尺寸,因此在設計過程中,硬件上沒有接外部晶振和32.768的低速晶振。因此只能使用內部HSI作為時鐘源,但是在使用HSI作為時鐘源時,系統的時鐘最大只能設置到64MHz;

代碼主要邏輯如下:

1、將HSI的晶振作為系統的晶振輸入;

2、關閉HSE時鐘源;

3、關閉LSE時鐘源;

4、計算出SYSCLK = HSI /2 * PLL_MUl16 = 8/2 * 16 = 64M;

5、調用HAL_RCC_OscConfig()接口,設置系統時鐘源;

6、選擇PLLCLK的輸出,最為系統時鐘(64M);

總結

????????本文主要描述了,在STM32F103 CPU初始化過程中,系統時鐘的初始化。雖然,我們可以利用ST提供的上位機圖形化工具進行時鐘配置,簡單的勾選就可以產生我們需要的代碼。但是,作為一個嵌入式開發程序員,我覺得,還是有必要去分析源碼,了解CPU的內部原理和HAL層代碼,這樣才能根據自己產品的實際需求情況,設計出更具有性價比的產品。

鏈接

yanl1229/STM32F103

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/74146.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/74146.shtml
英文地址,請注明出處:http://en.pswp.cn/web/74146.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【qt】文件類(QFile)

很高興你能看到這篇文章,同時我的語雀文檔也更新了許多嵌入式系列的學習筆記希望能幫到你 : https://www.yuque.com/alive-m4b9n 目錄 QFile 主要功能QFile 操作步驟QFile 其他常用函數案例分析及實現功能一實現:打開文件并顯示功能二實現:另…

基于AT89C52單片機的輪胎壓力監測系統

點擊鏈接獲取Keil源碼與Project Backups仿真圖: https://download.csdn.net/download/qq_64505944/90545655?spm1001.2014.3001.5503 功能介紹: 采用MPX4115壓力傳感器進行輪胎壓力檢測;使用LCD液晶顯示器顯示輪胎壓力;若壓力過…

shell腳本--MySQL簡單調用

實現功能 增 數據庫的創建,數據表的創建已經實現 創建用戶 刪 刪除數據庫, 刪除庫下的某個表, 刪除某個用戶 改 暫無 查 查看所有的數據庫, 查看某個庫下的所有數據表, 查看某個表的結構, 查…

計算機網絡 OSI參考模型

目錄 OSS七層 OSI通信過程1 OSI通信過程2 應用層 表示層 會話層 傳輸層 網絡層 數據鏈路層 物理層 OSS七層 OSI通信過程1 OSI通信過程2 應用層 表示層 會話層 傳輸層 網絡層 數據鏈路層 物理層

2025年華為HCIP題庫分享

1101、 【拖拽題】OPSF鄰接關系建立的過程中需要使用不同的報文,那么請分別將以下各個狀態和該狀態使用的報文聯系起來。 答題格式為:11 22 33 43 正確答案:【12】【21】【24】【33】 解析: 建立鄰居關系 RouterA的一個連接到廣…

DIskgenius使用說明

文章目錄 一、概述1. 軟件簡介2. 系統要求 二、核心功能1. 分區管理(1) 查看磁盤分區(2) 創建與刪除分區(3) 調整分區大小(4) 格式化分區 2. 數據恢復(1) 恢復已刪除文件(2) 恢復丟失分區(3) 恢復誤格式化分區 3. 磁盤復制(1) 克隆磁盤(2) 磁盤鏡像 4. 文件操作(1) 文件復制與移…

linux--------------進程控制(上)

1.進程創建 1.1fork函數初識 在linux中fork函數是?常重要的函數&#xff0c;它從已存在進程中創建?個新進程。新進程為?進程&#xff0c;?原進 程為?進程。 #include <unistd.h> pid_t fork(void); 返回值&#xff1a;?進程中返回0&#xff0c;?進程返回?進程id…

windows免密SSH連接 ubuntu教程

文章目錄 前情提要step1. 在windows下生成SSH密鑰step2. SSH公鑰copy到ubuntu的~/.ssh/authorized_keys內step3. 修改文件權限&#xff08;這一步完成后就可以實現免密SSH連接了&#xff09; 前情提要 ubuntu下安裝SSH服務 sudo apt-get install openssh-serverwindows下安裝…

中級:數組算法面試題全解析

一、引言 在Java面試中&#xff0c;數組相關的算法題是考察候選人基礎算法能力的常見類型。面試官通過這些問題了解候選人在面對具體問題時的邏輯思維和代碼實現能力。本文將深入剖析常見的數組算法面試題&#xff0c;結合實際開發場景&#xff0c;幫助讀者全面掌握這些知識點…

《Linux運維實戰:Ubuntu 22.04配置pam實現密碼復雜度策略》

總結&#xff1a;整理不易&#xff0c;如果對你有幫助&#xff0c;可否點贊關注一下&#xff1f; 更多詳細內容請參考&#xff1a;Linux運維實戰總結 一、背景信息 由于安全方面的考慮&#xff0c;先要求Ubuntu 22.04系統需配置密碼復雜度策略&#xff0c;先要求如下&#xff1…

JavaScript數據結構

目錄 JavaScript數據結構 一、基礎數據結構 1. 數組&#xff08;Array&#xff09; 2. 對象&#xff08;Object&#xff09; 二、ES6 高級數據結構 1. Map 2. Set 3. WeakMap 與 WeakSet 三、類型化數組&#xff08;Typed Arrays&#xff09; 四、其他數據結構實現 …

魔改chromium——基礎環境搭建

谷歌chromium環境要求詳細文檔 軟件和環境要求&#xff0c;必須安裝&#xff0c;硬性要求 系統環境&#xff1a;Windows 10&#xff0c;內存最小8GB&#xff0c;推薦16GB&#xff0c;NTFS格式磁盤最少100GB空間Git版本&#xff1a;安裝最新版本即可&#xff0c;Git桌面端下載…

電子文檔安全管理系統V6.0接口backup存在任意文件下載漏洞

免責聲明&#xff1a;本號提供的網絡安全信息僅供參考&#xff0c;不構成專業建議。作者不對任何由于使用本文信息而導致的直接或間接損害承擔責任。如涉及侵權&#xff0c;請及時與我聯系&#xff0c;我將盡快處理并刪除相關內容。 漏洞描述 電子文檔安全管理系統 V6.0 reso…

5.3 MVVM模型

一、MVVM的基本概念 MVVM的基本概念&#xff1a;Model、View、ViewModel 組件職責示例內容Model封裝業務數據User類&#xff0c;包含姓名、年齡屬性View負責UI呈現XAML界面&#xff0c;包含數據綁定ViewModel連接View和Model&#xff0c;處理視圖邏輯MainViewModel包含命令和…

python采集淘寶拍立淘按圖搜索API接口,json數據示例參考

以下是關于淘寶拍立淘按圖搜索API接口的詳細說明及JSON數據示例&#xff1a; 一、接口概述 淘寶拍立淘按圖搜索API接口是淘寶開放平臺提供的一項基于圖像識別技術的服務&#xff0c;允許開發者通過上傳商品圖片&#xff0c;獲取與圖片相似或相同的商品列表。該接口廣泛應用于…

每天學一個 Linux 命令(8):ls

大家好,歡迎來到《每天掌握一個Linux命令》系列。在這個系列中,我們將逐步學習并熟練掌握Linux命令,今天,我們要學習的命令是ls。 01 什么是ls命令 在Linux系統中,ls命令是“list”的縮寫,其英文全稱為“list directory contents”,即“列出目錄內容”。該命令非常實用…

00.【Linux系統編程】 Linux初識(云服務器設置CentOS并使用、Xshell鏈接云服務器)

目錄 一、華為云服務器免費體驗申請 二、Xshell遠程鏈接創建好的華為云服務器 2.1 下載Xshell 2.2 Xshell遠程連接華為云服務器 一、華為云服務器免費體驗申請 華為云官網 1. 進入華為云官網&#xff0c;最上面一欄點活動&#xff0c;并進入免費體驗中心。 2. 找到含有“…

arm非對齊訪問編譯器選項

gcc編譯選項&#xff1a; -munaligned-access gcc編譯選項&#xff1a; -mno-unaligned-access Enables (or disables) reading and writing of 16- and 32- bit values from addresses that are not 16- or 32- bit aligned. By default unaligned access is disabled for…

jmeter線程組高并發(詳細講解)

在 JMeter 中&#xff0c;線程組是測試計劃的核心組件&#xff0c;用于定義虛擬用戶&#xff08;線程&#xff09;的行為。線程組的屬性決定了測試的并發用戶數、加載速度、運行時間等。以下是線程組屬性的詳細講解&#xff1a; 1. 名稱&#xff08;Name&#xff09; 定義&…

vs2022中使用spdlog、C++日志

spdlog::set_level(spdlog::level::info); // 只顯示info及比info高級的信息&#xff0c;trace 和 debug 不顯示 參考&#xff1a;Windows10中使用VS2022和Cmake編譯構建C開源日志庫-spdlog-騰訊云開發者社區-騰訊云 spdlog C日志管理 | 快速上手教程 - 知乎 1.按照上述步驟…