1.时钟系统
1.1概念
换算关系:1s = 1000ms =1000000us
1) 时钟是嵌入式系统的脉搏,在电子系统中,时钟信号可以被理解为一个周期性的信号,它确定了系统的节奏和时间基准。处理器内核在时钟驱动下完成指令执行,状态变换等动作,外设部件在时钟的驱动下完成各种工作,例如:串口数据的发送、AD转换、定时器计数等。
因此时钟对于计算机系统是至关重要的,通常时钟系统出现问题也是致命的,比如振荡器不起振、振荡不稳、停振等。时钟信号推动单片机内各个部分执行相应的指令,时钟就像人的心跳一样。
2)**时钟系统的组成:**振荡器(信号源)、唤醒定时器、倍频器、分频器
振荡器:产生信号的源头唤醒定时器:使能、关闭功能
倍频器:放大频率
分频器:分频
注意:为什么使用倍频器和分频器?为什么不直接使用两个晶振?
因为CPU和外设使用的频率相差很大,所以不能使用同一频率的信号,又由于晶振价格远高于倍频器和分频器,所以不会使用两个晶振。
1.2 时钟源
振荡器主要分为晶体、RC
1.晶体振荡器 (Crystal Oscillator):【在芯片外部】晶体振荡器使用石英晶体作为振荡元件。石英晶体具有压电效应,当施加电场时,会以固定频率产生机械振动。晶体振荡器利用石英晶体的这种特性,通过电子电路驱动晶体振荡,产生稳定的振荡信号。晶体振荡器的频率稳定性非常高。优点:晶体振荡器信号稳定、质量好,连接方式简单。
缺点:价格高,需要较长的启动时间(起振时间)
晶体振荡器分类:
- 无源晶振是有2个引脚的无极性元件,需要借助于时钟电路才能产生振荡信号,自身无法振荡起来。(谐振器)
- 有源晶振有4只引脚,是一个完整的振荡器,其中除了石英晶体外,还有晶体管和阻容元件,因此体积较大。有源晶振不需要CPU的内部振荡器,信号稳定,质量较好,而且连接方式比较简单。(振荡器)
- RC振荡器(Resistor-Capacitor Oscillator):【在芯片内部】RC振荡器使用电阻和电容器构成一个简单的振荡回路。当电容器充放电达到某个阈值时,会产生周期性的振荡信号。RC振荡器通常成本低、结构简单,但其频率稳定性较差,受到温度、供电电压等环境因素影响较大。在芯片内部
优点:实现的成本比较低,仅由电阻电容构成。缺点:精度存在问题,振荡频率会存在误差。
|----|-----------------|------------|
| | RC振荡器 | 晶体振荡器 |
| 构成 | 电阻电容 | 石英晶体 |
| 优点 | 成本低 | 稳定、精度高 |
| 缺点 | 震荡频率会有误差、受温湿度影响 | 价格高、需接起振电容 |
1.3 S T M 3 2 U 5 时钟 源
HSI(High Speed Internal) 高速内部时钟,由RC振荡器产生16Mhz的时钟频率。
HSE(High Speed External) 高速外部时钟,由外部石英晶体/陶瓷谐振器产生4-50Mhz的时钟信号,本文使用12MHz晶振LSI(Low Speed Internal) 低速内部时钟,由低速RC振荡电路产生32Khz的时钟频率。
LSE(Low Speed External) 低速外部时钟,由低速晶振产生32.768Khz的时钟频率
补充:
RTC实时时钟 是一个独立的定时器。STM32 的 RTC 模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。只要电源电压保持在工作范围内,RTC永远不会停止。
1.4 时钟树
时钟从哪来?---> 时钟源(主要有四个)
送到那里去?---> 内核、外设、存储

注意:若在时钟树上找不到想找的外设,可以去找找该外设挂载在哪根系统总线上,然后在时钟树上查找该总线对应的时钟频率
CubeMX时钟配置:
内部时钟默认启用,外部时钟需要手动开启(使用外部时钟前提是外部电路有晶振)
开启外部时钟

