原创 STM32 TIM8的输入捕获.请教高手!

2010-3-9 13:49 7185 9 10 分类: MCU/ 嵌入式
思路:
用IO 口PC6 检测市电220V输入(硬件已整形为方波);
我的思路.
220V市电50HZ=20ms
Tim8系统时钟:72MHZ
已经将IO系统时钟及TIM8时钟设置好,且PC6配置为浮空输入

    /*  TIM8 channel 1 pin (PC.06) configuration */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
  

TIM8设置如下.:
void tim8ch1_config(void) 
{
  TIM_ICInitTypeDef  TIM_ICInitStructure;

  
  TIM_DeInit(TIM8);
  TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_ICAP;                 //配置为输入捕获模式          
  TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;                     //选择通道1
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;       //输入上升沿捕获  
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;   // 通道方向选择   
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;               //每次检测到捕获输入就触发一次捕获
  TIM_ICInitStructure.TIM_ICFilter = 0x4;                            //
  TIM_ICInit(TIM8, &TIM_ICInitStructure);
 
  TIM_PrescalerConfig(TIM8, 71, TIM_PSCReloadMode_Immediate);//72M/72=1M

   /* Select the TIM8 Input Trigger: TI2FP2 【输入触发源选择】*/
   TIM_SelectInputTrigger(TIM8,TIM_TS_TI2FP2);                      //参考TIM结构图选择滤波后的TI2输入    寄存器SMCR
        
  /* Select the slave Mode: Reset Mode */
  TIM_SelectSlaveMode(TIM8,TIM_SlaveMode_Reset);          //复位模式-选中的触发输入(TRGI)的上升沿初始化计数器,并且产生一个更新线号
        
  /* Enable the Master/Slave Mode */
  TIM_SelectMasterSlaveMode(TIM8,TIM_MasterSlaveMode_Enable);        //启动定时器的被动触发.
  
 TIM_ITConfig(TIM8, TIM_IT_CC1, ENABLE);        //打开中断
  
  TIM_Cmd(TIM8, ENABLE);                         //启动TIM8
  
  Tim8_SetupNVIC();
}
中断配置:
void Tim8_SetupNVIC(void)
{   
  NVIC_InitTypeDef NVIC_InitStructure;
#ifdef  VECT_TAB_RAM
  /* Set the Vector Table base location at 0x20000000 */
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */
  /* Set the Vector Table base location at 0x08000000 */
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
  /* Enable the TIM2 gloabal Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = TIM8_CC_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

中断里面做的事情:
void TIM8_CC_IRQHandler(void)
{
   if (TIM_GetITStatus(TIM8, TIM_IT_CC1) != RESET)
  {
   TIM_ClearITPendingBit(TIM8, TIM_IT_CC1);  
       if(HW_flag==0 )
       { 
             IC1[HW_NUM]=TIM8->CCR1;
             if ( IC1[HW_NUM] != 0)
             {
                   // IC2[HW_NUM]=TIM8->CCR2;
                    IC1[HW_NUM]=TIM8->CCR1;
              }
        } 
  
        HW_NUM++;
        if(HW_NUM>=14)
        {
            HW_NUM=0;
         
         HW_flag=1;
        }
 
  }

  
}

结果:
IC1[0]=687;IC1[1]=0;IC1[2]=0;IC1[3]=0;IC1[4]=0;IC1[5]=0;IC1[6]=0;IC1[7]=0;IC1[8]=0;IC1[9]=0;IC1[10]=0;IC1[11]=0;IC1[12]=0;IC1[13]=0;

怎么不对呢.郁闷两天了,快要崩溃了..

文章评论1条评论)

登录后参与讨论

用户547841 2010-3-10 17:27

问题解决了.是硬件搭线没接好.TIM8定时器作为普通定时器输入捕获的配置是正确的. 可以正确得到计算器的值, 我的分频系统有一点儿小了.我现在的分频系数是720; 即:TIM_PrescalerConfig(TIM8, 719, TIM_PSCReloadMode_Immediate);//72M/720=100K 得到的结果很稳定: IC1[0]=2000;IC1[1]=2000;IC1[2]=2001;IC1[3]=2000;IC1[4]=2001;IC1[5]=2000;IC1[6]=2000;IC1[7]=2000;IC1[8]=2000;IC1[9]=2000;IC1[10]=2000;IC1[11]=2000;IC1[12]=2000;IC1[13]=2000;
相关推荐阅读
用户547841 2011-01-05 21:36
DC power supply
...
用户547841 2010-12-23 14:34
PCF8563 我自己的面包板,支持原创!!
我自己焊了个面包板,自己测试软件和硬件,确认是没有问题的。#include<STC12C5A.h>//#include <reg52.h>   //调用头文件(单片机内部的寄存...
用户547841 2010-12-23 14:31
工程硕士专业课,中科院
 ...
用户547841 2010-10-13 07:52
PCF8563驱动程序演示实验
PCF8563驱动程序演示实验一、实验目的PCF8563是一款性价比极高的时钟芯片。它已被广泛用于电表、水表、气表、电话、传真机、便携式仪器以及电池供电的仪器仪表等产品领域。本实验示例展示了如何在Sm...
用户547841 2010-10-13 07:26
单片机
...
用户547841 2010-10-06 21:32
data xdata code
keil c51 v8.08汉字支持能力太差了。显示的注释就跟乱码似的,根本没法看。换掉!Keil C51 V8.02注释的汉字倒是没有错误了,但一注解汉字,过一会立刻找不到鼠标的定位点,然后就程序出...
我要评论
1
9
关闭 站长推荐上一条 /2 下一条