天天看點

STM32F1改用内部時鐘HSI,配置系統時鐘64M

參考: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

}

繼續閱讀