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使用的外部晶振的頻率不一樣
IAR下stm32使用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腳,按逆