SystemInit時鐘系統初始化函數剖析

SystemInit()函數:

void SystemInit (void)
{/* Set HSION bit */RCC->CR |= (uint32_t)0x00000001;//把內部的HSI RC(高速時鐘)打開#ifndef STM32F10X_CLRCC->CFGR &= (uint32_t)0xF8FF0000;//這一句不會執行,由于定義的是STM32F10X_HD,他會執行else后的語句。
#elseRCC->CFGR &= (uint32_t)0xF0FF0000;//系統初始化狀態
#endif /* STM32F10X_CL */   /* Reset HSEON, CSSON and PLLON bits */RCC->CR &= (uint32_t)0xFEF6FFFF;//默認狀態/* Reset HSEBYP bit */RCC->CR &= (uint32_t)0xFFFBFFFF;//默認狀態/* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */RCC->CFGR &= (uint32_t)0xFF80FFFF;//默認狀態#ifdef STM32F10X_CL/* Reset PLL2ON and PLL3ON bits */RCC->CR &= (uint32_t)0xEBFFFFFF;/* Disable all interrupts and clear pending bits  */RCC->CIR = 0x00FF0000;/* Reset CFGR2 register */RCC->CFGR2 = 0x00000000;
#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)/* Disable all interrupts and clear pending bits  */RCC->CIR = 0x009F0000;/* Reset CFGR2 register */RCC->CFGR2 = 0x00000000; //由于是STM32F10X_CL,所以ifdef后的語句不會執行     
#else/* Disable all interrupts and clear pending bits  */RCC->CIR = 0x009F0000;//把所有中斷都關掉,位全部都清掉
#endif /* STM32F10X_CL */#if defined (STM32F10X_HD) || (defined STM32F10X_XL) || (defined STM32F10X_HD_VL)#ifdef DATA_IN_ExtSRAMSystemInit_ExtMemCtl(); //這里沒有執行,因為不是STM32F10X_HD#endif /* DATA_IN_ExtSRAM */
#endif /* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers *//* Configure the Flash Latency cycles and enable prefetch buffer */SetSysClock();#ifdef VECT_TAB_SRAMSCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#elseSCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
#endif 
}

SystemInit()中的SetSysClock()函數部分:

static void SetSysClock(void)
{
#ifdef SYSCLK_FREQ_HSESetSysClockToHSE();
#elif defined SYSCLK_FREQ_24MHzSetSysClockTo24();
#elif defined SYSCLK_FREQ_36MHzSetSysClockTo36();
#elif defined SYSCLK_FREQ_48MHzSetSysClockTo48();
#elif defined SYSCLK_FREQ_56MHzSetSysClockTo56();  
#elif defined SYSCLK_FREQ_72MHz//這里的意思是判斷標識符有沒有被定義,定義了哪種就調用哪種設置系統時鐘的函數。SetSysClockTo72();
#endif/* If none of the define above is enabled, the HSI is used as System clocksource (default after reset) */ 
}

這里是舉例SetSysClockTo72()這個系統時鐘函數:
FLASH_ACR是閃存訪問控制寄存器

