[求助] 811定时捕获一直不成功,那位大侠帮我找找错

shower.xu   2012-3-7 22:58 楼主
我使用的是PC7作为CCP4的输入捕获功能,但是无论我PC7怎么变化,始终进不了中断函数,附上timer的设置程序,请那位大侠指点下原因
我注册了中断并使能了中断函数。
程序死在        while (!CPP4_Flag)                                  //  等待捕获输入脉冲
这里,经检查未进中断

/*

 IR_Din --  PC7

*/
#include "IR_CPP4.h"
#include "uartGetPut.h"
#include <stdio.h>

volatile tBoolean CPP4_Flag;
volatile tBoolean T2A_TimerOut;

void Timer2A_ISR(void);
//  定时器16位输入边沿定时捕获功能初始化
void timerInitCapTime(void)
{
    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER2);           //  使能Timer模块
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);            //  使能CCP4所在的GPIO端口PC7/CCP4
    GPIOPinTypeTimer(GPIO_PORTC_BASE,GPIO_PIN_7);           //  配置CCP4管脚为脉冲输入
GPIOPadConfigSet(GPIO_PORTC_BASE,GPIO_PIN_7, GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPU);
    TimerConfigure(TIMER2_BASE, TIMER_CFG_16_BIT_PAIR |     //  配置Timer为16位事件定时器
                                TIMER_CFG_A_CAP_TIME);

    TimerControlEvent(TIMER2_BASE,                          //  控制TimerA捕获负边沿
                      TIMER_A,
                      TIMER_EVENT_NEG_EDGE);

    TimerControlStall(TIMER2_BASE, TIMER_A, true);          //  允许在调试时暂停定时器计数
TimerIntRegister(TIMER2_BASE, TIMER_A,Timer2A_ISR); // 注册中断服务程序
    TimerIntEnable(TIMER2_BASE, TIMER_CAPA_EVENT|
TIMER_TIMA_TIMEOUT);        //  使能TimerA事件捕获中断和超时中断
    IntEnable(INT_TIMER2A);                  //  使能TimerA中断
    IntMasterEnable();                                      //  使能处理器中断
}

//  测量输入脉冲频率并显示
extern void lcd_write_stringxy(unsigned char x,unsigned char y,unsigned char *p);
void pulseMeasure(unsigned char* s)
{
    unsigned short i;
    unsigned short usVal[2];
    char ss[40];

CPP4_Flag = false;
T2A_TimerOut = false;
    TimerLoadSet(TIMER2_BASE, TIMER_A, 0xFFFF);             //  设置计数器初值
    TimerEnable(TIMER2_BASE, TIMER_A);                      //  使能Timer计数
uartPuts("into loop\r\n");
    for (i = 0;  i < 2;  i++)
    {
        while (!CPP4_Flag)                                  //  等待捕获输入脉冲
  if(T2A_TimerOut) break;
        CPP4_Flag = false;                                   //  清除捕获标志
        usVal = TimerValueGet(TIMER2_BASE, TIMER_A);     //  读取捕获值
uartPuts("get value\r\n");
    }

    TimerDisable(TIMER2_BASE, TIMER_A);                     //  禁止Timer计数
    sprintf(ss, "%d ms\r\n", (usVal[0] - usVal[1]) / 6);     //  输出测定的脉冲频率
uartPuts(ss);
// if(!T2A_TimerOut) lcd_write_stringxy(0,2,s);
}


//  Timer2的中断服务函数
void Timer2A_ISR(void)
{
    unsigned long ulStatus;

    ulStatus = TimerIntStatus(TIMER2_BASE, true);           //  读取当前中断状态
    TimerIntClear(TIMER2_BASE, ulStatus);                   //  清除中断状态,重要!

    if (ulStatus & TIMER_CAPA_EVENT)                        //  若是TimerA事件捕获中断
    {
        CPP4_Flag = true;                                    //  置位捕获标志
    }
    if (ulStatus & TIMER_TIMA_TIMEOUT)                      //  若是TimerA计时溢出中断
    {
        T2A_TimerOut = true;                                    //  置位捕获标志
    }
}

回复评论 (2)

在InMasterEnable()之前试着加上
//enable the Timer2A
TimerEnable(TIMER2_BASE, TIMER_A);
点赞  2012-3-8 00:31

我已经在pulseMeasure()函数里写了这一句。

 TimerEnable(TIMER2_BASE, TIMER_A); // 使能Timer计数

所以不应该是这里吧。谢谢你

[ 本帖最后由 shower.xu 于 2012-3-8 11:21 编辑 ]
点赞  2012-3-8 11:20
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复