首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STM32F4计时器-预分频器或周期值必须除以二才能得到我所期望的

STM32F4计时器-预分频器或周期值必须除以二才能得到我所期望的
EN

Stack Overflow用户
提问于 2021-10-15 09:31:47
回答 1查看 825关注 0票数 0

我正在STM32F4上工作,我注意到了计时器的一些奇怪行为。

我需要三个定时器:第一个必须每1ms产生一个中断(我选择了计时器1,一个高级控制定时器),第二个必须每10 ms生成一个中断(TIMER2,通用中断),第三个必须使它的CNT计数器每1 s递增一次(因此每65.535 ms产生一次中断,因为我使用的是计时器3,CNT是16位)。

为了计算PSC (预分频器)和ARR (周期)值,我使用了这个线程。因此,我使用的公式是(在ms中的一段时间):

代码语言:javascript
复制
Period = 1000 * (PSC+1)*(ARR+1) / TmerClockFreq

这意味着:

代码语言:javascript
复制
ARR = ((Period * TmerClockFreq) / (1000*(PSC + 1)) - 1

在我的例子中,TmerClockFreq =168个MHz =168x10^6Hz

对于TIMER1,一切都如预期的那样工作。我选择了PSC=11,它给了我ARR=13999,相应的中断实际上是每1ms调用一次。

计时器2和3会使事情变得复杂。

计时器2:我要周期= 10毫秒。如果我取,PSC = 39,它给我ARR = 41999。问题:使用这些参数,我的中断每隔20 is调用一次。为了得到我想要的周期,我必须将PSC除以2,所以PSC = 19,ARR = 41999。

对于Period=65.535 ms和ARR = 65535,PSC = 167 (请注意,在这种情况下,计算是近似的,但我不需要非常高的精度)。但在这里,中断的调用速度是我预期的两倍(大约每131.064毫秒)。我添加到选择PSC = 83,以使我的中断每65.535 ms被调用一次。

所以我的问题是:,为什么我需要对计时器2和计时器3除以2的预分频器才能得到中断的预期周期?

下面是我如何设置计时器3:

代码语言:javascript
复制
/* Get clock speed */
u32_ticks = (HAL_RCC_GetHCLKFreq() / 1000000); // = 168

pst_TimerHandle->Instance = TIM3;
pst_TimerHandle->Init.Prescaler = (u32_ticks - 1) / 2;
pst_TimerHandle->Init.CounterMode = TIM_COUNTERMODE_UP;
pst_TimerHandle->Init.Period = 0xFFFF;
pst_TimerHandle->Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
pst_TimerHandle->Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
if (HAL_TIM_Base_Init(pst_TimerHandle) != HAL_OK)
{
    //error handling
}
st_ClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(pst_TimerHandle, &st_ClockSourceConfig) != HAL_OK)
{
    //error handling
}
st_MasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
st_MasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

下面是我如何在IRQ处理程序中产生一些脉冲来检查中断的周期:

代码语言:javascript
复制
void TIM3_IRQHandler(void)
{
    HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12);

    HAL_TIM_IRQHandler(HAL_TIMER3_GetHandle());
}

定时器3,ARR=0xFFFF和PSC = 167的示波器输出(根据公式计算的值,输出结果与预期不符)

定时器3、ARR=0xFFFF和PSC = (167 / 2) = 83的示波器输出(PSC除以2,按预期输出)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-15 09:45:22

Timer1是先进的定时器,timer2 &3是通用定时器。Timer1来自APB2,timer 2,3来自APB1。您可以检查参考书或检查您的时钟设置,以了解更多细节。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69582650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档