gpt4 book ai didi

c++ - 为什么我的STM32F7每43秒才中断一次?

转载 作者:行者123 更新时间:2023-11-28 01:56:51 25 4
gpt4 key购买 nike

我的目标是中断 38khz 并切换 LED,但无论我设置什么预分频器和周期

static TIM_HandleTypeDef s_TimerInstance = { 
.Instance = TIM2,
};
void Hal::initTim()
{
__TIM2_CLK_ENABLE();
s_TimerInstance.Init.Prescaler = 96; // This does nothing
s_TimerInstance.Init.CounterMode = TIM_COUNTERMODE_UP;
s_TimerInstance.Init.Period = 26; // This does nothing
s_TimerInstance.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_Base_Init(&s_TimerInstance);
HAL_TIM_Base_Start_IT(&s_TimerInstance);


HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM2_IRQn);
}
extern "C" void TIM2_IRQHandler()
{
HAL_TIM_IRQHandler(&s_TimerInstance);
}
extern "C" void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
HAL_GPIO_TogglePin(GPIOI, GPIO_PIN_1); // Happens every 43 seconds for some reason
}
extern "C" void HAL_TIMEx_BreakCallback(TIM_HandleTypeDef *htim){}
extern "C" void HAL_TIMEx_CommutationCallback(TIM_HandleTypeDef *htim){}

当我将它对准目标时,无论预分频器和周期设置为什么,LED 每 43 秒切换一次。

我一定是遗漏了什么,但我想不通。有中断经验的人可以提供帮助吗?

最佳答案

嗯。定时器非常简单。你只是通过使用立方体让它变难了。

__TIM2_CLK_ENABLE();
TIM2->PSC = 96; // prescaler (note that 0 is /1)
TIM2->ARR = 0xFFFF-26; // reload on overflow
TIM2->DIER = TIM_DIER_UIE; // overflow isr
TIM2->CR1 |= TIM_CR1_CEN; // enable timer
HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM2_IRQn);

在 isr 中:

if(TIM2->SR & TIM_SR_UIF){
TIM2->SR &= ~TIM_SR_UIF;
}

顺便说一句。我喜欢确保初始化时的重置条件。

__HAL_RCC_TIM2_FORCE_RESET();
__NOP();
__HAL_RCC_TIM2_RELEASE_RESET();

关于c++ - 为什么我的STM32F7每43秒才中断一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40884278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com