它们既可作为通用定时器生成时基信号,也可专门用于驱动数模转换器(DAC)
寄存器
TIMx control register 1 (TIMx_CR1)(x = 6 to 7)
-
bit 11 UIFREMAP:UIF 状态位重新映射
- 0:不重新映射。UIF状态位不复制到TIMx_CNT寄存器位31
- 1:启用重新映射。UIF状态位复制到TIMx_CNT寄存器位31
-
bit 7 ARPE:自动重载预加载使能
- 0:TIMx_ARR寄存器不缓冲
- 1:TIMx_ARR寄存器缓冲
-
bit 3 OPM:单脉冲模式
- 0:计数器在更新事件时不停止
- 1:计数器在下次更新事件时停止计数(清除CEN位)
-
bit 2 URS:更新请求源该位由软件设置和清除,用于选择UEV事件源
- 0:启用时,以下任一事件将触发更新中断或DMA请求。这些事件包括:
-
计数器溢出/下溢
-
设置UG位
-
通过从模式控制器生成更新
-
1: 仅计数器溢出/下溢在启用时产生更新中断或DMA请求
-
bit 1 UDIS:更新禁用
- 该位由软件设置和清除,用于启用/禁用UEV事件生成
- 0:UEV启用。更新事件(UEV)由以下事件之一触发:
-
计数器溢出/下溢
-
设置UG位
-
通过从模式控制器生成更新缓冲寄存器随后加载预置值
-
1:UEV禁用。更新事件不生成,影子寄存器保持其值(ARR, PSC)。但若UG位被设置或从从机模式控制器接收到硬件复位,计数器和预分频器将被重新初始化
-
bit 0 CEN:计数器使能
TIMx control register 2 (TIMx_CR2)(x = 6 to 7)
-
bit 6:4 MMS[2:0]:主模式选择
- 这些位用于选择在主模式下发送给从属定时器以实现同步的信息(TRGO)
-
000:复位 - 使用TIMx_EGR寄存器的UG位作为触发输出(TRGO)。若触发输入产生复位(从机模式控制器配置为复位模式),则TRGO信号相对于实际复位存在延迟
-
001: 启用 - 计数器使能信号 CNT_EN 用作触发输出(TRGO)。该功能可用于同时启动多个计时器,或控制从属计时器启用的时间窗口。在门控模式下,计数器使能信号由 CEN 控制位与触发输入的逻辑或运算生成当计数器使能信号由触发输入控制时,TRGO会产生延迟,除非选择了主从模式(参见TIMx_SMCR寄存器中的MSM位说明)
-
010:更新 - 更新事件被选作触发输出(TRGO)。例如,主定时器可作为从定时器的预分频器使用
TIMx DMA/Interrupt enable register (TIMx_DIER)(x = 6 to 7)
-
bit 8 UDE:更新 DMA 请求使能
- 0:更新 DMA 请求禁用
- 1:更新 DMA 请求启用
-
bit 0 UIE:更新中断使能
TIMx status register (TIMx_SR)(x = 6 to 7)
-
bit 0 UIF:更新中断标志 该位由硬件在更新事件时设置,由软件清除
- 0:未发生更新
- 1:更新中断待处理,当寄存器更新时,该位由硬件设置:
-
当重复计数器值发生溢出或下溢,且TIMx_CR1寄存器中UDIS = 0
-
当软件通过TIMx_EGR寄存器中的UG位重新初始化CNT时,若TIMx_CR1寄存器中URS=0且UDIS=0
TIMx event generation register (TIMx_EGR)(x = 6 to 7)事件生成寄存器
- bit 0 UG:更新生成 此位可由软件设置,硬件会自动清除
- 0:无操作
- 1:重新初始化定时器计数器并更新寄存器。注意:预分频器计数器也被清零(但预分频比不受影响)。
TIMx counter (TIMx_CNT)(x = 6 to 7)
-
bit 31 UIFCPY:UIF复制位
- 该位是TIMx_ISR寄存器中UIF位的只读副本。若TIMx_CR1寄存器中的UIFREMAP位被清除,则位31保留并读取为0
-
bit 15:0 CNT[15:0]:计数器值
TIMx prescaler (TIMx_PSC)(x = 6 to 7) 预分频器
- bit 15:0 PSC[15:0]:预分频器值
- 计数器时钟频率CK_CNT等于fCK_PSC/ (PSC[15:0] + 1)
- PSC包含每次更新事件(包括通过TIMx_EGR寄存器的UG位或在"复位模式"配置下通过触发控制器清零计数器时)加载到活动预分频寄存器的值
TIMx auto-reload register (TIMx_ARR)(x = 6 to 7) 自动重载寄存器
实验
实现一个定时器,1S 反转 IO 电平
配置

软件
__HAL_TIM_ENABLE(&htim6);
while(!__HAL_TIM_GET_FLAG(&htim6, TIM_FLAG_UPDATE))
{
// Wait for the timer to finish
}
__HAL_TIM_CLEAR_FLAG(&htim6, TIM_FLAG_UPDATE);
HAL_GPIO_TogglePin(TEST_LOG_GPIO_Port, TEST_LOG_Pin);
结果

|