STM32F4學(xué)習(xí)筆記2——時(shí)鐘與復(fù)位系統(tǒng)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
STM32F4采用了三種不同的時(shí)鐘用來驅(qū)動系統(tǒng)時(shí)鐘(SYSCLK)·HSI振蕩器時(shí)鐘(內(nèi)部時(shí)鐘)·HSE振蕩器時(shí)鐘(外部時(shí)鐘)·PLL時(shí)鐘(鎖相環(huán)時(shí)鐘)這些設(shè)備有以下兩種二級時(shí)鐘源·32kHz低速內(nèi)部RC,可用于驅(qū)動獨(dú)立看門狗和通過程序選擇驅(qū)動RTC。RTC用于從停機(jī)/待機(jī)模式下自動喚醒系統(tǒng)。·32.768kHz低速外部晶振也可以用來通過程序選擇驅(qū)動RTC(RTCCLK)。AHB總線最高支持168MHz的時(shí)鐘,通過AHB總線分頻APB2最高支持84MHz,APB1最高支持42MHz。所有外設(shè)驅(qū)動全部來至于SYSCLK除了下面幾個(gè):·USBOTGFS時(shí)鐘48MHz,隨機(jī)信號發(fā)生器時(shí)鐘<=48MHz和SDIO時(shí)鐘<=48MHz全部來至于PLL48CLK·I2S為了達(dá)到高性能要求,I2S時(shí)鐘可用于內(nèi)部時(shí)鐘PLLI2S或者使用外部時(shí)鐘,通過I2S_CLKIN引腳輸入得到?!SBOTGHS60MHz需要外部PHY芯片內(nèi)提供·以太網(wǎng)時(shí)鐘(TXRXRMII)需要外部PHY芯片提供時(shí)鐘。RCC通過AHB時(shí)鐘(HCLK)8分頻后作為Cortex系統(tǒng)定時(shí)器(SysTick)的外部時(shí)鐘。通過對SysTick控制與狀態(tài)寄存器設(shè)置,可選擇上述時(shí)鐘或Cortex(HCLK)的始終作為SysTick時(shí)鐘。定時(shí)器時(shí)鐘分配頻率分配有硬件安一下兩種情況自動設(shè)置·如果相應(yīng)APB預(yù)分頻系數(shù)是1,定時(shí)器時(shí)鐘頻率與所在APB總線頻率一致?!し駝t,定時(shí)器的時(shí)鐘頻率被設(shè)為與其相連APB總線頻率的兩倍。
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main
LDRR0,=SystemInitBLXR0LDRR0,=__mainBXR0ENDP系統(tǒng)啟動默認(rèn)使用內(nèi)部16MHz的RC振蕩器,啟動過程中NRST引腳產(chǎn)生復(fù)位信號,從而進(jìn)入STM32F4的復(fù)位中斷函數(shù),在里面調(diào)用SystemInit()函數(shù)將時(shí)鐘切換到HSE進(jìn)入main執(zhí)行。主要的就是SystemInit函數(shù),這個(gè)函數(shù)在system_stm32f4xx.c里用于簡歷系統(tǒng)時(shí)鐘(系統(tǒng)時(shí)鐘源,PLL分頻因子和倍頻因子,AHP/ABPx分頻,F(xiàn)LASH設(shè)置);SystemCoreClockvariable也就是HCLK;SystemCoreClockUpdate()在程序執(zhí)行中內(nèi)核時(shí)鐘發(fā)生了變化這個(gè)函數(shù)是必須會被調(diào)用的。HSE默認(rèn)頻率是25MHz,HSE_VALUE在文件stm32f4xx.h里面定義。
static void SetSysClock(void)
{
/********************************************************************/
/* PLL (clocked by HSE) used as System clock source */
/********************************************************************/
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
/* Enable HSE */
RCC->CR |= ((uint32_t)RCC_CR_HSEON);
使能HSE,這個(gè)函數(shù)后面的幾個(gè)函數(shù)等待HSE就緒,如果超時(shí)就跳出SetSysClock。等待函數(shù)超時(shí)是一種很好地編程習(xí)慣,如果HSE就緒了的話,在執(zhí)行相關(guān)操作,如果失敗在在else中添加調(diào)試代碼尋找原因。
if ((RCC->CR & RCC_CR_HSERDY) != RESET)
{
HSEStatus = (uint32_t)0x01;
}
else
{
HSEStatus = (uint32_t)0x00;
}
HSE就緒后配置流程如下
HCLK = SYSCLK/1
PLCK2=HCLK/2
PLCK1=HCLK/4
配置主PLL并等待其就緒
配置Flash,prefecth,instruction cache,Data cache和wait state
配置mian PLL作為系統(tǒng)時(shí)鐘源
到這里基本就完成了HSE對系統(tǒng)時(shí)鐘初始化的工作,剩下就可以進(jìn)入mian函數(shù)了