嵌入式笔记5.1 定时器详解
- 一、SysTick——系统节拍定时器
- 二、RTC——实时时钟
- 1. 信息介绍
- 2. 寄存器详解
- 0. 寄存器地址
- 1. RTC 时间寄存器(RTC_TR)
- 2. RTC 日期寄存器(RTC_DR)
- 3. RTC 亚秒寄存器(RTC_SSR)
- 4. RTC 初始化控制和状态寄存器(RTC_ICSR)
- 5. RTC 预分频器寄存器(RTC_PRER)
- 6. RTC 唤醒定时器寄存器(RTC_WUTR)
- 7. RTC 控制寄存器(RTC_CR)
- 8. RTC 写保护寄存器(RTC_WPR)
- 9. RTC 校准寄存器(RTC_CALR)
- 10. RTC 移位控制寄存器(RTC_SHIFTR)
- 11. RTC 时间戳时间寄存器(RTC_TSTR)
- 12. RTC 时间戳日期寄存器(RTC_TSDR)
- 13. RTC时间戳亚秒寄存器(RTC_TSSSR)
- 14. RTC 闹钟 A 寄存器(RTC_ALRMAR)
- 15. RTC 闹钟 A 亚秒寄存器(RTC_ALRMASSR)
- 16. RTC 闹钟 B 寄存器(RTC_ALRMBR)
- 17. RTC 闹钟 B 亚秒寄存器(RTC_ALRMBSSR)
- 18. RTC 状态寄存器(RTC_SR)
- 19. RTC 屏蔽中断状态寄存器(RTC_MISR)
- 20. RTC 状态清除寄存器(RTC_SCR)
- 3. RTC 中断
- 三、TIM——定时器
一、SysTick——系统节拍定时器#
1. 信息介绍#
SysTick 是 Cortex 内核外设,内嵌在在 NVIC 中,属于 NVIC 的一部分,且可以产生 SysTick 异常(异常类型 #15)。
SysTick 为简单的 24bit 向下递减的计数器,可以使用处理器时钟或外部参考时钟(通常是片上时钟源)。
SysTick 主要用于周期性的定期触发 OS 内核,如用于任务管理和上下文切换,处理器也可以在不同时间片内处理不同任务。处理器设计还需要确保运行在非特权等级的应用任务无法禁止该定时器。之所以在处理器内增加一个定时器,是为了提高软件的可移植性,便于使用 SysTick 的操作系统在不同具有 MCU 中应用。
2. 功能介绍(工作模式)#
SysTick 定时器简单框图:

SysTick 内部包含一个 24 位向下计数器,它会根据处理器时钟或一个参考时钟信号来减小计数。
在设置控制和状态寄存器的第 0 位使能该计数器后,当前值寄存器在每个处理器时钟周期或参考时钟的上升沿都会减小。若计数减至 0,它会从重加载寄存器中加载数值并继续运行。
SysTick 校准值寄存器为软件提供了校准信息。由于 CMSIS-Core 提供了一个名为 SystemCoreCIock 的软件变量,因此就未使用 SysTick 校准值寄存器。系统初始化函数 Systemlnit() 函数设置了该变量,而且每次系统时钟配置改变时都要对其进行更新。这种软件手段比利用 SysTick 校准值寄存器的硬件方式更灵活。
3. 寄存器介绍#
SysTick 定时器只有 4 个寄存器(还有一个没用,结构十分简单),都位于系统控制空间(SCS)中,具体地址见下表:
地址 | CMSIS-Core 符号 | 寄存器 |
---|---|---|
0xE000E010 | SysTick->CTRL | SysTick 控制和状态寄存器 |
0xE000E014 | SysTick->LOAD | SysTick 重装载值寄存器 |
0xE000E018 | SysTick->VAL | SysTick 当前值寄存器 |
0xE000E01C | SysTick->CALIB | SysTick 校准值寄存器 |
- SYSTICK 控制和状态寄存器(0xE000E010)
位 | 名称 | 类型 | 复位值 | 描述 |
---|---|---|---|---|
16 | COUNTFLAG | RO | 0 | 当 SYSTICK 定时器计数到 0 时,该位变为 1,读取寄存器或清除计数器当前值时会被清零 |
2 | CLKSOURCE | R/W | 0 | 0 = 外部参考时钟(STCLK) 1 = 使用内核时钟 |
1 | TICKINT | R/W | 0 | 1 = SYSTICK 定时器计数减至 0 时产生异常 0 = 不产生异常(NVIC)(异常使能) |
0 | ENABLE | R/W | 0 | SYSTICK 定时器使能 |

- SYSTICK 重装载值寄存器(0xE000E014)
位 | 名称 | 类型 | 复位值 | 描述 |
---|---|---|---|---|
23:0 | RELOAD | R/W | 未定义 | 定时器计数位 0 时的重装载值 |

- SYSTICK 当前值寄存器(0xE000E018)
位 | 名称 | 类型 | 复位值 | 描述 |
---|---|---|---|---|
23:0 | CURRENT | R/Wc | 0 | 读出值为 SYSTICK 定时器的当前数值。写入任何值都会清除寄存器,SYSTICK 控制和状态寄存器中的 COUNTFLAG 也会清零 |

- SYSTICK 校准值寄存器(0xE000E01C)
位 | 名称 | 类型 | 复位值 | 描述 |
---|---|---|---|---|
31 | NOREF | R | - | 1 = 没有外部参考时钟(STCLK 不可用) 0 = 有外部参考时钟可供使用 |
30 | SKEW | R | - | 1 = 校准值并非精确的 10ms 0 = 校准值准确 |
23:0 | TENMS | R/W | 0 | 10 毫秒校准值。芯片设计者应通过 Cortex-M3 的输入信号提供该数值 ,若读出为 0,则表示校准值不可用 |

4. 使用方式#
- 使用函数
若只想产生周期性的 SysTick 中断,最简单的方法就是使用 CMSIS-Core 函数 SysTick_ Config
:
uint32_t SysTick_Config(uint32_t ticks);
该函数将 SysTick 中断间隔设置为 ticks,使能计数器使用处理器时钟,然后设置 SysTick 异常为最低优先级。
若要在 30MHz 的时钟频率下产生 1kHz 的 SysTick 异常,则可以使用:
SysTick_Config(SystemCoreClock / 1000);
变量 SystemCoreClock 应该存放正 确的时钟频率数值,也就是 30 X 106 另外,亦可使用:
SysTick_Config(30000); //30MHz/1000 = 30000
异常处理函数 SysTick_Handler(void)
的触发频率就变成了 1kHz。
若 SysTick_Config
函数的输入参数不满足 24 位重加载数值寄存器(大于 0xFFFFFF),SysTick_Config
函数返回 1,否则会返回 0。
- 直接操作寄存器(使用参考时钟或者不想使能 SysTick 中断)
步骤:
- 将 0 写入 SysTick->CTRL 禁止 SysTick 定时器。这个操作是可选的。若重用了其他代码,则由于 SysTick 之前可能已经使能过了,因此本操作是推荐使用的。
- 将新的重加载值写入 SysTick->LOAD,重加载值应该为周期数减 1。
- 将任何数值写人 SysTick 当前值寄存器 SysTick->VAL,该寄存器会被清零。(正确的,经过测试)
- 写入 SysTick 控制和状态寄存器 SysTick->CTRL 启动 SysTick 定时器。
由于 SysTick 定时器向下计数到 0,因此,若要设置 SysTick 周期为 1000,则应该将重加载值(SysTick->LOAD)设置为 999。
若要在轮询模式中使用 SysTick 定时器,则可以利用 SysTick 控制和状态寄存器(SysTick->CTRL)中的计数标志来确定定时器何时变为 0。
SysTick->CTRL = 0; //禁止 SysTick
SysTick->LOAD = OxFF; //计数范围 255~0 (256个周期)
SysTick->VAL = 0; //清除当前值和计数标志
SysTick->CTRL = 5; //使能 SysTick 定时器并使用处理器时钟
while((SysTick->CTRL & 0x00010000) == 0); //等待计数标志置位
SysTick->CTRL = 0; //禁止 SysTick
若要将 SysTick 中断用作在一定时间后触发的单发操作(异常处理实现),则可以将重加载值减小 12 个周期,以补偿中断等待时间。例如,要使 SysTick 定时器在 300 个时钟周期后执行:
volatile int SysTickFired; //全局软件标志,表示 SysTickAlarm 已执行
...
SysTick->CTRL = 0; //禁止 SysTick
SysTick->LOAD = (300- 12); //设置重加载值,由于异常等待减去 12
SysTick->VAL = 0; //将当前值清为 0
SysTickFired = 0; //将软件标志设为 0
SysTick->CTRL = 0x7; //使能 SysTick, 使能 SysTick 异常且使用处理器时钟
while(SysTickFired == 0); //等待 SysTick 处理将软件标志置位
在单发 SysTick 处理中,需要禁止 SysTick,以防 SysTick 异常再次产生。若由于所需的处理任务花费的时间太长而导致挂起状态再次置位,则可能还需要清除 SysTick 的挂起状态:
void SysTick_Handler(void) //SYSTlCK 异常处理
{
SysTick-> CTRL = 0x0; //禁止 SysTick
..., //执行所需任务
SCB->ICSR |= 1<<25; //清除 SYSTICK 挂起位,防止再次挂起
SysTickFired++; //更新软件标志,主程序据此可以知道 SysTick 定时任务已执行
return;
}
若同时产生了另一个异常,则 SysTick 异常可能会延迟。
SysTick 定时器可用于时间测量。例如,可以用下面的代码测量一个短函数的持续时间:
unsigned int start_timez, stop_time, cycle_count;
SysTick->CTRL = 0; //禁止 SysTick
SysTick->LOAD = OxFFFFFFFF; //将重加载值设置为最大
SysTick->VAL = 0; //将当前值清为 0
SysTick->CTRL = 0x5; //使能 SysTick, 使用处理器时钟
while(SysTick->VAL != 0); //等待 SysTick 重加载
start_time = SysTick->VAL; //获取开始时间
function(); //执行要测量的函数
stop_time = SysTick->VAL; //获取停止时间
cycle_count = start_time — stop_time;
由于 SysTick 定时器向下计数,start_ime 的数值比 stop_time 要大。可能还需要在时间测量的结尾检查一下 count_flago 若 count_flag 置位时测试的时间大于 0xFFFFFF,还得使能 SysTick 异常且在 SysTick 处理中计算 SysTick 计数器溢出的次数。时钟周期的总数还要考虑 SysTick 异常。
5. 其他信息#
- SysTick 定时器中的寄存器只能在特权状态下访问。
- 参考时钟在一些微控制器设计中可能会不存在。
- 若应用中存在嵌入式 OS,SysTick 定时器会被 OS 使用,因此就不能再被应用任务使用了。
- 当处理器在调试期间暂停时,SysTick 定时器会停止计数。
- 根据微控制器的实际设计,SysTick 定时器可能会在某些休眠模式中停止计数。
二、RTC——实时时钟#
1. 信息介绍#
RTC(real time clock)实时时钟,主要包含日历、闹钟和自动唤醒这三部分的功能,其中的日历功能使用的最多。
只要电源电压保持在工作范围内,RTC 就不会停止,无论设备状态如何(运行模式、低功耗模式或复位不足)。
RTC 主要功能:
-
具有秒、秒、分钟、小时(12 或 24 格式)、周、日、月、年的日历,采用 BCD(二进制编码的十进制)格式。
-
两个具有中断功能的可编程闹钟。
-
自动唤醒单元,可周期性地生成标志以触发自动唤醒中断。
-
用于事件保存的时间戳功能(1 个事件)
RTC 时钟源可以是:
- 外部低速晶振(LSE)
- 外部高速晶振(HSE)
- 内部低速晶振(LSI)
其中使用最多的是LSE,LSE由一个外部的32.768KHZ(6PF负载)的晶振提供,精度高,稳定, RTC首选。
LSI 是芯片内部的30KHZ晶体,精度较低,会有温漂,一般不建议使用。
HSE_RTC由HSE分频得到,最高是4M,使用的也较少。
stm32L431RCT6 的 RTC 引脚:
-
RTC_REFIN:参考时钟输入
-
RTC_OUT:RTC 时钟输出
RTC_OUT1 和 RTC_OUT2 可以选择以下两种输出之一:
- CALIB:512 Hz 或 1 Hz 时钟输出(LSE 频率为 32.768 kHz 时)。通过设置 RTC_CR 寄存器中的 COE 位来启用此输出。
- TAMPALRM:此输出是 TAMP 和 ALARM 输出的逻辑或(OR)。
-
RTC_TS:RTC 时间戳输入
-
RTC_TAMP1:TAMPER1 事件检测
-
RTC_TAMP2:TAMPER2 事件检测
2. 寄存器详解#
0. 寄存器地址#

1. RTC 时间寄存器(RTC_TR)#
RTC_TR 是日历时间影子寄存器。这个寄存器只能在初始化模式下写入。该寄存器受写保护。

-
地址偏移量:0x00
-
备份域复位值:0x0000 0000
-
系统复位:
- 当 BYPSHAD = 0 时,复位值为 0x0000 0000
- 当 BYPSHAD = 1 时,不受影响
-
位 31:23 保留,必须保持复位值。
-
位 22 PM:AM/PM 记号
- 0:AM 或 24 小时制
- 1:PM
-
位 21:20 HT[1:0]:小时的十位,以 BCD 格式表示
-
位 19:16 HU[3:0]:小时的个位,以 BCD 格式表示
-
位 15 保留,必须保持复位值。
-
位 14:12 MNT[2:0]:分钟的十位,以 BCD 格式表示
-
位 11:8 MNU[3:0]:分钟的个位,以 BCD 格式表示
-
位 7 保留,必须保持复位值。
-
位 6:4 ST[2:0]:秒的十位,以 BCD 格式表示
-
位 3:0 SU[3:0]:秒的个位,以 BCD 格式表示
2. RTC 日期寄存器(RTC_DR)#
RTC_DR 是日历日期影子寄存器。这个寄存器只能在初始化模式下写入。该寄存器受写保护。

- 地址偏移量:0x04
- 备份域复位值:0x0000 2101
- 系统复位:
- 当 BYPSHAD = 0 时,复位值为 0x0000 2101
- 当 BYPSHAD = 1 时,不受影响。
- 位 31:24 保留,必须保持复位值。
- 位 23:20 YT[3:0]:年份的十位,以 BCD 格式表示
- 位 19:16 YU[3:0]:年份的个位,以 BCD 格式表示
- 位 15:13 WDU[2:0]:星期几的单位
- 000:禁止
- 001:星期一
- ...
- 111:星期天
- 位 12 MT:月份的十位,以 BCD 格式表示
- 位 11:8 MU[3:0]:月份的个位,以 BCD 格式表示
- 位 7:6 保留,必须保持复位值。
- 位 5:4 DT[1:0]:日期的十位,以 BCD 格式表示
- 位 3:0 DU[3:0]:日期的个位,以 BCD 格式表示
注意:日历在达到最大值时会冻结,并且不能滚动翻转。
3. RTC 亚秒寄存器(RTC_SSR)#

-
地址偏移量:0x08
-
备份域复位值:0x0000 0000
-
系统复位:
- 当 BYPSHAD = 0 时,复位值为 0x0000 0000
- 当 BYPSHAD = 1 时,不受影响
-
位 31:16 保留,必须保持复位值。
-
位 15:0 SS[15:0]:亚秒值
SS[15:0] 是同步预分频计数器中的值。秒的分数由以下公式给出:
秒的分数 = (PREDIV_S - SS) / (PREDIV_S + 1)
注意:只有在移位操作之后,SS 才能大于 PREDIV_S。在这种情况下,正确的时间/日期比 RTC_TR/RTC_DR 所指示的少一秒。
4. RTC 初始化控制和状态寄存器(RTC_ICSR)#
该寄存器受写保护。

- 地址偏移量:0x0C
- 备份域复位值:0x0000 0007
- 系统复位:除了INIT、INITF和RSF位被清零外,不受影响
- 位 31:17 保留,必须保持复位值。
- 位 16 RECALPF:重新校准待处理标志
- 当软件写入 RTC_CALR 寄存器时,RECALPF 状态标志会自动置为1,表示 RTC_CALR 寄存器被阻塞。
- 当新的校准设置生效时,该位恢复为 0。
- 位 15:8 保留,必须保持复位值。
- 位 7 INIT:初始化模式
- 0:自由运行模式
- 1:初始化模式,用于编程时间和日期寄存器(RTC_TR 和 RTC_DR),以及预分频器寄存器(RTC_PRER)。当 INIT 被复位时,计数器停止并从新值开始计数。
- 位 6 INITF:初始化标志
- 当该位被置为1时,RTC 处于初始化状态,可以更新时间、日期和预分频器寄存器。
- 0:不允许更新日历寄存器
- 1:允许更新日历寄存器
- 位 5 RSF:寄存器同步标志
- 每次日历寄存器被复制到影子寄存器(RTC_SSRx、RTC_TRx 和 RTC_DRx)时,硬件会设置该位。该位在初始化模式下,在移位操作挂起(SHPF=1)时,或在旁路影子寄存器模式(BYPSHAD=1)时由硬件清除。软件也可以清除此位。
- 0:日历影子寄存器尚未同步
- 1:日历影子寄存器已同步
- 位 4 INITS:初始化状态标志
- 当日历年份字段不为 0(备份域复位状态)时,该位由硬件设置。
- 0:日历尚未初始化
- 1:日历已初始化
- 位 3 SHPF:移位操作挂起
- 当通过写入 RTC_SHIFTR 寄存器启动移位操作时,该标志由硬件设置。当相应的移位操作执行完毕时,由硬件清除。写入 SHPF 位无效。
- 0:无移位操作挂起
- 1:有移位操作挂起
- 位 2 WUTWF:唤醒定时器写入标志
- 当 WUTE 位在 RTC_CR 中被置为0后,硬件设置该位,此时可以更改 WUT 值。在初始化模式下,该位被硬件清除。
- 0:不允许更新唤醒定时器配置,初始化模式除外
- 1:允许更新唤醒定时器配置
- 位 1:0 保留,必须保持复位值。
5. RTC 预分频器寄存器(RTC_PRER)#
这个寄存器只能在初始化模式下写入。初始化必须通过两个单独的写入操作来完成。该寄存器受写保护。

-
地址偏移量:0x10
-
备份域复位值:0x007F 00FF
-
系统复位:不受影响
-
位 31:23 保留,必须保持复位值。
-
位 22:16 PREDIV_A[6:0]:异步预分频因子
- 这是异步分频因子:ck_apre 频率 = RTCCLK 频率 / (PREDIV_A + 1)
-
位 15 保留,必须保持复位值。
-
位 14:0 PREDIV_S[14:0]:同步预分频因子
- 这是同步分频因子:ck_spre 频率 = ck_apre 频率 / (PREDIV_S + 1)
6. RTC 唤醒定时器寄存器(RTC_WUTR)#
这个寄存器只能在 RTC_ICSR 中的 WUTWF 设置为 1 时写入。

-
地址偏移量:0x14
-
备份域复位值:0x0000 FFFF
-
系统复位:不受影响
-
位 31:16 WUTOCLR[15:0]:唤醒自动重载输出清除值
- 当 WUTOCLR[15:0] 不等于 0x0000 时,当自动重载倒计数器达到 0 时,WUTF 由硬件设置;当自动重载倒计数器达到WUTOCLR[15:0] 时,WUTF 由硬件清除。
- 当 WUTOCLR[15:0] = 0x0000 时,当 WUT 倒计时器达到 0 时,WUTF 由硬件设置,并由软件清除。
-
位 15:0 WUT[15:0]:唤醒自动重载值位
- 当唤醒定时器启用(WUTE 置为 1)时,每 (WUT[15:0] + 1) 个 ck_wut 周期设置一次 WUTF 标志。ck_wut 周期通过 RTC_CR 寄存器的 WUCKSEL[2:0] 位选择。
- 当 WUCKSEL[2] = 1 时,唤醒定时器变为 17 位,WUCKSEL[1] 实际上变为 WUT[16],即定时器要重新加载的最高有效位。
- 在设置 WUTE 后,WUTF 的第一次断言发生在 WUT 和 (WUT + 2) 个 ck_wut 周期之间。将 WUT[15:0] 设置为 0x0000 并且 WUCKSEL[2:0] = 011 (RTCCLK/2) 是禁止的。
7. RTC 控制寄存器(RTC_CR)#
该寄存器受写保护。

-
地址偏移量:0x18
-
备份域复位值:0x0000 0000
-
系统复位:不受影响
-
位 31 OUT2EN:RTC_OUT2 输出使能
- 设置此位可以将 RTC 输出重新映射到 RTC_OUT2,如下所示:
- OUT2EN = 0:禁用 RTC 输出 2
- 如果 OSEL ≠ 00 或 TAMPOE = 1:TAMPALRM 输出到 RTC_OUT1
- 如果 OSEL = 00 且 TAMPOE = 0 且 COE = 1:CALIB 输出到 RTC_OUT1
- OUT2EN = 1:启用 RTC 输出 2
- 如果 (OSEL ≠ 00 或 TAMPOE = 1) 且 COE = 0:TAMPALRM 输出到 RTC_OUT2
- 如果 OSEL = 00 且 TAMPOE = 0 且 COE = 1:CALIB 输出到 RTC_OUT2
- 如果 (OSEL ≠ 00 或 TAMPOE = 1) 且 COE = 1:CALIB 输出到 RTC_OUT2,TAMPALRM 输出到 RTC_OUT1
- OUT2EN = 0:禁用 RTC 输出 2
- 设置此位可以将 RTC 输出重新映射到 RTC_OUT2,如下所示:
-
位 30 TAMPALRM_TYPE:TAMPALRM 输出类型
- 0:TAMPALRM 为推挽输出
- 1:TAMPALRM 为开漏输出
-
位 29 TAMPALRM_PU:TAMPALRM 上拉使能
- 0:TAMPALRM 输出无上拉
- 1:TAMPALRM 输出有上拉
-
位 28:27 保留,必须保持复位值。
-
位 26 TAMPOE:篡改检测输出使能到 TAMPALRM
- 0:篡改标志不通过 TAMPALRM 输出
- 1:篡改标志通过 TAMPALRM 输出,并与 OSEL 提供的信号和 POL 提供的极性结合
-
位 25 TAMPTS:篡改检测事件时启用时间戳
- 0:篡改检测事件不会保存 RTC 时间戳
- 1:篡改检测事件时保存 RTC 时间戳
- 即使 RTC_CR 寄存器中的 TSE = 0,TAMPTS 也有效。在篡改标志之后设置时间戳标志,因此如果设置了 TAMPTS 和 TSIE,建议禁用篡改中断以避免处理两个中断。
-
位 24 ITSE:内部事件时间戳使能
- 0:内部事件时间戳禁用
- 1:内部事件时间戳启用
-
位 23 COE:校准输出使能
- 此位启用 CALIB 输出
- 0:校准输出禁用
- 1:校准输出启用
-
位 22:21 OSEL[1:0]:输出选择
- 这些位用于选择路由到 TAMPALRM 输出的标志。
- 00:输出禁用
- 01:启用报警 A 输出
- 10:启用报警 B 输出
- 11:启用唤醒输出
-
位 20 POL:输出极性
- 此位用于配置 TAMPALRM 输出的极性。
- 0:当 ALRAF/ALRBF/WUTF 断言时(取决于 OSEL[1:0]),或当 TAMPxF/ITAMPxF 断言时(如果 TAMPOE = 1),引脚为高电平
- 1:当 ALRAF/ALRBF/WUTF 断言时(取决于 OSEL[1:0]),或当 TAMPxF/ITAMPxF 断言时(如果 TAMPOE = 1),引脚为低电平
-
位 19 COSEL:校准输出选择
- 当 COE = 1 时,此位选择在 CALIB 上输出的信号。
- 0:校准输出为 512 Hz
- 1:校准输出为 1 Hz
- 这些频率对 RTCCLK 为 32.768 kHz 且预分频器为默认值(PREDIV_A = 127 和 PREDIV_S = 255)时有效。参见第 34.3.16 节:校准时钟输出。
-
位 18 BKP:备份
- 用户可以写入此位以记录是否已进行夏令时更改。
-
位 17 SUB1H:减去 1 小时(冬令时更改)
- 当在初始化模式之外设置此位时,如果当前小时不为 0,则日历时间减去 1 小时。此位总是读作 0。
- 当前小时为 0 时,设置此位无效。
- 0:无效
- 1:当前时间减去 1 小时。可用于冬令时更改。
-
位 16 ADD1H:加 1 小时(夏令时更改)
- 当在初始化模式之外设置此位时,日历时间加 1 小时。此位总是读作 0。
- 0:无效
- 1:当前时间加 1 小时。可用于夏令时更改
-
位 15 TSIE:时间戳中断使能
- 0:时间戳中断禁用
- 1:时间戳中断使能
-
位 14 WUTIE:唤醒定时器中断使能
- 0:唤醒定时器中断禁用
- 1:唤醒定时器中断使能
-
位 13 ALRBIE:报警 B 中断使能
- 0:报警 B 中断禁用
- 1:报警 B 中断使能
-
位 12 ALRAIE:报警 A 中断使能
- 0:报警 A 中断禁用
- 1:报警 A 中断使能
-
位 11 TSE:时间戳使能
- 0:时间戳禁用
- 1:时间戳使能
-
位 10 WUTE:唤醒定时器使能
- 0:唤醒定时器禁用
- 1:唤醒定时器使能
-
位 9 ALRBE:报警 B 使能
- 0:报警 B 禁用
- 1:报警 B 使能
-
位 8 ALRAE:报警 A 使能
- 0:报警 A 禁用
- 1:报警 A 使能
-
位 7 保留,必须保持复位值。
-
位 6 FMT:小时格式
- 0:24 小时/天格式
- 1:AM/PM 小时格式
-
位 5 BYPSHAD:绕过影子寄存器
- 0:日历值(从 RTC_SSR、RTC_TR 和 RTC_DR 读取时)来自影子寄存器,这些寄存器每两个 RTCCLK 周期更新一次。
- 1:日历值(从 RTC_SSR、RTC_TR 和 RTC_DR 读取时)直接来自日历计数器。
- 注意:如果 APB1 时钟的频率小于 RTCCLK 频率的七倍,必须将 BYPSHAD 设置为 1。
-
位 4 REFCKON:RTC_REFIN 参考时钟检测使能(50 或 60 Hz)
- 0:RTC_REFIN 检测禁用
- 1:RTC_REFIN 检测使能
- 注意:PREDIV_S 必须为 0x00FF。
-
位 3 TSEDGE:时间戳事件有效边缘
- 0:RTC_TS 输入上升沿生成时间戳事件
- 1:RTC_TS 输入下降沿生成时间戳事件
- 在更改 TSEDGE 时必须重置 TSE 以避免不需要的 TSF 设置。
-
位 2:0 WUCKSEL[2:0]:ck_wut 唤醒时钟选择
- 000:选择 RTC/16 时钟
- 001:选择 RTC/8 时钟
- 010:选择 RTC/4 时钟
- 011:选择 RTC/2 时钟
- 10x:选择 ck_spre(通常为 1 Hz)时钟
- 11x:选择 ck_spre(通常为 1 Hz)时钟。此外,WUT 计数器值增加 216。
注意:此寄存器的位 6 和位 4 只能在初始化模式下写入(RTC_ICSR/INITF = 1)。
WUT = 唤醒单元计数值。WUT = (0x0000 到 0xFFFF),当 WUCKSEL[2:1] = 11 时加上 0x10000。
此寄存器的位 2 到位 0 只能在 RTC_CR 寄存器的 WUTE 位 = 0 且 RTC_ICSR 寄存器的 WUTWF 位 = 1 时写入。
建议不要在日历小时增量期间更改小时,因为这可能会掩盖日历小时的增量。
ADD1H 和 SUB1H 的更改在下一秒生效。
8. RTC 写保护寄存器(RTC_WPR)#

-
地址偏移量:0x24
-
复位值:0x0000 0000
-
位 31:8 保留,必须保持复位值。
-
位 7:0 KEY:写保护密钥
- 此字节由软件写入。
- 读取此字节总是返回 0x00。
- 有关如何解锁 RTC 寄存器写保护的说明,请参阅 RTC 寄存器写保护。
9. RTC 校准寄存器(RTC_CALR)#

该寄存器受写保护。
-
地址偏移量:0x28
-
备份域复位值:0x0000 0000
-
系统复位:不受影响
-
位 31:16 保留,必须保持复位值。
-
位 15 CALP:将 RTC 频率增加 488.5 ppm
- 0:不增加 RTCCLK 脉冲。
- 1:每 211 个脉冲有效插入一个 RTCCLK 脉冲(频率增加 488.5 ppm)。
- 注意:此功能旨在与 CALM 一起使用,以细分降低日历频率。如果输入频率为 32768 Hz,则在 32 秒窗口期间添加的 RTCCLK 脉冲数计算如下:(512 × CALP) - CALM。
-
位 14 CALW8:使用 8 秒校准周期
- 当 CALW8 设置为 1 时,选择 8 秒校准周期。
- 注意:当 CALW8 = 1 时,CALM[1:0] 固定为 00。
-
位 13 CALW16:使用 16 秒校准周期
- 当 CALW16 设置为 1 时,选择 16 秒校准周期。如果 CALW8 = 1,则此位不得设置为 1。
- 注意:当 CALW16 = 1 时,CALM[0] 固定为 0。
-
位 12 LPCAL:校准低功耗模式
- 0:校准窗口为 220 RTCCLK,这是高功耗模式。仅当需要小于 32 秒的校准窗口时才应设置此模式。
- 1:校准窗口为 220 ck_apre,这是超低功耗模式所需的配置。
-
位 11:9 保留,必须保持复位值。
-
位 8:0 CALM[8:0]:校准减
- 通过屏蔽 220 RTCCLK 脉冲中的 CALM 来降低日历的频率(如果输入频率为 32768 Hz,则为 32 秒)。这以 0.9537 ppm 的分辨率降低日历频率。
- 为了增加日历的频率,此功能应与 CALP 一起使用。
10. RTC 移位控制寄存器(RTC_SHIFTR)#
该寄存器受写保护。

-
地址偏移量:0x2C
-
备份域复位值:0x0000 0000
-
系统复位:不受影响
-
位 31 ADD1S:增加一秒
- 0:无效
- 1:在时钟/日历上增加一秒
- 此位为只写,总是读取为零。当移位操作正在进行时(当 RTC_ICSR 中的 SHPF = 1 时),写入此位无效。
此功能旨在与 SUBFS 一起使用,以便在原子操作中有效地为时钟增加一秒的分数。
-
位 30:15 保留,必须保持复位值。
-
位 14:0 SUBFS[14:0]:减去一秒的分数
- 这些位为只写,总是读取为零。当移位操作正在进行时(当 RTC_ICSR 中的 SHPF = 1 时),写入这些位无效。
- 写入 SUBFS 的值将被加到同步预分频器计数器中。由于该计数器向下计数,此操作实际上会从时钟中减去(延迟):延迟(秒)= SUBFS / (PREDIV_S + 1)
- 当 ADD1S 功能与 SUBFS 一起使用时,可以有效地在时钟上增加一秒的分数(提前时钟):提前(秒)= (1 - (SUBFS / (PREDIV_S + 1)))
注意:写入 SUBFS 会导致 RSF 被清除。然后,软件可以等待直到 RSF = 1,以确保影子寄存器已经用移位后的时间更新。
11. RTC 时间戳时间寄存器(RTC_TSTR)#
这个寄存器的内容仅在RTC_SR中的TSF设置为1时有效。当TSF位被重置时,它会清除。

-
地址偏移量:0x30
-
备份域复位值:0x0000 0000
-
系统复位:不受影响
-
位 31:23 保留,必须保持复位值。
-
位 22 PM:AM/PM 表示法
- 0:AM 或 24 小时格式
- 1:PM
-
位 21:20 HT[1:0]:小时十位,BCD 格式。
-
位 19:16 HU[3:0]:小时个位,BCD 格式。
-
位 15 保留,必须保持复位值。
-
位 14:12 MNT[2:0]:分钟十位,BCD 格式。
-
位 11:8 MNU[3:0]:分钟个位,BCD 格式。
-
位 7 保留,必须保持复位值。
-
位 6:4 ST[2:0]:秒钟十位,BCD 格式。
-
位 3:0 SU[3:0]:秒钟个位,BCD 格式。
12. RTC 时间戳日期寄存器(RTC_TSDR)#
这个寄存器的内容仅在RTC_SR中的TSF设置为1时有效。当TSF位被重置时,它会清除。

-
地址偏移量:0x34
-
备份域复位值:0x0000 0000
-
系统复位:不受影响
-
位 31:16 保留,必须保持复位值。
-
位 15:13 WDU[2:0]:星期几单位
-
位 12 MT:月份十位,BCD 格式
-
位 11:8 MU[3:0]:月份个位,BCD 格式
-
位 7:6 保留,必须保持复位值。
-
位 5:4 DT[1:0]:日期十位,BCD 格式
-
位 3:0 DU[3:0]:日期个位,BCD 格式
13. RTC时间戳亚秒寄存器(RTC_TSSSR)#
这个寄存器的内容仅在RTC_SR中的TSF设置为1时有效。当TSF位被重置时,它会清除。

-
地址偏移量:0x38
-
备份域复位值:0x0000 0000
-
系统复位:不受影响
-
位 31:16 保留,必须保持复位值。
-
位 15:0 SS[15:0]:毫秒值
- SS[15:0] 是时间戳事件发生时同步预分频器计数器的值。
14. RTC 闹钟 A 寄存器(RTC_ALRMAR)#

-
地址偏移量:0x40
-
备份域复位值:0x0000 0000
-
系统复位:不受影响
-
位 31 MSK4:闹钟A日期掩码
- 0:如果日期/天匹配,则设置闹钟A
- 1:在闹钟A比较中,日期/天不予考虑
-
位 30 WDSEL:星期天选择
- 0:DU[3:0]代表日期单位
- 1:DU[3:0]代表星期天。DT[1:0]不予考虑。
-
位 29:28 DT[1:0]:BCD格式中的日期十位
-
位 27:24 DU[3:0]:BCD格式中的日期单位或天
-
位 23 MSK3:闹钟A小时掩码
- 0:如果小时匹配,则设置闹钟A
- 1:在闹钟A比较中,小时不予考虑
-
位 22 PM:上午/下午标记
- 0:上午或24小时格式
- 1:下午
-
位 21:20 HT[1:0]:BCD格式中的小时十位
-
位 19:16 HU[3:0]:BCD格式中的小时单位
-
位 15 MSK2:闹钟A分钟掩码
- 0:如果分钟匹配,则设置闹钟A
- 1:在闹钟A比较中,分钟不予考虑
-
位 14:12 MNT[2:0]:BCD格式中的分钟十位
-
位 11:8 MNU[3:0]:BCD格式中的分钟单位
-
位 7 MSK1:闹钟A秒掩码
- 0:如果秒匹配,则设置闹钟A
- 1:在闹钟A比较中,秒不予考虑
-
位 6:4 ST[2:0]:BCD格式中的秒十位
-
位 3:0 SU[3:0]:BCD格式中的秒单位
15. RTC 闹钟 A 亚秒寄存器(RTC_ALRMASSR)#

-
地址偏移量:0x44
-
备份域复位值:0x0000 0000
-
系统复位:不受影响
-
位 31:28 保留,必须保持复位值。
-
位 27:24 MASKSS[3:0]:从该位开始屏蔽最高有效位
- 0:不对闹钟A的亚秒进行比较。当秒单位递增时设置闹钟(假设其他字段匹配)。
1:在闹钟A比较中,SS[14:1]不予考虑。仅比较SS[0]。
2:在闹钟A比较中,SS[14:2]不予考虑。仅比较SS[1:0]。
3:在闹钟A比较中,SS[14:3]不予考虑。仅比较SS[2:0]。
...
12:在闹钟A比较中,SS[14:12]不予考虑。比较SS[11:0]。
13:在闹钟A比较中,SS[14:13]不予考虑。比较SS[12:0]。
14:在闹钟A比较中,SS[14]不予考虑。比较SS[13:0]。
15:比较所有15个SS位,必须匹配才能激活闹钟。 - 同步计数器的溢出位(位15)永远不会进行比较。只有在移位操作后,这个位才能不同于0。
- 注意:同步计数器的溢出位(位15)永远不会进行比较。只有在移位操作后,这个位才能不同于0。
- 0:不对闹钟A的亚秒进行比较。当秒单位递增时设置闹钟(假设其他字段匹配)。
-
位 23:15 保留,必须保持复位值。
-
位 14:0 SS[14:0]:亚秒值
- 这个值与同步预分频器计数器的内容进行比较,以确定是否激活闹钟A。只有位0到MASKSS-1进行比较。
16. RTC 闹钟 B 寄存器(RTC_ALRMBR)#

-
地址偏移量:0x48
-
备份域复位值:0x0000 0000
-
系统复位:不受影响
-
位 31 MSK4:闹钟B日期掩码
- 0:如果日期和天匹配,则设置闹钟B
- 1:在闹钟B比较中,日期和天不予考虑
-
位 30 WDSEL:星期天选择
- 0:DU[3:0]代表日期单位
- 1:DU[3:0]代表星期天。DT[1:0]不予考虑。
-
位 29:28 DT[1:0]:BCD格式中的日期十位
-
位 27:24 DU[3:0]:BCD格式中的日期单位或天
-
位 23 MSK3:闹钟B小时掩码
- 0:如果小时匹配,则设置闹钟B
- 1:在闹钟B比较中,小时不予考虑
-
位 22 PM:上午/下午标记
-
0:上午或24小时格式
-
1:下午
-
位 21:20 HT[1:0]:BCD格式中的小时十位
-
位 19:16 HU[3:0]:BCD格式中的小时单位
-
位 15 MSK2:闹钟B分钟掩码
- 0:如果分钟匹配,则设置闹钟B
- 1:在闹钟B比较中,分钟不予考虑
-
位 14:12 MNT[2:0]:BCD格式中的分钟十位
-
位 11:8 MNU[3:0]:BCD格式中的分钟单位
-
位 7 MSK1:闹钟B秒掩码
- 0:如果秒匹配,则设置闹钟B
- 1:在闹钟B比较中,秒不予考虑
-
位 6:4 ST[2:0]:BCD格式中的秒十位
-
位 3:0 SU[3:0]:BCD格式中的秒单位
17. RTC 闹钟 B 亚秒寄存器(RTC_ALRMBSSR)#
这个寄存器只能在RTC_CR寄存器中的ALRBE被重置时,或者处于初始化模式下写入。

-
地址偏移量:0x4C
-
备份域复位值:0x0000 0000
-
系统复位:不受影响
-
位 31:28 保留,必须保持复位值。
-
位 27:24 MASKSS[3:0]:从该位开始屏蔽最高有效位
- 0x0:不对闹钟B的亚秒进行比较。当秒单位递增时设置闹钟(假设其他字段匹配)。
0x1:在闹钟B比较中,SS[14:1]不予考虑。仅比较SS[0]。
0x2:在闹钟B比较中,SS[14:2]不予考虑。仅比较SS[1:0]。
0x3:在闹钟B比较中,SS[14:3]不予考虑。仅比较SS[2:0]。
...
0xC:在闹钟B比较中,SS[14:12]不予考虑。比较SS[11:0]。
0xD:在闹钟B比较中,SS[14:13]不予考虑。比较SS[12:0]。
0xE:在闹钟B比较中,SS[14]不予考虑。比较SS[13:0]。
0xF:比较所有15个SS位,必须匹配才能激活闹钟。 - 同步计数器的溢出位(位15)永远不会进行比较。只有在移位操作后,这个位才能不同于0。
- 0x0:不对闹钟B的亚秒进行比较。当秒单位递增时设置闹钟(假设其他字段匹配)。
-
位 23:15 保留,必须保持复位值。
-
位 14:0 SS[14:0]:亚秒值
- 这个值与同步预分频器计数器的内容进行比较,以确定是否激活闹钟B。只有位0到MASKSS-1进行比较。
18. RTC 状态寄存器(RTC_SR)#

-
地址偏移量:0x50
-
备份域复位值:0x0000 0000
-
系统复位:不受影响
-
位 31:6 保留,必须保持复位值。
-
位 5 ITSF:内部时间戳标志
- 当发生内部事件的时间戳时,硬件会设置这个标志。
-
位 4 TSOVF:时间戳溢出标志
- 当 TSF 已经设置且发生时间戳事件时,硬件会设置这个标志。
- 建议在清除 TSF 位之后检查并清除 TSOVF。否则,如果在 TSF 位被清除之前立即发生时间戳事件,可能会忽略溢出。
-
位 3 TSF:时间戳标志
- 当发生时间戳事件时,硬件会设置这个标志。
- 如果 ITSF 标志被设置,TSF 必须与 ITSF 一起清除。
-
位 2 WUTF:唤醒定时器标志
- 当唤醒自动重载计数器达到0时,硬件会设置这个标志。
- 如果 WUTOCLR[15:0] 与 0x0000 不同,当唤醒自动重载计数器达到 WUTOCLR 值时,硬件会清除 WUTF。
- 如果 WUTOCLR[15:0] 为 0x0000,WUTF 必须由软件清除。
- 这个标志必须在 WUTF 再次被设置为 1 之前至少 1.5 个 RTCCLK 周期内由软件清除。
-
位 1 ALRBF:闹钟B标志
- 当时间/日期寄存器(RTC_TR和RTC_DR)与闹钟 B 寄存器(RTC_ALRMBR)匹配时,硬件会设置这个标志。
-
位 0 ALRAF:闹钟A标志
- 当时间/日期寄存器(RTC_TR和RTC_DR)与闹钟 A 寄存器(RTC_ALRMAR)匹配时,硬件会设置这个标志。
注意:在 RTC_SCR 寄存器中设置相应的清除位后,这个寄存器的位将在 2 个 APB 时钟周期后被清除。
19. RTC 屏蔽中断状态寄存器(RTC_MISR)#

-
地址偏移量:0x54
-
备份域复位值:0x0000 0000
-
系统复位:不受影响
-
位 31:6 保留,必须保持复位值。
-
位 5 ITSMF:内部时间戳屏蔽标志
- 当发生内部事件的时间戳且时间戳中断被触发时,硬件会设置这个标志。
-
位 4 TSOVMF:时间戳溢出屏蔽标志
- 当时间戳中断发生且TSMF已经设置时,硬件会设置这个标志。
- 建议在清除TSF位之后检查并清除TSOVF。否则,如果在TSF位被清除之前立即发生时间戳事件,可能会忽略溢出。
-
位 3 TSMF:时间戳屏蔽标志
- 当时间戳中断发生时,硬件会设置这个标志。
- 如果ITSF标志被设置,TSF必须与ITSF一起清除。
-
位 2 WUTMF:唤醒定时器屏蔽标志
- 当唤醒定时器中断发生时,硬件会设置这个标志。
- 这个标志必须在WUTF再次被设置为1之前至少1.5个RTCCLK周期内由软件清除。
-
位 1 ALRBMF:闹钟B屏蔽标志
- 当闹钟B中断发生时,硬件会设置这个标志。
-
位 0 ALRAMF:闹钟A屏蔽标志
- 当闹钟A中断发生时,硬件会设置这个标志。
20. RTC 状态清除寄存器(RTC_SCR)#

-
地址偏移量:0x5C
-
备份域复位值:0x0000 0000
-
系统复位:不受影响
-
位 31:6 保留,必须保持复位值。
-
位 5 CITSF:清除内部时间戳标志
- 向这个位写入1可以清除RTC_SR寄存器中的ITSF位。
-
位 4 CTSOVF:清除时间戳溢出标志
- 向这个位写入1可以清除RTC_SR寄存器中的TSOVF位。
- 建议在清除TSF位之后检查并清除TSOVF。否则,如果在TSF位被清除之前立即发生时间戳事件,可能会忽略溢出。
-
位 3 CTSF:清除时间戳标志
- 向这个位写入1可以清除RTC_SR寄存器中的TSF位。
- 如果ITSF标志被设置,TSF必须与ITSF一起清除,通过设置CRSF和CITSF。
-
位 2 CWUTF:清除唤醒定时器标志
- 向这个位写入1可以清除RTC_SR寄存器中的WUTF位。
-
位 1 CALRBF:清除闹钟B标志
- 向这个位写入1可以清除RTC_SR寄存器中的ALRBF位。
-
位 0 CALRAF:清除闹钟A标志
- 向这个位写入1可以清除RTC_SR寄存器中的ALRBF位。
3. RTC 中断#
在 stm32L4 中 RTC 共有两个中断:
RTC_WKUP_IRQHandler - 实时时钟 (RTC) 唤醒中断#
触发条件:
- RTC 唤醒定时器 (Wakeup Timer) 溢出时触发。
详细介绍:
- RTC 唤醒定时器可以配置为一个周期性的定时器,产生定时中断,用于低功耗模式下唤醒 MCU。
- 唤醒定时器可以在各种低功耗模式下运行,比如待机模式 (Standby Mode) 和停止模式 (Stop Mode),以确保 MCU 能够定时唤醒进行任务。
- 配置时需要设置 RTC 寄存器,包括唤醒定时器的预分频器和自动重装值,以确定唤醒周期。
- 典型应用包括定时任务调度、低功耗数据采集等。
配置步骤:
- 使能 RTC 外设:通常在电源控制寄存器中使能 RTC 时钟。
- 配置 RTC 唤醒定时器:
- 设置唤醒定时器的预分频器和计数值。
- 使能唤醒定时器。
- 使能唤醒中断:
- 在 NVIC 中使能 RTC 唤醒中断。
- 在 RTC 控制寄存器中使能唤醒中断。
- 编写中断处理程序:
- 在
RTC_WKUP_IRQHandler
中实现唤醒后需要执行的任务。 - 清除中断标志,以防止重复中断。
- 在
RTC_Alarm_IRQHandler - RTC 闹钟事件中断#
触发条件:
- RTC 闹钟达到设定时间时触发。
详细介绍:
- RTC 闹钟用于在指定的日期和时间触发中断,可以用于计时和事件提醒。
- STM32 的 RTC 通常有两个闹钟:Alarm A 和 Alarm B,可以分别设置不同的时间和日期。
- 闹钟可以配置为一次性触发或者周期性触发,例如每天固定时间触发。
- 典型应用包括定时事件提醒、时间戳记录等。
配置步骤:
- 使能 RTC 外设:同样需要在电源控制寄存器中使能 RTC 时钟。
- 配置 RTC 闹钟:
- 设置闹钟的时间和日期,包括小时、分钟、秒,以及可选的日期和星期几。
- 设置闹钟的掩码寄存器以确定哪部分时间生效(如仅小时和分钟)。
- 使能闹钟。
- 使能闹钟中断:
- 在 NVIC 中使能 RTC 闹钟中断。
- 在 RTC 控制寄存器中使能闹钟中断。
- 编写中断处理程序:
- 在
RTC_Alarm_IRQHandler
中实现闹钟时间到达后需要执行的任务。 - 清除中断标志,以防止重复中断。
- 在
配置示例#
以下是配置 RTC 唤醒中断和闹钟中断的示例代码(基于 HAL 库):
// 配置 RTC 唤醒中断
void RTC_Wakeup_Init(void) {
// 使能 RTC 时钟
__HAL_RCC_RTC_ENABLE();
// 设置 RTC 唤醒定时器(例如每秒唤醒一次)
HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 0x7FFF, RTC_WAKEUPCLOCK_RTCCLK_DIV16);
// 配置 NVIC
HAL_NVIC_SetPriority(RTC_WKUP_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(RTC_WKUP_IRQn);
}
// RTC 唤醒中断处理程序
void RTC_WKUP_IRQHandler(void) {
// 检查并清除中断标志
HAL_RTCEx_WakeUpTimerIRQHandler(&hrtc);
// 用户代码
}
// 配置 RTC 闹钟中断
void RTC_AlarmA_Init(void) {
// 使能 RTC 时钟
__HAL_RCC_RTC_ENABLE();
// 设置闹钟时间(例如每天上午8:00)
RTC_AlarmTypeDef sAlarm = {0};
sAlarm.AlarmTime.Hours = 8;
sAlarm.AlarmTime.Minutes = 0;
sAlarm.AlarmTime.Seconds = 0;
sAlarm.Alarm = RTC_ALARM_A;
HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN);
// 配置 NVIC
HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);
}
// RTC 闹钟中断处理程序
void RTC_Alarm_IRQHandler(void) {
// 检查并清除中断标志
HAL_RTC_AlarmIRQHandler(&hrtc);
// 用户代码
}
这个配置示例展示了如何初始化 RTC 唤醒定时器和闹钟,并编写相应的中断处理程序。根据具体应用需求,可以在中断处理程序中添加需要执行的任务。
三、TIM——定时器#
定时器的大部分信息都可在参考手册中有。
TIM 地址#



