打印
[STM8]

stm8l152c6输入捕获

[复制链接]
5530|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 totti.lu 于 2014-4-1 19:14 编辑

  TIM1_TimeBaseInit(0x0010, TIM1_CounterMode_Up, 0xffff, 0x00);
  TIM1_PWMIConfig(TIM1_Channel_1, TIM1_ICPolarity_Rising,TIM1_ICSelection_DirectTI, TIM1_ICPSC_DIV1, 0x03);
  TIM1_SelectInputTrigger(TIM1_TRGSelection_TI1FP1);//101:滤波后的定时器输入1(TI1FP1),
  TIM1_SelectSlaveMode(TIM1_SlaveMode_Reset);//100:复位模式– 在选中的触发输入(TRGI)的上升沿时重新初始化计数器,并且产生一个更新寄存器的信号
  TIM1_ITConfig(TIM1_IT_CC1, ENABLE);
  TIM1_ITConfig(TIM1_IT_CC2, ENABLE);
  TIM1_Cmd(ENABLE);
很奇怪,我使能了输入捕获1,2通道,中断发生时却是3,4通道标志位以及溢出标志位改变,有谁遇到过这种情况吗

sss.bmp (513.93 KB )

sss.bmp
沙发
mmuuss586| | 2014-4-1 12:21 | 只看该作者
没遇到过,帮顶

使用特权

评论回复
板凳
nienianhong| | 2014-4-1 13:06 | 只看该作者
没有用过152的!

使用特权

评论回复
地板
totti.lu|  楼主 | 2014-4-1 19:20 | 只看该作者
哪位高手帮看看啊,实在搞不定啦,CC1IF,CC2IF没有置位,但还是照样能进中断,搞不懂,搞不懂

使用特权

评论回复
5
FAQ| | 2014-4-1 22:28 | 只看该作者
本帖最后由 FAQ 于 2014-4-1 22:34 编辑

  TIM1_ICInit( TIM1_CHANNEL_1, TIM1_ICPOLARITY_FALLING, TIM1_ICSELECTION_DIRECTTI,
               TIM1_ICPSC_DIV8, 0x0);


这个是STM8S的代码你看下。STM8L输入捕获我测试通过了。

注意这个TIM1_ICSELECTION_DIRECTTI

使用特权

评论回复
6
FAQ| | 2014-4-2 09:22 | 只看该作者
本帖最后由 FAQ 于 2014-4-2 09:23 编辑

这个是TIM1 CH2  PIN33/PD4脚上进行输入捕获的配置,你看下,我测试通过了。

注意红色部分代码。

void Tim1Config(void)
{
  /* Enable TIM1 CLK */
    CLK_PeripheralClockConfig(CLK_Peripheral_TIM1, ENABLE);
    /* Set the Prescaler value */
    TIM1->PSCRH = (uint8_t)(TIM1_PRESCALER>>8);
    TIM1->PSCRL = (uint8_t)(TIM1_PRESCALER);
   
   
    /* Set the Autoreload value */
    TIM1->ARRH = (uint8_t)(TIM1_PERIOD >> 8);
    TIM1->ARRL = (uint8_t)(TIM1_PERIOD);
   

    /* TI1 Configuration */

    /* Disable the Channel 2: Reset the CCE Bit */
    TIM1->CCER1 &= (uint8_t)(~TIM1_CCER1_CC2E);

    /* Select the Input and set the filter */
    TIM1->CCMR2  = (uint8_t)((uint8_t)(TIM1->CCMR2 & (uint8_t)(~(uint8_t)( TIM1_CCMR_CCxS | TIM1_CCMR_ICxF )))
                             | (uint8_t)(((CCMR_TIxDirect_Set)) | ((uint8_t)( 0x00 << 4))));

    /* Select the Polarity */

    //TIM2->CCER1 &= (uint8_t)(~TIM2_CCER1_CC1P);//上升沿
    TIM1->CCER1 |= TIM1_CCER1_CC2P;//下降沿

    /* Set the CCE Bit */
    TIM1->CCER1 |= TIM1_CCER1_CC2E;
   
   
   


    /* Reset the IC2PSC Bits &Set the IC2PSC value */
    TIM1->CCMR2 = (TIM1->CCMR2 & 0xF3)| TIM1_ICPSC_DIV1;
    TIM1->CR1 |= 0x01;//使能TIM2


   
   
   
    /* Enable the Interrupt sources */
    TIM1->IER |= TIM1_IT_CC2;
    TIM1->IER |= TIM1_IT_Update;
}