static void SetSysClockTo72(void)
{__IO uint32_t StartUpCounter = 0, HSEStatus = 0;/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/    /* Enable HSE */    RCC->CR |= ((uint32_t)RCC_CR_HSEON);//外部高速時鐘使能/* Wait till HSE is ready and if Time out is reached exit  do  while語句意思是等待HSE穩定 */do{HSEStatus = RCC->CR & RCC_CR_HSERDY;StartUpCounter++;  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));if ((RCC->CR & RCC_CR_HSERDY) != RESET){HSEStatus = (uint32_t)0x01;//HSEStatus是表示一種狀態}//if語句是判斷是否準備就緒else{HSEStatus = (uint32_t)0x00;}  if (HSEStatus == (uint32_t)0x01)//就緒后執行這一步{/* Enable Prefetch Buffer */FLASH->ACR |= FLASH_ACR_PRFTBE;///* Flash 2 wait state */FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;    
//cpu的速度比芯片的flash的速度快很多,所以在操作之前要等待時鐘,這三句是對FLASH_ACR寄存器操作/* HCLK = SYSCLK */RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;//HCLK = SYSCLK就要設置AHB預分頻為不分頻  /* PCLK2 = HCLK */RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;//PCLK2 = HCLK就要APB2預分頻預分頻系數HCLK不分頻/* PCLK1 = HCLK/2*/RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;//PCLK1 = HCLK/2就要APB1設置預分頻系數HCLK的二分頻
#ifdef STM32F10X_CL/* Configure PLLs ------------------------------------------------------*//* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz *//* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);/* Enable PLL2 */RCC->CR |= RCC_CR_PLL2ON;/* Wait till PLL2 is ready */while((RCC->CR & RCC_CR_PLL2RDY) == 0){}/* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */ RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLMULL9); 
#else    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |RCC_CFGR_PLLMULL));RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);//RCC_CFGR_PLLSRC_HSE是將HSE作為PLL的時鐘源,RCC_CFGR_PLLMULL9是將倍頻系數設置為9
#endif /* STM32F10X_CL *//* Enable PLL */RCC->CR |= RCC_CR_PLLON;//使能PLL時鐘/* Wait till PLL is ready  while語句等待PLL就緒*/while((RCC->CR & RCC_CR_PLLRDY) == 0){}/* Select PLL as system clock source 將PLL作為系統時鐘來源*/RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    /* Wait till PLL is used as system clock source */while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08){}}else{ /* If HSE fails to start-up, the application will have wrong clock configuration. User can add here some code to deal with this error */}
}

總結一下:
SystemInit()函數中設置的系統時鐘大小:

SYSCLK(系統時鐘) =72MHzAHB 總線時鐘(使用 SYSCLK) =72MHzAPB1 總線時鐘(PCLK1) =36MHzAPB2 總線時鐘(PCLK2) =72MHzPLL 時鐘 =72MHz

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

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

相關文章

火狐表格錯亂兼容性問題

對于某一單元行需要顯示時,使用CSS display:block屬性,不需要顯示時使用display:none屬性,在IE瀏覽器中顯示正常,沒有任何問題,但是當用Firefox瀏覽時卻出現了布局錯亂的問題,這是為什么呢? 本文…

docker ps命令詳解 列出運行中的容器

docker ps命令詳解 列出運行中的容器 使用docker ps命令即可列出運行中的容器,執行該命令后,會出現如下7列表格 CONTAINER_ID 表示容器ID IMAGE 表示鏡像名稱 COMMAND 表示啟動容器時運行的命令 CREATED …

Lattice 的 Framebuffer IP核使用調試筆記之datasheet筆記

本文由遠航路上ing 原創,轉載請標明出處。 學習使用以及調試Framebuffer IP 核已經有一段時間了,調試的時候總想記錄些東西,可是忙的時候就沒有時間來寫,只有先找個地方記錄下,以后再總結。所以找這個時間好好的記錄學…

Systick滴答定時器寄存器、delay()延時函數、SysTick_Config函數

SysTick定時器 SysTick定時器,是一個簡單的定時器,對于CM3、CM4內核的芯片都有SysTick定時器。SysTick 是一個 24 位的倒計數定時器,當計數到 0 時,將從RELOAD 寄存器中自動重裝載定時初值,開始新一輪計數。只要不把它…

查看docker容器日志

1:實時查看docker容器id為 02c5ac132ee5 的最后10行日志 docker logs -f -t --tail 10 02c5ac132ee5 2:查看指定時間后的日志,只顯示最后100行: docker logs -f -t --since"2020-02-14" --tail100 d7db22166a0a 3:查看最近20分鐘的…

Web UI 自動化測試環境搭建 (轉載自51測試天地第三十九期上)

1. 安裝 Python 2.7 并設置系統環境變量 2. 下載并安裝 python setuptools Easily download, build, install, upgrade, and uninstall Python packages https://pypi.python.org/pypi/setuptools#installation-instructions 2.1 找到ez_setup.py,點擊右鍵--目標另存…

STM32F1 端口復用、端口(部分和完全)重映射

端口復用功能 STM32 有很多的內置外設(比如:串口、ADC、DAC等是獨立的模塊和內核連接在一起),這些外設的外部引腳都是與 GPIO 復用的。也就是說,一個 GPIO如果可以復用為內置外設的功能引腳,那么當…

docker啟動容器后容器狀態為Exited (137) 5 seconds ago

1:因為容器里的運行的代碼報錯了,然后容器 Exited (1) 3 seconds ago 了,通過 docker logs -f container_id 能看到哪里錯了 容器樁體為exited,說明容器已經退出停止 先查看查看鏡像id ps images 在后臺運行一個容器 為了保證提…

ReflectionClass與Closure

<?php /*** Class A*/ class A{}$obj new ReflectionClass(A); var_export($obj.PHP_EOL); 類后面加上PHP_EOL會把當前類的詳細接口文檔打印出來。 ReflectionClass 可以利用這個動態創建類&#xff0c;動態使用類方法參數。 try{ //如果存在控制器名字的類 if(class_exis…

STM32中斷優先級的管理(NVIC)

STM32 NVIC 中斷優先級管理 CM3 內核支持 256 個中斷&#xff0c;其中包含了 16 個內核中斷和 240 個外部中斷&#xff0c;并且具有 256級的可編程中斷設置。STM32 并沒有使用 CM3 內核的全部東西&#xff0c;而是只用了它的一部分。STM32 有 84 個中斷&#xff0c;包括 16 個…

docker修改容器名字

查看一下容器的名字 這個laughing_elion是下載es時候默認的名字 修改容器名字 docker rename 容器原來名 要改為的名字 最后可以看到容器名已經修改成功

STM32 串行通信原理

處理器與外部設備通信的兩種方式&#xff1a; 并行通信 傳輸原理&#xff1a;數據各個位同時傳輸。優點&#xff1a;速度快缺點&#xff1a;占用引腳資源多 串行通信 傳輸原理&#xff1a;數據按位順序傳輸。優點&#xff1a;占用引腳資源少缺點&#xff1a;速度相對較慢 …

linus下centos7防火墻設置

CentOS7 默認使用firewalld防火墻&#xff0c;如果想換回iptables防火墻&#xff0c;可關閉firewalld并安裝iptables。 1:安裝firewalld服務 yum install firewalld 2、firewalld的基本使用 啟動&#xff1a; systemctl start firewalld &#xff08;關閉后顯示notrunning&a…

串口通信寄存器/庫函數配置、實例編寫

常用的串口相關寄存器 USART_SR狀態寄存器USART_DR數據寄存器USART_BRR波特率寄存器 串口操作相關庫函數&#xff08;省略入口參數&#xff09;&#xff1a; void USART_Init(); //串口初始化&#xff1a;波特率&#xff0c;數據字長&#xff0c;奇偶校驗&#xff0c;硬件流…

使用docker安裝Mongodb

下載mongo3.2的docker鏡像&#xff1a; docker pull mongo:3.2 使用docker命令啟動&#xff1a; docker run -p 27017:27017 --name mongo \ -v /mydata/mongo/db:/data/db \ -d mongo:3.2 查看已經成功啟動

移動端meta標簽

現在的手機或平板電腦等移動設備上的瀏覽器默認都有雙擊放大的設置&#xff0c;如何阻止雙擊放大&#xff1f;user-scalableno <!-- 禁止縮放 --> <meta name”viewport” content”widthdevice-width,initial-scale1.0,maximum-scale1.0,user-scalableno”> <!…

正點原子stm32--串口通信實驗講解里關于USART_RX_STA的問題與思考

這篇博文講的挺詳細的可以參考以下&#xff1a; USART_RX_STA詳解

什么是真正的程序員?

什么是真正的程序員 這篇文章的原文來自&#xff1a;A Little Printf Story作者仿照《小王子》中的情節&#xff0c;通過小printf遇見的不同類型的程序員&#xff0c;最后悟出什么才是真正的程序員&#xff01;第一次翻譯有很多不妥&#xff0c;歡迎留言指正。 文章略長&#x…

為什么會出現docker

docker鏡像&#xff0c;一次構建&#xff0c;到處運行

docker和虛擬機的區別

虛擬機缺點&#xff1a; docker和虛擬機的不同之處&#xff1a;