基本定时器信息(TIM6/TIM7)#
功能框图#

功能特性#
基本特性
- 16位自动重载向上计数器:用于实现基本的计数和周期性事件。(只能向上计数)
- 16位可编程预分频器:用于将计数器时钟频率按任意因子分频,范围在1到65535之间,并支持“动态”更改分频比。
同步电路
- 同步电路 (Synchronization Circuit):用于触发数模转换器 (DAC)。
中断/DMA生成
- 中断/DMA生成 (Interrupt/DMA Generation):在更新事件(如计数器溢出)时产生中断或DMA请求。
通用定时器信息(TIM2/TIM3/TIM15/TIM16)#
TIM2/TIM3#
功能框图

功能特性
基本特性
- 计数器类型:
- TIM2:32位向上、向下、向上/向下自动重载计数器
- TIM3:16位向上、向下、向上/向下自动重载计数器
- 16位可编程预分频器:可以将计数器时钟频率按任意因子分频,范围在1到65535之间,并支持“动态”更改分频比。
独立通道功能
- 最多支持4个独立通道:
- 输入捕获 (Input Capture)
- 输出比较 (Output Compare)
- PWM 生成(边沿和中心对齐模式)(PWM Generation, Edge- and Center-Aligned Modes)
- 单脉冲模式输出 (One-Pulse Mode Output)
同步电路
- 同步电路:用于通过外部信号控制定时器,并将多个定时器互连。
中断/DMA生成
- 中断/DMA生成:在以下事件发生时产生中断或DMA请求:
- 更新事件:计数器溢出/下溢、计数器初始化(通过软件或内部/外部触发器)
- 触发事件:计数器启动、停止、初始化或通过内部/外部触发器计数
- 输入捕获事件
- 输出比较事件
增量编码器和霍尔传感器支持
- 支持增量(正交)编码器和霍尔传感器电路:用于定位目的。
触发输入
- 触发输入:用于外部时钟或周期性电流管理。
TIM15#
功能框图

