每次接觸一款新的單片機,我都會很好奇該單片機的系統(tǒng)時鐘是多少MHz,怎樣才能達到Datasheet中描述的最大系統(tǒng)時鐘,該單片機的外設的時鐘會是多少MHz呢?如果要使用延時,我怎么編寫程序才能實現(xiàn)精準的延時呢?我認為這些問題是我開始接觸新單片機之前需要了解的。
成都創(chuàng)新互聯(lián)公司于2013年創(chuàng)立,先為南召等服務建站,南召等地企業(yè),進行企業(yè)商務咨詢服務。為南召企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務解決您的所有建站問題。
對于每款ARM Cortex-M系列單片機而言,廠商為了更好的推廣自己的單片機,同時方便設計人員使用,降低產(chǎn)品開發(fā)周期,都會將該單片機的外設相關寄存器以及外設的相關函數(shù)都實現(xiàn)并打包,放在官方網(wǎng)站上免費供大家使用。STM32F405RG的標準外設庫還包含有DSP核的各種運算函數(shù)。如果需要,可以從http://www2.st.com/content/st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32-standard-peripheral-libraries/stsw-stm32065.html#下載。
如果使用標準外設庫,我們可以根據(jù)標準外設庫中的system_stm32f4xx.c文件中的代碼分析可知:
#if defined(STM32F40_41xxx) || defined(STM32F427_437xx) || defined(STM32F429_439xx) || defined(STM32F401xx) || defined(STM32F469_479xx) #define PLL_M 25 #elif defined (STM32F446xx) #define PLL_M 8 #elif defined (STM32F410xx) || defined (STM32F411xE) #if defined(USE_HSE_BYPASS) #define PLL_M 8 #else /* !USE_HSE_BYPASS */ #define PLL_M 16 #endif /* USE_HSE_BYPASS */ #else #endif #if defined (STM32F40_41xxx) #define PLL_N 336 /* SYSCLK = PLL_VCO / PLL_P */ #define PLL_P 2 #endif #if defined(STM32F40_41xxx) uint32_t SystemCoreClock = 168000000; #endif
根據(jù)編程手冊關于時鐘寄存器的內(nèi)容,可知
PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N
SYSCLK=PLL_VCO/PLL_P
式中,HSE_VALUE表示單片機外接晶振的頻率,HSI_VALUE表示單片機內(nèi)部振蕩器的頻率,本實驗板使用的是外部25MHz的晶振,根據(jù)程序中的配置,我們可以計算出SystemCoreClock =168000000。