STM32_Day05(时钟)

本文详细介绍了STM32的时钟系统,包括振荡器类型(晶体、RC、LC)、倍频器和分频器的作用,以及SYSCLK、HCLK、PCLK和PLL时钟的配置。重点讲解了Systick定时器的工作原理和如何利用定时器实现不同应用场景,如1秒打印和灯的闪烁。
摘要由CSDN通过智能技术生成

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

在这里插入图片描述
振荡器:产生信号的源头
唤醒定时器:使能、关闭功能
倍频器:放大频率(升频)
分频器:减小频率(降频)

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

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

优点:晶体振荡器信号稳定、质量好,连接方式简单。
缺点:价格高,需要较长的启动时间(起振时间)
晶体振荡器分类:
无源晶振是有2个引脚的无极性元件,需要借助于时钟电路才能产生振荡信号,自身无法振荡起来。(谐振器)
有源晶振有4只引脚,是一个完整的振荡器,其中除了石英晶体外,还有晶体管和阻容元件,因此体积较大。有源晶振不需要CPU的内部振荡器,信号稳定,质量较好,而且连接方式比较简单。(振荡器)

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

   优点:实现的成本比较低,仅由电阻电容构成。
   缺点:精度存在问题,振荡频率会存在误差。

RC振荡器	晶体振荡器

构成 电阻电容 石英晶体
优点 成本低 稳定、精度高
缺点 震荡频率会有误差、受温湿度影响 价格高、需接起振电容

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

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

倍频器:CPU需要更高的频率,晶体振荡器制作成本较高(而且频率越高,自身的频率也不稳定),不宜直接生产高频振荡器,可以利用倍频器对现有的时钟频率进行放大。
分频器:外设需要不同的频率,为了降低功耗,可以进行分频以提供不同频率时钟信号。
为什么要设计 倍频器和分频器? 答:1)为了降低成本(CPU需要更高的时钟频率)
2)减少功耗(外设需要不同的时钟频率)

1.2 G030时钟源
英文参考手册(121页)
在这里插入图片描述

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时钟树配置
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.Systick定时器
概念
SysTick又称滴答定时器。是一个定时设备,位于Cortex-M0内核中,和NVIC捆绑(可以产生中断信号),产生SysTick异常(IRQ异常号15)可以对输入的时钟进行计数,系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。(时基为1ms)
用之前需要在NVIC中使能(默认使能)
在这里插入图片描述

工作原理
滴答定时器是一个24位递减定时器,也就是最多能计数2^24(0xFFFFFF) 16,777,216。
SysTick设定初值并使能后,每来一个时钟信号,计数值就减1。
计数减到0时,触发中断,SysTick计数器自动重装初值并继续减一,循环不断。
在这里插入图片描述

探究:systick多久触发一次异常?触发异常干了什么?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

触发异常干了什么?
uwTick += 1;
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

16 000 一直减到 0 触发中断
结论:
每次重新装载的值是多少?
SysTick->LOAD = (uint32_t)(ticks - 1UL); //16 000-1
从16 000 -1 减到0 ,总共计数 16 000次
当前时钟频率 16MHz ,计一个数 需要 1/16 000 000 秒
记了16 000 个数 16 000 * 1/16 000 000 s =1/1 000 秒 -》1毫秒
所以说,SysTick每隔1ms 触发一次异常

【练习】利用Systick异常,实现1秒打印1次“helloworld”
1、定义一个全局变量
在这里插入图片描述

2、找到中断,跳转一次
在这里插入图片描述

3、让flag 1毫秒自加
在这里插入图片描述

4、在主函数中判断,当flag加到1000时,说明systick异常触发了1000次,此时刚好用时1s打印“helloworld”
在这里插入图片描述

2.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)						//0xFFFFFFFF
  {
    wait += (uint32_t)(uwTickFreq);			//wait +=1;
  }

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

3.定时器
Systick(滴答定时器)是在内核里(ARM公司设计),定时器(ST、其他厂商)
在这里插入图片描述

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

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

在这里插入图片描述

种类 位数 计数器模式 产生DMA请求 捕获/比较通道 互补输出 特殊应用场景
高级
16 向上,向下,向上/下 可以 4 有 带死区控制和紧急刹车,可应用于PWM电机控制
通用 16 向上,向下,向上/下 可以 4
通用。定时计数,PWM输出,输入捕获,输出比较
基本
16 向上,向下,向上/下 可以 0 无 主要应用于驱动DAC

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

时基单元
在这里插入图片描述

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

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

注意:G030最大频率64MHz
在这里插入图片描述

2.自动重装寄存器
在这里插入图片描述

3.计数器
在这里插入图片描述

计数模式
向上计数模式:计数器从0开始计数,当达到自动装载寄存器(TIMx_ARR)里的值时,自动清零且产生一个溢出事件,然后再从0开始向上计数。
向下计数模式:计数器从自动装载寄存器(TIMx_ARR )里的值开始递减计数,当计数值达到0时产生一个定时器溢出事件,并重装初值,继续向下计数。
中央对齐模式:又称为向上/向下计数,计数器从0开始递增达到ARR的值,产生一个定时器溢出事件,再从ARR的值递减到0,产生一个定时器溢出事件。
在这里插入图片描述

定时器计数原理
在这里插入图片描述

问:时钟频率配置成64MHz,如何让定时器产生一秒中断?
时基单元外部的频率64MHz
1)预分频器:写64-1,相当于64分频
64MHz / 64 = 1 MHz 1秒计 1 000 000 个数
2)计数器:向上计数
3)自动重装寄存器:1 000 000
经典的错误,标准的零分 注意:最大装载65535

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

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在main.c中重写定时器溢出中断回调函数

以中断模式启用TIM14定时器
在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值