功能特性
基本特性
- 16位自动重载向上计数器:实现计数和周期性事件的基础。(只能向上计数)
- 16位可编程预分频器:用于将计数器时钟频率按任意因子分频,范围在1到65535之间,并且支持“动态”更改分频比。
独立通道
TIM15拥有最多2个独立通道,可以配置为以下模式:
- 输入捕获 (Input Capture):用于捕获外部事件的时间戳。
- 输出比较 (Output Compare):用于产生精确定时的输出事件。
- PWM生成 (PWM Generation):边沿模式下产生脉宽调制信号。
- 单脉冲模式输出 (One-Pulse Mode Output):在触发事件后产生单个脉冲。
补充功能
- 补充输出及可编程死区时间 (Complementary Outputs with Programmable Dead-Time):仅适用于通道1,用于控制驱动器的死区时间以避免短路。
同步电路
- 同步电路 (Synchronization Circuit):用于通过外部信号控制定时器,并将多个定时器互连。
重复计数器
- 重复计数器 (Repetition Counter):在计数器经过指定周期数后才更新定时器寄存器,提高操作效率。
断点输入
- 断点输入 (Break Input):在特定条件下将定时器的输出信号置于复位状态或已知状态,提供安全保护机制。
中断/DMA生成
TIM15支持在以下事件中产生中断或DMA请求:
- 更新事件 (Update Event):包括计数器溢出和计数器初始化(通过软件或内部/外部触发)。
- 触发事件 (Trigger Event):计数器启动、停止、初始化或通过内部/外部触发进行计数。
- 输入捕获事件 (Input Capture Event)。
- 输出比较事件 (Output Compare Event)。
- 断点输入事件 (Break Input Event):产生中断请求。
TIM16#
功能框图

