811定时捕获不成功

[复制链接]
 楼主| 小小猫咪 发表于 2013-8-25 11:45 | 显示全部楼层 |阅读模式
811定时捕获一直不成功,那位大侠帮我找找错我使用的是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;                                    //  置位捕获标志
    }
}




zyf部长 发表于 2013-8-25 11:46 | 显示全部楼层
您用的是keil吧。
 楼主| 小小猫咪 发表于 2013-8-25 11:48 | 显示全部楼层

是,这个有什么关系么?是仿真进不去么?
renyaq 发表于 2013-8-25 11:48 | 显示全部楼层
Keil下使用IntRegister()的方法

在TI Stellarisware里的keil例程下,是不能直接使用IntRegister()方法,注册中断的入口的
 楼主| 小小猫咪 发表于 2013-8-25 11:50 | 显示全部楼层
怎么实现呢
houcs 发表于 2013-8-25 11:50 | 显示全部楼层
在TI的例程里是采用.sct文件来进行编译链接的,下面的内容就是xx.sct里的内容
LR_IROM 0x00000000 0x00040000
{
    ;
    ; Specify the Execution Address of the code and the size.
    ;
    ER_IROM 0x00000000 0x00040000
    {
        *.o (RESET, +First)
        * (InRoot$$Sections, +RO)
    }
    ;
    ; Specify the Execution Address of the data area.
    ;
    RW_IRAM 0x20000000 0x00018000
    {
        ;
        ; Uncomment the following line in order to use IntRegister().
        ;
        ;* (vtable, +First)
        * (+RW, +ZI)
    }
}

将上面的RW_IRAM里的;* (vtable, +First)取消注释,就可以使用了。

    RW_IRAM 0x20000000 0x00018000
    {
        ;
        ; Uncomment the following line in order to use IntRegister().
        ;
       * (vtable, +First)
        * (+RW, +ZI)
    }
 楼主| 小小猫咪 发表于 2013-8-25 11:53 | 显示全部楼层
可以通过修改.s文件里面的中断向量实现么
      EXTERN        Timer2A_ISR
        DCD     Timer2A_ISR                           ; Timer 2A
supernan 发表于 2013-8-25 11:53 | 显示全部楼层


当然可以。
liuzaiy 发表于 2013-8-25 11:55 | 显示全部楼层


记得startup.s里的向量要和器件手册里的一一对应,经常会有搞错的。
liuzaiy 发表于 2013-8-25 11:55 | 显示全部楼层
别放错位置了
 楼主| 小小猫咪 发表于 2013-8-25 11:56 | 显示全部楼层
哦,我知道了,多谢
 楼主| 小小猫咪 发表于 2013-8-25 11:57 | 显示全部楼层
先结贴了哈
pangb 发表于 2013-8-25 11:58 | 显示全部楼层
我以前用过的一些都是
您需要登录后才可以回帖 登录 | 注册

本版积分规则

313

主题

3014

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部