以STM32F030F4P6,uVision開發環境為例,注意了,若使用其它相近芯片,本文僅供參考。
引用請注明出處:https://www.cnblogs.com/beiyhs/p/11211691.html
//*********************************************************************************** 北有寒山 ***********************
1、打開項目,查看startup_stm32f0xx.s或startup_stm32f030.s; 啟動時是調用SystemInit函數
找到system_stm32f0xx.c並打開查看SystemInit函數,里面又調用了SetSysClock()
2、還在該文件內往下找到找到static void SetSysClock(void)函數;
3、用以下代碼拷貝粘貼替換SetSysClock(void)函數:
static void SetSysClock(void)
{
__IO uint32_t StartUpCounter = 0, HSIStatus = 0;
RCC->CR &= ~((uint32_t)RCC_CR_HSEON); //關閉外部時鍾
RCC->CR |= ((uint32_t)RCC_CR_HSION); //使能內部時鍾 HSI
do //等待內部時鍾起振
{
HSIStatus = RCC->CR & RCC_CR_HSIRDY; // 設置RCC
StartUpCounter++; //啟動計數器
}
while((HSIStatus== 0) && (StartUpCounter != HSI_STARTUP_TIMEOUT)); // 等待 HSE 啟動穩定
if ((RCC->CR & RCC_CR_HSIRDY) != RESET) //判斷啟動狀態
{
HSIStatus = (uint32_t)0x01;
}
else
{
HSIStatus = (uint32_t)0x00; //啟動不成功
}
if (HSIStatus == (uint32_t)0x01) //啟動成功
{
/* Enable Prefetch Buffer and set Flash Latency */
FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY; //flash總線時鍾使能
/* HCLK = SYSCLK */ //AHB總線時鍾HCLK(是系統時鍾SYSCLK經過AHB分頻器分頻后得到的時鍾,
//一般設置1分頻,HCLK=SYSSCLK=48MHz;
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; //AHB總線時鍾 HCLK = SYSCLK/1=48MHz
/* PCLK = HCLK */ //APB總線時鍾PCLK等於AHB總線時鍾/1 PCLK=HCLK/1
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1; // PCLK=HCLK/1=48M/1=48M
/* PLL configuration = HSI/2 * 12= 48 MHz */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_Div2 | RCC_CFGR_PLLMULL12);
//RC時鍾2分頻后 進行12倍頻
//=8M/2*12=48M
RCC->CR |= RCC_CR_PLLON; //使能鎖相環倍頻開關 /* Enable PLL */
while((RCC->CR & RCC_CR_PLLRDY) == 0) //等待鎖相環就緒
{ }
/* Select PLL as system clock source * / //選擇鎖相環輸出時鍾作為系統時鍾
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
{ } //等待鎖相環輸出時鍾已經成為系統時鍾
}
else
{ } //啟動失敗,在此寫代碼
}
4、 存盤重編譯一下就OK啦,是不是嗖易Z,小伙伴們看明白了嗎?
5、過程重新捋一遍:內部8M的RC時鍾/2=4M,然后12倍頻=4*12=48M, AHB輸出48M給AHB總線, APB輸
出48M給APB外設、ADC、串口、倍頻器后各個TIM用。
6、系統時鍾SYSCLK經AHB分頻后叫HCLK,HCLK經APB分頻后叫PCLK。需要關注的是,查看
STM32F030F4P6的2019版datasheet,芯片內部沒有APB1,只有APB,其它相似芯片是有APB1的。所以
使用固件庫只用到RCC_CFGR_PPRE_DIV1而沒有RCC_CFGR_PPRE1_DIV1。
DIV1是APB不分頻,DIV2是2分頻,然后直接給倍頻器再進各個TIM。
如果在APB內是DIV1,后面的倍頻器不倍頻直接進各個TIM使用。
如果在APB內是DIV2、4、8、16,則分頻后還要在后面的倍頻器乘以2再進各個TIM使用。
嗯,有點繞,琢磨一下吧。
7、注意:RCC->CR &= ~((uint32_t)RCC_CR_HSEON); 這句是關閉外部時鍾,關閉后,原來連接外部晶振
的PF0、PF1方可作為普通IO口使用。