目录
时钟系统+定时器+PWM
时钟系统
时钟基本概念
时钟源
晶体振荡器(Crystal Oscillator)
RC振荡器(Resistor-Capacitor Oscillator)
STM32U5时钟源
HSI(High Speed Internal)
HSE(High Speed External)
LSI(Low Speed Internal)
LSE(Low Speed External)
时钟树
STM32CubeMX时钟树配置
Systick定时器
概念
工作原理
滴答定时器分析
TIM定时器
基本概念
STM32U5定时器
定时器框图
预分频器
自动重装寄存器
计数器
定时器实验
cubeMX配置
编程
PWM
定义
参数
PWM生成原理
风扇调速实验
时钟系统+定时器+PWM
时钟系统
时钟基本概念
void delay(int T)
{
int a,b;
for(a=0;a<T;a++)
for(b=0;b<100;b++);
}
1s = 1000ms =1000000us
假如时钟频率是4M,所以运行一条指令的时间是1/4us,那么100条延时时间就是25us
1) 时钟是嵌入式系统的脉搏,在电子系统中,时钟信号可以被理解为一个周期性的信号,它确定了系统的节奏和时间基准。处理器内核在时钟驱动下完成指令执行,状态变换等动作,外设部件在时钟的驱动下完成各种工作,例如:串口数据的发送、AD转换、定时器计数等。
因此时钟对于计算机系统是至关重要的,通常时钟系统出现问题也是致命的,比如振荡器不起振、振荡不稳、停振等。时钟信号推动单片机内各个部分执行相应的指令,时钟就像人的心跳一样。
2)时钟系统的组成:振荡器(信号源)、唤醒定时器、倍频器、分频器
振荡器:产生信号的源头
唤醒定时器:使能、关闭功能
倍频器:放大频率
分频器:分频
振荡器(信号源):振荡器是时钟系统的基础,它提供一个稳定的振荡信号作为时钟源。振荡器可以是晶体振荡器、RC振荡器等,它们产生的信号频率决定了时钟系统的基本节拍。
唤醒定时器(Wake-up Timer):唤醒定时器是一种特殊的定时器,用于在设备处于低功耗模式时定期唤醒设备。它通常基于时钟信号计数,并在设定的时间间隔后触发唤醒信号。
倍频器(Clock Multiplier):倍频器用于将时钟信号的频率进行倍增,以产生更高频率的时钟信号。倍频器通常通过锁相环(PLL)来实现,可以根据需要调整输出时钟频率。
分频器(Clock Divider):分频器用于将时钟信号的频率进行分频,以产生较低频率的时钟信号。分频器通常通过调整分频比来控制输出时钟频率。
分频器:外设需要不同的频率,为了降低功耗,可以进行分频以提供不同频率时钟信号。
为什么要设计 倍频器和分频器?
答:1)为了降低成本(CPU需要更高的时钟频率)
2)减少功耗(外设需要不同的时钟频率)
时钟源
常见振荡器的有哪些?
振荡器主要分为晶体、RC、LC
晶体振荡器(Crystal Oscillator)
晶体振荡器使用石英晶体作为振荡元件。石英晶体具有压电效应,当施加电场时,会以固定频率产生机械振动。晶体振荡器利用石英晶体的这种特性,通过电子电路驱动晶体振荡,产生稳定的振荡信号。晶体振荡器的频率稳定性非常高。
无源:
没有信号源,靠外部给 蜂鸣器
有源:
有信号源,外部不需要给 蜂鸣器
优点:晶体振荡器信号稳定、质量好,连接方式简单。
缺点:价格高,需要较长的启动时间(起振时间)
晶体振荡器分类:
无源晶振是有2个引脚的无极性元件,需要借助于时钟电路才能产生振荡信号,自身无法振荡起来。(谐振器)
有源晶振有4只引脚,是一个完整的振荡器,其中除了石英晶体外,还有晶体管和阻容元件,因此体积较大。有源晶振不需要CPU的内部振荡器,信号稳定,质量较好,而且连接方式比较简单。(振荡器)
RC振荡器(Resistor-Capacitor Oscillator)
- RC振荡器使用电阻和电容器构成一个简单的振荡回路。当电容器充放电达到某个阈值时,会产生周期性的振荡信号。RC振荡器通常成本低、结构简单,但其频率稳定性较差,受到温度、供电电压等环境因素影响较大。
(在芯片内部)
优点:实现的成本比较低,仅由电阻电容构成。
缺点:精度存在问题,振荡频率会存在误差。
RC振荡器 | 晶体振荡器 | |
构成 | 电阻电容 | 石英晶体 |
优点 | 成本低 | 稳定、精度高 |
缺点 | 震荡频率会有误差、受温湿度影响 | 价格高、需接起振电容 |
STM32U5时钟源
参考手册(481页)
I2S是专门给一个引脚提供的,这里不做解释。
HSI(High Speed Internal)
HSI : 高速内部时钟,由RC振荡器产生16Mhz的时钟频率。
HSE(High Speed External)
HSE :高速外部时钟,由外部石英晶体/陶瓷谐振器产生4-50Mhz的时钟信号,咱们外接12Mhz晶振。
LSI(Low Speed Internal)
LSI :低速内部时钟,由低速RC振荡电路产生32Khz的时钟频率。
LSE(Low Speed External)
LSE:低速外部时钟,由低速晶振产生32.768Khz的时钟频率。
1MHZ=10^3KHZ=10^6HZ
时钟树
参考手册(483页)
STM32CubeMX时钟树配置
打开STM32外部时钟的方法
Systick定时器
概念
SysTick又称滴答定时器。是一个定时设备,位于Cortex-M33内核中,和NVIC配合使用(可以产生异常信号),产生SysTick异常可以对输入的时钟进行计数,系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。(1ms)
频率 单位是HZ KHZ MHZ,符号:f 一秒钟震荡的次数
周期 单位是S ms us 符号:T 震荡一次所需的时间
1KHZ 代表1s震荡1000次,震荡一次的时间 1/1000s=1ms
工作原理
滴答定时器是一个24位递减定时器,也就是最多能计数2^24(0xFFFFFF) 16,777,216。
SysTick设定初值并使能后,每来一个时钟信号,计数值就减1。
计数减到0时,触发异常,SysTick计数器自动重装,初值并继续减一,循环不断。
寄存器
输入是1MHZ的话,定时1ms该怎么定?
算出1MHZ的周期,即计一个数所需要的时间,算出为1us,那计时1ms,需要计数1000次,那么就需要我们给重载数值寄存器写1000-1
开始计时时,重载数值寄存器会给定时计数器赋值,将1000-1赋值给计数器,从此每来一个时钟周期计数器-1,当减到0的时候,计数1000个,触发中断,重载数值寄存器重新将1000-1再赋值给计数器,以此往复实现每隔1ms触发一次异常(中断)
所以,所谓的定时器,就是对时钟信号进行计数,当达到相应的计数值的时候,就会触发中断并重新开始计数。
定时器就是计数器
输入时钟频率为4MHZ,计1ms该计多少个数,如何配置寄存器?
输入频率4MHZ ---> 1us计数4 1ms-->4000个数
重载数值寄存器 :4000-1
输入时钟频率为32KHZ,计200ms该计多少个数,如何配置寄存器?
32KHZ--->1ms震荡32次 --->200ms--->32*200=6400
重载数值寄存器 :6400-1
滴答定时器分析
输入频率:4MHZ
可知重载寄存器的初始默认值为4000-1
得出结论:系统滴答定时器默认每隔1ms触发一次异常(中断)
既然是中断,那肯定会进自己的处理函数
得出结论,系统默认每隔1ms让1个叫uwTick的变量自加1
TIM定时器
SysTick(嘀嗒定时器)是在内核里(ARM公司设计) 、定时器(ST、芯片厂商)
基本概念
定时器类似于我们生活中的闹钟,可以设定一个时间来提醒我们。定时器可以作为基本的定时器/计数器,
用于生成周期性的定时中断或作为计数器来计数外部事件的脉冲数。例如1秒钟进入定时器中断干一件事,定时器可以配置为产生脉冲宽度调制(PWM)信号,用于控制电机速度、LED亮度调节,风扇风速调节,等应用。
STM32U5定时器
定时器是存在于STM32U5单片机中的一个外设,总共有11个定时器,分别是2个高级定时器(TIM1,TIM8)7个通用定时器(TIM2,TIM3,TIM4,TIM5,TIM15,TIM16,TIM17)和2个基本定时器(TIM6,TIM7)
定时器的基本结构是通用的,很多模块电路都能用到,所以STM32定时上扩展了非常多的功能,根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型
计数器的分辨率:重装载计数器最大可以写多少
计数器类型:向上、向下计数,向上再向下计数
预分频因子:预分频因子是用于配置定时器和计数器模块的一个参数,用于控制时钟信号的分频比。通过设置不同的预分频因子,可以改变定时器和计数器的计数频率,从而实现不同的定时和计数功能。16位的寄存器,可以设置的值范围为0到65535。设置为0时表示不进行分频,设置为1时表示将输入时钟分频为2,以此类推。
定时器框图
定时器基本三大件
PSC:预分频器
CNT:计数器
ARR:自动重装载寄存器
预分频器
自动重装寄存器
计数器
TIM定时器定时算法训练
32MHZ 计时10ms 需要配置那些寄存器,如何配置?
PSC:31 32分频 计数器计数频率1MHZ
ARR: 10000-1
16MHZ初始频率,计时700ms如何配置?
PSC:16000-1 16000分频 计数器输入频率:1KHZ
ARR:700-1
定时器实验
cubeMX配置
选定时器
根据所选定时器查手册看看在那个总线上
根据总线查相关定时器的输入频率
配置时间
打开中断
打开风扇引脚
编程
重写中断处理函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
主函数启动定时器
PWM
定义
PWM,全称为脉冲宽度调制(Pulse Width Modulation),是一种调节信号的方法。简单来说,PWM 就是通过改变信号的高电平和低电平的时间比例来控制输出的平均电压或功率。
想象一下,我们有一个周期性的信号,其中高电平表示“开”状态,低电平表示“关”状态。PWM 就是在一个固定的时间周期内,通过改变高电平和低电平的持续时间来控制信号的特性。例如,如果我们将高电平持续时间设为较长,低电平持续时间设为较短,那么平均电压或功率就会比较高。相反,如果高电平持续时间设为较短,低电平持续时间设为较长,平均电压或功率就会比较低。
通过不断地调整高电平和低电平的持续时间比例,我们可以得到不同的输出效果。这种方法常用于控制电机的速度、调光灯的亮度、音频设备的音量等。
参数
周期
高低电平变化所需要的时间,单位:ms
T=1/f T是周期,f是频率。
频率
在1秒钟内,信号从高电平到低电平再回到高电平的次数,也就是说一秒钟PWM有多少个周期,单位Hz。
例如:如果频率为50Hz ,也就是说一个周期是20ms,那么一秒钟就有50次PWM周期。
1000 ms / 50 = 20 ms
占空比
在一个脉冲周期内,高电平的时间占整个周期时间的比例,单位是% (0%-100%)。
PWM生成原理
PSC预分频器
ARR 自动重装载寄存器
CNT 计数器
CCR 捕获比较寄存器
PWM模式
风扇调速实验
做一个按键控制风扇速度的程序
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); //开启PWM输出
TIM3->CCR1=; //开启PWM输出