单片机stm32(时钟系统源配置)详解之stm32自学记录(一)

2019-07-21 08:30发布

       这是我第一次在*火上写东西,准备把自己学习STM32的内容记录下来。
  因为最近在复习,所以就当作是巩固学习吧。
       下面就来进入今天的记录时间

  STM32有5个时钟源:
  1.HSI高速内部时钟,RC振荡器,可作为系统时钟或者用作PLL时钟输入。16MHZ
  2.HSE高速外部时钟。4-26MHZ
  3.LSI是低速内部时钟,RC振荡器。频率为32KHZ,用于驱动独立看门狗。
  4.LSE低速外部时钟。用于驱动RTC时钟(RTCCLK)
  5.PLL为锁相环倍频输出。主PLL由HSI或HSE提供时钟信号。

  一共有三个PLL,分别为主PLL、专用PLLI2S、专用PLLSAI。
  1)主PLL有两个不同的输出时钟。一个作为高速系统时钟(最高达216MHZ),第二个输出用于为 USB OTG FS、SDMMC 和 RNG 生成 48 MHz 时钟。
  2)另外两个专用时钟也是为其他模块提供时钟源的。
  对于每个时钟源在未使用时都可以打开或关闭,以降低功耗。
  其中,HSI、HSE、PLL可用来驱动系统时钟SYSCLK。
       PLLCLK = HSE *N /(M *P)


            


  Stm32_Clock_Init函数讲解:
  时钟系统配置的一般步骤:
  1.使能PWR时钟:调用函数__HAL_RCC_PWR__CLK_ENABLE();
  2.设置调压器输出电压级别:
  调用函数__HAL_PWR_VOLTAGESCALING_CONFIG();
  3.选择是否开启Over_Drive功能。调用函数:HAL_PWREx_EnableOverDrive();
  4。配置时钟源相关参数:调用函数HAL_RCC_OscConfig();
  5.配置系统时钟源以及AHB,APB1,APB2的分频系数
  调用函数 HAL_RCC_ClockConfig();

  PS:
  Fvco = Fs*N/M; // Fvco VCO频率
  Fsys = Fvco/P ; // Fsys 系统时钟频率
  Fusb = Fvco/Q; // Fusb USB、RNG、SDIO等的时钟频率 // Fs PLL输入时钟频率,可以为HSI 或 HSE
  例子: 外部晶振为25MHZ时,若N = 432; M = 25; P = 2 ;Q= 9
  则 : Fvco = 25*432/25 = 432MHZ;
  Fsys = 432/2 = 216MHZ;
  Fusb = 432/9 = 48 MHZ;
  时钟源配置函数: HAL_RCC_OscConfig();
  HAL_RCC_OscConfig(&RCC_OscInitStructure)
  RCC _OscInitTypeDef* RCC_OscInitStructure
  typedef struct
  {
  uint32_t OsillatorType;
  uint32_t HSEState;
  uint32_t HSIState;
  uint32_t LSEState;
  uint32_t HSICalibration Value;
  uint32_t LSIState;
  RCC_PLLInitTypeDef PLL;
  } RCC _OscInitTypeDef
  typedef struct
  {
  uint32_t PLLState;
  uint32_t PLLSource;
  uint32_t PLLM;
  uint32_t PLLN;
  uint32_t PLLP;
  uint32_t PLLQ;
  } RCC _PLLInitTypeDef
  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; // 分频系数
  RCC_OscInitStructure.PLL.PLLN=plln; //分频系数
  RCC_OscInitStructure.PLL.PLLP=pllp;//分频系数 RCC_OscInitStructure.PLL.PLLQ=pllq; //分频系数
  HAL_RCC_OscConfi(&RCC_OscInitStructure);//初始化
  时钟配置函数:HAL_RCC_ClockConfig();
  typedef struct
  {
  uint32_t ClockType;
  uint32_t SYSCLKSource;
  uint32_t AHBCLKDivider;
  uint32_t APB1CLKDivider;
  uint32_t APB2CLKDivider;
  } RCC_ClkInitTypeDef;
  RCC_ClkInitStructure.ClockType=(RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2);
  RCC_ClkInitStructure.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK;// 系统时钟源
  RCC_ClkInitStructure.AHBCLKDivider=RCC_SYSCLK_DIV1;//AHB分频系数
  RCC_ClkInitStructure.APB1CLKDivider=RCC_HCLK_DIV4;//APB1分频系数
  RCC_ClkInitStructure.APB2CLKDivider=RCC_HCLK_DIV2;//APB2分频系数
  HAL_RCC_ClockConfig(&RCC_ClkInitStructure,FLASH_LATENCY_7);//同时设置FLASH延时周期为7WS,也就是8个CPU周期。


  配置调压器输出级别和开启Over-Drive 功能需要开启PWR时钟。

                        

            我的第一就记录到这里了,大家一起交流  自学经验交流群  816509137
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。