打印

输入捕获,STM32移植到GD32出错,只能进一次中断。

[复制链接]
3184|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
程序移植到GD32,用的还是ST的外设库,输入捕获一直出问题。其他功能正常。麻烦大家帮看一下。

TIM2初始化
//输入捕获
static void TIM2_Mode_Config(void)
{
    TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
    TIM_ICInitTypeDef  TIM_ICInitStructure;
    TIM_DeInit(TIM2);
   
    /* Time base configuration */
   
    TIM_TimeBaseStructure.TIM_Period = 0xffff;         
    //TIM_TimeBaseStructure.TIM_Prescaler = 719;
    TIM_TimeBaseStructure.TIM_Prescaler = 287;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;   
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
   
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
    //TIM输入2,3或4选择对应地与IC1或IC2或IC3或IC4相连
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;   

    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV4;
    //选择输入比较滤波器 0x0 - 0xF
    TIM_ICInitStructure.TIM_ICFilter = 0x8;  //0x8
   
    TIM_PWMIConfig(TIM2, &TIM_ICInitStructure);
   
    /* Select the TIM3 Input Trigger: TI2FP2 */
    TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);
   
    /* Select the slave Mode: Reset Mode */
    TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);
   
    /* Enable the Master/Slave Mode */
    TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);   
   
    /* Enable the CC2 Interrupt Request */
    TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);
   
    /* TIM enable counter */
    TIM_Cmd(TIM2, ENABLE);   
}


TIM2中断

void TIM2_ISR(void)
{
        Uint16 IC2Value;

        if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
        {               
                TIM_ClearITPendingBit(TIM2, TIM_IT_CC2); //清除中断标志位

                IC2Value = TIM_GetCapture2(TIM2);
        }

        //此处软件清除也没用
        //TIM2->SR &= ~0x0404;  //软件清除CC2IF和CC2OF标志

}


断点调试的时候,只能进中断一次,IC2Value为0,就再也进不去中断了。

STM32中一切正常。

沙发
wzw2134| | 2016-11-8 16:42 | 只看该作者
GD的可能是边沿触发

使用特权

评论回复
板凳
chuntian2016| | 2016-11-10 21:30 | 只看该作者
中断的处理注意的,,中断优先级的也考虑下。

使用特权

评论回复
地板
zhanzr21| | 2016-11-12 16:35 | 只看该作者
看这个能解决你问题吗



使用特权

评论回复
5
没有六一了| | 2016-11-21 22:37 | 只看该作者
楼上给的资料很全,受教了

使用特权

评论回复
6
金色大元宝|  楼主 | 2016-11-24 09:59 | 只看该作者
奇怪了。还是不行,谁有GD32库的输入捕捉例程? 贡献一下。

使用特权

评论回复
7
金色大元宝|  楼主 | 2016-11-24 11:09 | 只看该作者
断点调试的时候,发现一使能就进入中断。
/* Enable the CC2 Interrupt Request */
    TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);
   
    /* TIM enable counter */
    TIM_Cmd(TIM2, ENABLE);  


在 TIM_Cmd(TIM2, ENABLE); 执行后直接进入中断,外部并没有脉冲进来。

使用特权

评论回复
8
金色大元宝|  楼主 | 2016-11-24 16:02 | 只看该作者
终于搞定了,在参考了GD32的例程代码后,发现在设置完触发后,需要重载ARR,并且清除中断标记。

/* Select the TIM3 Input Trigger: TI2FP2 */
    TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);
   
    /* Select the slave Mode: Reset Mode */
    TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);
   
    /* Enable the Master/Slave Mode */
    TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);   

    /* GD32 BEGIN */
    TIM_ARRPreloadConfig(TIM2, ENABLE);         //使能TIM2重载寄存器ARR
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);  //清除中断标志位
    /* GD32 END */
   
    /* Enable the CC2 Interrupt Request */
    TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);
   
    /* TIM enable counter */
    TIM_Cmd(TIM2, ENABLE);

使用特权

评论回复
9
comeon201208| | 2016-11-25 22:25 | 只看该作者
还是从代码部分单步调试的看看

使用特权

评论回复
10
tongbu2015| | 2016-11-27 15:33 | 只看该作者
两个平台的还是不太一样的,多注意些接处理的

使用特权

评论回复
11
zhangbo1985| | 2016-11-27 16:14 | 只看该作者
这个要先滤清捕获功能的响应处理流程与细节的

使用特权

评论回复
12
电子信使| | 2016-11-27 19:56 | 只看该作者
是不是中断标志位错误

使用特权

评论回复
13
baimiaocun2015| | 2016-11-27 21:11 | 只看该作者
这个注意两个库的不同之处的

使用特权

评论回复
14
quangg| | 2016-11-27 22:13 | 只看该作者
楼主把解决方案给说了,不错,赞一个

使用特权

评论回复
15
1306720549| | 2017-2-5 14:45 | 只看该作者
求输入捕获例程,

使用特权

评论回复
16
xuanchenzhu| | 2018-6-4 16:33 | 只看该作者
楼主要是能把源码发一下就更好了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

82

帖子

3

粉丝