HOOD 发表于 2012-12-22 17:40:16

希望我这个对正在用STM8S做输入捕获,测频的有帮助!

                                    第一部:
            内部时钟   CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);  //16M
            
            第二步:
            配置IO口 我用的是STM8S103k3t6       
            GPIO_Init(GPIOB , GPIO_PIN_0 , GPIO_MODE_IN_PU_NO_IT);//TIM1_CH1   PB0端口
            
            第三步:TIM1初始化,
            注意:
            tim1 分频是16000000/1600 =10000
            那计数一下的时间是!1/10000 S
            向上计数 0到20000  的时间是2S
            
            
            void TIME1_INIT(void)
            {
               TIM1_DeInit();
               TIM1_TimeBaseInit(1600, TIM1_COUNTERMODE_UP, 20000, 0);
               TIM1_ICInit( TIM1_CHANNEL_1, TIM1_ICPOLARITY_RISING, TIM1_ICSELECTION_DIRECTTI , TIM1_ICPSC_DIV8, 0x0);
               TIM1_ITConfig( TIM1_IT_CC1 , ENABLE);
               TIM1_ClearFlag(TIM1_FLAG_CC1);
               TIM1_Cmd(ENABLE);
            }
            
            
            第四步: TIM4用来产生溢出中断用的!
            
            void TIME4_INIT(void)
            {
               TIM4_TimeBaseInit(TIM4_PRESCALER_32 ,250);
               TIM4_ARRPreloadConfig(ENABLE);
               TIM4_PrescalerConfig(TIM4_PRESCALER_32,TIM4_PSCRELOADMODE_IMMEDIATE);
               TIM4_SetAutoreload(250);
               TIM4_Cmd(ENABLE);                  
               TIM4_ITConfig(TIM4_IT_UPDATE,ENABLE);   
            }
            
            
            第五步: TIM1的中断程序  连续进入两次中断,两次计数的值 乘 第三步中计数一下的时间 就是脉宽
            
            //   if(TIM1_GetFlagStatus(TIM1_FLAG_CC1))
               if(TIM1_GetITStatus(TIM1_FLAG_CC1) != RESET)         
               {
                   switch(temp)
                   {
                      case 0: ICValue1=TIM1_GetCapture1();
                              temp=1;
                              break;
                                                                                   
                      case 1: ICValue2=TIM1_GetCapture1();
                              temp=2;
                              break;
                                                   
                     default:
                    TIM1_CCxCmd(TIM1_CHANNEL_1, DISABLE);
                            TIM1_ITConfig(TIM1_IT_CC1, DISABLE);       
                            temp=3;
                            break;
                   }
                   TIM1_ClearITPendingBit(TIM1_IT_CC1);       
                   TIM1_ClearFlag(TIM1_FLAG_CC1);
               }
            
            
            
            第六步:
            TIM4的中断程序
                     if(temp==3)
                     {
                      temp=0;
                    if(ICValue2>ICValue1)
                    {
                       disvalue=ICValue2-ICValue1;
                     }
                    else if(ICValue210) i0=0;
                    display();
                    TIM1_CCxCmd(TIM1_CHANNEL_1, ENABLE);
                            TIM1_ITConfig(TIM1_IT_CC1, ENABLE);
                      }
                              else
                      {
                       display();
                      }
                    TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
            
            
            
            我现在又个问题!我硬件上   PB0 TIM1的捕获口不接任何东西的情况下
            TIM1_ICPSC_DIV8 时 得到的  disvalue 值是40
            TIM1_ICPSC_DIV1   得到的  disvalue   的值是 5
            
            好像精确的不得了  时间那就是 两脉宽时间差是   5/10000S   =  2000HZ 这个到底是什么值  输入口不接任何东西也能进去 捕获中断!
            
             
            图片是我的输入端 接入方法!
             
            我最不明白的就是  为什么 什么都不接 能进入中断
             
                     

weision 发表于 2013-1-1 23:11:07

回复:希望我这个对正在用STM8S做输入捕获,测频的有帮助!

正在学STM8,进来围观。

melodyczw 发表于 2013-10-30 13:06:40

RE:希望我这个对正在用STM8S做输入捕获,测频的有帮助!

你看是否是这个意思:什么都没接,TIM1的计数器是一直在计数,从0记到2000,溢出产生更新事件,进入中断,因此周期就是你设定的2000

jkm99 发表于 2014-10-16 09:45:15

回复:希望我这个对正在用STM8S做输入捕获,测频的有帮助!

谢谢,:lol

织梦狼 发表于 2015-6-13 12:12:45

大大的有用:lol

yangjiawei1223 发表于 2015-9-24 09:47:39

有更完整的工程就好了   还有就是捕获可不可以 不要中断直接在main函数捕获
页: [1]
查看完整版本: 希望我这个对正在用STM8S做输入捕获,测频的有帮助!