stm32f7 时钟
在 STM32F7 中,有 5 个最重要的时钟源,为 HSI、HSE、LSI、LSE、PLL。
①、LSI 是低速内部时钟,RC 振荡器,频率为 32kHz 左右。LSI 主要可以作为 IWDG 独立看门狗时钟,LPTimer 低功耗定时器时钟以及 RTC 时钟。
②、LSE 是低速外部时钟,接频率为 32.768kHz 的石英晶体。这个主要是 RTC 的时钟源。
③、HSE 是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为 4MHz~26MHz。阿波罗 STM32F7 开发板接的是 25MHz 外部晶振。HSE 可以直接做为系统时钟或者 PLL 输入时钟,同时它经过 2~31 分频后也可以作为 RTC 时钟。
④、HSI 是高速内部时钟,RC 振荡器,频率为 16MHz。可以直接作为系统时钟或者用作 PLL输入,同时它经过 488 分频之后也可以作为 HDMI-CEC 时钟。
⑤、PLL 为锁相环倍频输出。STM32F7 有三个 PLL:
1) 主 PLL(PLL)由 HSE 或者 HSI 提供时钟信号,并具有两个不同的输出时钟。
第一个输出 PLLP 用于生成高速的系统时钟(最高 216MHz)
第二个输出 PLLQ 为 48M 时钟,用于 USB OTG FS 时钟,随机数发生器的时钟和 SDMMC
时钟。
2) 第一个专用 PLL(PLLI2S)用于生成精确时钟,在 I2S、SAI 和 SPDIFRX 上实现高品质音频性
能。其中,N 是用于 PLLI2S vco 的倍频系数,其取值范围是:50~432;R 是 I2S 时钟的
分频系数,其取值范围是:2~7;Q 是 SAI 时钟分频系数,其取值范围是:2~15;P 没
用到。
3) 第二个专用 PLL(PLLSAI)用于为 SAI接口生成时钟,生成 LCD-TFT时钟以及可供 USB OTG FS、
SDMMC 和 RNG 选择的 48MHz 时钟。其中,N 是用于 PLLSAI vco 的倍频系数,其取值
范围是:50~432;Q 是 SAI 时钟分频系数,其取值范围是:2~15;R 是 LTDC 时钟的分
频系数,其取值范围是:2~7;P 没用到。
时钟系统配置一般步骤:
1、使能PWR时钟:调用函数__HAL_RCC_PWR_CLK_ENABLE()。
2、设置调压器输出电压级别:调用函数__HAL_PWR_VOLTAGESCALING_CONFIG()。
3、选择是否开启Over-Driver功能:调用函数HAL_PWREx_EnableOverDrive()。
4、配置时钟源相关参数:调用函数HAL_RCC_OscConfig()。
5、配置系统时钟源以及AHB,APB1和APB2的分频系数:调用函数HAL_RCC_ClockConfig()。
时钟源配置函数:
HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct)
他的参数:
typedef struct { uint32_t OscillatorType; /*!< The oscillators to be configured. This parameter can be a value of @ref RCC_Oscillator_Type */ uint32_t HSEState; /*!< The new state of the HSE. This parameter can be a value of @ref RCC_HSE_Config */ uint32_t LSEState; /*!< The new state of the LSE. This parameter can be a value of @ref RCC_LSE_Config */ uint32_t HSIState; /*!< The new state of the HSI. This parameter can be a value of @ref RCC_HSI_Config */ uint32_t HSICalibrationValue; /*!< The HSI calibration trimming value (default is RCC_HSICALIBRATION_DEFAULT). This parameter must be a number between Min_Data = 0x00 and Max_Data = 0x1F */ uint32_t LSIState; /*!< The new state of the LSI. This parameter can be a value of @ref RCC_LSI_Config */ RCC_PLLInitTypeDef PLL; /*!< PLL structure parameters */ }RCC_OscInitTypeDef;
最后一个成员
RCC_PLLInitTypeDef PLL 的结构体如下:
typedef struct { uint32_t PLLState; /*!< The new state of the PLL. This parameter can be a value of @ref RCC_PLL_Config */ uint32_t PLLSource; /*!< RCC_PLLSource: PLL entry clock source. This parameter must be a value of @ref RCC_PLL_Clock_Source */ uint32_t PLLM; /*!< PLLM: Division factor for PLL VCO input clock. This parameter must be a number between Min_Data = 2 and Max_Data = 63 */ uint32_t PLLN; /*!< PLLN: Multiplication factor for PLL VCO output clock. This parameter must be a number between Min_Data = 50 and Max_Data = 432 */ uint32_t PLLP; /*!< PLLP: Division factor for main system clock (SYSCLK). This parameter must be a value of @ref RCC_PLLP_Clock_Divider */ uint32_t PLLQ; /*!< PLLQ: Division factor for OTG FS, SDMMC and RNG clocks. This parameter must be a number between Min_Data = 2 and Max_Data = 15 */ #if defined (STM32F765xx) || defined (STM32F767xx) || defined (STM32F769xx) || defined (STM32F777xx) || defined (STM32F779xx) uint32_t PLLR; /*!< PLLR: Division factor for DSI clock. This parameter must be a number between Min_Data = 2 and Max_Data = 7 */ #endif /* STM32F767xx || STM32F769xx || STM32F777xx || STM32F779xx */ }RCC_PLLInitTypeDef;
HAL_RCC_OscConfig配置示例代码:(plln pllq 等都是变量,本例中是作为时钟init函数的入口参数)
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分频系数 HAL_RCC_OscConfig(&RCC_OscInitStructure);//初始化
时钟配置函数:
HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency)
入口参数结构体:
typedef struct { uint32_t ClockType; /*!< The clock to be configured. This parameter can be a value of @ref RCC_System_Clock_Type */ uint32_t SYSCLKSource; /*!< The clock source (SYSCLKS) used as system clock. This parameter can be a value of @ref RCC_System_Clock_Source */ uint32_t AHBCLKDivider; /*!< The AHB clock (HCLK) divider. This clock is derived from the system clock (SYSCLK). This parameter can be a value of @ref RCC_AHB_Clock_Source */ uint32_t APB1CLKDivider; /*!< The APB1 clock (PCLK1) divider. This clock is derived from the AHB clock (HCLK). This parameter can be a value of @ref RCC_APB1_APB2_Clock_Source */ uint32_t APB2CLKDivider; /*!< The APB2 clock (PCLK2) divider. This clock is derived from the AHB clock (HCLK). This parameter can be a value of @ref RCC_APB1_APB2_Clock_Source */ }RCC_ClkInitTypeDef;
配置示例:
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