參考:https://blog.csdn.net/zxh1592000/article/details/78644
工程下載下傳連結:https://download.csdn.net/download/weixin_42225238/10934926
因項目需要改用内部時鐘配置系統時鐘,使用8MHSI,配置64M系統時鐘。此文記錄修改過程。
1. 修改在SystemInit (void)中被調用的SetSysClock()函數。
在外部晶振失效時,系統也是可以工作的,此時的系統時鐘是8MHZ,此時外設時鐘需要更改相應配置。
原工程配置72M時鐘,定義了SYSCLK_FREQ_72MHz,
第一步注釋SYSCLK_FREQ_72MHz。
第二步增加SetSysClockTo64();函數
static void SetSysClockTo64()
{
__IO uint32_t HSIStartUpStatus = 0;
HSIStartUpStatus = RCC->CR & RCC_CR_HSIRDY;
if (HSIStartUpStatus == RCC_CR_HSIRDY)
{
FLASH->ACR |= FLASH_ACR_PRFTBE;
FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_16);
RCC_PLLCmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while (RCC_GetSYSCLKSource() != 0x08){
}
} else {
while (1) {
}
}
}
第三步修改SysTick_Config(64000);
測試點燈函數,g_led_single_flashing(); 1s翻轉,成功。
void g_led_single_flashing(void)
{
static u32 tick_last = 0;
if(tick > tick_last+1000)
{
tick_last = tick;
l_gpio_toggle_pin(LED_PORT, LED_PIN);
}
}
static void SetSysClock(void)
{
#ifdef SYSCLK_FREQ_HSE
SetSysClockToHSE();
#elif defined SYSCLK_FREQ_24MHz
SetSysClockTo24();
#elif defined SYSCLK_FREQ_36MHz
SetSysClockTo36();
#elif defined SYSCLK_FREQ_48MHz
SetSysClockTo48();
#elif defined SYSCLK_FREQ_56MHz
SetSysClockTo56();
#elif defined SYSCLK_FREQ_72MHz
SetSysClockTo72();
#endif
#ifdef SYSCLK_FREQ_64MHz
SetSysClockTo64();
#endif
}