Timer STM32定时器中断周期
我使用的是STM32F401RE板,我希望每X秒(比方说60秒)发生一次计时器中断 中断回调可以工作。问题是中断不是每60秒发生一次(它每34秒发生一次)。我尝试了不同的预分频器和周期值,但我尝试的结果都不是我想要的 我正在另一个项目中使用CubeMX生成的函数: main.cTimer STM32定时器中断周期,timer,interrupt,stm32,clock,Timer,Interrupt,Stm32,Clock,我使用的是STM32F401RE板,我希望每X秒(比方说60秒)发生一次计时器中断 中断回调可以工作。问题是中断不是每60秒发生一次(它每34秒发生一次)。我尝试了不同的预分频器和周期值,但我尝试的结果都不是我想要的 我正在另一个项目中使用CubeMX生成的函数: main.c TIM_HandleTypeDef htim10; int main(void) { HAL_Init(); SystemClock_Config(); // Some other code
TIM_HandleTypeDef htim10;
int main(void)
{
HAL_Init();
SystemClock_Config();
// Some other code
MX_TIM10_Init();
HAL_TIM_Base_Start_IT(&htim10);
while (1)
{
}
}
static void MX_TIM10_Init(void)
{
htim10.Instance = TIM10;
htim10.Init.Prescaler = 35999;
htim10.Init.CounterMode = TIM_COUNTERMODE_UP;
htim10.Init.Period = 60000;
htim10.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if (HAL_TIM_Base_Init(&htim10) != HAL_OK)
{
Error_Handler();
}
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM10)
{
printf("ABCDEFG\n\r");
}
}
void SystemClock_Config(void)
{
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = 16;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLM = 16;
RCC_OscInitStruct.PLL.PLLN = 288;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
RCC_OscInitStruct.PLL.PLLQ = 6;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1);
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
__HAL_RCC_SYSCFG_CLK_ENABLE();
}
stm32f4xx_hal_msp.c
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
{
if(htim_base->Instance==TIM10)
{
__HAL_RCC_TIM10_CLK_ENABLE();
HAL_NVIC_SetPriority(TIM1_UP_TIM10_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn);
}
}
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base)
{
if(htim_base->Instance==TIM10)
{
__HAL_RCC_TIM10_CLK_DISABLE();
HAL_NVIC_DisableIRQ(TIM1_UP_TIM10_IRQn);
}
}
stm32f4xx_it.c
void TIM1_UP_TIM10_IRQHandler(void)
{
HAL_TIM_IRQHandler(&htim10);
}
谁能解释一下我做错了什么?如何配置计时器参数以达到所需的周期
提前谢谢你 你能捕获你项目的CubeMX时钟配置屏幕吗,它让我更容易诊断你的问题 编辑1:我检查你的代码,定时器10是由APB2时钟源运行的,所以定时器10的时钟运行速度快了两倍。您应该这样配置代码:
static void MX_TIM10_Init(void)
{
htim10.Instance = TIM10;
htim10.Init.Prescaler = 35999;
htim10.Init.CounterMode = TIM_COUNTERMODE_UP;
htim10.Init.Period = 60000;
htim10.Init.ClockDivision = TIM_CLOCKDIVISION_DIV2; //TIM_CLOCKDIVISION_DIV1
if (HAL_TIM_Base_Init(&htim10) != HAL_OK)
{
Error_Handler();
}
}
Frankie在下面添加名为
MX_NVIC_Init()的函数
到main()
函数
static void MX_NVIC_Init(void)
{
HAL_NVIC_SetPriority(TIM1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM10_IRQn);
}
我已经试过TIM_CLOCKDIVISION_DIV2,但它不起作用(中断仍然每30秒触发一次,这对我来说毫无意义)。我无法向您展示CubeMX中的时钟配置,因为我正在处理ST中已经创建的项目,因此我没有.ioc文件。由于您没有.ioc文件,我建议您在STM32CubeMx中启动一个新的、最简单的项目来创建一个,根据需要配置计时器和中断,让它自动生成源代码,测试它是否有效,然后使用git difftool和meld将您的文件与它生成的文件和您现在拥有的文件进行比较。一旦你发现了差异,回到这里,把你找到的解决方案贴出来,让所有人都看到,并把你自己的问题标记为正确的问题。我将投票表决。你知道如何使用STM32CubeMX吗?