stm32f103的HSI設置


HSI基本知識 

  HSI是8MRC震盪電路,精度1%。

  PLL的設置必須在其被激活前完成,輸出必須被設置溫48M或者72M

  LSE:通過在備份域控制寄存器(RCC_BDCR)里的LSEON位啟動和關閉。

  如果相應的APB預分頻系數是1,定時器的時鍾頻率與所在APB總線頻率一致。

  否則,定時器的時鍾頻率被設為與其相連的APB總線頻率的2

  HSI + PLL  最高為64M(HSI / 2   *  16)。

寄存器的作用

  時鍾控制寄存器RCC_CRHSI/HSE/PLL使能和就緒,HSI時鍾校准。

  時鍾配置寄存器(RCC_CFGR):時鍾切換和切換狀態標志,各種分頻器

  時鍾中斷寄存器 (RCC_CIR):各種時鍾中斷和時鍾中斷標志。

  APB2 外設復位寄存器 (RCC_APB2RSTR);APB1 外設復位寄存器 (RCC_APB1RSTR):各個外設接口的復位

  AHB外設時鍾使能寄存器 (RCC_AHBENR);APB2 外設時鍾使能寄存器(RCC_APB2ENR);APB1 外設時鍾使能寄存器(RCC_APB1ENR):各個外設的使能。


HSI的配置,我這里用的是原庫,直接將  system_stm32f10x.c 中的  void SystemInit (void) 函數改成下邊的就可以了

void SystemInit (void){

 RCC_DeInit();//將外設 RCC寄存器重設為缺省值  
    RCC_HSICmd(ENABLE);//使能HSI    
    while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);//等待HSI使能成功  
    
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);      //使能或者失能預取指緩存(參數里是使能)    -----加上這兩句才能到64M
    FLASH_SetLatency(FLASH_Latency_2); //設置代碼延時值(參數里的是指2延時周期)
     
    RCC_HCLKConfig(RCC_SYSCLK_Div1);   //設置AHB時鍾 HCLK = SYSCLK/1      
    RCC_PCLK1Config(RCC_HCLK_Div4);      //設置低速速AHB時鍾        -----這里頻率是48/4 = 12M     定時器2~7頻率是24M
    RCC_PCLK2Config(RCC_HCLK_Div1);      //設置高速AHB時鍾        -----這里頻率是48/1 = 48M
      
    //設置 PLL 時鍾源及倍頻系數  
    RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_12);//使能或者失能 PLL,這個參數可以取:ENABLE或者DISABLE   
    RCC_PLLCmd(ENABLE);//如果PLL被用於系統時鍾,那么它不能被失能  
    //等待指定的 RCC 標志位設置成功 等待PLL初始化成功  
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);  
 
    //設置系統時鍾(SYSCLK) 設置PLL為系統時鍾源  
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//選擇想要的系統時鍾   
    //等待PLL成功用作於系統時鍾的時鍾源  
    //  0x00:HSI 作為系統時鍾   
    //  0x04:HSE作為系統時鍾   
    //  0x08:PLL作為系統時鍾    
    while(RCC_GetSYSCLKSource() != 0x08);//需與被選擇的系統時鍾對應起來,RCC_SYSCLKSource_PLL

} 


 配置之后,不確定是否配置成功,可以只用庫函數中的時鍾頻率結構體,來查看系統各個時鍾頻率,在主函數中使用

int main( void ){

  RCC_ClocksTypeDef  RCC_Clocks; //時鍾頻率結構體

     RCC_GetClocksFreq(&RCC_Clocks); //獲取各個時鍾頻率
    printf("SYSCLK_Frequency  is %d \r\n",RCC_Clocks.SYSCLK_Frequency);    //SYSCLK_Frequency  is 48000000
    printf("HCLK_Frequency is %d \r\n",RCC_Clocks.HCLK_Frequency);        //HCLK_Frequency is 48000000
    printf("PCLK1_Frequency   is %d \r\n",RCC_Clocks.PCLK1_Frequency);    //PCLK1_Frequency   is 12000000
    printf("PCLK2_Frequency is %d \r\n",RCC_Clocks.PCLK2_Frequency);    //PCLK2_Frequency is 48000000
    printf("ADCCLK_Frequency is %d \r\n",RCC_Clocks.ADCCLK_Frequency);    //ADCCLK_Frequency is 24000000

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM