一、时钟系统基础
1. STM32时钟系统概述
STM32的时钟系统是一个复杂而精密的架构,负责为整个微控制器提供各种频率的时钟信号。理解时钟系统对于STM32的开发和优化至关重要。
2. 时钟系统的组成
(振荡器,唤醒定时器,倍频器,分频器)
振荡器(Oscillator):时钟源,包括外部晶体和内部RC。产生信号的源头。
锁相环(PLL,倍频器):对时钟信号进行倍频。
分频器(Prescaler/Divider):对时钟信号进行分频。
时钟切换与控制逻辑:选择和分配时钟源,控制外设时钟开关。
外设时钟分配:为各外设分配合适的时钟。
(可选)时钟输出(MCO):将时钟信号输出到外部。
3. 振荡器分类
在STM32时钟系统中,分别指的是晶体振荡器和RC振荡器,它们是常见的时钟源类型。
3.1 晶体振荡器(Crystal Oscillator)
原理:
利用石英晶体的压电效应,产生非常稳定和精确的振荡信号。
优点:
频率精度高(ppm级别)
温度稳定性好
适合对时钟精度要求高的应用(如USB、RTC、通信等)
缺点:
启动时间较长(通常几毫秒)
成本较高
需要外部元件(晶体和负载电容)
在STM32中的应用:
HSE(High Speed External):高速外部晶体(如8MHz、12MHz等),常用于主系统时钟
LSE(Low Speed External):低速外部晶体(32.768kHz),常用于实时时钟(RTC)
3.2 RC振荡器(Resistor-Capacitor Oscillator)
原理:
利用电阻和电容充放电特性产生振荡信号,通常为片上集成的RC电路。
优点:
成本低
启动快
不需要外部元件
缺点:
频率精度较低(受工艺、温度、电压影响大)
稳定性较差
不适合对时钟精度要求高的场合
在STM32中的应用:
HSI(High Speed Internal):高速内部RC振荡器(如8MHz、16MHz等),适合一般应用
LSI(Low Speed Internal):低速内部RC振荡器(如40kHz),常用于独立看门狗、低功耗定时等
3.3 区别:
特性 晶体振荡器(Crystal) RC振荡器(RC) 精度 高 低 稳定性 高 低 成本 高 低 启动速度 慢 快 外部元件 需要 不需要 典型用途 RTC、主时钟、USB等 看门狗、一般应用
3.4 STM32时钟源分类
HSI(High Speed Internal):高速内部RC振荡器(如8MHz、16MHz等),适合一般应用HSE(High Speed External):高速外部晶体(如8MHz、12MHz等),常用于主系统时钟
LSI(Low Speed Internal):低速内部RC振荡器(如32kHz),常用于独立看门狗、低功LSE(Low Speed External):低速外部晶体(32.768kHz),常用于实时时钟(RTC)
红色是一般常用的频率,也是现在用的。
3.5 时钟树
时钟树(Clock Tree)是指单片机内部所有时钟信号的来源、分配和流向的结构图。
它形象地展示了各种时钟源(如外部晶体、内部RC、PLL等)如何通过分频、倍频、切换等方式,最终分配到各个总线和外设。
三、滴答定时器
滴答定时器是CPU内部的,定时器是CPU外部的。
1. 概念
- SysTick是Cortex-M系列内核(如STM32F1/F4等)内置的一个24位递减计数定时器。
- 主要用于操作系统节拍(tick),也常用于周期性中断、延时等功能。
和NVIC配合使用(可以产生异常信号(等价与中断,在CPU内部产生的叫做异常,在CPU外部产生的叫做中断))
2. 工作原理
设置LOAD寄存器,决定定时周期。
启动SysTick,计数器开始递减。
计数到0时,自动重装载,并可产生中断。
在中断服务函数中处理定时任务。
注意:一定要知道,HZ单位是什么意思,这是震动的频率,1HZ就是一秒震动一次,就是电平变化一次,1KHZ就是一秒震动1000次。
3. 滴答定时器分析
补充:
自动重装载寄存器(ARR):设定计数器的最大值,计数到达后清零重计。
预分频器(PSC):对时钟进行分频,调节计数速度。
找到我们的滴答时钟:确认输入频率是4MHZ,所以重载寄存器的默认值就是4000-1,所以滴答定时器默认一毫秒触发一次异常(中断),因为设置的uwTick提供一个1ms的时间基准
系统滴答定时器默认一毫米触发一次异常(中断)
uwTick的作用就是提供一个1ms 的时间基准
四、RCC
1. RCC
- RCC(Reset and Clock Control)是STM32单片机内部的一个外设模块,用于管理和控制整个芯片的时钟和复位功能。
- 它是一个功能单元,就像GPIO、USART、ADC等外设一样。
2. RCC寄存器
- RCC寄存器是RCC模块内部的一组控制和状态寄存器。
- 这些寄存器用于配置和控制RCC模块的各种功能,比如时钟源选择、分频、外设时钟开关、复位等。
- 你通过读写RCC寄存器,来实现对时钟和复位的管理。
3. 二者的关系
- RCC是一个外设模块(功能单元)。
- RCC寄存器是RCC模块的“操作面板”,是你和RCC模块“对话”的接口。
- 你通过操作RCC寄存器,来实现对RCC模块的各种功能控制。
五、TIM定时器
1. 概念
TIM是Timer(定时器)的缩写。STM32中有多种定时器,统称为TIM定时器。
它们可以用于定时、计数、PWM输出、输入捕获、输出比较、编码器接口等多种功能。
2. STM32U5的定时器分类
类型 | 典型型号 | 通道数 | 主要功能 |
---|---|---|---|
基本定时器 | TIM6, TIM7 | 无 | 主要应用用于驱动DAC |
通用定时器 | TIM15, TIM16,TIM17等 | 2 | 定时计数,PWM输出,输入捕获,输出比较 |
通用定时器 | TIM2, TIM3,TIM4,TIM5等 | 4 | 定时计数,PWM输出,输入捕获,输出比较 |
高级定时器 | TIM1, TIM8 | 4 | 带死区控制和紧急刹车,可用于PWM电机控制 |
3. TIM定时器框图
TIM定时器的基本结构
计数器(CNT):记录当前计数值。
自动重装载寄存器(ARR):设定计数器的最大值,计数到达后清零重计。
预分频器(PSC):对时钟进行分频,调节计数速度。
捕获/比较寄存器(CCR):用于输入捕获或输出比较。
控制寄存器(CR1/CR2):配置定时器的工作模式。
补充:预分频器,计数器和自动重载寄存器是基本三部分
4.定时器的定时周期计算公式:
T定时=(PSC+1)×(ARR+1)/FTIMT
- PSC:预分频器值
- ARR:自动重装载值
- F_TIM:定时器时钟频率
注意:(1)T定时就是定的中断时间
(2)PSC和ARR必须都不大于65535
5.定时器实验
目标:实现LED3随着定时器闪烁,时间0.3秒一次
(1)配置RCC
控制定时器
(2)配置TIM17定时器
查看FTIMT
先查看TIM17在哪个总线上(在SPB2上)
找到FTIMT = 4MHZ
PSC和ARR自己计算,得出定时时间(不唯一,只要不超出范围)
(3)配置NVIC
用来触发中断,计时器到时间就会触发中断
(4)编写程序实现
定时器中断回调函数:
__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
开启定时器函数:
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);
1. 重写回调函数:
2. 开启定时器:
六、PWM
1. 概念:
PWM是一种通过改变脉冲信号的高电平宽度(占空比),来控制平均输出电压或能量的方法。
- 周期:一组高低电平的总时间
- 占空比:高电平时间/周期时间 × 100%
2. PWM的主要用途
- 电机调速(如直流电机、舵机)
- LED亮度调节
- 加热器功率控制
- 音频信号合成
- 数字-模拟信号转换(DAC)
3. STM32中如何产生PWM?
STM32的TIM定时器(尤其是通用定时器和高级定时器)可以很方便地输出PWM信号。
3.1 输入捕获:
输入捕获是一种利用定时器记录外部信号特定时刻(如上升沿、下降沿)到达时,定时器计数值的功能。
输入捕获测量PWM的原理
1. 定时器计数器以已知频率递增。
2. 输入捕获通道连接到PWM信号输入引脚。
3. 配置定时器在上升沿和下降沿时分别捕获计数值。
4. 通过两次上升沿之间的计数差,得到周期。
5. 通过上升沿和下一个下降沿之间的计数差,得到高电平宽度。
计算公式:
- 频率 = 定时器时钟 / 周期计数
- 占空比 = 高电平宽度 / 周期计数 × 100%
3.2 输出比较:
此项功能是用来控制一个输出波形,当计数器与捕获/比较寄存器的内容相同时,输出比较功能做出相应动作,比如电平的翻转。通常用于生成PWM波形。
3.3 输出过程:
当0-t1这段时间,计数器寄存器的CNT的值是小于CCR,输出高电平。
当t1-t2这段时间,计数器寄存器的CNT的值是大于CCR且小于ARR的,输出低电平。
当CNT的值达到ARR里的值时,产生溢出事件,自动清零再次从0开始向上计数。
补充:关键寄存器
- ARR:决定PWM周期
- CCR:决定高电平时间(占空比)
- PSC:预分频器,调节定时器计数速度
3.5 PWM输出的基本配置流程
目标:实现风扇百分之五十功率转动。
(1)使能定时器和GPIO时钟(通过RCC)
和上面设置RCC一样
(2)配置GPIO为复用推挽输出(风扇)
(3)配置定时器TM3
PWM模式
同时设置ARR、PSC、CCR
(4)使能定时器和通道输出
开启PWM时钟函数:
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
回调函数还是:(但是用不到)
__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
我们可以看到对TIM3初始化的函数里有分屏等配置
七、练习
实现按键控制风扇转动速度。
(1)设置按键引脚类型
(2)添加按键能触发中断
(3)设置按键中断类型(下降沿)
(4)回调函数内添加事件发送时,提高定时器TIM3的CCR(决定高电平时间)从而增大风扇的功率。
八、总结
1. 时钟系统是STM32微控制器的核心基础,决定了各个模块的运行速度和精度。理解时钟源的分类(晶体、RC)、时钟树结构及其分配方式,有助于合理配置系统和外设的时钟,提高系统性能和稳定性。
2. RCC(复位与时钟控制)模块是时钟系统的管理中枢。通过RCC寄存器,可以灵活地选择时钟源、配置分频、使能或关闭外设时钟,实现对功耗和性能的优化管理。
3. 滴答定时器(SysTick)是Cortex-M内核自带的定时器,常用于系统节拍和延时。它以系统主时钟为基准,提供了高精度的1ms时间基准,便于实现延时和定时任务。
4. TIM定时器是STM32中功能丰富的外设,支持定时、计数、PWM输出、输入捕获、输出比较等多种模式。通过合理配置PSC、ARR等参数,可以实现精确的定时和多样的控制功能。
5. PWM(脉宽调制)是定时器的重要应用之一,广泛用于电机调速、LED亮度调节等场合。掌握PWM的原理、占空比和周期的设置方法,有助于实现对外部设备的精细控制。
6. 输入捕获功能可以用来测量外部PWM信号的频率和占空比,扩展了定时器的应用范围。