2.SYSTICK系统滴答定时器
滴答定时器(SYSTICK)是CPU内部的,定时器(TIM)是CPU外部的。

2.1 概念
SysTick又称滴答定时器。是一个定时设备,位于Cortex-M33内核中,和NVIC配合使用(可以产生异常信号),产生SysTick异常可以对输入的时钟进行计数,系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。(1ms)
频率 单位是HZ KHZ MHZ,符号:f 一秒钟震荡的次数周期 单位是S ms us 符号:T 震荡一次所需的时间
1KHZ 代表1s震荡1000次,震荡一次的时间 1/1000s=1ms
1MHZ 代表1s震荡1000000次,震荡一次的时间 1/1000000s=1us
2.2 原理
滴答定时器本质是一个计次器,即他没有时间的概念,我们规定频率为1KHz,他就认为震荡1000次为1s,规定频率为1MHz,他就认为震荡1000000次为1s。所以,所谓的定时器其实就是对时钟信号进行计数,当达到计数个数时会触发异常,并重新开始计数。
滴答定时器是一个24位递减定时器,也就是最多能计数2^24(0xFFFFFF) 16,777,216。SysTick设定初值并使能后,每来一个时钟信号,计数值就减1。计数减到0时 ,触发异常 ,SysTick计数器自动重装,初值并继续减一,循环不断。
配置寄存器时注意减到最后是0不是1,所以配置的数值应为计数次数-1
例:输入时钟频率为32KHZ,计200ms该计多少个数,如何配置寄存器?时钟频率为32KHZ--->计时1s需要计数32000次--->计时1ms需要32次--->计时200ms需要6400次--->寄存器应配置为6400-1
重载寄存器的默认值就是4000-1
系统滴答定时器默认1ms触发一次异常(中断)
探究:systick多久触发一次异常? 触发异常干了一件什么事情?????
得出结论:1ms产生一次异常,异常中让uwtick+1;systick->load = 4000-1 ; 计数到0,一共计数4000次
因为频率是4MHZ=4000 000HZ--> 1秒计4000 000 个数
这里记了4000 个数,用时1毫秒
HAL_Delay()函数
3.定时器(TIM)
3.1 基本概念
定时器类似于我们生活中的闹钟,可以设定一个时间来提醒我们。定时器可以作为基本的定时器/计数器,
用于生成周期性的定时中断或作为计数器来计数外部事件的脉冲数。例如1秒钟进入定时器中断干一件事,定时器可以配置为产生脉冲宽度调制(PWM)信号,用于控制电机速度、LED亮度调节,风扇风速调节,等应用。
3.2 STM32U5定时器
定时器是存在于STM32U5单片机中的一个外设,总共有11个定时器,分别是2个高级定时器(TIM1,TIM8)7个通用定时器(TIM2,TIM3,TIM4,TIM5,TIM15,TIM16,TIM17)和2个基本定时器(TIM6,TIM7)
3.3 定时器框图
定时器三大件:PSC(预分频器)、ARR(自动重装载寄存器)、CNT(计数器)
时基单元:
时基单元是指用于计时和生成定时事件的模块。常见的时基单元是定时器模块。
计数器:可以根据外部时钟源或内部时钟源递增或递减计数值。
预分频器:定时器模块通常还包含一个可编程的预分频器,用于将外部时钟源分频得到较低的计数频率。
比较值和自动重装载:定时器模块可以配置比较值和自动重装载值,用于在达到特定计数值时触发中断或事件。
输入捕获和输出比较:定时器模块通常支持输入捕获功能,用于测量外部事件的时间间隔,并支持输出比较功能,用于生成精确的定时事件或 PWM 信号。
- 预分频器(PSC)
定时器模块通常还包含一个可编程的预分频器,用于将外部时钟源分频得到较低的计数频率。
- 自动重装载寄存器(ARR)
- 计数器(CNT)
可以根据外部时钟源或内部时钟源递增或递减计数值。
计数模式:
向上计数模式:计数器从0开始计数,当达到自动装载寄存器(目标值)(TIMx_ARR)里的值时,自动清零且产生一个溢出事件(或中断),然后再从0开始向上计数。
向下计数模式:计数器从自动装载寄存器(目标值)(TIMx_ARR )里的值开始递减计数,当计数值达到0时产生一个定时器溢出事件,并重装初值,继续向下计数。中央对齐模式:又称为向上/向下计数,计数器从0开始递增达到ARR(目标值)的值,产生一个定时器溢出事件,再从ARR的值递减到0,产生一个定时器溢出事件。
3.4 关于 定时器PSC和ARR的配置
PSC(预分频器的值)*ARR(计数值) = 输入时钟频率 * 定时时间
注意:要保证PSC的值与ARR的值都不能超过65535
例:32MHZ 计时10ms 需要配置那些寄存器,如何配置?
32**10^6 ** 1**10^-2 = PSC** ARR
32** 10^4 = PSC** ARR
方案一:PSC = 8-1 ARR = 4**10^4 = 40000-1*
方案二:PSC = 16-1 ARR = 2* 10^4 = 20000-1
方案三:PSC = 32-1 ARR = 1*10^4 = 10000-1
4.PWM
4.1定义
PWM,全称为脉冲宽度调制(Pulse Width Modulation),是一种调节信号的方法。简单来说,PWM 就是通过改变信号的高电平和低电平的时间比例来控制输出的平均电压或功率。
想象一下,我们有一个周期性的信号,其中高电平表示"开"状态,低电平表示"关"状态。PWM 就是在一个固定的时间周期内,通过改变高电平和低电平的持续时间来控制信号的特性。例如,如果我们将高电平持续时间设为较长,低电平持续时间设为较短,那么平均电压或功率就会比较高。相反,如果高电平持续时间设为较短,低电平持续时间设为较长,平均电压或功率就会比较低。通过不断地调整高电平和低电平的持续时间比例,我们可以得到不同的输出效果。这种方法常用于控制电机的速度、调光灯的亮度、音频设备的音量等。
周期
高低电平变化所需要的时间,单位:msT=1/f T是周期,f是频率。
频率
在1秒钟内,信号从高电平到低电平再回到高电平的次数,也就是说一秒钟PWM有多少个周期,单位Hz。
例如:如果频率为50Hz ,也就是说一个周期是20ms,那么一秒钟就有50次PWM周期。
1000 ms / 50 = 20 ms
占空比
在一个脉冲周期内,高电平 的时间占整个周期时间的比例,单位是% (0%-100%)。
4.2 TIM的PWM模式
主要涉及到的寄存器有CNT、ARR、CCR

输入捕获 :输入捕获可以用来捕获外部事件,比如引脚的电平变化(上升沿,下降沿),并记录下变化的时间,通常可以用来测量外部信号的频率或者电平持续的时间
输出比较 :此项功能是用来控制一个输出波形,当CNT与CCR的内容相同时,输出比较功能做出相应动作,比如电平的翻转。通常用于生成PWM波形
(此处基于PWM1,PWM2和PWM1正好相反)当0-t1这段时间,计数器寄存器的CNT的值是小于CCR,输出高电平。
当t1-t2这段时间,计数器寄存器的CNT的值是大于CCR且小于ARR的,输出低电平。
当CNT的值达到ARR里的值时,产生溢出事件,自动清零再次从0开始向上计数。
STM32微控制器可产生一个由ARR 寄存器确定周期 ,由CCR 寄存器确定高电平所占整个周期多少的信号
查看CUbeMX配置与HAL库相关函数对应关系:使用PWM模式时:(在main.c中)
实验:
通过使用TIM的PWM模式来做一个控制风扇转速的程序
看day7_RCC文件夹中