天天看點

STM32F030 配置HSI

因為之前做的闆子都是帶外部晶振的,故很多工程拿來就直接用了,這次做的闆子沒有配置外部晶振,然後去設定内部時鐘源,遇到各種問題,以為配置好了,結果程式調試起來各種bug。卡了我兩天。總結下整體思路,友善後續使用。

最重要的還是看手冊裡的時鐘圖RCC

STM32F030 配置HSI

 需要配置的地方都用箭頭指出來了,這些大部分都在 RCC_CR  & RCC_CFGR這兩個寄存器裡,還有附屬的一些外設在CFGR2 3 裡能找到。

我需要用内部時鐘 是以配置大概流程就是  

1. 使能HSI  并等待其穩定

2. 設定PLL鎖相環時鐘來源并倍頻 

3. 使能PLL 并等待穩定

4. 選擇系統時鐘 SYSCLK 來源  判斷标志位穩定

5. 設定AHB APB的分頻因子

6. 配置外設(uart,iic,adc,flash)的時鐘來源分頻

代碼如下(系統進入SystemInit 複位後,進入SetSysClock, 預設是等待HSE起振,這裡直接貼HSI的代碼)

void SetSysClock(void)
{
  __IO uint32_t StartUpCounter = 0, HSIStatus = 0;
  
  /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/
#if defined (PLL_SOURCE_HSI)

	//Enable HSI
	RCC->CR |= RCC_CR_HSION;
	//Wait till Hsi is ready	
	do
  {
   HSIStatus = RCC->CR & RCC_CR_HSIRDY;
    StartUpCounter++;  
  } while((HSIStatus== 0) && (StartUpCounter != HSI_STARTUP_TIMEOUT));
	 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;
				//Set AHB prescaler /1  48M
		RCC->CFGR |= RCC_CFGR_HPRE_DIV1;
		//Set APB prescaler /1 48M
		RCC->CFGR |= RCC_CFGR_PPRE_DIV1;
		
		 /* 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倍頻</font>
		
		
//		//Select Pllsrc as hsi already reset & pllmul *12  8/2*12=48M
//		RCC->CFGR |= RCC_CFGR_PLLMUL12;
		
		/* Enable PLL */
		RCC->CR |= RCC_CR_PLLON;
		/* Wait till PLL is ready */
		while((RCC->CR & RCC_CR_PLLRDY) == 0);
		
		//select system clock as pll
		RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
		RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
		
		//wait pll use as system clock
		while((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL);

		//Set ADC prescaler /4  12M
	//	RCC->CFGR |= RCC_ADCCLK_PCLK_Div4;
		//Set ADC clock source
		RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);
		//Set usart clock source
		RCC_USARTCLKConfig(RCC_USART1CLK_PCLK);
		//Set IIC clock source
		RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK);	
		
  }

#endif /* PLL_SOURCE_HSI */  
}
           

繼續閱讀