功能特性
基本特性
- 16位自动重载向上计数器:用于基本的计数和周期性事件。
- 16位可编程预分频器:可以将计数器时钟频率按任意因子分频,范围在1到65535之间,并支持“动态”更改分频比。
单通道功能
- 单通道支持:
- 输入捕获 (Input Capture)
- 输出比较 (Output Compare)
- PWM 生成(边沿对齐模式)(PWM Generation, Edge-Aligned Mode)
- 单脉冲模式输出 (One-Pulse Mode Output)
其他特性
- 互补输出及可编程死区时间:支持互补输出,并可以编程设置死区时间。
- 重复计数器:仅在计数器经过一定周期后更新定时器寄存器。
- 断点输入:将定时器输出信号置于复位状态或已知状态。
中断/DMA生成
- 中断/DMA生成:在以下事件发生时产生中断或DMA请求:
- 更新事件(计数器溢出)
- 输入捕获事件
- 输出比较事件
- 断点输入事件
高级定时器信息(TIM1)#
stm32L4只有一个高级定时器——TIM1。
功能框图#

功能:#
基本特性
- 计数器类型:16位向上、向下、向上/向下自动重载计数器。
- 16位可编程预分频器:支持将计数器时钟频率按任意因子分频,范围在1到65536之间,并支持“动态”更改分频比。
独立通道功能
- 最多支持 6 个独立通道:
- 输入捕获(不包括通道5和6)
- 输出比较
- PWM生成(边沿和中心对齐模式)
- 单脉冲模式输出
其他特性
- 互补输出:带可编程死区时间。
- 同步电路:用于通过外部信号控制定时器,并将多个定时器互连。
- 重复计数器:在计数器经过指定数量的周期后更新定时器寄存器。
- 2个断点输入:用于将定时器的输出信号置于安全的用户可选配置中。
- 中断/DMA生成:在以下事件发生时产生中断或DMA请求:
- 更新事件:计数器溢出/下溢、计数器初始化(通过软件或内部/外部触发器)
- 触发事件:计数器启动、停止、初始化或通过内部/外部触发器计数
- 输入捕获事件
- 输出比较事件
- 支持增量(正交)编码器和霍尔传感器电路:用于定位目的。
- 触发输入:用于外部时钟或周期性电流管理。
常用功能介绍#
定时器同步或级联#
输出比较#
计算公式

