回顾下之前的章节:
本文我们总结下时钟的概念,并介绍下如何获取系统中各模块的时钟频率。
通常所说的系统时钟就是指时钟系统,它是由振荡器(信号源)、定时唤醒器、分频器等组成的电路。常用的信号源有晶体振荡器和RC振荡器,如下图所示:
时钟系统
ARM的时钟系统包括4部分,分为晶体振荡器、唤醒定时器、锁相环(PLL)和VPB分频器。其中晶体振荡器为系统提供基本的时钟信号(频率为Fosc)。当复位或者处理器从掉电模式唤醒时,“唤醒定时器”要对输入的时钟信号做计数延时,使芯片内部的部件有时间进行初始化。然后Fosc被PLL提高到一个符合用户需要的频率Fcclk,Fcclk用于CPU内核。因为CPU内核通常比外设部件的工作速度要快,用户可以通过设置VPB分频器,把Fcclk信号降低到一个合适的值Fpclk,该信号用于外设部件。
信号源也就是时钟源,外部晶振的频率一般是8M,25M,可以在电路板上的晶振上看到,标号一般是Y*。在keil中需要在魔术棒的Target中进行设置:
Keil时钟配置
时钟是嵌入式系统的脉搏,处理器内核在时钟驱动下完成指令执行,状态变换等动作。外设部件在时钟的驱动下完成各种工作,比如串口数据的发送、A/D转换、定时器计数等等。因此时钟对于计算机系统是至关重要的,通常时钟系统出现问题也是致命的,比如振荡器不起振、振荡不稳、停振等。
通常略微复杂的单片机系统中会给出时钟树,描述了系统中所有用到时钟的设备对应的时钟。软件中需要根据时钟树来配置硬件管脚。
以STM32F103ZE为例:
STM32F103ZE时钟树
上图中:假设使能HSE,外部晶振为8MHZ。
1线为使用外部晶振时的系统时钟的配置:外部晶振OSC_IN A为8MHZ,在B处9倍倍频PLL,那么SYSCLK就为72MHZ。
2线为TIM2-7的时钟配置:假设:C处AHB分频为1,D处APB1分频为2,那么E的输入为36MHZ,E的输出为else X2 = 72MHZ。TIM2-7的时钟频率为72MHZ。
在软件设计中,我们常常需要用到软件定时,这是需要我们使用定时器来产生周期定时。
如何产生周期定时,需要用到定时器,需要用到2个参数:预分频值Prescaler和重装值Period。
预分频值决定了最小分辨率,假设72MHZ的TIM3定时器:
重装值表示计数到此数之后会产生一个定时器中断,假设Prescaler=7199(10KHZ):
STM32提供了库函数 RCC_GetClocksFreq
:
typedef struct
{
uint32_t SYSCLK_Frequency;
uint32_t HCLK_Frequency;
uint32_t PCLK1_Frequency;
uint32_t PCLK2_Frequency;
uint32_t ADCCLK_Frequency;
}RCC_ClocksTypeDef;
RCC_ClocksTypeDef clock;
RCC_GetClocksFreq(&clock);
GD32提供了库函数 rcu_clock_freq_get
:
uint32_t rcu_clock_freq_get(rcu_clock_freq_enum clock)
参数:CK_SYS, CK_AHB, CK_APB1, CK_APB2
没有提供接口的外设频率怎么查询?
看芯片手册外设配置和时钟树自己算
以GD32的ADC为例,ADC_SYNCCTL寄存器中bit16-18为ADC的时钟频率ADCCK[2:0]:
18:16 ADCCK[2:0] ADC时钟
这些位配置所有ADC的时钟
000:PCLK2 2分频
001:PCLK2 4分频
010:PCLK2 6分频
011:PCLK2 8分频
100:HCLK 5分频
101:HCLK 6分频
110:HCLK 10分频
111:HCLK 20分频
#define ADC_SYNCCTL_ADCCK BITS(16,18)
那么:
STM32F1-COM3,GD32F4-COM9
时钟频率获取
--EOF--