簡體   English   中英

STM32定時器頻率等於PWM輸出頻率嗎?

[英]Does STM32 timer frequency equal the PWM output frequency?

我很容易理解問題。 如果我確實將我的STM32計時器初始化為1 sek計數(TIM8,預分頻器= 16800-1,周期= 10000-1)並想調試(測量引腳輸出頻率)-它的計時器頻率與我觀察到的頻率相同在示波器上? 這是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處理程序

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

    }
}

如我所見,您在TIM8中斷中更改了TIM3寄存器。

其次,您在中斷例程中檢查錯誤事件(調用此例程,然后CC事件發生,而不是UG事件。設置中斷時相同。啟用UG中斷但服務CC一個。某些uC模型具有這些中斷向量沒有共享。

BTW如果更改寄存器,使用HAL庫有什么意義?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM