STM32—时钟

目录

时钟的基本概念

振荡器

晶体振荡器(Crystal Oscillator)

优点

缺点

晶体振荡器分类

RC振荡器(Resistor-Capacitor Oscillator)

优点

缺点

 LC振荡器(Inductor-Capacitor Oscillator)

倍频器

分频器

G032时钟源

HSI

HSE

LSI

LSE

时钟树

SysTick定时器 

概念

工作原理

原理图

时间基准

实验一

实验二

实验三

HAL_Delay函数分析

实验

定时器

基本概念

定时器的分类

时基单元

预分频器

自动重装载寄存器

计数器

计数模式

定时器计数原理

实验一

实验要求

实验步骤

重写中断回调函数

实验二

实验要求

实验步骤


时钟的基本概念

时钟是嵌入式系统的脉搏,在电子系统中,时钟信号可以被理解为一个周期性的信号,它确定了系统的节奏和时间基准,处理器内核在时钟驱动下完成指令执行,状态变换等动作,外设部件在时钟的驱动下完成各种工作,例如:串口数据的发送、AD转换、定时器计数等。因此,时钟对于计算机系统是至关重要的,通常时钟系统出现问题也是致命问题,比如振荡器不起振、震荡不稳、停振等,时钟信号推动单片机内各个部分执行相应的指令,时钟就像是人的心跳一样。

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

振荡器:信号产生的来源

唤醒定时器:具有使能、关闭功能

倍频器:放大频率

分频器:通过对输入时钟进行分频,将时钟的频率降低或提高,以调整定时器的计数周期。

振荡器

振荡器主要分为晶体、RC振荡器、LC振荡器

晶体振荡器(Crystal Oscillator)

晶体振荡器使用石英晶体作为震荡元件,石英晶体具有压电效应,当施加电压时,会以固定频率产生机械振动。晶体振荡器利用石英晶体这种特性,通过电子电路驱动晶体振荡,产生稳定的震荡信号,晶体振荡器的频率稳定性非常高。

优点

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

缺点

价格高,需要相对较长的启动时间(起振时间)

晶体振荡器分类

无源晶体振荡器:也叫谐振器,有两个引脚的无极性元件,需要借助时钟电路才能产生振荡信号,自身无法震荡起来。

有源晶体振荡器:也叫振荡器,有四只引脚,是一个完整的振荡器,其中除了石英晶体之外还有晶体管和阻容元件,因此体积相对较大,有源晶体振荡器不需要CPU的内部振荡器,信号稳定,质量较好,并且连接方式比较简单。

RC振荡器(Resistor-Capacitor Oscillator)

RC振荡器使用电阻和电容器构成一个简单的震荡回路,当电器充放电达到某个阈值时,会产生周期性的振荡信号,RC振荡器通常成本低、结构简单,但其频率稳定性较差,受到温度、供电电压等环境因素影响较大。

芯片内部

优点

振荡器成本较低,仅由电容电阻构成。

缺点

精度不够精确,振荡频率会存在较大误差。

RC振荡器晶体振荡器
构成电容电阻石英晶体
优点成本低稳定、精度高
缺点振荡频率会有误差价格高、需要接起振电容

 LC振荡器(Inductor-Capacitor Oscillator)

LC振荡器使用电感和电容通过能量交换产生周期性的振荡信号。LC振荡器的频率稳定性较好,但相比于RC振荡器,LC振荡器结构复杂、尺寸较大。

 RC振荡器和LC振荡器是最简单的振荡器,适应于一些地要求的应用场景,而晶体振荡器则具有更高的频率稳定性和精度,适应于对时钟信号要求较高的电子系统中。

倍频器

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

分频器

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

为什么要设计倍频器和分频器?

为了降低成本(CPU需要更高的时钟频率)

减少功耗(外设需要不同的时钟频率)

G032时钟源

英文参考手册121页

HSI

高速内部时钟,由RC振荡器产生16MHz的时钟频率。

HSE

高速外部时钟,由外部晶体/陶瓷谐振器产生4-48MHz的时钟频率。

LSI

低速内部时钟,由低速RC振荡电路产生32KHz的时钟频率。

LSE

低速外部时钟,由外部低俗晶振产生32.768KHz-1MHz的时钟频率。

时钟树

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

HCLK是高速外设时钟。能够为高性能总线(AHB busperipherals)供给时钟信号(AHB是Advanced high-performance bus),它是由系统时钟SYSCLK分频得到的,一般不分频,不分频的时候相当于系统时钟。HCLK是为外设提供的,例如内存、FLASH

