打印

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

[复制链接]
1930|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
terrypsp|  楼主 | 2012-3-9 09:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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;                                    //  置位捕获标志
    }
}




相关帖子

沙发
永远的不知| | 2012-3-9 11:30 | 只看该作者
您用的是keil吧。

使用特权

评论回复
板凳
terrypsp|  楼主 | 2012-3-9 11:41 | 只看该作者
您用的是keil吧。
永远的不知 发表于 2012-3-9 11:30

是,这个有什么关系么?是仿真进不去么?

使用特权

评论回复
地板
永远的不知| | 2012-3-9 11:42 | 只看该作者
Keil下使用IntRegister()的方法

在TI Stellarisware里的keil例程下,是不能直接使用IntRegister()方法,注册中断的入口的,通过修改可以实现此功能。

在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)
    }

使用特权

评论回复
5
renyunling18| | 2012-3-9 12:22 | 只看该作者
:)专家威武啊!!!呵呵

使用特权

评论回复
6
terrypsp|  楼主 | 2012-3-9 13:04 | 只看该作者
谢谢!我今晚回去试以下。
另外,可以通过修改.s文件里面的中断向量实现么
      EXTERN        Timer2A_ISR
        DCD     Timer2A_ISR                           ; Timer 2A

使用特权

评论回复
7
永远的不知| | 2012-3-9 16:14 | 只看该作者
谢谢!我今晚回去试以下。
另外,可以通过修改.s文件里面的中断向量实现么
      EXTERN        Timer2A_ISR
        DCD     Timer2A_ISR                           ; Timer 2A
terrypsp 发表于 2012-3-9 13:04


当然可以。

使用特权

评论回复
8
TI_MCU| | 2012-3-9 16:18 | 只看该作者
本帖最后由 TI_MCU 于 2012-3-9 16:22 编辑

记得startup.s里的向量要和器件手册里的一一对应,经常会有搞错的。别放错位置了

使用特权

评论回复
9
爱之翼V| | 2012-3-12 13:56 | 只看该作者
高手云集啊,过来学习一下

使用特权

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

本版积分规则

0

主题

4

帖子

1

粉丝