【7】、STM32F767——————>STM32时钟系统

  1. STM32F7时钟树概述
    1. 系统框图
    2. 简述:STM32系列有5个时钟源,分别为HSI、HSE、LSI、LSE、PLL。
    3. 高速时钟:HSI、HSE、PLL; 低速时钟:LSE、LSI
    4. 时钟源用途:
      1. LSI是低速内部时钟,RC振荡器,频率为32Khz左右,用于IWDG独立看门狗、LPTime低功耗定时器时钟、RTC时钟; 
      2. LSE低速外部时钟,32.768KHz的石英晶体,用于RTC时钟
      3. HSE高速外部时钟,石英晶体/陶瓷谐振器/外部时钟源,频率范围为4MHz~26MHz,开发板接的是25MHz,软件里面把默认的8Mhz改为25Mhz; 
      4. HSI高速内部时钟,RC振荡器,频率固定为16MHz。可做系统时钟或用作PLL输入; 
      5. PLL锁相环倍频输出 ; 有三个PLL输出 
        1. 主PLL由HSE或者HSI提供两个时钟信号,并具有两个不同的输出时钟;
          1. 第1个用于系统主时钟,最高频率为216Mhz; 
          2. 第2个用于USB时钟,48MHz; 
        2. 专用PLL(PLLI2S)用于生成精确时钟,在I2S、SAI、SPDIFRX上实现高品质音频性能
        3. 专用PLL(PLLSAI)用于为SAI接口生成时钟,用于LCD_TFT和可供USB、SDMMC、RNG选择的48Mhz时钟
      6. 系统时钟设置:
        1. 例如:选用外部晶振25Mhz,设置系统频率为216Mhz;分频器M=25; 倍频器倍频系数N=432; 分频器分频系数P=2;公式如下:PLL = 25MHz *N/(M*P) = 216MHz; 
  2. STM32F7时钟初始化配置
    1. 参阅正点原子:4.8手把手教你入门STM32CubeMX图形配置工具-P143
    2. 野火STM32:第15章 RCC—使用 HSE/HSI 配置时钟 - P135
  3. 时钟树解剖
    1. 系统配置函数SystemClock_Config();
    2. 外部晶振频率25MHz
    3. HCLK = SYSCLK=PLLCLK = 216 MHz, PCLK2=HCLK/2 =108 MHz, PCLK1=HCLK/4 = 54
      MHz
    4. HSE经过25M分频(VCO时钟必须在1~2MhZ),然后再经过432倍频,再经过2分频得到216MHz系统频率; 
  4. 例程:
    1. //时钟设置函数
      //Fvco=Fs*(plln/pllm);
      //Fsys=Fvco/pllp=Fs*(plln/(pllm*pllp));
      //Fusb=Fvco/pllq=Fs*(plln/(pllm*pllq));
      
      //Fvco:VCO频率
      //Fsys:系统时钟频率
      //Fusb:USB,SDIO,RNG等的时钟频率
      //Fs:PLL输入时钟频率,可以是HSI,HSE等. 
      //plln:主PLL倍频系数(PLL倍频),取值范围:64~432.
      //pllm:主PLL和音频PLL分频系数(PLL之前的分频),取值范围:2~63.
      //pllp:系统时钟的主PLL分频系数(PLL之后的分频),取值范围:2,4,6,8.(仅限这4个值!)
      //pllq:USB/SDIO/随机数产生器等的主PLL分频系数(PLL之后的分频),取值范围:2~15.
      
      //外部晶振为25M的时候,推荐值:plln=432,pllm=25,pllp=2,pllq=9.
      //得到:Fvco=25*(432/25)=432Mhz
      //     Fsys=432/2=216Mhz
      //     Fusb=432/9=48Mhz
      //返回值:0,成功;1,失败
      void Stm32_Clock_Init(u32 plln,u32 pllm,u32 pllp,u32 pllq)
      {
          HAL_StatusTypeDef ret = HAL_OK;
          RCC_OscInitTypeDef RCC_OscInitStructure; 
          RCC_ClkInitTypeDef RCC_ClkInitStructure;
      	
          __HAL_RCC_PWR_CLK_ENABLE(); //使能PWR时钟
       
          __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);//设置调压器输出电压级别,以便在器件未以最大频率工作
            
          RCC_OscInitStructure.OscillatorType=RCC_OSCILLATORTYPE_HSE;    //时钟源为HSE
          RCC_OscInitStructure.HSEState=RCC_HSE_ON;                      //打开HSE
          RCC_OscInitStructure.PLL.PLLState=RCC_PLL_ON;				   //打开PLL
          RCC_OscInitStructure.PLL.PLLSource=RCC_PLLSOURCE_HSE;          //PLL时钟源选择HSE
          RCC_OscInitStructure.PLL.PLLM=pllm;	//主PLL和音频PLL分频系数(PLL之前的分频)
          RCC_OscInitStructure.PLL.PLLN=plln; //主PLL倍频系数(PLL倍频)
          RCC_OscInitStructure.PLL.PLLP=pllp; //系统时钟的主PLL分频系数(PLL之后的分频)
          RCC_OscInitStructure.PLL.PLLQ=pllq; //USB/SDIO/随机数产生器等的主PLL分频系数(PLL之后的分频)
          ret=HAL_RCC_OscConfig(&RCC_OscInitStructure);//初始化
          if(ret!=HAL_OK) while(1);
          
          ret=HAL_PWREx_EnableOverDrive(); //开启Over-Driver功能
          if(ret!=HAL_OK) while(1);
          
          //选中PLL作为系统时钟源并且配置HCLK,PCLK1和PCLK2
          RCC_ClkInitStructure.ClockType=(RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2);
          RCC_ClkInitStructure.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK;//设置系统时钟时钟源为PLL
          RCC_ClkInitStructure.AHBCLKDivider=RCC_SYSCLK_DIV1;//AHB分频系数为1
          RCC_ClkInitStructure.APB1CLKDivider=RCC_HCLK_DIV4;//APB1分频系数为4
          RCC_ClkInitStructure.APB2CLKDivider=RCC_HCLK_DIV2;//APB2分频系数为2
          
          ret=HAL_RCC_ClockConfig(&RCC_ClkInitStructure,FLASH_LATENCY_7);//同时设置FLASH延时周期为7WS,也就是8个CPU周期。
          if(ret!=HAL_OK) while(1);
      }
      
  5. 总结:核心系统时钟的设置,如上述所示; 至少其它相应外设的时钟,用到哪个再详细分析; 

参考资料:《正点原子STM32F7开发指南-HAL库版本_V1.1 P118》

发布了24 篇原创文章 · 获赞 1 · 访问量 1520

猜你喜欢

转载自blog.csdn.net/Linux_ARM9/article/details/104343283