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

标签 c timer stm32

我的问题很容易理解。当我将 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 模型有一些共享的中断 vector 。

顺便说一句,如果更改寄存器,使用 HAL 库有什么意义?

关于c - STM32定时器频率等于PWM输出频率吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53007469/

相关文章:

c - 结构体数组内存 realloc stderr

c - 就 cpu 而言,coSTLy 如何成为低争用互斥体

arm - PWM DMA 到整个 GPIO

c - 将自动变量的指针传递给 DMA 函数

arm - STM32清除中断标志的正确方法

c - 如何将给定基数中任意长度整数的字符串表示形式转换为十进制?

c - 在c代码中只读取文件中的一行

java - java中递归方法的时间限制

java - 使用具有不同预期间隔的计时器执行周期性任务

c# - 如何让 C# 计时器在创建它的同一线程上执行?