STM32F 4 시계 설정

3794 단어 STM32F4
시계 트 리 를 봤 는데http://blog.csdn.net/louyangyang91/article/details/51374924이 블 로그 가 설정 되 어 있 는데 UART 포트 율 이 틀 렸 다 는 것 을 알 게 되 었 습 니 다. 그러나 MOC 1 \ \ 2 는 모두 정상 출력 (168 M / 5 주파수 출력) 입 니 다. 한참 을 알 고 나 서 야 USART 를 발 견 했 습 니 다.Init(USART1, &USART_InitStructure); 이 함수 내부 에서 RCC 를 호출 합 니 다.GetClocksFreq(&RCC_ClocksStatus);이 함 수 는 PCLK 1 \ \ PCLK 2 등 시스템 시 계 를 가 져 옵 니 다. 이 함수 에 들 어가 서 내부 에서 호출 된 것 을 보 았 습 니 다.
HSE_VALUE    ,         
#if !defined  (HSE_VALUE) 
  #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
8M   。            12M,    PLL    168M,  UART     。    、、、、
 void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)
{
  uint32_t tmp = 0, presc = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2;

  /* Get SYSCLK source -------------------------------------------------------*/
  tmp = RCC->CFGR & RCC_CFGR_SWS;

  switch (tmp)
  {
    case 0x00:  /* HSI used as system clock source */
      RCC_Clocks->SYSCLK_Frequency = HSI_VALUE;
      break;
    case 0x04:  /* HSE used as system clock  source */
      RCC_Clocks->SYSCLK_Frequency = HSE_VALUE;
      break;
    case 0x08:  /* PLL used as system clock  source */

      /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN
         SYSCLK = PLL_VCO / PLLP
         */    
      pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22;
      pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM;
      
      if (pllsource != 0)
      {
        /* HSE used as PLL clock source */
        pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
      }
      else
      {
        /* HSI used as PLL clock source */
        pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);      
      }

      pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2;
      RCC_Clocks->SYSCLK_Frequency = pllvco/pllp;
      break;
    default:
      RCC_Clocks->SYSCLK_Frequency = HSI_VALUE;
      break;
  }
  /* Compute HCLK, PCLK1 and PCLK2 clocks frequencies ------------------------*/

  /* Get HCLK prescaler */
  tmp = RCC->CFGR & RCC_CFGR_HPRE;
  tmp = tmp >> 4;
  presc = APBAHBPrescTable[tmp];
  /* HCLK clock frequency */
  RCC_Clocks->HCLK_Frequency = RCC_Clocks->SYSCLK_Frequency >> presc;

  /* Get PCLK1 prescaler */
  tmp = RCC->CFGR & RCC_CFGR_PPRE1;
  tmp = tmp >> 10;
  presc = APBAHBPrescTable[tmp];
  /* PCLK1 clock frequency */
  RCC_Clocks->PCLK1_Frequency = RCC_Clocks->HCLK_Frequency >> presc;

  /* Get PCLK2 prescaler */
  tmp = RCC->CFGR & RCC_CFGR_PPRE2;
  tmp = tmp >> 13;
  presc = APBAHBPrescTable[tmp];
  /* PCLK2 clock frequency */
  RCC_Clocks->PCLK2_Frequency = RCC_Clocks->HCLK_Frequency >> presc;
}

다음은 시계 설정 코드 를 붙 입 니 다:
void SetSysClockProc(void)
{
	ErrorStatus HSEStartUpStatus;
					 
	RCC_DeInit();                                
					
	RCC_HSEConfig(RCC_HSE_ON);        
						 
	HSEStartUpStatus = RCC_WaitForHSEStartUp();        
					 
	if(HSEStartUpStatus==SUCCESS)                        
	{    
			RCC_HCLKConfig(RCC_SYSCLK_Div1);        

			RCC_PCLK1Config(RCC_HCLK_Div4);                

			RCC_PCLK2Config(RCC_HCLK_Div2);                
									
			FLASH_SetLatency(FLASH_Latency_5);        

			FLASH_PrefetchBufferCmd(ENABLE); 

			//RCC_ADCCLKConfig(RCC_PCLK2_Div2);
									
			RCC_PLLConfig(RCC_PLLSource_HSE,12,336,2,7);//168M

			RCC_PLLCmd(ENABLE);

			while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
			{
			}    

		 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); 

	//  while(RCC_GetSYSCLKSource()!=0x08)
	//    {
	//    }
	}   

}

좋은 웹페이지 즐겨찾기