STM32(时钟)

1、STM32的时钟系统

1.1 时钟基本概念

    1) 时钟是嵌入式系统的脉搏,在电子系统中,时钟信号可以被理解为一个周期性的信号,它确定了系统的节奏和时间基准。处理器内核在时钟驱动下完成指令执行,状态变换等动作,外设部件在时钟的驱动下完成各种工作,例如:串口数据的发送、AD转换、定时器计数等。  

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

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

振荡器:产生时钟信号

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

倍频器:放大频率

分频器:减小频率

振荡器(信号源):振荡器是时钟系统的基础,它提供一个稳定的振荡信号作为时钟源。振荡器可以是晶体振荡器、RC振荡器等,它们产生的信号频率决定了时钟系统的基本节拍。

唤醒定时器(Wake-up Timer):唤醒定时器是一种特殊的定时器,用于在设备处于低功耗模式时定期唤醒设备。它通常基于时钟信号计数,并在设定的时间间隔后触发唤醒信号。

倍频器(Clock Multiplier):倍频器用于将时钟信号的频率进行倍增,以产生更高频率的时钟信号。倍频器通常通过锁相环(PLL)来实现,可以根据需要调整输出时钟频率。

分频器(Clock Divider):分频器用于将时钟信号的频率进行分频,以产生较低频率的时钟信号。分频器通常通过调整分频比来控制输出时钟频率。

常见振荡器的有哪些?

晶体振荡器、RC、LC

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

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

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

晶体振荡器分类:

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

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

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

(在芯片内部)

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

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

RC振荡器

晶体振荡器

构成

电阻电容

石英晶体

优点

成本低

稳定、精度高

缺点

震荡频率会有误差、受温湿度影响

价格高、需接起振电容

  1. LC振荡器(Inductor-Capacitor Oscillator):LC振荡器使用电感和电容器构成一个振荡回路。在LC振荡回路中,电感和电容器通过能量交换产生周期性的振荡信号。LC振荡器的频率稳定性较好,但相比RC振荡器,其结构复杂、尺寸较大。

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

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

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

为什么要设计倍频器和分频器? 答:1)为了降低成本(CPU需要更高的时钟频率)

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

1.2 G030时钟源

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

HSE:高速外部时钟,由外部晶体/陶瓷谐振器产生4-48MHz的时钟频率(咱们使用的是8MHz的贴片式晶振)

LSI:低速内部时钟,由低速RC振荡器产生的32KHz的时钟频率

LSE:低速外部时钟,由外部低速晶振产生32.768KHz的频率

1.3 时钟树

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 

1.4 STM32CubeMX时钟树配置

2、Systick定时器

 概念

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

工作原理

滴答定时器是一个24位递减定时器,也就是最多能计数2^24(0xFFFFFF)  。

SysTick设定初值并使能后,每来一个时钟信号,计数值就减1。

计数减到0时,触发中断,SysTick计数器自动重装初值并继续减一,循环不断。

系统默认开启滴答定时器

原理图

时钟基准

 探究:systick多久触发一次异常?

中断中uwTick 自加1

1ms进一次中断

//如果systick初值大于最大值0xFFFFFF
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
  {
    return (1UL);                                                   //返回1 说明配置失败
  }

  SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         // 设置重载寄存器重载的计数值    16000 - 1
  NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); 
//设置Systick中断的优先级

//加载SysTick计数器值 
  SysTick->VAL   = 0UL;                                             //启用SysTick IRQ和SysTick定时器
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                   SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk;                        
  return (0UL);                                                     /* Function successful */
}

结论:

每次重新装载的值为多少?

SysTick->LOAD  = (uint32_t)(ticks - 1UL);   //16 000-1

从16 000 -1 递减到0,总共需要计16 000次数

当前频率是16MHz,计一个数需要1/16M s

计16 000 个数需要 16000 * 1/16M= 1/1000 s =1 ms

因此Systick每隔1ms会触发一次异常。

【练习】利用Systick异常,实现1秒打印1次“helloworld”

1、定义一个全局变量

  1. 每次Systick触发异常时让全局变量flag自加1

3、设置一个外部引用变量 extern flag,并重写函数每次,没过1ms flag++

3、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)
  {
    wait += (uint32_t)(uwTickFreq);
  }

  while ((HAL_GetTick() - tickstart) < wait)
  {
		//如果当前系统时间 - 初始时间 < 延时时间   则循环
		//当达到延时条件,循环结束
  }
}

GetTick函数返回当前系统uwTick的值

uwTick每个1ms会自加1

因此HAL_Delay的实现依靠Systick,以达到毫秒为单位的延时效果。

