STM32的Hal库对于定时器TIM使用细则2

STM32的TIM->ARR寄存器实际上对应了两个寄存器:一个是用户可以写入或读出数据的寄存器,称为preload register(预装载寄存器),也就是TIM->ARR。另一个是用户看不见的、但在操作中真正起作用的寄存器称为shadow register(影子寄存器)。当我们需要修改定时时间的时候,其实修改的是表面那个预装载寄存器,要让这个修改起作用,就还要把预装载寄存器的值赋给影子寄存器才行。因为每次TIM->CNT计数都是跟影子寄存器比较,若满足条件才触发中断。那么根据不同的需求 :

从ARR预装载寄存器传送到影子寄存器,有两种方式,一种是立刻更新,一种是等触发事件之后更新;这两种方式主要取决于寄存器TIMx->CR1中的“APRE”位:
APRE=0,当ARR值被修改时,同时马上更新影子寄存器的值;
 APRE=1,当ARR值被修改时,必须在下一次事件UEV发生后才能更新影子寄存器的值;

 

还有个小细节要特别注意:就是注意定时器里面所有寄存器的位数都是16位的,所以取值范围为0-65535,若超过该值,则只会取到低16位。举例说明:时钟频率为72M, 分频数3600-1,这样计时频率就为20000Hz,若我们需要定时1s,则设置TIM->ARR为20000,3s则是60000,若我们定时器10s,则需要设置为100000,这个值已经大于65535了,因此只会取其低16位为34465,此时实际计时才34465/20000=1.7s
 

STM32F1 HAL库中的TIMTimer)模块是一个非常强大的工具,用于实现精确的时间测量和定时任务。要使用TIM来显示实时计数并分割为分钟、秒钟,你需要遵循以下步骤: 1. 初始化TIM:首先,你需要配置一个TIM计数器,通常选择一个内部时钟源,并设置合适的预分频器(例如,使用TIMx->ARR寄存器来设定定时器的最大值)。 ```c TIM_HandleTypeDef htim; TIM_TimeBaseInitTypeDef.TIM_Prescaler = ...; // 根据系统时钟频率计算 TIM_TimeBaseInitTypeDef.TIM_Period = ...; // 设置计数周期 TIM_TimeBaseInit(htim, &TIM_TimeBaseInitTypeDef); HAL_TIM_Base_Init(&htim); ``` 2. 设置中断:为了让TIM在计数达到特定值时触发中断,你需要配置TIM的溢出或更新中断。 ```c HAL_TIM_IRQHandler(&htim); ``` 并添加相应的中断服务函数(ISR),在那里处理计数并更新显示。 ```c void TIM_IRQHandler(TIM_HandleTypeDef *htim) { if (HTIM_GetITStatus(htim, TIM_IT_Update) != RESET) { // 更新计数和显示 UpdateTimerDisplay(); HAL_TIM_IRQHandler(htim); // 继续处理其他可能的中断 HTIM_ClearITPendingBit(htim, TIM_IT_Update); // 清除中断标志 } } ``` 3. 更新显示:在`UpdateTimerDisplay()`函数中,你需要根据当前的计数值计算出分钟和秒数。这可能涉及到对计数值进行模运算来得到余数。 ```c void UpdateTimerDisplay() { uint32_t timerValue = htim->CNT; uint32_t minutes = timerValue / 60; // 分钟部分 uint32_t seconds = timerValue % 60; // 秒钟部分 // 在这里更新LCD或其他显示设备的分钟和秒数 } ``` 4. 阻塞或非阻塞模式:如果你的应用需要在计数时保持程序执行,可以选择使TIM工作在非阻塞模式;如果需要暂停其他操作直到计数完成,可以将其设为阻塞模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值