1. 程式人生 > >STM32在外部32Mhz晶振下的時鐘配置方法

STM32在外部32Mhz晶振下的時鐘配置方法

1. 硬體平臺

本例程使用的是 STM32F302RDT6 晶片,其時鐘配置方法在其它ST微控制器中也類似。

2. 實驗目的

使用外部 32Mhz 晶振配置系統時鐘為 72Mhz

3. 配置原理

根據STM32F302RD晶片的參考手冊,可以檢視該晶片的時鐘樹結構,這裡我們配置系統時鐘 SYSCLK 為72Mhz,所以這裡只需要修改 PREDIV 的分頻值為4分頻,其它 PLL 倍頻等配置和使用8Mhz外部晶振時配置相同。
這裡寫圖片描述

4. 修改配置

(1)開啟工程裡的 system_stm32f30x.c 檔案,找到 SetSysClock() 函式,進行時鐘配置修改。這裡我們只需要將外部時鐘四分頻後得到8Mhz的時鐘,所示我們只需要新增 RCC->CFGR2 |= (uint32_t)RCC_CFGR2_PREDIV1_DIV4;來實現時鐘的分頻。

static void SetSysClock(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;

/******************************************************************************/
/*            PLL (clocked by HSE) used as System clock source                */
/******************************************************************************/
/* 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 { 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; } else { HSEStatus = (uint32_t)0x00; } if (HSEStatus == (uint32_t)0x01) { /* Enable Prefetch Buffer and set Flash Latency */ FLASH->ACR = FLASH_ACR_PRFTBE | (uint32_t)FLASH_ACR_LATENCY_1; /* HCLK = SYSCLK / 1 */ RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; /* PCLK2 = HCLK / 1 */ RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; /* PCLK1 = HCLK / 2 */ RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2; /* PLL configuration */ RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL9); /*!< PREDIV1 input clock divided by 4 */ RCC->CFGR2 |= (uint32_t)RCC_CFGR2_PREDIV1_DIV4; // add. by zhixiaoxing /* Enable PLL */ RCC->CR |= RCC_CR_PLLON; /* Wait till PLL is ready */ while((RCC->CR & RCC_CR_PLLRDY) == 0) { } /* Select PLL as system clock source */ 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)RCC_CFGR_SWS_PLL) { } } 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 */ } }

(2)全域性搜尋 HSE_VALUE 空定義,在 stm32f30x.h 檔案中,這裡我們將外部晶振時鐘修改為 32000000 Hz

#if !defined  (HSE_VALUE) 
#define HSE_VALUE            ((uint32_t)32000000) /*!< Value of the External oscillator in Hz */
#endif /* HSE_VALUE */

5. 檢視匯流排時鐘

在對STM32時鐘進行配置後,為了進一步驗證配置的正確性,我們可以使用模擬來檢視系統各匯流排的時鐘頻率。首先在主函式中新增如下程式碼:

int main(void)
{
    RCC_ClocksTypeDef get_rcc_clock;    
    RCC_GetClocksFreq(&get_rcc_clock); // 獲取系統時鐘配置
}

通過模擬可以檢視各匯流排時鐘的配置頻率,如下圖所示:
這裡寫圖片描述
Note:注意一定要修改巨集 #define HSE_VALUE ((uint32_t)32000000) /!< Value of the External oscillator in Hz /的值,因為時鐘使用該巨集定義進行計算。

5. 慎入此坑

在時鐘配置時,需要注意的一些問題:
(1)在時鐘樹任何一個倍頻的環節都不能超頻,即使後面分頻係數較大,還是會導致時鐘配置失敗;
(2)在配置外部晶振四分頻時,發現了一個詭異的問題,CFGR2暫存器一定要在CFGR暫存器之後,否則會導致CGFR2暫存器的值與配置的不符,至今不明其詭異之處?

/* PLL configuration */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL9);

/*!< PREDIV1 input clock divided by 4 */  
RCC->CFGR2 |= (uint32_t)RCC_CFGR2_PREDIV1_DIV4;     // add. by zhixiaoxing

相關推薦

STM32外部32Mhz時鐘配置方法

1. 硬體平臺 本例程使用的是 STM32F302RDT6 晶片,其時鐘配置方法在其它ST微控制器中也類似。 2. 實驗目的 使用外部 32Mhz 晶振配置系統時鐘為 72Mhz。 3. 配置原理 根據STM32F302RD晶片

關於Nucleo-STM32板沒有時鐘頻率的來源

        剛入手的一塊Nucleo-STM32F303RE開發板,高興之餘發現板上竟然沒有晶振,不過有出廠程式,燈能閃,難道用了內部晶振?帶著疑問百度了一下,有人說是和板上st-link共用8M晶振,那麼到底是不這樣呢? 一、結論:        下載這塊板的使用者手冊

stm32變更外部時如何配置時鐘、以及HSI的使用

void RCC_Configuration(void) {         /* RCC system reset(for debug purpose) */         RCC_DeInit();         RCC_HSICmd(ENABLE);        //開啟內部高速時鐘    

STM32使用內部外部

在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法如果使用內部RC振盪器而不使用外部晶振,請按照下面方法處理:1)對於100腳或144腳的產品,OSC_IN應接地,OSC_OUT應懸空。2)對於少於100腳的產品,有2種接法:2.1)OSC_IN和OSC_

