日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

STM32F2系列系统时钟默认配置

發(fā)布時(shí)間:2024/10/14 windows 64 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32F2系列系统时钟默认配置 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

新到一家公司后,有個(gè)項(xiàng)目要用到STM32F207Vx單片機(jī),找到網(wǎng)上的例子照貓畫(huà)虎的寫(xiě)了幾個(gè)例子,比如ADC,可是到了ADC多通道轉(zhuǎn)換的時(shí)候就有點(diǎn)傻眼了,這里面的時(shí)鐘跑的到底是多少M(fèi)呢?單片機(jī)外掛的時(shí)鐘是25M,由于該單片機(jī)時(shí)鐘系統(tǒng)較為復(fù)雜,有內(nèi)部高/低、外部高/低 、PLL鎖相環(huán)時(shí)鐘,又有AHB總線(xiàn)時(shí)鐘、APB1/2時(shí)鐘,而例子中很少講到系統(tǒng)時(shí)鐘的默認(rèn)配置是怎么配置呢?那么就發(fā)點(diǎn)時(shí)間研究下這個(gè)單片機(jī)內(nèi)部的復(fù)雜時(shí)鐘系統(tǒng)吧。

下圖是STM32F2系列的時(shí)鐘樹(shù)結(jié)構(gòu)圖:

1、內(nèi)部高速時(shí)鐘HSI、外部高速時(shí)鐘HSE和PLL時(shí)鐘PLLCLK時(shí)鐘都接到了SW開(kāi)關(guān)處,通過(guò)SW選擇哪一路作為SYSCLK,SYSCLK經(jīng)過(guò)AHB分頻器進(jìn)行分頻得到HCLK,APB1和APB2是掛在總線(xiàn)AHB上的,通過(guò)APB1和APB2分頻得出fpclk1和fpclk2。

2、PLL輸入時(shí)鐘源主要是靠外部高速時(shí)鐘和內(nèi)部高速時(shí)鐘作為時(shí)鐘源,通過(guò)PLLCFGR寄存器的bit22來(lái)選擇具體哪一路作為時(shí)鐘源。選擇好了時(shí)鐘源進(jìn)入/M分頻器,也就是PLLM進(jìn)行分頻,送入VCO,在通過(guò)xN,進(jìn)行倍頻,也就是PLLN:(1)通過(guò)/P進(jìn)行分頻(PLLP)得到PLLCLK;(2)通過(guò)/Q分頻(PLLQ),得到PLL48CK。

然后邊看代碼邊對(duì)照結(jié)構(gòu)圖進(jìn)行分析,看軟件如何給單片機(jī)配置系統(tǒng)時(shí)鐘的。

然后找到啟動(dòng)代碼“startup_stmf32xx.s”,該代碼是用匯編寫(xiě)的,可以看到,在調(diào)用main函數(shù)之前,是先調(diào)用了SystemInit函數(shù)的,該函數(shù)是在“system_stm32f2xx.c”中

; Reset handler Reset_Handler PROCEXPORT Reset_Handler [WEAK]IMPORT SystemInitIMPORT __mainLDR R0, =SystemInitBLX R0LDR R0, =__mainBX R0ENDP

代碼如下,變量直接賦個(gè)16進(jìn)制的數(shù),都不知道是啥意思,目的是干什么的,不知道,所以看下面代碼時(shí)最好對(duì)照STM32F2x用戶(hù)手冊(cè)。當(dāng)然這個(gè)只是一個(gè)初始化,待會(huì)主要看SetSysClock();這個(gè)函數(shù),在調(diào)用該函數(shù)之前,我們知道單片機(jī)是先啟用了內(nèi)部高速時(shí)鐘等一些配置。

