STM32F051應(yīng)用筆記-系統(tǒng)時間選擇及PLL倍頻設(shè)
1、啟動代碼分析—SystemInit (void)系統(tǒng)時鐘初始化
SystemInit (void)是系統(tǒng)初始化函數(shù),很多新手不知其在何處調(diào)用,小肖馬上為你解惑。
startup_stm32f0xx.s文件中匯編代碼為STM32啟動代碼。
啟動代碼步驟一般為:
1)堆和棧的初始化;
2)向量表定義;
3)地址重映射及中斷向量表的轉(zhuǎn)移;
4)設(shè)置系統(tǒng)時鐘頻率;
5)中斷寄存器的初始化;
6)進入主程序。
廢話太多,估計也看煩了。現(xiàn)在挑重點講,重點在第4個步驟。(第5、6一般編程時在用戶代碼中執(zhí)行)。
Reset_Handler
PROC;標(biāo)記一個函數(shù)的開始,也就是復(fù)位入口。
IMPORT
__main ; 通知編譯器要使用的標(biāo)號在其他文件
IMPORT
SystemInit; 同上
關(guān)鍵在這里了,
LDR
R0, =SystemInit;
這里的“=”表示LDR目前是偽指令不是標(biāo)準(zhǔn)指令。這里是把SystemInit的地址給RO。也就是說SystemInit (void)在這里被調(diào)用編譯。所以用戶編在寫程序時無需編寫PLL配置程序。
BX
R0;BX是ARM指令集和THUMB指令集之間程序的跳轉(zhuǎn)。
其他省略。詳情如下圖所示:
SystemInit初始化RCC之后調(diào)用SetSysClock(void)系統(tǒng)時鐘設(shè)置函數(shù)
代碼如下:
void SystemInit (void)
{
RCC->CR |= (uint32_t)0x00000001;
RCC->CFGR &= (uint32_t)0xF8FFB80C;
RCC->CR &= (uint32_t)0xFEF6FFFF;
RCC->CR &= (uint32_t)0xFFFBFFFF;
RCC->CFGR &= (uint32_t)0xFFC0FFFF;
RCC->CFGR2 &= (uint32_t)0xFFFFFFF0;
RCC->CFGR3 &= (uint32_t)0xFFFFFEAC;
RCC->CR2 &= (uint32_t)0xFFFFFFFE;
RCC->CIR = 0x00000000;
SetSysClock();
}
2、SetSysClock()設(shè)置系統(tǒng)時鐘
由于之前選擇定義了PLL_SOURCE_HSE,執(zhí)行條件編譯。
RCC->CR |= ((uint32_t)RCC_CR_HSEON);//使能HSE,如下圖所示:
等待HSE設(shè)置完畢,代碼如下。
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;
}
設(shè)置完成,HSEStatus賦值1,代碼如下:
if ((RCC->CR & RCC_CR_HSERDY) != RESET)
{
HSEStatus = (uint32_t)0x01;
}
else
{
HSEStatus = (uint32_t)0x00;
}
HSEStatus HSE==1表示HSE狀態(tài)正常,啟用緩沖區(qū)和設(shè)置FLASH延遲、HCLKPCLK。PLL倍頻如下圖紅線所示,修改RCC_CFGR_PLLMULL實現(xiàn)倍頻(默認6倍頻)。
評論