gaonaiweng 发表于 2024-2-22 15:48

遇到TIM1和TIM3配置问题,请求帮助

本帖最后由 gaonaiweng 于 2024-2-22 15:49 编辑

大家好,

我在处理TIM1和TIM3的定时器配置问题时候遇到了问题,希望得到一些指导。这里TIM1被配置为单脉冲模式,同时TIM3负责生成PWM信号。在程序中进行了相应的GPIO和定时器的初始化,但在下载验证时遇到了一些问题。

我配置了TIM1_CH1输出一个脉宽为60%的PWM,TIM3_CH1输出一个脉宽为30%的PWM,而TIM1_CH2作为输入捕获用于接收外部触发信号。然而我并没有得到想要的结果。

有没有人遇到过类似的问题,或者对TIM1和TIM3的配置有一些经验可以分享的?谢谢!

期待大佬们的回复。

tomps 发表于 2024-2-26 09:07

可做参考一下这个代码

本帖最后由 tomps 于 2024-2-26 09:09 编辑

//TIM1
int main(void)
{
    /*
            单脉冲模式
            PA10TIM1_CH1单脉冲输出通道
            PA8   TIM1_CH2输入捕获,用来捕获上升沿
    */

    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
    TIM_OCInitTypeDefTIM_OCInitStructure;
    TIM_ICInitTypeDefTIM_ICInitStructure;
    TIM_BDTRInitTypeDef TIM_BDTRInitStruct;

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

    //PA10TIM1_CH1单脉冲输出通道      
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_6);
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    //PA8   TIM1_CH2输入捕获,用来捕获上升沿
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_6);   
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.TIM_Period = 9999;                                    //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    TIM_TimeBaseStructure.TIM_Prescaler = (SystemCoreClock / 1000000 - 1);      //设置用来作为TIMx时钟频率除数的预分频值不分频
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;                              //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_RepetitionCounter = 1 - 1;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;               //TIM向上计数模式
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

    //输出比较结构体
    TIM_OCStructInit(&TIM_OCInitStructure);
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;                  //配置为PWM模式2
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;      //CCER: CCxE 输出使能
    TIM_OCInitStructure.TIM_Pulse = 0;                              //设置跳变时间
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;            //CCxP 输出通道电平极性配置
    TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
    TIM_OC1Init(TIM1,&TIM_OCInitStructure);      
    TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
//   
    TIM_ICStructInit(&TIM_ICInitStructure);
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
    TIM_ICInitStructure.TIM_ICFilter = 0;
    TIM_ICInit(TIM1,&TIM_ICInitStructure);   

    TIM_ARRPreloadConfig(TIM1, ENABLE);                                 //CR1:ARPE = 1,使能TIMx在ARR上的预装载寄存器

    TIM_SelectOnePulseMode(TIM1, TIM_OPMode_Single);
    TIM_SelectInputTrigger(TIM1, TIM_TS_TI2FP2);
    TIM_SelectSlaveMode(TIM1,TIM_SlaveMode_Trigger);

    TIM_SetCounter(TIM1,0);
    TIM_CtrlPWMOutputs(TIM1, ENABLE);   
    TIM_Cmd(TIM1, ENABLE);

    while(1){
            
    }
}

//TIM2
int main(void)
{
    /*
            单脉冲模式
            PB3   TIM2_CH1单脉冲输出通道
            PB4   TIM2_CH2输入捕获,用来捕获上升沿
    */

    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
    TIM_OCInitTypeDefTIM_OCInitStructure;
    TIM_ICInitTypeDefTIM_ICInitStructure;

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

    //PB3TIM2_CH1单脉冲输出通道      
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_7);
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    //PB4   TIM2_CH2输入捕获,用来捕获上升沿
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_7);   
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.TIM_Period = 9999;                                    //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    TIM_TimeBaseStructure.TIM_Prescaler = (SystemCoreClock / 1000000 - 1);      //设置用来作为TIMx时钟频率除数的预分频值不分频
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;                              //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;               //TIM向上计数模式
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

    //输出比较结构体
    TIM_OCStructInit(&TIM_OCInitStructure);
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;                  //配置为PWM模式2
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;      //CCER: CCxE 输出使能
    TIM_OCInitStructure.TIM_Pulse = 5000;                              //设置跳变时间
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;            //CCxP 输出通道电平极性配置
    TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
    TIM_OC1Init(TIM2,&TIM_OCInitStructure);      
    TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);

    TIM_ICStructInit(&TIM_ICInitStructure);
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
    TIM_ICInitStructure.TIM_ICFilter = 0;
    TIM_ICInit(TIM2,&TIM_ICInitStructure);

    TIM_ARRPreloadConfig(TIM2, ENABLE);                                 //CR1:ARPE = 1,使能TIMx在ARR上的预装载寄存器

    TIM_SelectOnePulseMode(TIM2, TIM_OPMode_Single);

    TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);
    TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Trigger);

    TIM_SetCounter(TIM2,0);
    TIM_CtrlPWMOutputs(TIM2, ENABLE);   
    TIM_Cmd(TIM2, ENABLE);
    while(1){
            
    }
}

jcky001 发表于 2024-2-27 10:48

检查时钟配置

两只袜子 发表于 2024-2-27 12:00

检查定时器初始化,包括设置预分频器、自动重载值、捕获/比较寄存器等。

cr315 发表于 2024-2-27 14:00

检查GPIO配置是否正确

duo点 发表于 2024-2-27 16:02

PWM配置有误?

七毛钱 发表于 2024-2-27 17:00

检查输入捕获配置

内政奇才 发表于 2024-2-27 18:26

如果你在使用中断来处理输入捕获或PWM事件,确保你已经正确配置了中断优先级和使能了相应的中断。此外,你还需要编写适当的回调函数来处理这些事件。
页: [1]
查看完整版本: 遇到TIM1和TIM3配置问题,请求帮助