【练习】尝试将HAL_Delay的延时单位修改成1s。

4、定时器  

systick(滴答定时器)是在内核里(ARM公司设计);定时器(ST、GD、其他芯片厂商)

基本概念    

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

定时器分类

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

计数器的分辨率:重装载计数器最大可以写多少

计数器类型:向上、向下计数,向上再向下计数

预分频因子:预分频因子是用于配置定时器和计数器模块的一个参数,用于控制时钟信号的分频比。通过设置不同的预分频因子,可以改变定时器和计数器的计数频率,从而实现不同的定时和计数功能。16位的寄存器,可以设置的值范围为0到65535。设置为0时表示不进行分频,设置为1时表示将输入时钟分频为2,以此类推。

DMA请求:是否支持DMA(最后一天会讲到)捕获/比较通道:输入捕获、输出比较(根据比较可以输出PWM波)

互补输出:具有两个输出引脚,分别称为主输出互补输出。主输出引脚和互补输出引脚是成对使用的,用于产生相位差为180度的两个信号。主输出和互补输出引脚的电平变化是互补的,即当主输出引脚上的电平上升时,互补输出引脚上的电平下降,反之亦然。互补输出还可以用于减小电磁干扰和噪声,并提高系统的可靠性。

种类

位数

计数器模式

产生DMA请求

捕获/比较通道

互补输出

特殊应用场景

高级

16

向上,向下,向上/下

可以

4

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

通用

16

向上,向下,向上/下

可以

4

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

基本

16

向上,向下,向上/下

可以

0

主要应用于驱动DAC

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

时基单元

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

1. 计数器:可以根据外部时钟源(晶振或内部时钟源(RC)递增或递减计数值。

2. 预分频器:定时器模块通常还包含一个可编程的预分频器,用于将外部时钟源分频得到较低的计数频率。

3. 比较值和自动重装载:(目标值定时器模块可以配置比较值和自动重装载值,用于在达到特定计数值时触发中断或事件。

4. 输入捕获和输出比较:定时器模块通常支持输入捕获功能,用于测量外部事件的时间间隔,并支持输出比较功能,用于生成精确的定时事件或 PWM 信号。

  1. 预分频器

  1. 自动重装寄存器

  1. 计数器

计数模式

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

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

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

 定时器计数原理

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

  1. 预分频值写64-1,相当于64分频

64MHz---------->1MHz(1 000 000)

  1.  自动重装载寄存器写1 000 000 -1

1000000 个数 * 1/1000000 =1s

经典的错误,标准的零分

实验1

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

重写回调函数

别忘了启动

实验2

使用定时器中断实现蓝灯1s间隔闪烁,黄灯2s间隔闪烁。

以中断的形式启动定时器

重写中断服务程序(tim14是1秒触发一次,tim16是2秒)

作业

  1. 使用定时器中断实现蓝灯1s间隔闪烁,黄灯2s间隔闪烁,绿灯3s间隔闪烁。(静止用HAL_Delay)
  2. 使用定时器1秒打印一次“HelloWorld”,接收到4个字符,可以打印“HelloHello”。绿色灯500ms闪烁一次

扩展:看门狗(面试会问)

单片机STM32的看门狗(Watchdog)是一种硬件定时器,用于监控系统的运行状态并在出现故障或死锁时采取措施以恢复正常操作。看门狗的主要功能是定期检查系统是否正常运行,并在系统出现问题时触发复位操作。

STM32系列单片机通常配备了内置的看门狗定时器(通常称为独立看门狗,IWDG)和窗口看门狗定时器(WWDG),以提供更可靠的系统保护。

独立看门狗(IWDG)是STM32中常用的看门狗,它是一个独立的硬件模块,可以在系统内部独立运行。通过配置IWDG定时器的计数器和预分频器,可以设置看门狗的定时时间。当看门狗定时器计数器达到预设的值时,会产生看门狗超时事件,触发系统复位。

窗口看门狗(WWDG)是另一种类型的看门狗,它允许在特定的时间窗口内更新计数器值,以避免触发复位。WWDG可以通过设定窗口和计数器的值来进行配置,并在每次更新计数器时,确保计数器值位于设定的窗口范围内。如果计数器超出窗口范围,将触发看门狗复位。

————————————————

版权声明:本文为CSDN博主「JiaYu嵌入式」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:单片机STM32看门狗详解(嵌入式学习)_JiaYu嵌入式的博客-CSDN博客

IWDG(WWDG和这个原理相近,自己扩展

它的时钟由LSI提供

我们启用独立看门狗

HAL函数

程序测试

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

满山的猴子我的腚最红

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值