STM32基础(时钟系统)
摘要:本文介绍了嵌入式系统中的时钟系统和定时器。主要内容包括:1)时钟系统的基本概念与组成(振荡器、分频器等),对比分析了晶体振荡器、RC振荡器和LC振荡器的特点;2)STM32U5的时钟源配置,包括高速/低速内部时钟和外部时钟;3)SysTick定时器的工作原理,如何通过计数实现精确延时;4)TIM定时器的基本功能与配置。通过分析时钟频率计算、重载寄存器设置等关键参数,阐明了如何利用定时器实现毫
1.时钟系统
1.1 时钟基本概念
1) 时钟是嵌入式系统的脉搏,在电子系统中,时钟信号(方波信号)可以被理解为一个周期性的信号,它确定了系统的节奏和时间基准。处理器内核在时钟驱动下完成指令执行,状态变换等动作,外设部件在时钟的驱动下完成各种工作,例如:串口数据的发送、AD转换、定时器计数等。
因此时钟对于计算机系统是至关重要的,通常时钟系统出现问题也是致命的,比如振荡器不起振、振荡不稳、停振等。时钟信号推动单片机内各个部分执行相应的指令,时钟就像人的心跳一样。
2)时钟系统的组成:振荡器(信号源)、唤醒定时器、倍频器、分频器)
振荡器:产生时钟信号(方波),信号源
唤醒定时器:使能、关闭开关(功能)
倍频器:放大频率
分频器:降低频率
常见振荡器的有哪些?
振荡器主要分为晶体、RC、LC
- 晶体振荡器(Crystal Oscillator):晶体振荡器使用石英晶体作为振荡元件。石英晶体具有压电效应,当施加电场时,会以固定频率产生机械振动。晶体振荡器利用石英晶体的这种特性,通过电子电路驱动晶体振荡,产生稳定的振荡信号。晶体振荡器的频率稳定性非常高。

优点:晶体振荡器信号稳定、质量好,连接方式简单。
缺点:价格高,需要较长的启动时间(起振时间)
晶体振荡器分类:
无源晶振是有2个引脚的无极性元件,需要借助于时钟电路才能产生振荡信号,自身无法振荡起来。(谐振器)
有源晶振有4只引脚,是一个完整的振荡器,其中除了石英晶体外,还有晶体管和阻容元件,因此体积较大。有源晶振不需要CPU的内部振荡器,信号稳定,质量较好,而且连接方式比较简单。(振荡器) - RC振荡器(Resistor-Capacitor Oscillator):RC振荡器使用电阻和电容器构成一个简单的振荡回路。当电容器充放电达到某个阈值时,会产生周期性的振荡信号。RC振荡器通常成本低、结构简单,但其频率稳定性较差,受到温度、供电电压等环境因素影响较大。
(在芯片内部)
优点:实现的成本比较低,仅由电阻电容构成。
缺点:精度存在问题,振荡频率会存在误差。 - LC振荡器(Inductor-Capacitor Oscillator):LC振荡器使用电感和电容器构成一个振荡回路。在LC振荡回路中,电感和电容器通过能量交换产生周期性的振荡信号。LC振荡器的频率稳定性较好,但相比RC振荡器,其结构复杂、尺寸较大。

RC振荡器和LC振荡器是简单的振荡器,适用于一些低要求的应用场景,而晶体振荡器则具有更高的频率稳定性和精度,适用于对时钟信号要求较高的电子系统中。
分频器:外设需要不同的频率,为了降低功耗,可以进行分频以提供不同频率时钟信号。
为什么要设计 倍频器和分频器?
答:1)为了降低成本(CPU需要更高的时钟频率)
2)减少功耗(外设需要不同的时钟频率)
1.2 STM32U5时钟源
HSI(高速内部时钟):通常是内部RC提供时钟,频率确定,但不稳定。
HSE(高速外部时钟):外部晶体陶瓷谐振器(晶振)提供时钟,频率可以改,稳定。
LSI(低速内部时钟):一般都是32.768KHZ,内部RC构成。(RTC–实时时钟)
LSE(低速外部):一般都是32.768KHZ,外部晶振构成。(RTC)
RTC实时时钟是一个独立的定时器。STM32 的 RTC 模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。只要电源电压保持在工作范围内,RTC永远不会停止。
1.3 时钟树
时钟从哪来,送到那里去?
1.4 STM32CubeMX时钟树配置



2.Systick定时器
概念
SysTick又称滴答定时器。是一个定时设备,位于Cortex-M33内核中,和NVIC配合使用(可以产生异常信号),产生SysTick异常可以对输入的时钟进行计数,系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。(1ms)
在NVIC使能
工作原理
定时------》计时(时钟频率)-------》计数(时钟信号)
滴答定时器是一个24位递减定时器,也就是最多能计数2^24(0xFFFFFF) 16,777,216。
SysTick设定初值并使能后,每来一个时钟信号,计数值就减1。
计数减到0时,触发异常,SysTick计数器自动重装,初值并继续减一,循环不断。
寄存器

输入的时钟频率为1MHZ的话,定时1ms该怎么定?
第一步:算出1MHZ对应的周期,即计一个数所需要的时间,算出为1us,那计时1ms需要对这样的时钟信号计1000次,所以我们给重载数值寄存器写1000-1。
这样,计数器就会从999开始计数,每来一个时钟周期就减1,直到减到0再来一次就会触发异常,此时计数器已经计数的个数为1000次,1000*1us=1ms,正好计时1ms;此时重载数值计数器重新给计数器写为1000-1;以此往复。从而实现1ms触发一次异常。
所以:所谓的定时器其实就是对时钟信号进行计数,当达到计数个数时会触发异常,并重新开始计数。
小练习:
频率是4MHZ,计1ms该计多少个数?如何配置重载数值寄存器?
4MHZ–>1/4us 1us–>4次 —>1ms—>计4000次
时钟频率:4MHZ
重载数值寄存器:4000-1
计时1ms
时钟基准,探究:systick多久触发一次异常?
首先看Systick每次触发异常在异常处理程序中做了哪些工作
她一定在中断向量表(它属于异常)


继续探究:uwTick多久加一次?????




系统频率为4MHZ,此时计4000个数触发一次异常。---------》1MS
得出结论:1ms产生一次异常,异常中让uwtick+1;
systick->load = 4000-1 ; 计数到0,一共计数4000次
因为频率是4MHZ=4000 000HZ----》1秒计4000 000 个数
这里记了4000 个数,用时1毫秒
HAL_Delay函数分析

练习:将HAL_Delay改为1s延时
HAL_Delay(1);----------->代表延时一秒
3.TIM定时器
Systick(滴答定时器)是在CPU(M33)内部,所以是ARM公司设计的
TIM定时器(单片机厂商:ST、GD、其他)
基本概念
定时器本质上是一个计数器,可对输入的时钟信号进行计数,并在计数值达到设定值时触发中断,当这个计数器的输入是一个准确可靠的基准时钟时,对基准时钟计数的过程就是计时的过程。
STM32U5定时器
定时器是存在于STM32U5单片机中的外设(片上外设),总共有11个定时器,分别是2个高级定时器(TIM1,TIM8)7个通用定时器(TIM2,TIM3,TIM4,TIM5,TIM15,TIM16,TIM17)和2个基本定时器(TIM6,TIM7)
定时器的基本结构是通用的,很多模块电路都能用到,所以STM32定时上扩展了非常多的功能,根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型。
时基单元

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

3.2.自动重装寄存器(目标)
3.3.计数器
计数模式
向上计数模式:计数器从0开始计数,当达到自动装载寄存器(目标值)(TIMx_ARR)里的值时,自动清零且产生一个溢出事件(或中断),然后再从0开始向上计数。
向下计数模式:计数器从自动装载寄存器(目标值)(TIMx_ARR )里的值开始递减计数,当计数值达到0时产生一个定时器溢出事件,并重装初值,继续向下计数。
中央对齐模式:又称为向上/向下计数,计数器从0开始递增达到ARR(目标值)的值,产生一个定时器溢出事件,再从ARR的值递减到0,产生一个定时器溢出事件。
TIM定时器定时算法训练
32MHZ 计时1ms 需要配置那些寄存器,如何配置?
预分频器:32-1
计数器:向上计数
自动重装在寄存器(目标值):1000-1
16MHZ初始频率,计时20s如何配置?
预分频器:16000-1
计数器:向上计数
自动重装在寄存器(目标值):20000-1
4.PWM
定义
PWM,全称为脉冲宽度调制(Pulse Width Modulation),是一种调节信号的方法。简单来说,PWM 就是通过改变信号的高电平和低电平的时间比例来控制输出的平均电压或功率。
参数
周期
高低电平变化所需要的时间,单位:ms
T=1/f T是周期,f是频率。
频率
在1秒钟内,信号从高电平到低电平再回到高电平的次数,也就是说一秒钟PWM有多少个周期,单位Hz。
例如:如果频率为50Hz ,也就是说一个周期是20ms,那么一秒钟就有50次PWM周期。
1000 ms / 50 = 20 ms
占空比
在一个脉冲周期内,高电平的时间占整个周期时间的比例,单位是% (0%-100%)。
工作原理
自动装载寄存器 (TIMx_ARR) 目标值
计数器寄存器 (TIMx_CNT) 不用管
捕获/比较寄存器(TIMx_CCRx)
输入捕获:
输入捕获可以用来捕获外部事件,比如引脚的电平变化(上升沿,下降沿),并记录下变化的时间,通常可以用来测量外部信号的频率或者电平持续的时间
输出比较:
此项功能是用来控制一个输出波形,当计数器与捕获/比较寄存器的内容相同时,输出比较功能做出相应动作,比如电平的翻转。通常用于生成PWM波形
向上计数模式:
输出过程:
当0-t1这段时间,计数器寄存器的CNT的值是小于CCR,输出高电平。
当t1-t2这段时间,计数器寄存器的CNT的值是大于CCR且小于ARR的,输出低电平。
当CNT的值达到ARR里的值时,产生溢出事件,自动清零再次从0开始向上计数。
实验:PWM控制风扇的转速


MX配置


代码分析

代码编写

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐



所有评论(0)