|
本帖主要是討論stm32F103系列IC,同類的stm32的時鐘樹系統與F103系列相差不大,可做參考由于本人能力有限,難免會出現錯誤,歡迎批評指正!!!
時鐘是一顆ic的心臟,為程序執行提供基礎步調;可以說,一個單片機的性能強不強,與時鐘頻率直接掛鉤;
下面我們現在簡單介紹一下STM32F103系列的時鐘樹,參考附件截圖;
STM32F10xxx參考手冊RCC章節中可以看出,時鐘樹包含兩個外部輸入時鐘,一個外部輸出時鐘和兩個內部振蕩時鐘;
兩個外部輸入時鐘分別是:HSE,LSE
一個外部輸出時鐘是:MCO
兩個內部振蕩時鐘分別是:HSI,LSI
還包含了PLL鎖相環和預分頻器,這些共同組成了整個F103的時鐘樹系統;
我該如何配置時鐘呢?以打開gpio時鐘為例:
第一步:等待HSE,LSE,HSI,LSI起振,起振成功之后,配置PLL Source和PLL MUL;
第二步:設置SYSCLK Source,可以默認設置PLL;
第三步:設置AHB總線預分頻系數,使其總線頻率不超過72MHZ;
第四步:設置APB1和APB2總線預分頻系數,使其總線頻率不超過最大總線頻率72MHZ和36MHZ;
第五步:打開GPIO時鐘使能,使其能正常工作;
這樣我就配置好了一個時鐘,下面是代碼示例:
- /* enable lse clock*/
- hw_rcc_set_lse_enable(true);
- hw_rcc_lse_wait_ready();
- /* enable lsi clock */
- hw_rcc_set_lsi_enable(true);
- hw_rcc_lsi_wait_ready();
- /* enable hse clock */
- hw_rcc_set_hse_enable(true);
- hw_rcc_hse_wait_ready();
- /* open hsi clock */
- hw_rcc_set_hsi_enable(true);
- hw_rcc_hsi_wait_ready();
- /* configure pll clock source */
- rcc_set_pll_multiplication_factor(clock->pll_mul);
- rcc_set_pll_source(clock->pll_source);
- /* enable pll clock */
- hw_rcc_set_pll_enable(true);
- hw_rcc_pll_wait_ready();
- /* configure anb,apb1,apb2 prescaler */
- rcc_set_hpre(clock->ahb_prescaler);
- rcc_set_ppre1(clock->apb1_prescaler);
- rcc_set_ppre2(clock->apb2_prescaler);
- /* set system clock source */
- rcc_set_sysclk_source(clock->sysclk_source);
- /* enable gpio clock */
- hw_rcc_apb2periph_clock_enable(RCC_APB2ENR_IOPAEN, IOPAEN);
- hw_rcc_apb2periph_clock_enable(RCC_APB2ENR_IOPBEN, IOPBEN);
- hw_rcc_apb2periph_clock_enable(RCC_APB2ENR_IOPCEN, IOPCEN);
- hw_rcc_apb2periph_clock_enable(RCC_APB2ENR_IOPDEN, IOPDEN);
- hw_rcc_apb2periph_clock_enable(RCC_APB2ENR_IOPEEN, IOPEEN);
- hw_rcc_apb2periph_clock_enable(RCC_APB2ENR_IOPFEN, IOPFEN);
- hw_rcc_apb2periph_clock_enable(RCC_APB2ENR_IOPGEN, IOPGEN);
復制代碼
另外在時鐘樹上,發現cortex系統時鐘只有AHB時鐘的1/8,也就是說72M的系統時鐘下,內核只有9M的速度,與內核相關外設最大時鐘頻率只有9M。
配置時鐘樹,需要按照參考手冊上的來,不能超過各個總線的最大時鐘頻率的限制;
可以通過標準庫和HAL庫已經提供了相關的初始化接口,直接就可以配置到最大的速度;
也可以通過STM32CubeMX這種圖形化工具自己來配置各個時鐘,直接生成代碼;
|
評分
-
查看全部評分
|