上图是 TIM 输出比较功能的主要硬件部分,不难看出时基单元(预分频器时钟 CK_PSC、预分频器 PSC、自动重装器 ARR)决定输出 PWM 波形的频率,自动重装器 ARR 和 捕获/比较器 CCR 决定 PWM 占空比。计算公式有:
- PWM 频率:Freq = CK_PSC / (PSC + 1) / (ARR + 1)
- PWM占空比:Duty = CCR / (ARR + 1)
- PWM分辨率:Reso = 1 / (ARR + 1)
当然占空比还与输出比较模式和输出极性有关。
输出比较模式
模式 | 描述 |
---|---|
冻结 | CNT=CCR时,REF保持为原状态 |
匹配时置有效电平 | CNT=CCR时,REF置有效电平 |
匹配时置无效电平 | CNT=CCR时,REF置无效电平 |
匹配时电平翻转 | CNT=CCR时,REF电平翻转 |
强制为无效电平 | CNT与CCR无效,REF强制为无效电平 |
强制为有效电平 | CNT与CCR无效,REF强制为有效电平 |
PWM模式1 | 向上计数:CNT<CCR时,REF置有效电平,CNT≥CCR时,REF置无效电平 向下计数:CNT>CCR时,REF置无效电平,CNT≤CCR时,REF置有效电平 |
PWM模式2 | 向上计数:CNT<CCR时,REF置无效电平,CNT≥CCR时,REF置有效电平 向下计数:CNT>CCR时,REF置有效电平,CNT≤CCR时,REF置无效电平 |
输出比较模式通过 TIMx_CCMR 寄存器中 OC1M:输出比较 1 模式 (Output compare 1 mode) 项进行设置。
输出极性:
输出极通过捕获/比较使能寄存器 (TIMx_CCER) 中的 CCxP 项进行设置:
位 1 CC1P: 捕获/比较 1 输出极性 (Capture/Compare 1 output Polarity)。
CC1 通道配置为输出:
0: OC1 高电平有效1: OC1 低电平有效
输入捕获#
使用STM32定时器(TIM)进行输入捕捉(Input Capture)可以测量外部信号的周期、频率或其他时间特性。其主要使用方法是通过输入波形产生的中断(上升沿或下降沿触发),(在中断服务函数)读取中断发生时的计数器值(记录在 CCR 寄存器中),并进行所需计算,得出想要结果(输入波形的频率、周期、占空比等)。
使用步骤
- 初始化定时器和GPIO引脚:配置定时器和对应的GPIO引脚,以接收外部信号。
- 配置捕捉/比较通道:设置输入捕捉通道及其参数。
- 使能定时器中断:以处理捕捉事件。
- 编写中断服务函数:在捕捉事件发生时,读取捕捉值并进行处理。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了