stm32的RCC系统时钟配置 以及RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP, uint32_t PLLQ)的配置
生活随笔
收集整理的這篇文章主要介紹了
stm32的RCC系统时钟配置 以及RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP, uint32_t PLLQ)的配置
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一直以來,我使用的系統時鐘都是默認設置,沒有經過修改,也一直能用,但是一直不清楚如何一步步配置,現在知道怎么改了,所以把修改的方法寫下來供參考。
很全很細的介紹請看這里 https://wenku.baidu.com/view/3c11ec1925c52cc58bd6bed8.html
想復制一下,隨便改改就能用請看下面。重點是注釋
首先貼我從野火f103抄來的,經過修改的代碼
1 void HSE_SetSysClockTo72(void)
2 {
3 __IO uint32_t StartUpCounter = 0, HSEStartUpStatus = 0;
4
5 // 把RCC外設初始化成復位狀態,這句是必須的
6 RCC_DeInit();
7
8 //使能HSE,開啟外部晶振,野火開發板用的是8M
9 RCC_HSEConfig(RCC_HSE_ON);
10
11 // 等待 HSE 啟動穩定
12 HSEStartUpStatus = RCC_WaitForHSEStartUp();
13
14 // 只有 HSE 穩定之后則繼續往下執行
15 if (HSEStartUpStatus == SUCCESS)
16 {
17 //----------------------------------------------------------------------//
18 // 使能FLASH 預存取緩沖區
19 FLASH_PrefetchBufferCmd(ENABLE);
20
21 // SYSCLK周期與閃存訪問時間的比例設置,這里統一設置成2
22 // 設置成2的時候,SYSCLK低于48M也可以工作,如果設置成0或者1的時候,
23 // 如果配置的SYSCLK超出了范圍的話,則會進入硬件錯誤,程序就死了
24 // 0:0 < SYSCLK <= 24M
25 // 1:24< SYSCLK <= 48M
26 // 2:48< SYSCLK <= 72M
27 FLASH_SetLatency(FLASH_Latency_2);
28 //----------------------------------------------------------------------//
29
30 // AHB預分頻因子設置為1分頻,HCLK = SYSCLK
31 RCC_HCLKConfig(RCC_SYSCLK_Div1);
32
33 // APB2預分頻因子設置為1分頻,PCLK2 = HCLK
34 RCC_PCLK2Config(RCC_HCLK_Div1);
35
36 // APB1預分頻因子設置為1分頻,PCLK1 = HCLK/2
37 RCC_PCLK1Config(RCC_HCLK_Div2);
38
39 //-----------------設置各種頻率主要就是在這里設置-------------------//
40 // 設置PLL時鐘來源為HSE,HSE=8MHz
41 // PLLM:PLL_VCO input clock =(HSE or HSI /PLLM)
42 // PLLN:PLL_VCO output clock =(PLL_VCP input clock)*PLLN
43 // PLLP:System Clock =PLL_VCO output clock/PLLP
44 // PLLQ:配置SD卡讀寫,USB等功能,暫時不用
45 RCC_PLLConfig(RCC_PLLSource_HSE, 8,432,6,7);
46 //------------------------------------------------------------------//
47
48 // 開啟PLL
49 RCC_PLLCmd(ENABLE);
50
51 // 等待 PLL穩定
52 while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
53 {
54 }
55
56 // 當PLL穩定之后,把PLL時鐘切換為系統時鐘SYSCLK
57 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
58
59 // 讀取時鐘切換狀態位,確保PLLCLK被選為系統時鐘
60 while (RCC_GetSYSCLKSource() != 0x08)
61 {
62 }
63 }
64 else
65 { // 如果HSE開啟失敗,那么程序就會來到這里,用戶可在這里添加出錯的代碼處理
66 // 當HSE開啟失敗或者故障的時候,單片機會自動把HSI設置為系統時鐘,
67 // HSI是內部的高速時鐘,8MHZ
68 while (1)
69 {
70 }
71 }
72 }
注釋寫的很清楚,多看看應該能看懂,
我主要修改了第45行RCC_PLLConfig()這個函數,f407和f103是有很大區別的,函數內的參數很不一樣,剛開始我一點都看不懂,最終在發現了一篇詳細的介紹,才知道怎么配置成72MHz。我也已經寫到注釋里了。
著重介紹下一種修改默認配置到達修改時鐘頻率的方法,在system_stm32f40x.c這個文件中,有這么一段,只要知道了PLLM,PLLN,PLLP,PLLQ的含義和用法,然后改改,就好了,
1 #if defined (STM32F40_41xxx) || defined (STM32F427_437xx) || defined (STM32F429_439xx) || defined (STM32F401xx) 2 /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */ 3 #define PLL_M 8 4 #else /* STM32F411xE */ 5 #if defined (USE_HSE_BYPASS) 6 #define PLL_M 8 7 #else /* STM32F411xE */ 8 #define PLL_M 16 9 #endif /* USE_HSE_BYPASS */ 10 #endif /* STM32F40_41xxx || STM32F427_437xx || STM32F429_439xx || STM32F401xx */ 11 12 /* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */ 13 #define PLL_Q 7 14 15 #if defined (STM32F40_41xxx) 16 #define PLL_N 432 17 /* SYSCLK = PLL_VCO / PLL_P */ 18 #define PLL_P 6 19 #endif /* STM32F40_41xxx */ 20 21 #if defined (STM32F427_437xx) || defined (STM32F429_439xx) 22 #define PLL_N 432 23 /* SYSCLK = PLL_VCO / PLL_P */ 24 #define PLL_P 6 25 #endif /* STM32F427_437x || STM32F429_439xx */ 26 27 #if defined (STM32F401xx) 28 #define PLL_N 432 29 /* SYSCLK = PLL_VCO / PLL_P */ 30 #define PLL_P 6 31 #endif /* STM32F401xx */ 32 33 #if defined (STM32F411xE) 34 #define PLL_N 432 35 /* SYSCLK = PLL_VCO / PLL_P */ 36 #define PLL_P 6 37 #endif /* STM32F411xx */
總結
以上是生活随笔為你收集整理的stm32的RCC系统时钟配置 以及RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t PLLM, uint32_t PLLN, uint32_t PLLP, uint32_t PLLQ)的配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何查看电脑历史开机时间
- 下一篇: 分类算法中的ROC与PR指标