PCLK是低速外设时钟,为低速外设总线(APB busperipherals)供给时钟信号。

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

SysTick定时器 

概念

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

工作原理

滴答定时器是一个24位递减定时器,也就是最多能计数2……24(0XFFFFFF)。Sys Tick设定初值并使能后,每来一个时钟信号,计数值就减一。计数值减到0时,SysTick计数器自动重装初值,并继续减一,以此循环不断。

系统会默认开启滴答定时器。

原理图

时间基准

实验一

SysTick多久触发一次异常?

__weak void HAL_IncTick(void)
{
  uwTick += (uint32_t)uwTickFreq;      //uwTick自加1
}

实验二

uwTick多久自加一次?

SystemCoreClock / (1000U /(uint32_t)uwTickFreq)    //16 000

__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)        //不可能重载值
  {
    return (1UL);                             //返回1  配置失败                      /* Reload value impossible */
  }
        //重装载值 16 000 -1
  SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
  SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                   SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */
  return (0UL);                                                     /* Function successful */
}
SysTick-> LOAD   = ( uint32_t )( ticks  - 1UL )

16 000 -1    —————》 0      计数16 000次

16MHz    =  16 000 000   计一个数      1/16 000 000  s

计数16 000次    *   1/16 000 000 s   =1/1000   秒  =    1毫秒

实验三

利用SysTick异常,实现一秒打印一次 “ hello world ”

HAL_Delay函数分析

两种方法找到HAL_Delay()

 

__weak void HAL_Delay(uint32_t Delay)
{
  uint32_t tickstart = HAL_GetTick();		//获取当前时间作为开始时间
  uint32_t wait = Delay;								//获取用户要延时的时间

  /* Add a freq to guarantee minimum wait */
  if (wait < HAL_MAX_DELAY)							//0xFFFFFFFFU
  {
    wait += (uint32_t)(uwTickFreq);
  }

  while ((HAL_GetTick() - tickstart) < wait)	//获取当前时间-开始时间
    //GetTick()函数返回当前系统uwTick的值,uwTick每隔1ms会自加1
    //HAL_Delay()的实现依靠SysTick以达到毫秒为单位的延时效果
  {
		
  }
}

实验

将HAL_Delay()的延时单位修改成1s,即HAL_Delay(1)为延时1s

定时器

SysTick(滴答定时器)是内核里面的(ARM设计),定时器是在外部(ST公司或厂商设计)。

基本概念

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

定时器的分类

定时器的基本结构是通用的,很多模块电路都能用到,所以STM32在定时方面扩展了非常多的功能,根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型。

种类

位数

计数器模式

产生DMA请求

捕获/比较通道

互补输出

特殊应用场景

高级

16

向上,向下,向上/下

可以

4

带死区控制和紧急刹车,可应用于PWM电机控制

通用

16

向上,向下,向上/下

可以

4

通用。定时计数,PWM输出,输入捕获,输出比较

基本

16

向上,向下,向上/下

可以

0

主要应用于驱动DAC

互补输出和死区插入:中文参考手册389页

时基单元

时基单元是指用于计时和生成定时事件的模块,常见的时基单元是定时器模块。

  1. 计数器:可以根据外部时钟源或内部时钟源递减或递增计数值。
  2. 预分频器:定时器模块通常还包含一个可编程的预分频器,用于将外部时钟源分频得到较低的技术频率。
  3. 比较值和自动重装载:定时器模块可以配置比较值和自动重装载值,用于在达到特定计数值时触发中断或事件。
  4. 输入捕获和输出比较:定时器模块通常支持输入捕获功能,用于测量外部事件的时间间隔,并支持输出比较功能,用于生成精确的定时事件或PWM信号。

预分频器

自动重装载寄存器

计数器

向上计数

计数模式

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

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

定时器计数原理

时钟频率配置成64MHz,如何让定时器产生1s中断?

第一步:

        分频值64-1,64分频

        64MHz/64=1MHz

        计一个数需要1/1 000 000秒

第二步:

        自动重装载值 1 000 000

1 000 000个数*1/1/1 000 000=1s

注意:

        这样计算是错误的,最大计数是65535,超出范围

实验一

实验要求

利用定时器中断实现1s打印一个“hellowolrd”

实验步骤

重写中断回调函数

实验二

实验要求

使用定时器中断实一个灯1s间隔闪烁,另一个灯2s间隔闪烁

实验步骤

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值