打印

DM642定时器中断问题,急需帮助!

[复制链接]
2543|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zjzz1234|  楼主 | 2012-12-15 21:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    刚学DSP,写了一个DSP定时器中断的代码,中断服务程序显示的现象一直无法理解,请大侠指点,主要代码如下,代功能就是每次定时器中断时,把LED的显示状态进行翻转。但是实际跑出来的结果完全不同,也搞不懂它显示规律。
#include <csl.h>
#include <csl_emifa.h>
#include <csl_irq.h>
#include <csl_chip.h>

/*VMDM642的emifa的设置结构*/
EMIFA_Config vmd642ConfigA ={
           0x00052078,/*gblctl EMIFA(B)global control register value */
                                     /*将CLK6、4、1使能;将MRMODE置1;使能EK2EN,EK2RATE*/
           0xffffffd3,/*cectl0 CE0 space control register value*/
                                     /*将CE0空间设为SDRAM*/
           0x73a28e01,/*cectl1 CE1 space control register value*/
                                     /*Read hold: 1 clock;
                                       MTYPE : 0000,选择8位的异步接口
                                       Read strobe :001110;14个clock宽度
                                       TA:2 clock; Read setup 2 clock;
                                       Write hold :2 clock; Write strobe: 14 clock
                                       Write setup :7 clock
                                       --                                         ---------------
                                               \                 14c                /1c
                                               \----------------/ */
           0x22a28a22, /*cectl2 CE2 space control register value*/
       0x22a28a42, /*cectl3 CE3 space control register value*/
           0x57116000, /*sdctl SDRAM control register value*/
           0x0000081b, /*sdtim SDRAM timing register value*/
           0x001faf4d, /*sdext SDRAM extension register value*/
           0x00000002, /*cesec0 CE0 space secondary control register value*/
           0x00000002, /*cesec1 CE1 space secondary control register value*/
           0x00000002, /*cesec2 CE2 space secondary control register value*/
           0x00000073 /*cesec3 CE3 space secondary control register value*/       
};


TIMER_Config MyConfig = {
  0x00000200, /* ctl */
  0x00630000, /* prd */
  0x00000000  /* cnt */
};

/* LED address*/
Uint8 *pled = (Uint8*)0x90080015 ;

extern far void vectors();

void main()
{

    TIMER_Handle hTimer;
        Uint32 dwTimerEventId;
/*----------------------------------------------------------*/
        /*Initialise CSL,初始化CSL库*/
        CSL_init();
/*----------------------------------------------------------*/
        /*EMIFA的初始化,将CE0设为SDRAM空间,CE1设为异步空间
        EMIFA_config(&vmd642ConfigA);
/*----------------------------------------------------------*/
   
    *pled = 0xaa;   /*LED灯初始状态,0为亮,1为灭*/

    /*定时器初始化*/
    hTimer = TIMER_open(TIMER_DEV0, 0);
    dwTimerEventId = TIMER_getEventId(hTimer);
    TIMER_config(hTimer, &MyConfig);

        /*中断向量表的初始化*/
        //Point to the IRQ vector table
    IRQ_setVecs(vectors);
    IRQ_globalEnable(); //全局中断使能 IER|=1<<14
    IRQ_nmiEnable();
    IRQ_map(dwTimerEventId,14); //把定时中断重新映射到 14 MUXH[25:21]=0×02
    IRQ_reset(dwTimerEventId);
    IRQ_enable(dwTimerEventId);

    /*定时器启动*/
    TIMER_start(hTimer);
  
    for(;;)
    {       
    }

}

interrupt void timer0(void)
{
    *pled = ~(*pled);      /*每次中断,LED灯的状态发生翻转*/

}

相关帖子

沙发
zjzz1234|  楼主 | 2012-12-15 22:00 | 只看该作者
补充一下,中断向量表的设置是从标准全程里拷出来的,应该没问题!

使用特权

评论回复
板凳
zjzz1234|  楼主 | 2012-12-16 15:56 | 只看该作者
问题解决了:
    原因是pled对应的地址是个输出地址,所以只能对它进行写操作,而不能读。
    *pled = ~(*pled);   这句话就有问题了。修改之后就成功了。

使用特权

评论回复
地板
jlass| | 2012-12-17 09:30 | 只看该作者
解决了就好

使用特权

评论回复
5
596121344| | 2015-6-27 22:51 | 只看该作者
zjzz1234 发表于 2012-12-16 15:56
问题解决了:
    原因是pled对应的地址是个输出地址,所以只能对它进行写操作,而不能读。
    *pled = ~( ...

能不能问题你怎么修改的呢?

使用特权

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

本版积分规则

1

主题

3

帖子

0

粉丝