STM32嵌入式开发之CubeMx定时器基本定时功能详解
图1 定时器内部架构图
图2 Cubemx 可视化定时器配置
工作流程:
内部或外部驱动时钟CK_PSC驱动预分频器PSC计数分频,产生CK_CNT驱动计数器CNT计数。自动重装载寄存器在发生更新事件时将值传到计数器CNT中作为初始计数值,REP寄存器则控制CNT溢出次数,当重复次数计数器从REP寄存器的数值递减至0是计数器CNT停止计数。
1. 根据上述CubeMx工具自动产生如下代码,定时周期s = (Period + 1) * (Prscaler +1) /(Tclk定时器时钟频率Hz) = (99+1)*(63+1)/64MHz=100*10^(-6)秒=100us
/* USER CODE BEGIN TIM1_Init 1 */
/* USER CODE END TIM1_Init 1 */
htim1.Instance = TIM1; // 选择所使用的的定时器
htim1.Init.Prescaler = 63; // 对定时器输入的时钟源进行分频的分频系数,对应于图1中的1,例如输入时钟源时钟频率为64MHz,此处分频系数为63,则定时器时钟=64MHz/64 = 1MHz
htim1.Init.CounterMode = TIM_COUNTERMODE_UP; // 定时器计数方式选择为从下往上
htim1.Init.Period = 99; // 计时周期=定时器时钟*(period+1) 自动重装载值(默认值)
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0; // 代表计数值满溢出几次才进入中断,对应于图1中的3,RepetitionCounter = 0则代表一个定时周期便产生中断;RepetitionCounter =1 代表需要两个定时周期才产生中断
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; // 关闭自动重载功能
if (HAL_TIM_OC_Init(&htim1) != HAL_OK)
{
Error_Handler();
}
2.常用术语
2.1 计数模式--对应于htim1.Init.CounterMode
向上计数模式:
在向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR计数器的内容),然后重新从0开始计数并且产生一个计数器溢出事件。
向下计数模式:
在向下模式中,计数器从自动装入的值(TIMx_ARR计数器的值)开始向下计数到0,然后从自动装入的值重新开始并且产生一个计数器向下溢出事件。
中央对齐模式:
在中央对齐模式,计数器从0开始计数到自动加载的值(TIMx_ARR寄存器)-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器下溢事件;然后再从0开始重新计数。
2.2 重复计数器功能
如果使用了重复计数器功能,在向上计数达到设置的重复计数次数(TIMx_RCR)时,产生更新事件(UEV);否则每次计数器溢出时才产生更新事件。对应于htim1.Init.RepetitionCounter
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构