简体   繁体   English

STM32 F429 TIM1 捕捉比较始终为零

[英]STM32 F429 TIM1 Capture Compare always zero

I'm building a tachometer using a hall sensor and I tied it to PE13 or Tim1 Channel 3.我正在使用霍尔传感器构建转速计,并将其连接到 PE13 或 Tim1 通道 3。

Everything seems to be working as the interrupt TIM1_CC_IRQHandler fires at the expected rate, but whenever I run LL_TIM_IC_GetCaptureCH3(TIM1) I only get 0 back from the function call.一切似乎都在工作,因为中断 TIM1_CC_IRQHandler 以预期的速率触发,但是每当我运行 LL_TIM_IC_GetCaptureCH3(TIM1) 时,我只能从函数调用中得到 0。

Did I miss something in my setup code?我在设置代码中遗漏了什么吗? Or am I misunderstanding how to use the timer and the LL drivers?还是我误解了如何使用计时器和 LL 驱动程序?

Setup code:设置代码:

    // Enable Timer and Peripheral Clocks
    LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_TIM1);
    LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOE);

    // Ensure Pins are Configured Correctly
    LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
    /**TIM1 GPIO Configuration
    PE13    ------> TIM1_CH3
    */
    GPIO_InitStruct.Pin = LL_GPIO_PIN_13;
    GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
    GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
    GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
    GPIO_InitStruct.Alternate = LL_GPIO_AF_1;
    LL_GPIO_Init(GPIOE, &GPIO_InitStruct);   

    // Register FanTach CLI Comand
    FreeRTOS_CLIRegisterCommand( &xFANTACH );

    // Configure Timer for Capture Compare
    LL_TIM_InitTypeDef TIM_InitStruct = {0};

    TIM_InitStruct.Prescaler = 0;
    TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
    TIM_InitStruct.Autoreload = 0;
    TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;
    TIM_InitStruct.RepetitionCounter = 0;
    LL_TIM_Init(TIM1, &TIM_InitStruct);
    LL_TIM_DisableARRPreload(TIM1);
    LL_TIM_SetClockSource(TIM1, LL_TIM_CLOCKSOURCE_INTERNAL);
    LL_TIM_SetTriggerOutput(TIM1, LL_TIM_TRGO_RESET);
    LL_TIM_DisableMasterSlaveMode(TIM1);
    LL_TIM_IC_SetActiveInput(TIM1, LL_TIM_CHANNEL_CH3, LL_TIM_ACTIVEINPUT_DIRECTTI);
    LL_TIM_IC_SetPrescaler(TIM1, LL_TIM_CHANNEL_CH3, LL_TIM_ICPSC_DIV1);
    LL_TIM_IC_SetFilter(TIM1, LL_TIM_CHANNEL_CH3, LL_TIM_IC_FILTER_FDIV1);
    LL_TIM_IC_SetPolarity(TIM1, LL_TIM_CHANNEL_CH3, LL_TIM_IC_POLARITY_RISING);

    /* Set the pre-scaler value to have TIM2 counter clock equal to 10 MHz      */
  
  //   To get TIM1 counter clock at 10 MHz, the Prescaler is computed as following:
  //   Prescaler = (TIM1CLK / TIM2 counter clock) - 1
  //   Prescaler = (TIM1CLK / 10 MHz) - 1
  
    LL_TIM_SetPrescaler(TIM1, __LL_TIM_CALC_PSC(get_pclk2_freq(), 10000000));

    //Enable Interrupts
    NVIC_SetPriority(TIM1_UP_TIM10_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), PreemptPriority, SubPriority));
    NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn);
    NVIC_SetPriority(TIM1_CC_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), PreemptPriority, SubPriority));
    NVIC_EnableIRQ(TIM1_CC_IRQn);

    /* Enable Capture Compare channel 3 for Timer 1 */
    LL_TIM_EnableIT_CC3(TIM1);

    //Start Input Capture
    LL_TIM_CC_EnableChannel(TIM1, LL_TIM_CHANNEL_CH3);

    //Enable Counter
    LL_TIM_SetCounterMode(TIM1, LL_TIM_COUNTERMODE_UP);
    LL_TIM_EnableCounter(TIM1);
}

If anyone stumbles upon this with the same problem, I solved this in two steps:如果有人遇到同样的问题,我分两步解决了这个问题:

  1. LL_TIM_DisableARRPreload should be LL_TIM_EnableARRPreload LL_TIM_DisableARRPreload 应该是 LL_TIM_EnableARRPreload
  2. TIM_InitStruct.Autoreload needs to be set to your max counter value TIM_InitStruct.Autoreload 需要设置为您的最大计数器值

This allows the timer to automatically reset and gives the up counter a maximum value.这允许计时器自动重置并为递增计数器提供最大值。 For my work I set it to 0xFFFF.对于我的工作,我将其设置为 0xFFFF。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM