清除所有定时器计时器

今天也是心血来潮,之前做一个需求是手机号绑定和邮箱绑定的,都需要获取验证码倒计时,还要弹窗打开就恢复默认,其实就是清除计时器。

讲道理,一般也就一个计时器在跑,测试愣是提出了我点击获取手机验证码马上取消,然后点击获取邮箱验证码,我当时就想了一下原生应该提供了清除所有计时器的方法,结果没有,只好定义了六个变量来获取不同的计时器,然后分别清除。

今天看了一下setInterval和setTimeout返回的ID,都是数字,而且是递增的关系。我在一个HTML里面引入a.js和b.js,两个js里面都设置了一setInterval和setTimeout。

a.js:
let at1 = setTimeout(function () {})
let at2 = setTimeout(function () {})
let at3 = setTimeout(function () {
  let at4 = setTimeout(function () {})
  let at5 = setTimeout(function () {})
  let at6 = setTimeout(function () {})
  console.log('at4:' + at4);
  console.log('at5:' + at5);
  console.log('at6:' + at6);
}, 5000)
let ai1 = setInterval(function () {})
let ai2 = setInterval(function () {})
console.log('at1:' + at1);
console.log('at2:' + at2);
console.log('at3:' + at3);
console.log('ai1:' + ai1)
console.log('ai2:' + ai2)

b.js:
let bt1 = setTimeout(function () {})
let bt2 = setTimeout(function () {})
let bt3 = setTimeout(function () {
let bt4 = setTimeout(function () {})
let bt5 = setTimeout(function () {})
let bt6 = setTimeout(function () {})
  console.log('bt4:' + bt4);
  console.log('bt5:' + bt5);
  console.log('bt6:' + bt6);
}, 2000)
let bi1 = setInterval(function () {})
let bi2 = setInterval(function () {})
console.log('bt1:' + bt1);
console.log('bt2:' + bt2);
console.log('bt3:' + bt3);
console.log('bi1:' + bi1)

HTML里面:
<script src="./a.js"></script>
<script src="./b.js"></script>
<script>
  let c1 = setInterval(function () {})
  let c2 = setInterval(function () {})
  let c3 = setTimeout(function () {})
  console.log('c1:' + c1)
  console.log('c2:' + c2)
  console.log('c3:' + c3)
</script>console.log('bi2:' + bi2)

结果:
在这里插入图片描述

这表明setInterval和setTimeout返回的ID是一起递增的,想要清除所有的

setInterval和setTimeout,只要新加一个然后循环清除:

let endTid = setTimeout(function () {});
for (let i = 0; i <= endTid; i++) {
  clearTimeout(i)
  clearInterval(i)
}

因为是同步的,所以不用担心你刚好清除的时候又新增了一个。如果不放心,完全可以循环一个大一点的值,一般来说,项目超过几十个定时器应该是没有。

在这里插入图片描述

