stm32使用HSI倍频到48MHz后发现串口和定时器配置出现波特率和时间不对的问题解决----填坑

stm32使用HSI倍频到48MHz后发现串口和定时器配置出现波特率和时间不对,配置代码如下:


/* Set HSION bit */
    RCC->CR |= (uint32_t)0x00000001;
    
    // select HSI as PLL source
    RCC->CFGR |= (uint32_t)RCC_CFGR_PLLSRC_HSI_Div2;        
    
    //PLLCLK=8/2*12=48M
    RCC->CFGR |= (uint32_t)RCC_CFGR_PLLMULL12;
    
        /* HCLK = SYSCLK/1      */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
    
    RCC_HCLKConfig(RCC_SYSCLK_Div1);  //RCC_SYSCLK_Div1——AHB时钟 = 系统时钟
    RCC_PCLK2Config(RCC_HCLK_Div1);    //高速时钟总线为系统时钟
    RCC_PCLK1Config(RCC_HCLK_Div2);    //低速时钟总线为系统时钟2分频
    FLASH_SetLatency(FLASH_Latency_2);    //FLASH_Latency_2  2延时周期
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);       // 预取指缓存使能
    
        /* Enable PLL */
    RCC->CR |= RCC_CR_PLLON;
        
    /* Wait till PLL is ready */
    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;
            
        /* Wait till PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
    {
    }


然后正常配置串口和定时器等一些外设,发现波特率和时间都不对,后来在移植RTThread的时候发现了这个问题的解决方法,就是在配置好系统时钟后和外设初始化之前调用这个函数SystemCoreClockUpdate()更新一下关于系统时钟部分的配置,相当于让单片机知道当前的系统时钟配置:

int main()
{
    SystemCoreClockUpdate();//让单片机知道当前的时钟配置
    MySystemInit();

    ..........

}

这样就完美解决了上面的问题。

你可能感兴趣的:(C语言,STM32)