void SystemInit(void) {/* Reset the RCC clock configuration to the default reset state ------------*//* Set HSION bit */RCC->CR |= (uint32_t)0x00000001; //RCC_CR復(fù)位值0x0000_xx83,內(nèi)部高速時(shí)鐘使能,也就是說(shuō)上電開(kāi)始就使用內(nèi)部高速時(shí)鐘,16MHZ/* Reset CFGR register */RCC->CFGR = 0x00000000; //通過(guò)開(kāi)關(guān)SW選擇內(nèi)部高速時(shí)鐘作為系統(tǒng)時(shí)鐘16MHZ//AHB prescaler 不分頻//APB Low speed prescaler (APB1) 不分頻,fplck1 = 16MHZ//APB high-speed prescaler (APB2)不分頻,fplck2 = 16MHZ//MCO1和MCO2時(shí)鐘輸出等配置可參考用戶(hù)手冊(cè)Page95/* Reset HSEON, CSSON and PLLON bits */RCC->CR &= (uint32_t)0xFEF6FFFF;/* Reset PLLCFGR register */RCC->PLLCFGR = 0x24003010; //RCC_CFGR復(fù)位值是0x2400_3010/* Reset HSEBYP bit */RCC->CR &= (uint32_t)0xFFFBFFFF; //對(duì)bit18 HSEBYP 設(shè)置為0,外部高速時(shí)鐘被禁止/* Disable all interrupts */RCC->CIR = 0x00000000; //所有時(shí)鐘中斷都被禁止 #ifdef DATA_IN_ExtSRAMSystemInit_ExtMemCtl(); #endif /* DATA_IN_ExtSRAM *//* Configure the System clock source, PLL Multiplier and Divider factors, AHB/APBx prescalers and Flash settings ----------------------------------*/SetSysClock();/* Configure the Vector Table location add offset address ------------------*/ #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(void)函數(shù)中在配置完一些參數(shù)后,還調(diào)用了SetSysClock()函數(shù),該函數(shù)代碼如下

static void SetSysClock(void) { /******************************************************************************/ /* PLL (clocked by HSE) used as System clock source */ /******************************************************************************/__IO uint32_t StartUpCounter = 0, HSEStatus = 0;/* Enable HSE */RCC->CR |= ((uint32_t)RCC_CR_HSEON); //外部高速時(shí)鐘使能,25MHZ/* Wait till HSE is ready and if Time out is reached exit */ //外部時(shí)鐘使能后,得需要一點(diǎn)時(shí)間到達(dá)各個(gè)端口do{HSEStatus = RCC->CR & RCC_CR_HSERDY; //如果RCC_CR_HSERDY為0,說(shuō)明外部時(shí)鐘還沒(méi)準(zhǔn)備好,1說(shuō)明外部時(shí)鐘已準(zhǔn)備好StartUpCounter++;//對(duì)讀的次數(shù)進(jìn)行累加,當(dāng)累加次數(shù)到達(dá)1280次時(shí),就意味著啟動(dòng)時(shí)間超時(shí)} while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));if ((RCC->CR & RCC_CR_HSERDY) != RESET)//這里判斷上面的do while循環(huán)是因哪個(gè)條件結(jié)束的 {HSEStatus = (uint32_t)0x01; //說(shuō)明時(shí)鐘已準(zhǔn)備好了,才結(jié)束do whlie循環(huán) }else{HSEStatus = (uint32_t)0x00; //說(shuō)明是因?yàn)槌瑫r(shí)了而退出do while循環(huán) }if (HSEStatus == (uint32_t)0x01){/* HCLK = SYSCLK / 1*/RCC->CFGR |= RCC_CFGR_HPRE_DIV1; //AHB不分頻,AHB出來(lái)后時(shí)鐘就是sysclk=120M/* PCLK2 = HCLK / 2*/RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;//APB2 2分頻,fpclk2 = sysclk/2 = 60M/* PCLK1 = HCLK / 4*/RCC->CFGR |= RCC_CFGR_PPRE1_DIV4; //APB1 4分頻,fplck1 = sysclk/4 = 30M/* Configure the main PLL */ //主要對(duì)PLL和PPI2S 進(jìn)行配置RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |(RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24); //配置完后RCC->PLLCFGR = 0x05403c19,然后對(duì)照寄存器RCC_PLLCFGR查看哪些位對(duì)應(yīng)哪些功能 //通過(guò)bit5~bit0可計(jì)算出PLLM=25,那么input VCO = PLL input clock /PLLM = 25M/25 = 1M,對(duì)應(yīng)時(shí)鐘結(jié)構(gòu)圖中的/M //通過(guò)bit14~bit6可計(jì)算出倍頻因子PLLN = 240,那么VCO output clock = PLLN * input VCO = 240 * 1 = 240M,對(duì)應(yīng)時(shí)鐘結(jié)構(gòu)圖中的xN //bit17~bit16可計(jì)算出分頻因子PLLP = 2,那么PLLCLK = VCO output clock /PLLP = 240/2 = 120M //bit22是選擇給PLL輸入的時(shí)鐘源,輸入時(shí)鐘源有外部和內(nèi)部高速時(shí)鐘,這里選擇的是外部高速時(shí)鐘即PLL input clock = HSE =25M //bit27~24可計(jì)算出分頻因子PLLQ = 5,那么PLL48CK = VCO output clock/PLLQ = 240/5 = 48M/* Enable the main PLL */RCC->CR |= RCC_CR_PLLON; //使能PLL/* Wait till the main PLL is ready */while((RCC->CR & RCC_CR_PLLRDY) == 0){}//到這里RCC->CR已配置完,最終值0x03036783//通過(guò)查看用戶(hù)手冊(cè)知道,內(nèi)部高速時(shí)鐘、外部高速時(shí)鐘、PLL時(shí)鐘都已開(kāi)啟/* Configure Flash prefetch, Instruction cache, Data cache and wait state */FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN | FLASH_ACR_DCEN | FLASH_ACR_LATENCY_3WS;/* Select the main PLL as system clock source */RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));RCC->CFGR |= RCC_CFGR_SW_PLL;//到這里RCC->CFGR已配置完,最終值是0x0000_940A//通過(guò)查看用戶(hù)手冊(cè),知道,PLL時(shí)鐘作為系統(tǒng)時(shí)鐘即120M//AHB不分頻,即HCLK = 120M//APB1 4分頻,即fpclk1 = 120/4=30M//APB2 2分頻,即fpclk2 = 120/2=60M/* Wait till the main PLL is used as system clock source */while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);{}}else{ /* If HSE fails to start-up, the application will have wrong clockconfiguration. User can add here some code to deal with this error */}}

OK,分析完這段代碼后,調(diào)用系統(tǒng)固件函數(shù)后,現(xiàn)在知道了時(shí)鐘樹(shù)結(jié)構(gòu)圖中右邊出來(lái)的時(shí)鐘是多少M(fèi)Hz了吧。

總結(jié):

1、使用的是外部時(shí)鐘25MHZ,通過(guò)PLL進(jìn)行分頻倍頻分頻得到PLLCLK 120M,PLLCLK作為系統(tǒng)時(shí)鐘SYSCLK。

2、APB1出來(lái)是30M,也就是FPCLK1。

3、APB2出來(lái)是60M,也就是FPCLK2。


轉(zhuǎn)自?http://www.cnblogs.com/wen2376/p/4468319.html

總結(jié)

以上是生活随笔為你收集整理的STM32F2系列系统时钟默认配置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。