<think>嗯,用户现在想用STM32的LL库来清除定时器计数值,确保每次启动ADC时计数器从0开始。之前他们问过HAL库的实现,现在转向LL库,可能需要更底层的控制或者项目要求使用LL库。 首先,我需要回忆一下LL库和HAL库的区别。LL库是Low-Layer,更接近寄存器操作,相比HAL库更轻量,执行效率更高。用户之前的问题得到了HAL库的解决方法,现在需要对应的LL函数。 用户提到要清除定时器计数器,确保ADC启动时计数器从0开始。在HAL库中,用的是__HAL_TIM_SET_COUNTER或者HAL_TIM_SetCounter。那么在LL库中,应该使用LL_TIM_SetCounter函数。需要确认这个函数的参数和用法是否正确,比如传入定时器实例和0作为计数值。 接下来,要考虑定时器和ADC的同步配置。用户可能已经配置了定时器触发ADC,所以需要检查LL库中如何设置触发源。例如,使用LL_TIM_SetTriggerOutput来产生TRGO事件,作为ADC的外部触发源。 另外,用户可能还需要在初始化代码中正确配置定时器的自动重装载值(ARR),确保定时器在达到ARR时产生更新事件,从而触发ADC转换。需要指导用户如何通过LL_TIM_SetAutoReload来设置ARR的值。 还要注意,使用LL库时,可能需要直接操作寄存器或者启用定时器的计数器。比如,在启动定时器之前,先停止计数器,清零,然后重新启动。LL库提供了LL_TIM_DisableCounter和LL_TIM_EnableCounter函数,这些步骤可以确保计数器从0开始计数。 用户的问题还涉及到ADC的启动时机。可能需要配置ADC的外部触发源为定时器的TRGO事件,这样每次定时器更新时触发ADC采样。在LL库中,这涉及到ADC配置部分,比如使用LL_ADC_REG_SetTriggerSource函数来设置触发源为定时器。 此外,用户可能需要完整的代码示例,展示如何结合LL库函数来实现定时器清零和ADC启动的同步操作。例如,在启动ADC之前,先停止定时器,清零计数器,然后启动定时器,再启动ADC,确保计数器从0开始。 还需要注意时钟配置是否正确,确保定时器和ADC的时钟源已经使能,避免因为时钟未启动导致功能异常。例如,使用LL_APB1_GRP1_EnableClock来使能定时器的时钟。 最后,用户可能需要了解如何验证配置是否正确,比如通过调试查看计数器是否真的从0开始,或者ADC是否在预期的时刻触发。可能需要指导用户使用调试工具或者输出信号进行测试。</think>在STM32 LL库中实现定时器计数器清零并同步ADC启动,可通过以下步骤完成: ### 一、LL库关键函数 1. **计数器清零函数** 使用LL_TIM_SetCounter直接修改计数器寄存器: ```c LL_TIM_SetCounter(TIMx, 0); // TIMx如TIM2 ``` 2. **计数器启停控制** ```c LL_TIM_DisableCounter(TIMx); // 停止计数器 LL_TIM_EnableCounter(TIMx); // 启动计数器 ``` ### 二、完整操作流程 ```c /* 1. 停止计数器 */ LL_TIM_DisableCounter(TIM2); /* 2. 强制生成更新事件以重置预分频器 */ LL_TIM_GenerateEvent_UPDATE(TIM2); /* 3. 清零计数器 */ LL_TIM_SetCounter(TIM2, 0); /* 4. 配置ADC触发源(需提前在CubeMX中配置)*/ LL_ADC_REG_SetTriggerSource(ADC1, LL_ADC_REG_TRIG_EXT_TIM2_TRGO); /* 5. 启动ADC */ LL_ADC_REG_StartConversion(ADC1); /* 6. 启动定时器 */ LL_TIM_EnableCounter(TIM2); ``` ### 三、硬件配置要点 1. **定时器触发配置** 通过LL_TIM_SetTriggerOutput设置TRGO事件: ```c LL_TIM_SetTriggerOutput(TIM2, LL_TIM_TRGO_UPDATE); ``` 2. **自动重装载值设置** ```c LL_TIM_SetAutoReload(TIM2, period-1); // 设置ARR寄存器 ``` 3. **ADC外部触发配置** 在CubeMX中需设置: - ADC的触发源选择对应定时器的TRGO事件 - 定时器的时钟总线配置正确(如APB1) ### 四、LL与HAL库对比差异 | 功能 | HAL库函数 | LL库函数 | |---------------------|----------------------------|---------------------------| | 计数器操作 | `HAL_TIM_SetCounter()` | `LL_TIM_SetCounter()` | | 定时器启停 | `HAL_TIM_Base_Start()` | `LL_TIM_EnableCounter()` | | 事件生成 | `__HAL_TIM_GENERATE_SOURCE`| `LL_TIM_GenerateEvent_UPDATE()` | --- **注意事项**: 1. 使用LL_TIM_GenerateEvent_UPDATE()可确保预分频器和计数器同步重置[^3] 2. ADC触发模式需配置为外部触发而非软件触发[^1] 3. 建议通过ST-Link实时查看TIMx_CNT寄存器验证清零效果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值