简体   繁体   中英

Does STM32 timer frequency equal the PWM output frequency?

I have easy understanding Question. Whet I do initialize my STM32 timer for 1 sek counts (TIM8, Prescaller = 16800-1, Period = 10000-1) and want to debug it (measure a pin output frequency) - it a timer frequency the same frequency like I can observe it on oscilloscope? And it is a right configuration for TIM8 timer Interrupt?

void Second_timer_Init() {

    GPIO_InitTypeDef GPIO_InitStructure;                        //GPIO Init structure definition

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);       //Enables AHB1 peripheral clock for GPIOC
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);        //Enables AHB1 peripheral clock for TIM2

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;                   //Specifies the GPIO pins to be configured

    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;              //Specifies the operating output type for the selected pins
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                //GPIO Alternate function Mode
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;            //Specifies the operating Pull-up/Pull down for the selected pins
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;           //Specifies the speed for the selected pins

    GPIO_Init(GPIOC, &GPIO_InitStructure);                      //Initializes the GPIOA peripheral

    TIM_TimeBaseInitTypeDef Timer_InitStructure;                //TIM8 Time Base Init structure definition
    TIM_OCInitTypeDef Output_ChannelInit;                       //TIM8 Output Compare Init structure definition

    GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM8);     // PC6 -> Connect TIM8 pins to AF3

    Timer_InitStructure.TIM_Period = 10000 - 1;                 //Specifies the period value (Orig 1 Sek: 10000-1)
    Timer_InitStructure.TIM_Prescaler = 16800-1;                //Specifies the prescaler value used to divide the TIM clock (Orig 1 Sek: 16800-1)
    Timer_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;       //Specifies the clock division (0)
    Timer_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;   //Specifies the counter mode

    TIM_TimeBaseInit(TIM8, &Timer_InitStructure);               //Initializes the TIM8 Time Base Unit peripheral

//  TIM_OCStructInit(&Output_ChannelInit);
    Output_ChannelInit.TIM_OCMode = TIM_OCMode_PWM1;            //Specifies the TIM8 PWM mode
    Output_ChannelInit.TIM_OutputState = TIM_OutputState_Enable;//Specifies the TIM8 Output Compare state
    Output_ChannelInit.TIM_Pulse = 0;                           //Specifies the pulse value to be loaded into the Capture Compare Register
    Output_ChannelInit.TIM_OCPolarity = TIM_OCPolarity_Low;     //Specifies the output polarity

    TIM_OC1Init(TIM8, &Output_ChannelInit);                     //Initializes the TIM8 Channel1
    TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable);           //Enables the TIM2 peripheral Preload register on CCR1

    TIM_ARRPreloadConfig(TIM8, ENABLE);                         //Enables TIM2 peripheral Preload register on ARR

    TIM_Cmd(TIM8, ENABLE);                                      //Enables the specified TIM8 peripheral

    TIM_CtrlPWMOutputs(TIM8, ENABLE);                           //Enables the TIM peripheral Main Outputs ?

    TIM8->CCR1 = 5000;                                          //Set duty cycle to 50%

    TIM_ClearITPendingBit(TIM8, TIM_IT_Update);                 //Clears the TIM8 interrupt pending bits
    TIM_ITConfig(TIM8, TIM_IT_Update, ENABLE);                  //Enables the specified TIM8 interrupts

    NVIC_InitTypeDef NVIC_InitStructure;                        //NVIC Init Structure definition
    NVIC_InitStructure.NVIC_IRQChannel = TIM8_CC_IRQn;          //Specifies the IRQ channel to be enabled
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//Specifies the pre-emption priority for the IRQ channel specified in NVIC_IRQChannel (0-15)
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;       //Specifies the subpriority level for the IRQ channel specified in NVIC_IRQChannel (0-15)
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;             //Specifies whether the IRQ channel defined in NVIC_IRQChannel will be enabled
    NVIC_Init(&NVIC_InitStructure);                             //Initializes the NVIC peripheral

}

IRQ Handler

void TIM8_CC_IRQHandler(){
    if (TIM_GetITStatus(TIM8, TIM_IT_Update) != RESET)          //Checks whether the TIM8 interrupt has occurred
        {
            TIM_ClearITPendingBit(TIM8, TIM_IT_Update);         //Clears the TIM8 interrupt pending bits
            TIM3->CCR1 = 500;                                   //Debug
        }
    else{
            TIM3->CCR1 = 0;                                         //Debug

    }
}

As I see you change the TIM3 registers in the TIM8 interrupt.

Secondly you check for the wrong event in your interrupt routine (this routine is invoked then the CC event occurs not the UG event. Same when you set the interrupts. You enable the UG interrupt but serve the CC one. Some of the uC models have those interrupt vectors shared some not.

BTW What is the point of using HAL library if you change the registers?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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