深入理解STM32时钟的工作原理和应用

时钟基本概念

要是想学习时钟,我们首先需要了解,什么是时钟

 1) 时钟是嵌入式系统的脉搏,处理器内核在时钟驱动下完成指令执行,状态变换等动作,

    外设部件在时钟的驱动下完成各种工作,例如:串口数据的发送、AD转换、定时器计数等

    因此时钟对于计算机系统是至关重要的,通常时钟系统出现问题也是致命的,比如振荡器不起振、振荡不稳、停振等。  时钟信号推动单片机内各个部分执行相应的指令,时钟就像人的心跳一样。

   2)时钟系统的组成:时钟源(振荡源)、唤醒定时器、倍频器、分频器

只看上面这些文字可能会有些晦涩难懂,但是,请不要跳过,选择先记住时钟系统的组成,下面来看一下组成时钟系统的分别是什么

时钟系统的组成

时钟源

晶体振荡器

采用石英晶体的振荡器称为晶体振荡器。

          工作原理:晶振利用一种能把电能和机械能相互转化的晶体,在共振的状态下工作可以提供稳定、精确的单频振荡。

 优点:晶体振荡器信号稳定、质量好,连接方式简单。

  缺点:价格高,需要较长的启动时间(起振时间)

 晶体振荡器分类

无源晶振是有2个引脚的无极性元件,需要借助于时钟电路才能产生振荡信号,自身无法振荡起来。

有源晶振有4只引脚,是一个完整的振荡器,其中除了石英晶体外,还有晶体管和阻容元件,因此

体积较大。有源晶振不需要CPU的内部振荡器,信号稳定,质量较好,而且连接方式比较简单。

RC振荡器

   由电阻和电容设计的振荡电路,能够将直流电转换成具有一定频率的交流信号输出。

            优点:实现的成本比较低,仅由电阻电容构成。

            缺点:精度存在问题,振荡频率会存在误差。

 倍频器

        CPU需要更高频率,晶体振荡器制作成本较高(而且自身不稳定),不易直接生产高频振荡器,可以利用倍频器对现有时钟频率进行放大。

 分频器

     外设需要不同频率,为了降低功耗,可以进行分频以提供不同频率时钟信号。

STM32G030系列的时钟源

在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。 
①、HSI是高速内部时钟,RC振荡器,频率为8MHz。 
②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 
③、LSI是低速内部时钟,RC振荡器,频率为40kHz。 
④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。 
⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍, 
但是其输出频率最大不得超过72MHz。 
其中FCLK,HCLK,PCLK都称为系统时钟,但区别如下, 
FCLK,提供给CPU内核的时钟信号,CPU的主频就是指这个信号; 
HCLK,提供给高速总线AHB的时钟信号; 
PCLK,提供给低速总线APB的时钟信号;

SYSCLK 系统时钟,最大72MHz
HCLK  :AHB总线时钟,由系统时钟SYSCLK 分频得到,一般不分频,等于系统时钟
经过总线桥AHB–APB,通过设置分频,可由HCLK得到 PCLK1与PCLK2时钟
不过PCLK2时钟最高可达72MHz,而PCLK1最大36MHz。PCLK2对应APB2外设。PCLK1对应APB1外设

时钟树

     RTC实时时钟是一个独立的定时器。STM32 的 RTC 模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。只要电源电压保持在工作范围内,RTC永远不会停止。  

    Hclk为高性能总线(AHB bus peripherals )供给时钟信号(AHB为advanced high-performance bus) ; 由系统时钟SYSCLK分频得到,一般不分频,等于系统时钟,HCLK是高速外设时钟,是给外部设备的,比如内存,flash。

   Pclk为低速总线外设总线(APB busperipherals)供给时钟信号

    PLL为锁相环倍频输出, 如果希望有一个比较大的时钟频率,可选择 PLLCLK 作为系统时钟。其时钟输入源可选择为HSI,HSE、倍频可选择为8~86倍,但是其输出频率最大不超过64MHz

注:我们需要知道的是,机器是没有时间概念的,他们只能计数,所以,所谓的定时器就是计数器

滴答定时器 Systick

 概念:

     SysTick又称滴答定时器。是一个定时设备,位于Cortex-M0内核中,和NVIC捆绑,产生SysTick异常(IRQ异常号15)可以对输入的时钟进行计数,系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。                                            

工作原理

如果想要滴答定时器每隔1ms触发一次异常,首先要知道我们输入的时钟频率是多少,已知是16MHZ,那如果想计1ms需要重装载寄存器写 16000 -1.

即Systick计数16000次后会产生一次溢出中断。

那么来了,系统是怎么给重装载寄存器写16000-1的,看线路图

进入初始化函数

进入配置函数,可以看到其传入的参数为(1600 0000/1000/1  )

进入这个函数后可以看到,函数将装载寄存器写入了1600 0000/1000 -1即 16000-1,达到预设要求。可实现每隔1ms触发一次中断。

中断发生后会进入中断处理函数,现在追寻处理函数的处理流程

找到中断向量表进入。

可看到,每次触发中断即每隔1ms会有一个叫uwtick的变量自加1。

HAL_Delay函数的底层实现就是依据uwtick实现的,先看看其代码

按键中断,终端过程中进了HAL_Delay,那就会运行到Delay里的while

定时器

基本概念

        定时器本质上是一个计数器,可对输入的时钟进行计数,并在计数值达到设定值时触发中断,当这个计数器的输入是一个准确可靠的基准时钟时,对基准时钟计数的过程就是计时的过程。

定时器分类

        定时器的基本结构是通用的,很多模块电路都能用到,所以STM32定时上扩展了非常多的功能,根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型。高级定时器通常提供更多的功能和扩展性,例如可以支持编码器模式、PWM输入输出等。而通用定时器通常可以使用多种计数/工作模式,包括输入捕获、输出比较等。基本定时器相对简单,只能进行单一模式的计数。

       STM32G030具有多个定时器,包括基本定时器(TIM6/TIM7)、通用定时器

(TIM3/TIM4/TIM14/TIM15/TIM16/TIM17)和高级控制定时器(TIM1)

计数器

   向上计数模式:计数器从0开始计数,当达到自动装载寄存器(TIMx_ARR)里的值时,自动清零且产生一个溢出事件,然后再从0开始向上计数。

   向下计数模式:计数器从自动装载寄存器(TIMx_ARR)里的值开始递减计数,当计数值达到0时产生一个定时器溢出事件,并重装初值,继续向下计数。

   中央对齐模式:又称为向上/向下计数,计数器从0开始递增达到ARR的值,产生一个定时器溢出事件,再从ARR的值递减到0,产生一个定时器溢出事件。

自动重装寄存器

32MHZ    计时10ms   需要配置哪些东西?

预分频器

定时器定时原理

  假设STM32G030当前主频为64Mhz,如何让定时器TIM1产生一个1s定时中断?

  预分频器  写64-1 相当于对PCLK进行64分频得到1Mhz时钟频率

  在1Mhz时钟频率下,计一个数需要1/1000000s

  在自动重装寄存器中写入1000000-1即可。

  当计数器计数个数达到1000000时产生一个定时器溢出中断,此时刚好1s。

相关HAL库函数

在中断模式下启动TIM时基的生成

ps:我理解的定时器就是,芯片内部没有时间概念,但是机器可以检测电平,人为固定好电平的频率,然后再规定好计数的次数,每当计数达到我们规定的次数(或者从我们规定好的时间减到0),将会触发一次异常,进入中断处理程序,只要我们将中断处理函数写成我们想要的效果,就能实现功能。

物联沃分享整理
物联沃-IOTWORD物联网 » 深入理解STM32时钟的工作原理和应用

发表评论