一、时钟系统概述
时钟是嵌入式系统中最重要的部分之一。在STM32中,时钟系统可以分为系统时钟、时钟树、PLL锁相环以及分频器这几个部分。
系统时钟负责提供基准时钟信号,它主要由内部低速晶振LSE、高速晶振HSE以及相应的系统时钟控制器RCC组成。时钟树负责将基准时钟信号通过各种分频、选择电路最终形成各个模块需要的时钟信号。
PLL锁相环可以通过内部晶振或者外部信号时钟得到高频时钟信号,从而提高系统运行速度。分频器则用于将时钟信号分频,提供给各个模块使用。
二、系统时钟控制器
在使用STM32时钟系统前,需要先了解系统时钟控制器RCC(Reset and Clock Control)的工作方式。RCC位于处理器外设区,主要功能是控制时钟源的选择和各个模块的时钟使能状态。
STM32设备的时钟源可以选择为内部低速晶振LSE或高速晶振HSE,也可以通过PLL锁相环或外部信号时钟得到高频时钟信号。在进行系统时钟切换时,需要先设置RCC的时钟源。然后通过PLL锁相环或分频器将时钟信号分配到各个模块,这样每个模块都可以根据自己的需要选择相应的时钟。
三、时钟树
时钟树主要负责根据RCC的配置计算各个模块的时钟。在STM32中,可以通过配置RCC_CR、RCC_PLLCFGR等寄存器来控制时钟分频、倍频、时钟源选择等参数。
/* Configure clock frequency to 180 MHz */ RCC->CR |= RCC_CR_HSION; // Enable HSI internal oscillator while(!(RCC->CR & RCC_CR_HSIRDY)); // Wait for HSI ready flag RCC->CFGR |= RCC_CFGR_SW_HSI; // Select HSI as system clock while(!(RCC->CFGR & RCC_CFGR_SWS_HSI)); // Wait for HSI selected as system clock RCC->CFGR |= RCC_CFGR_PLLSRC_HSI_DIV2; // PLL input clock = HSI/2 RCC->CFGR |= RCC_CFGR_PLLM_DIV2; // PLLM = 2 RCC->CFGR |= RCC_CFGR_PLLN_MUL180; // PLLN = 180 RCC->CFGR |= RCC_CFGR_PLLP_DIV2; // PLLP = 2 RCC->CFGR |= RCC_CFGR_PLLQ_DIV5; // PLLQ = 5 RCC->CR |= RCC_CR_PLLON; // Enable PLL while(!(RCC->CR & RCC_CR_PLLRDY)); // Wait for PLL ready flag RCC->CFGR |= RCC_CFGR_SW_PLL; // Select PLL as system clock while(!(RCC->CFGR & RCC_CFGR_SWS_PLL)); // Wait for PLL selected as system clock
四、PLL锁相环
PLL锁相环是提高STM32系统性能的重要部分,它可以通过倍频输入信号来产生高频时钟信号。STM32中的PLL由一个VCO(Voltage Controlled Oscillator)和一个反馈电路组成,其输出时钟频率可以通过改变倍频器的时钟倍率来调整。
PLL锁相环的输入时钟有两种类型:外部输入时钟和内部时钟。当使用外部输入时钟时,需要注意时钟频率和STM32的数据手册规定的最大值是否相符。当使用内部时钟时,注意内部时钟的频率以及倍频系数的选择。
五、分频器
分频器可以将时钟信号分频为任何需要的频率。在STM32中,分频器的分频比可以通过PSC和ARR两个寄存器的值来控制。
/* Configure timer clock frequency to 100 kHz */ TIM2->PSC = 7199; // Prescaler = (F_CK / F_TIM) - 1 TIM2->ARR = 999; // Auto-reload value = (F_TIM / F_PWM) - 1
以上代码配置了一个定时器,其时钟频率为100kHz。
总结
STM32时钟系统是嵌入式系统中最重要的部分之一。在使用时钟系统时,需要了解系统时钟控制器RCC、时钟树、PLL锁相环以及分频器的工作原理,根据具体应用场景进行相应的配置,以达到最优的性能。