STM8S103K3T6捕获程序,捕获的值错误。有做过的,指点下

2019-12-18 18:50发布

MCU  :  STM8S103K3T6
目的:捕获4路PWM的高电平宽度,频率50HZ 周期20MS  高电平宽度1——2MS     (航模接收机输出的信号,要求捕获这个脉宽值)

写了个测试程序   一路信号接到   TIM1_CH1 通道 利用中断方式  来捕获值。

然后网上找了一些资料,看了一下。 参考下载的资料程序,对照手册   不断测试了,发现就是捕获不到实际的值。

无奈,发帖请教大家 ,如果做过的朋友,请指点下。

以下 是程序部分

中断能进去  上升 下降 中断 都没问题。 就是读取值部分 总是不对。 不知道哪里有误。。




  1. //定时器 设置部分

  2.    enableInterrupts(); //打开总中断

  3.   TIM1_TimeBaseInit(15, TIM1_COUNTERMODE_UP,6000, 0);
  4.   
  5.   //RISING 上升
  6.   TIM1_ICInit( TIM1_CHANNEL_1, TIM1_ICPOLARITY_RISING, TIM1_ICSELECTION_DIRECTTI , TIM1_ICPSC_DIV8, 0x0);
  7.   
  8.   TIM1_ITConfig( TIM1_IT_CC1 , ENABLE);
  9.   
  10.   TIM1_ClearFlag(TIM1_FLAG_CC1);
  11.   
  12.   TIM1_Cmd(ENABLE);       


  13. //TIM1  捕获中断 程序部分

  14. INTERRUPT_HANDLER(TIM1_CAP_COM_IRQHandler, 12)
  15. {
  16.   /* In order to detect unexpected events during development,
  17.      it is recommended to set a breakpoint on the following instruction.
  18.   */
  19.   //是不是上升沿捕获中断
  20.   if((TIM1->CCER1 & TIM1_CCER1_CC1P)==0)//  //与运算 之前是上升沿 还是下降沿中断 如果之前是1 那么下降 那么就是下降沿
  21.   {
  22. //   T1_CAP[0]  = ( TIM1->CCR1H << 8 );
  23. //   T1_CAP[0] |= TIM1->CCR1L;
  24.    
  25.     TIM1->CCR1H=0;
  26.     TIM1->CCR1L=0;
  27.    
  28. //    TIM1->CCER1 &= (uint8_t)(~TIM1_CCER1_CC1P);   //设置 上升沿中断
  29.     TIM1->CCER1 |= TIM1_CCER1_CC1P;                          //设置  下降沿中断
  30.       
  31.   }
  32.   else //下降沿中断
  33.   {
  34.     T1_CAP[1]  = ( TIM1->CCR1H << 8 );
  35.     T1_CAP[1] |= TIM1->CCR1L;;
  36.    
  37.     T1_CAP_VAL=T1_CAP[1]-T1_CAP[0];
  38.    
  39.     TIM1->CCER1 &= (uint8_t)(~TIM1_CCER1_CC1P);     //设置 上升沿中断
  40. //    TIM1->CCER1 |= TIM1_CCER1_CC1P;                    //设置  下降沿中断
  41.   }
  42.   
  43.   TIM1_ClearFlag(TIM1_FLAG_CC1);
  44. // TIM1_ClearITPendingBit(TIM1_IT_CC1) ;      
  45. }
复制代码

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
一心2013
1楼-- · 2019-12-18 20:44
我以前写过,当时虽然用的也是S系列,但我是用寄存器写的。一开始也是老读数不正常,只记得手册上有一句话

TIM1_CCR1L(即计数高位)可以清除标志位,

或也可以软件写零来清除。

就是因为这句话,我把最后一个清除输入捕获标志位给去了。然后就正常了

楼主你也可以试下。
lyg407
2楼-- · 2019-12-19 00:44
一心2013 发表于 2014-11-28 19:25
我以前写过,当时虽然用的也是S系列,但我是用寄存器写的。一开始也是老读数不正常,只记得手册上有一句话
...

行 我试试                 
xyzabc
3楼-- · 2019-12-19 05:38
没有明白你说的实际值,可能你的理解错误,捕获值没有任何意义,只有两次捕获的差值才有意义,而且定时器周期必须大于脉冲周期
lyg407
4楼-- · 2019-12-19 07:32
 精彩回答 2  元偷偷看……
lyg407
5楼-- · 2019-12-19 09:59
一心2013 发表于 2014-11-28 17:33
我以前写过,当时虽然用的也是S系列,但我是用寄存器写的。一开始也是老读数不正常,只记得手册上有一句话
...

第一个回复的,那么 最佳答案就给你了。 谢谢
怪咖
6楼-- · 2019-12-19 12:23
Mark               

一周热门 更多>