STM32F4时钟配置

看了下时钟树按照http://blog.csdn.net/louyangyang91/article/details/51374924这个博文配置了,结果发现UART波特率不对,但是MOC1\2都是正常输出(168M/5分频输出),蒙了很久才发现 USART_Init(USART1, &USART_InitStructure); 这个函数内部会调用RCC_GetClocksFreq(&RCC_ClocksStatus);这个函数来得到PCLK1\PCLK2等系统时钟,进入这个函数看其内部发现它调用了一个

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)
	//    {
	//    }
	}   

}


STM32F4系统时钟配置有多种方法,其中两种常用的方法如下: 方法一是采用官方库提供的配置方法。官方库已经为STM32F4提供了默认的系统时钟配置。在启动代码(startup_stm32f4xx.s)中,会调用SystemInit函数进行系统时钟的初始化。具体配置可以通过修改SystemInit函数中的参数来实现。例如,如果外部晶振为8MHz,系统时钟配置为168MHz,可以在SystemInit函数中进行相应的参数设置。 方法二是手动配置系统时钟。可以通过设置寄存器来手动配置STM32F4系统时钟。具体的配置步骤可以参考相关文档或教程。在进行定时器初始化设置时,可能需要用到定时器的时钟频率。可以通过计算得到,具体的计算方法可以参考相关的资料或博客文章。 需要注意的是,不同型号的STM32F4微控制器的默认系统时钟配置可能是不同的,所以在进行系统时钟配置时,需要根据具体的型号和需求来选择合适的方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [STM32F4如何设置系统时钟,非常重要](https://blog.csdn.net/jdsnpgxj/article/details/72149501)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值