STM32使用外部16MHZ修改程式點

做小封裝產品設計的朋友或許知道3225-4PIN的晶振,為何8MHZ晶振批量價格要到2元一片,而16MHZ晶振只需要0.4元甚至更少。究其原因是因為3225封裝的晶振目前全球最低頻率一般為8MHZ,而國內8MHZ達不到精度指標,所以市場上的8MHZ晶振一般為進口晶振,因此成

10-STM32的ADC轉換和RTC時鐘配置

一.ADC 1.復位並清除ADC通道,HAL_ADC_MspInit() 2.ADC通道時鐘使能  __HAL_RCC_ADC_CLK_ENABLE() 3.GPIO通道時鐘使能,引腳配置 __HAL_RCC_GPIOx_CLK_ENABLE();HAL_GPIO_

stm32 外接問題

由於STM32F10x庫官方採用的是預設的外接8MHz晶振,因此造成很多使用者也採用了8MHz的晶振,但是,8MHz的晶振不是必須的,其他頻點的晶振也是可行的,只需要在庫中做相應的修改就行。     在論壇上看到很多使用者反映,使用外接12MHz的晶振,會造成很多的問題,如USART的波特率不正確,Syst

STM32 I/O複用功能時鐘配置

RCC_APB2Periph_AFIO--複用IO時鐘的使用 為了優化64腳或100 腳封裝的外設數目,可以把一些複用功能重新對映到其他引腳上。設定複用 重對映和除錯I/O 配置暫存器(AFIO_MAPR) 實現引腳的重新對映。這時,複用功能不再對映到它 們的原始

cc2530時鐘

CC2530有四個晶振,兩個內部(16M RC晶振,32K RC晶振),兩個外部(32.768K的石英晶振,32M的石英晶振),石英晶振的精度高,耗電大,啟動慢。RC晶振精度低一點,耗電小,啟動快。在上電時,預設是使用內部的兩個晶振,因為內部這兩個RC晶振速度快。外部的3

hibernate框架在eclipse配置方法(一)

java、 sql數據庫 文件目錄 測試表 any 配置 包名 ive 當我 一、ORM O:object 對象 R:Realtion 關系(關系型數據庫) M:Mapping 映射 ORM:對象關系型映射   目前流行的編程語言,如Java、C# ,它們都是面向對象的編程

Linux環境Swap配置方法

cache post /etc/ setting 情況 buffers 是否 mks sta Linux環境下Swap配置方法 場景: 今天下午安裝一個CentOS6.5操作系統,忘記配置swap分區。看看如何安裝系統之後,增加和刪除swap分區。方法如下:1.內存占

Linux IPMItool配置方法(MSI主機板)

一、IPMI-IP配置(本機登陸方式) 1,ipmitool -I open shell      //進入本地BMC shell [[email protected] ~]# ipmitool -I open shell ipmitool> 2,l

jsoncpp在VS2008配置方法

C++要使用JSON來解析資料,一般採用jsoncpp. 下載jsoncpp後,按ReadMe文件的說法是要先安裝的,但是安裝比較麻煩。然而事實上,我們並不需要安裝,就可以直接使用。 方法一:直接拷貝原始檔。這個方法比較簡單,但不推薦,因為不便於專案管理。 VS2008裡新

Hibernate複合主鍵中其中有主鍵是引用外來鍵情況配置方法

這個有兩種配置方式。一種是對映一個也是複合主鍵一部分的外來鍵列,通過一般的<many-to-one>元素,並用insert="false" update="false"禁用該列的任何Hibernate插入或者更新。另一種方式是<key-many-to-on

windows環境memcache配置方法 詳細篇

將memcache伺服器安裝包解壓到C:\memcached資料夾後,使用cmd命令視窗安裝。 1>開始>執行:CMD(確定) 2>cd C:\memcached(回車) 3>memcached -d install(回車 這步執行安裝) 4>memcached -d s

STM32外部時鐘配置

void SystemClock_Config(void) { RCC_DeInit(); RCC_HSEConfig(RCC_HSE_ON); //INPUT HSE = 24M Err

STM32 F1配置外部

當外部晶振配置錯誤時,會導致串列埠亂碼,這是描述從 預設的8M晶振改成12M  改晶振方法如下 1. 修改外部高速晶振值  stm32f10x.h  修改前  #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of

STM32不同外部時工程的配置問題

遇到的問題:同樣的串列埠配置程式碼在一種407開發板上能正常輸出,但是換到另一種407開發板上後就出現亂碼,檢查串列埠輸出波形後發現,電平轉換晶片沒有問題,但是波特率卻有問題。問題原因:   經過故障排查發現出現上述問題的原因是兩種STM32F407使用的外部晶振的頻率不一樣

IARstm32使用12M外部

系統預設的是使用8M外部晶振,需修改三個地方:  第一步,開啟stm32f10x.h,將 define HSE_VALUE ((uint32_t)8000000) /!< Value of the External oscillator in Hz / 修改為:

STM32外部不起

晶片:STM32F429 開發平臺:Keil 問題: STM32外部晶振不起振,選擇了內部16MHZ,從而導致延時函式、波特率、定時器等等有問題。 有源晶振和無源晶振的區別 有源晶振一般4個腳,一個電源,一個接地,一個訊號輸出端,一個NC(空腳)。有個點標記的為1腳,按逆