使用特权

评论回复
评论
28182900 2016-5-25 15:06 回复TA
mark 
7
FAQ| | 2014-4-2 09:25 | 只看该作者

使用特权

评论回复
8
totti.lu|  楼主 | 2014-4-3 09:49 | 只看该作者
FAQ 发表于 2014-4-2 09:22
这个是TIM1 CH2  PIN33/PD4脚上进行输入捕获的配置,你看下,我测试通过了。

注意红色部分代码。

感谢你的回复,看了你的代码,应该只是捕捉一个PWM信号的频率,而我需要捕捉PWM信号的频率和占空比,所以还是有点区别。

使用特权

评论回复
9
tianheyun| | 2014-11-4 13:39 | 只看该作者
日我也遇到了。不清楚咋回事。使能的是CC2IE. 进入中断入口后SR标志位却是CC1IF置1,但是可以进入CC2的中断处理

使用特权

评论回复
10
yhy630| | 2015-7-16 17:47 | 只看该作者
我用TIM2 通道1测量PWM的周期和高电平时间,通过。代码如下:
   CLK_PeripheralClockConfig(CLK_Peripheral_TIM2, ENABLE);//设置TM2时钟源,使能  
     // /*
       TIM2_PWMIConfig(TIM2_Channel_1,TIM2_ICPolarity_Rising ,
                        TIM2_ICSelection_DirectTI,TIM2_ICPSC_DIV1,8);
      //通道2为信号输入,上升沿,直接输入,无分频,8个滤波时间
      TIM2_SelectInputTrigger (TIM2_TRGSelection_TI1FP1);//101:滤波后的定时器输入1(TI1FP1),
       // TIM2->SMCR |=0X04;// 复位
      TIM2_SelectSlaveMode(TIM2_SlaveMode_Reset);//100 复位模式– 在选中的触发输入(TRGI)的上升沿时重新初始化计数器,
         //                                        并且产生一个更新寄存器的信号
      TIM2_ITConfig(TIM2_IT_CC2 ,ENABLE);//使能中断 捕获中断
       TIM2_ITConfig(TIM2_IT_CC1 ,ENABLE);//使能中断 捕获中断
       TIM2_Cmd(ENABLE);///计数器使能,开始计数
//////////////////////////////////////
寄存器方式:
  TIM2->CCER1&=0XEE;//禁止输入捕获1,2
      TIM2->CCMR1 |=0x01;// ch1到ti1fp1
      TIM2->CCER1&= 0xec;//ch1 上升沿触发
    TIM2->CCMR2 |=0x02;// ch2选择 ti1fp2上
    TIM2->CCER1|= 0x20;//ch1 下降沿触发 ic2
    TIM2->SMCR |=0X54;//选源触发源和触发方式 复位
    TIM2->IER |=0x06;//使能中断ch1 ch2
    TIM2->CCER1 |= 0x11;//使能输入捕获1,2
    TIM2_Cmd(ENABLE);
///////////////////////
中断
INTERRUPT_HANDLER(TIM2_CC_USART2_RX_IRQHandler,20)
{
    /* In order to detect unexpected events during development,
       it is recommended to set a breakpoint on the following instruction.
    */
     if(TIM2_GetITStatus(TIM2_IT_CC1))
     {
        TIM2_ClearITPendingBit(TIM2_IT_CC1);
        CCR1_Val=TIM2_GetCapture1();
        
     }
      if(TIM2_GetITStatus(TIM2_IT_CC2))
     {
        TIM2_ClearITPendingBit(TIM2_IT_CC2);
        CCR2_Val=TIM2_GetCapture2();
     }
      
}

使用特权

评论回复
11
28182900| | 2016-5-25 15:08 | 只看该作者
mark

使用特权

评论回复
12
孙鑫1234| | 2016-6-8 16:53 | 只看该作者
你们的库函数是在哪个文件找到的啊?

使用特权

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

本版积分规则

2

主题

4

帖子

1

粉丝