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

[复制链接]
1077|15
 楼主 | 2016-11-1 13:37 | 显示全部楼层 |阅读模式
程序移植到GD32,用的还是ST的外设库,输入捕获一直出问题。其他功能正常。麻烦大家帮看一下。

TIM2初始化
  1. //输入捕获
  2. static void TIM2_Mode_Config(void)
  3. {
  4.     TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
  5.     TIM_ICInitTypeDef  TIM_ICInitStructure;
  6.     TIM_DeInit(TIM2);
  7.    
  8.     /* Time base configuration */
  9.    
  10.     TIM_TimeBaseStructure.TIM_Period = 0xffff;         
  11.     //TIM_TimeBaseStructure.TIM_Prescaler = 719;
  12.     TIM_TimeBaseStructure.TIM_Prescaler = 287;
  13.     TIM_TimeBaseStructure.TIM_ClockDivision = 0;   
  14.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  15.     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  16.    
  17.     TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
  18.     TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
  19.     //TIM输入2,3或4选择对应地与IC1或IC2或IC3或IC4相连
  20.     TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;   

  21.     TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV4;
  22.     //选择输入比较滤波器 0x0 - 0xF
  23.     TIM_ICInitStructure.TIM_ICFilter = 0x8;  //0x8
  24.    
  25.     TIM_PWMIConfig(TIM2, &TIM_ICInitStructure);
  26.    
  27.     /* Select the TIM3 Input Trigger: TI2FP2 */
  28.     TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);
  29.    
  30.     /* Select the slave Mode: Reset Mode */
  31.     TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);
  32.    
  33.     /* Enable the Master/Slave Mode */
  34.     TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);   
  35.    
  36.     /* Enable the CC2 Interrupt Request */
  37.     TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);
  38.    
  39.     /* TIM enable counter */
  40.     TIM_Cmd(TIM2, ENABLE);   
  41. }
复制代码


TIM2中断

  1. void TIM2_ISR(void)
  2. {
  3.         Uint16 IC2Value;

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

  7.                 IC2Value = TIM_GetCapture2(TIM2);
  8.         }

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

  11. }
复制代码


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

STM32中一切正常。

| 2016-11-8 16:42 | 显示全部楼层
GD的可能是边沿触发
| 2016-11-10 21:30 | 显示全部楼层
中断的处理注意的,,中断优先级的也考虑下。
| 2016-11-12 16:35 | 显示全部楼层
看这个能解决你问题吗



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
| 2016-11-21 22:37 | 显示全部楼层
楼上给的资料很全,受教了
 楼主 | 2016-11-24 09:59 | 显示全部楼层
奇怪了。还是不行,谁有GD32库的输入捕捉例程? 贡献一下。
 楼主 | 2016-11-24 11:09 | 显示全部楼层
断点调试的时候,发现一使能就进入中断。
  1. /* Enable the CC2 Interrupt Request */
  2.     TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);
  3.    
  4.     /* TIM enable counter */
  5.     TIM_Cmd(TIM2, ENABLE);  
复制代码


在 TIM_Cmd(TIM2, ENABLE); 执行后直接进入中断,外部并没有脉冲进来。
 楼主 | 2016-11-24 16:02 | 显示全部楼层
终于搞定了,在参考了GD32的例程代码后,发现在设置完触发后,需要重载ARR,并且清除中断标记。

  1. /* Select the TIM3 Input Trigger: TI2FP2 */
  2.     TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);
  3.    
  4.     /* Select the slave Mode: Reset Mode */
  5.     TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);
  6.    
  7.     /* Enable the Master/Slave Mode */
  8.     TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);   

  9.     /* GD32 BEGIN */
  10.     TIM_ARRPreloadConfig(TIM2, ENABLE);         //使能TIM2重载寄存器ARR
  11.     TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);  //清除中断标志位
  12.     /* GD32 END */
  13.    
  14.     /* Enable the CC2 Interrupt Request */
  15.     TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);
  16.    
  17.     /* TIM enable counter */
  18.     TIM_Cmd(TIM2, ENABLE);
复制代码
| 2016-11-25 22:25 | 显示全部楼层
还是从代码部分单步调试的看看
| 2016-11-27 15:33 | 显示全部楼层
两个平台的还是不太一样的,多注意些接处理的
| 2016-11-27 16:14 | 显示全部楼层
这个要先滤清捕获功能的响应处理流程与细节的
| 2016-11-27 19:56 | 显示全部楼层
是不是中断标志位错误
| 2016-11-27 21:11 | 显示全部楼层
这个注意两个库的不同之处的
| 2016-11-27 22:13 | 显示全部楼层
楼主把解决方案给说了,不错,赞一个
| 2017-2-5 14:45 | 显示全部楼层
求输入捕获例程,
| 2018-6-4 16:33 | 显示全部楼层
楼主要是能把源码发一下就更好了
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

快速回复 返回顶部 返回列表