stm32定时器的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stm32定时器的问题相关的知识,希望对你有一定的参考价值。

TIM_TimeBaseStructure.TIM_Period=35999;
TIM_TimeBaseStructure.TIM_Prescaler=1999;
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //TIM2时钟分频
谁能告诉我这个TIM_Period和 TIM_Prescaler是怎么计算来的?还有这三个语句都是什么意思啊?

是用来产生定时器的中断溢出时间的,计算公式是:
T=Ftosc/(TIM_Period+1)*(TIM_Prescaler+1);(Ftosc是定时器时钟)
其中T,是中断溢出时间,你的这个例子就是1Sec,TIM_Period,是计数器的计数频率,TIM_Prescaler是定时器隔多少个周期溢出,化量溢出时间的。这两个数字的组合可以产生小于(最小分频因子,最大溢出周期,所产生的时间)下的任意时间。一般是产生1S,不过定时器只是用来产生1S时间太占用CPU资源了,如果想不占用CPU,可以用一个特殊的定时间,就是滴答了。最后还有第三句的意思是就产生定时器时对系统时钟的分频因子。此例中是1分频,就是不分频。
参考技术A pyb8874正确

STM32 定时器中断

【中文标题】STM32 定时器中断【英文标题】:STM32 Timer Interrupts 【发布时间】:2018-01-23 22:33:21 【问题描述】:

我正在尝试在 STM32L073 中使用定时器外设,但我遇到了问题。 我在 STM32Cube 中生成了设置代码,并且只使用了 HAL API 提供的功能。问题是定时器中断只发生一次,它应该总是发生然后它溢出。我不知道计时器是否正在运行,或者我的设置是否错误(我认为这不应该是因为我使用的是 Cube 生成的代码)。任何人都可以帮忙吗?

这是在while循环之前在main中调用的

void MX_TIM7_Init(void)

TIM_ClockConfigTypeDef sClockSourceConfig;
TIM_MasterConfigTypeDef sMasterConfig;

htim7.Instance = TIM7;
htim7.Init.Prescaler = 00;
htim7.Init.CounterMode = TIM_COUNTERMODE_UP;
htim7.Init.Period = 00;
if (HAL_TIM_Base_Init(&htim7) != HAL_OK) 
    Error_Handler();
    

sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim7, &sMasterConfig) != HAL_OK)
     _Error_Handler(__FILE__, __LINE__);
    


BaseMspInit 方法

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)

if(tim_baseHandle->Instance==TIM7)
/* USER CODE BEGIN TIM7_MspInit 0 */

/* USER CODE END TIM7_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_TIM7_CLK_ENABLE();

/* TIM7 interrupt Init */
HAL_NVIC_SetPriority(TIM7_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM7_IRQn);
/* USER CODE BEGIN TIM7_MspInit 1 */

/* USER CODE END TIM7_MspInit 1 */
   

然后在main中我称之为

HAL_TIM_Base_Start_IT(&htim7);

这是做什么的

HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)
/* Check the parameters */
assert_param(IS_TIM_INSTANCE(htim->Instance));

/* Enable the TIM Update interrupt */
__HAL_TIM_ENABLE_IT(htim, TIM_IT_UPDATE);

/* Enable the Peripheral */
__HAL_TIM_ENABLE(htim);

/* Return function status */
return HAL_OK;

我的中断处理程序调用 PeriodElapsedCallback

 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) 
    HAL_GPIO_TogglePin(led_GPIO_Port, led_Pin);
    

它编译没有错误没有警告,在调试器中我看到这个中断只触发一次,然后永远不会。期待答案

附:使用 SEGGER Embedded Studio

【问题讨论】:

【参考方案1】:

由于您没有设置 ARR,因此您的溢出每个时钟都会发生

【讨论】:

这就是为什么你不应该在午夜之后做任何新的事情......谢谢【参考方案2】:

首先您需要将这些参数设置为您的目标期间

时钟源的预分频器(检查哪个总线):

htim7.Init.Prescaler = 00;

发生 ISR 需要多少计时器计数:

htim7.Init.Period = 00;

【讨论】:

是的,这也是正确的答案。我真傻...谢谢你

以上是关于stm32定时器的问题的主要内容,如果未能解决你的问题,请参考以下文章

STM32基本定时器

STM32定时器输出比较不能正常工作

STM32定时器中断周期

定时器和按钮接口stm32

STM32定时器频率是不是等于PWM输出频率?

STM32F7 定时器触发定时器