MyCollege1999 2023-11-29 19:04 采纳率: 73.3%
浏览 6
已结题

TIM5捕获4个通道都没有值,怀疑没有进入中断

用STM32F103ZET6的TIM8输出4路PWM,并用TIM5来捕获,现在现象是TIM8的4个寄存器已经配置了,但是捕获的值是0,怀疑没有进入中断,请大家帮看下,谢谢

TIM5初始的代码:

//20231128:尝试TIM5 4个通道一起初始化
void TIM5CapInit(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_ICInitTypeDef  TIM_ICInitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    //使能GPIOA时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    //初始化定时器
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);

    TIM_TimeBaseStructure.TIM_Period = 0xFFFF-1;
    TIM_TimeBaseStructure.TIM_Prescaler = 72-1; //1us,总时间65ms
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    //printf("444 InitFan1OutletFGTIM5CapInit, line %d\r\n", __LINE__);
    TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);

    /* IC2,上升沿触发 TI2FP2 */
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_3 | TIM_Channel_4 | TIM_Channel_2 | TIM_Channel_1;
    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 = 0x0;
    TIM_PWMIConfig(TIM5, &TIM_ICInitStructure);
#if 0
    /* IC2, 下降沿触发,TI2FP1*/
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI;
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
    TIM_ICInitStructure.TIM_ICFilter = 0x0;
    TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);
#endif

    TIM_SelectInputTrigger(TIM5, TIM_TS_TI2FP2);
    TIM_SelectSlaveMode(TIM5, TIM_SlaveMode_Reset);
    TIM_SelectMasterSlaveMode(TIM5,TIM_MasterSlaveMode_Enable);

    TIM_Cmd(TIM5, ENABLE);

    //使能CC捕获中断,主
    TIM_ITConfig(TIM5, TIM_IT_CC3, ENABLE);
    TIM_ITConfig(TIM5, TIM_IT_CC4, ENABLE);
    TIM_ITConfig(TIM5, TIM_IT_CC1, ENABLE);
    TIM_ITConfig(TIM5, TIM_IT_CC2, ENABLE);

    //使能中断
    NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

中断代码如下:

void Timer5ISR(void)
{
    int ret;

    ret = TIM_GetFlagStatus(TIM5, TIM_FLAG_CC1);
    if (ret)
    {
        TIM_ClearITPendingBit(TIM5, TIM_IT_CC1);
        Tim5Ch1Isr();
    }

    ret = TIM_GetFlagStatus(TIM5, TIM_FLAG_CC2);
    if (ret)
    {
        TIM_ClearITPendingBit(TIM5, TIM_IT_CC2);
        Tim5Ch2Isr();
    }

    ret = TIM_GetFlagStatus(TIM5, TIM_FLAG_CC3);
    if (ret)
    {
        TIM_ClearITPendingBit(TIM5, TIM_IT_CC3);
        Tim5Ch3Isr();
    }

    ret = TIM_GetFlagStatus(TIM5, TIM_FLAG_CC4);
    if (ret)
    {
        TIM_ClearITPendingBit(TIM5, TIM_IT_CC4);
        Tim5Ch4Isr();
    }
}

void Tim5Ch1Isr(void)
{
    IC1Value = TIM_GetCapture1(TIM5);
    if (IC1Value != 0)
    {
        rotateSpeed = (30*1000000)/IC1Value;
    }
}

现在加打印,rotateSpeed的值还是0,没有获取过,

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-29 20:05
    关注

    【以下回答由 GPT 生成】

    #include "stm32f1xx.h"
    
    void TIM5_IRQHandler(void){
        if (TIM5->SR & TIM_SR_UIF){
            // Timer overflow interrupt
            // handle overflow event here
            TIM5->SR &= ~TIM_SR_UIF; // Clear interrupt flag
        }
    
        if (TIM5->SR & TIM_SR_CC1IF){
            // Capture/Compare 1 interrupt
            // handle capture event here
            uint32_t capturedValue = TIM5->CCR1; // Get captured value
            TIM5->SR &= ~TIM_SR_CC1IF; // Clear interrupt flag
        }
    }
    
    void TIM5_Init(void){
        RCC->APB1ENR |= RCC_APB1ENR_TIM5EN; // Enable TIM5 clock
    
        TIM5->CR1 |= TIM_CR1_ARPE; // Enable auto-reload preload
        TIM5->CR1 |= TIM_CR1_URS; // Only overflow and update events generate interrupts
        TIM5->DIER |= TIM_DIER_UIE;   // Enable update interrupt
    
        TIM5->CCMR1 |= TIM_CCMR1_CC1S_0; // CC1 channel is configured as input, IC1 is mapped on TI1
        TIM5->CCER |= TIM_CCER_CC1E; // Capture/Compare 1 output enable
        TIM5->CCER |= TIM_CCER_CC1P; // Capture/compare 1 on the falling edge
        TIM5->CCMR1 |= TIM_CCMR1_IC1F; // Input capture 1 filter
    
        TIM5->CR1 |= TIM_CR1_CEN; // Enable timer
    }
    
    int main(){
        TIM5_Init();
    
        while(1){
            // Main program loop
        }
    }
    

    这是一个初步的TIM5初始化代码,具体问题需要进一步调试和排查。以下是一些可能导致捕获值为0的原因和解决方案:

    1. 硬件连接问题:确保TIM5的输入引脚与相应的物理引脚连接正确。

    2. 中断使能问题:在主程序中,确保中断向量表已正确配置,并且中断优先级设置正确。

    3. NVIC配置问题:在TIM5_Init函数中添加以下代码,以使能TIM5的中断向量和优先级:

    cpp NVIC_SetPriority(TIM5_IRQn, 0); // Set interrupt priority (adjust value if necessary) NVIC_EnableIRQ(TIM5_IRQn); // Enable TIM5 interrupt in NVIC

    1. 其他配置问题:检查TIM5的其他配置,例如时钟源、预分频器、计数模式等,确保与要求一致。

    如果以上解决方案都没有解决问题,请提供更多有关问题的细节和调试结果,以便更好地帮助您解决问题。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月13日
  • 已采纳回答 12月5日
  • 创建了问题 11月29日

悬赏问题

  • ¥15 unity从3D升级到urp管线,打包ab包后,材质全部变紫色
  • ¥50 comsol温度场仿真无法模拟微米级激光光斑
  • ¥15 上传图片时提交的存储类型
  • ¥15 VB.NET如何绘制倾斜的椭圆
  • ¥15 arbotix没有/cmd_vel话题
  • ¥15 odoo17的分包重新供应路线如何设置?可从销售订单中实时直接触发采购订单或相关单据
  • ¥15 用C语言怎么判断字符串的输入是否符合设定?
  • ¥15 通信专业本科生论文选这两个哪个方向好研究呀
  • ¥50 我在一个购物网站的排队系统排队,这个排队到号后重新定向到目标网站进行购物,但是有技术牛通过技术方法直接跳过排队系统进入目标网址购物,有没有什么软件或者脚本可以用
  • ¥15 ios可以实现ymodem-1k协议 1024字节传输吗?