STM32时钟树总结和时钟配置 | 您所在的位置:网站首页 › DDR速率和时钟锁相环 › STM32时钟树总结和时钟配置 |
总结STM32时钟树和时钟配置
预习:
(1)5到6个时钟源,HSI、HSE、LSI、LSE、MSI、PLL(细分为主PLL、PLLI2S和PLLSAI)。 (2)LSI频率为32KHz左右,仅供看门狗和RTC使用。 (3)LSE频率为32.768KHz,作为RTC的时钟源。 (4)HSE:OSC_OUT和OSC_IN引脚接4~26MHz的晶振。 (5)HSI是高速内部RC振荡器,频率16MHz。 (6)MSI(暂时看到它出现在低功耗单片机里),时钟信号由内部RC振荡器产生。其频率范围可以由时钟控制寄存器(RCC_CR)调整。 (7)主PLL的时钟源可以是:1.HSE;2.HSI(;3.MSI) 问题:1.Sysclk、PLLCLK、PCLK1、PCLK2、HCLK、AHB、APB1、APB2的关系? 2.如何配置完成自己想要的系统时钟? 对于低功耗单片机,启动文件会在执行main函数之前先执行SystemInit函数,该函数默认配置MSI为系统时钟;对于F系列单片机,启动文件先执行SystemInit函数配置HSI为系统时钟。但是往往默认的系统时钟不是我们想要的,这时就要配置相关寄存器修改系统时钟了。 HAL库版本:HAL库用以下4个函数来配置系统时钟: 1.用来使能PWR时钟 __HAL_RCC_PWR_CLK_ENABLE(); 2.设置调压器输出电压级别 HAL_StatusTypeDef HAL_PWREx_ControlVoltageScaling(uint32_t VoltageScaling); 3.用来打开/关闭PLL和配置PLL的时钟源以及相关参数,比如M、N、P、Q、R HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct); 4.用来确定系统时钟以及外设总线时钟 HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency); 若想设置系统的时钟为80MHz,那么在设置调压器的时候,设置成Vcore Range1,同时第四个函数的第二个入口参数等待周期要设置成4WS。规范要求如下图所示。 主程序调用该函数即可配置系统时钟为80MHz,当然还配置了APB1,APB2,AHB。 标准库版本:相比HAL库,标准库版本的系统初始化SystemInit()函数多了个设置时钟频率的函数SetSysClock(void),里面用条件编译的方式选择系统的时钟频率,比如下面的F103的SetSysClock: /** * @brief Configures the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers. * @param None * @retval None */ static void SetSysClock(void) { #ifdef SYSCLK_FREQ_HSE SetSysClockToHSE(); #elif defined SYSCLK_FREQ_24MHz SetSysClockTo24(); #elif defined SYSCLK_FREQ_36MHz SetSysClockTo36(); #elif defined SYSCLK_FREQ_48MHz SetSysClockTo48(); #elif defined SYSCLK_FREQ_56MHz SetSysClockTo56(); #elif defined SYSCLK_FREQ_72MHz SetSysClockTo72(); #endif /* If none of the define above is enabled, the HSI is used as System clock source (default after reset) */ }假设要求F103单片机工作在72MHz的时钟频率,就声明SYSCLK_FREQ_72MHz即可,主程序不用重复调用SystemInit()函数来设置系统时钟频率。 |
CopyRight 2018-2019 实验室设备网 版权所有 |