STM32F4时钟配置

原创 2016年05月31日 09:04:46

看了下时钟树按照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)
	//    {
	//    }
	}   

}


版权声明:本文为博主原创文章,未经博主允许不得转载。

STM32F407系统时钟配置

STM32F407系统时钟配置时钟树方法一,采用官方库提供的配置(这里外部晶振25MHz,系统配置为168MHz) STM32F4启动与STM32F10X不同,时钟已经默认配置好 启动代码,文件:st...
  • u012075442
  • u012075442
  • 2016年12月25日 20:05
  • 4726

STM32F4如何设置系统时钟,非常重要

STM32F4的系统时钟非常重要,涉及到整个系统的运行结果,无论是什么操作,都需要时钟信号,不同型号的微控制器的默认系统时钟配置是不同的,这里,给出两种配置STM32F407系统时钟的方法。 方法一...
  • jdsnpgxj
  • jdsnpgxj
  • 2017年05月15日 14:58
  • 4725

STM32F407时钟配置

STM32F407时钟配置学习。
  • husterxmh
  • husterxmh
  • 2016年08月30日 19:48
  • 2540

关于STM32F4定时器时钟频率问题

从时钟树中我们可以得知 (1)高级定时器timer1, timer8以及通用定时器timer9, timer10, timer11的时钟来源是APB2总线 (2)通用定时器timer2~timer5,...
  • jdsnpgxj
  • jdsnpgxj
  • 2017年05月15日 15:52
  • 1472

STM32F4时钟设置分析

STM32F4时钟设置分析 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN7 开发...
  • jdh99
  • jdh99
  • 2014年03月25日 14:06
  • 28293

stm32f4 时钟配置工具

  • 2013年11月03日 09:28
  • 659KB
  • 下载

STM32 时钟 配置 16MHZ

时钟基础知识 http://blog.csdn.net/kevinhg/article/details/17517117 http://blog.chinaunix.net/uid-2421970...
  • liang890319
  • liang890319
  • 2016年08月24日 10:43
  • 552

STM32F407VG (四)时钟配置

1.STM32 F407VG 的starup_stm32f40_41xxx.s的如下位置调用 IMPORT SystemInit,之后调用main函数,所以 进入main函数时候就已经自动完成有关时...
  • hitzjm
  • hitzjm
  • 2015年06月30日 13:51
  • 1166

stm32f40x官方时钟代码分析

/**   ******************************************************************************   * @file    ...
  • u012792791
  • u012792791
  • 2014年01月02日 11:07
  • 1174

STM32 V3.5.0版本固件口中关于RCC_GetClocksFreq()函数的一个小细节

/* Get HCLK prescaler */ tmp = RCC->CFGR & CFGR_HPRE_Set_Mask; tmp = tmp >> 4; presc = APBAHBP...
  • wanzhiqi1991
  • wanzhiqi1991
  • 2014年11月04日 21:52
  • 471
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:STM32F4时钟配置
举报原因:
原因补充:

(最多只允许输入30个字)