This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

C6747进入不了定时器中断



我的程序是:

#include "stdio.h"
#include "C6747.h"

Uint16 c=0;
Uint16 *LED = (Uint16 *)0x64000012; ///led add
Uint16 led[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

void interrupt LEDINT() //中断响应函数
{
CSR&=0xfffe; // 关中断 GIE=0

asm(" NOP 1 ");

ICR = 0xFFF0; //中断清除寄存器,清除中断4~15
c++;
//GPIO_OUT_DATA23=~GPIO_OUT_DATA23;
TIMER0_INTCLSTAT=0x00000003; // 清除定时器中断标志
asm(" NOP 1 ");

CSR=CSR|0x1; // 开中断
}

void initTIMER0(void)
{

TIMER0_TGCR=0x00000015; //采用32位独立定时器12
TIMER0_TIM12=0x00000000;
TIMER0_PRD12=0x00ffffff; //周期值,改变其值的大小可以改变灯的亮灭频率
TIMER0_EMUMGT=0x00000001; //设置定时器为自由的模式
TIMER0_INTCLSTAT=0x00000003;//开定时器中断
TIMER0_TCR=0x00000080;//开定时器0

INTmux1=0x00000004; //中断事件选择寄存器,将事件tim12(为中断4)与中断4联系在一起,不知道这样讲事件与中断连接在一起是否正确
ISTP=0x80000000; //重置中断向量表
ICR=0xfff0; //中断清除寄存器,清除中断4~15
ISR=0x0000; //中断设置寄存器,清除等待的中断
IER=0xffff; // 使能中断
// CSR=CSR|0x1; // 开中断/* */
}

void main( void )
{
unsigned int i;
/* Initialize OMAPL137*/
C6747_init(); //初始化6747核
GPIO_DIR23=0x0000; //设置IO口为输出模式
initTIMER0(); //初始化定时器0
CSR=CSR|0x1; //开总中断,设置GIE=1
//GPIO_OUT_DATA23=0x0000;//关闭LED
*LED=0xffff; //关闭LED
for(i=0;i<100;i++);//延时
while(1)
{

if(c==8) c=0;

*LED=led[c];
}
}

单步执行的话只在main函数中的while循环中进行,而不进入中断,在板子上的led灯只显示0xfe作用的效果,并且定时器寄存器TIM12的值不发生改变,请帮忙看一下我的程序那里出现问题了?

  • TIM12寄存器值不变,像是定时器没运行。你用的是外部时钟给timer, TM64P0_IN12管脚给的频率是多快的?手册上要求<OSCIN/4.

  • 我设置错了,应该是内部的时钟给timer,我重新设置为TIMER0_TCR=0x00000080,但是还进入不了中断,tim12已经可以有改变了,但是定时时间到了prd12的值之后还是不产生中断 ,请帮忙再看看吧  非常感谢

  • INTmux1=0x00000000这句没有把TINT12中断事件绑定到INT4~15。

    TINT12中断事件号是4,如果要绑定到INT4, 则设成
    INTmux1=0x4.

  • 我试过了,还是没有什么用,中断程序部分进入不了,我想可能是两方面的问题1、定时器某些寄存器没设置好,2、关于中断的寄存器没设置好,但是在我所知道设置内容已经全部设置了,请帮忙看一下还有什么没有设置,或者是否有些寄存器设置出现错误了,非常感谢

  • 先查看一下中断事件有没有发生:INTCTLSTAT.PRDINTSTAT12=1?EVTFLAG0.EF4=1? IFR相应位=1?

    再查看中断使能位有没有使能:INTCTLSTAT.PRDINTEN12=1? IER相应位=1?GIE=1?

    如果以上这些位都正确,在中断向量表相应的中断矢量处设置断点,看是否能停在该断点处?

  • 我测试了一下,首先,您上面说的相关设置都是正确的,然后,就是您是的在中断向量表相应的中断矢量处设置断点,我的理解是咋子重置中断向量地址处设置的断点即ISTP=0x00300000;   //中断向量表到0c00h处设置的断点,运行到此处的时候程序继续向下运行,直到运行到while循环的时候才停下来,此时继续单步执行程序,led灯是没反应的。请问1、我理解的断点设置位置正确吗?2、如果设置正确断点处要执行好几步才停下来为什么?接下来怎么办?非常感谢

  • 今天又试了一下,程序稍微有一些改动(如第一个帖子),查看了定时器中断状态位,发现定时时间到的时候定时器中断状态位变为1,说明定时器中断已经产生,但是就是不进入中断程序。我还查看了中断标志寄存器IFR和中断设置寄存器ISR,发现4~7中断的中断标志位为1(程序刚开始的时候两寄存器的值都是0)。

  • 建议参考一下下面rCSL库里的timer点灯例程C:\ti\quickStartOMAPL1x_rCSL\quickStartOMAPL1x_rCSL\OMAPL1x\rCSL_examples\evmOMAPL137\DSP_examples\timer\TIMER_led_blink_frequency_dspL137。

    http://processors.wiki.ti.com/index.php/QuickStartOMAPL1x_rCSL