简体   繁体   English

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

[英]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? 如果我确实将我的STM32计时器初始化为1 sek计数(TIM8,预分频器= 16800-1,周期= 10000-1)并想调试(测量引脚输出频率)-它的计时器频率与我观察到的频率相同在示波器上? And it is a right configuration for TIM8 timer Interrupt? 这是TIM8定时器中断的正确配置吗?

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 IRQ处理程序

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. 如我所见,您在TIM8中断中更改了TIM3寄存器。

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. 其次,您在中断例程中检查错误事件(调用此例程,然后CC事件发生,而不是UG事件。设置中断时相同。启用UG中断但服务CC一个。某些uC模型具有这些中断向量没有共享。

BTW What is the point of using HAL library if you change the registers? BTW如果更改寄存器,使用HAL库有什么意义?

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

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