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.

dsp2809应用求教

Other Parts Discussed in Thread: SPRC191

以前使用dsp2407,最近才接触2809,感觉很不适应。2809的各种寄存器在程序中没有指定明确的内存地址

以前的2407文件REGS240X_H部分内容如下:

#define IMR                *((volatile int *)0x0004)    /*   Interrupt Mask Register             */
#define IFR                *((volatile int *)0x0006)    /*   Interrupt Flag Register             */
#define SCSR1              *((volatile int *)0x7018)

其中各个寄存器在文件中明确了地址位置。。2809是否也可以采用这种单独定义寄存器内存地址的方式呢 

  • F28x芯片使用的是方法稍微有些不同。

    它是将所有同一类的寄存器放在一起,只给定起始寄存器的地址,之后的寄存器使用偏移地址的方式指定地址,这样可以更高效地实现寻址。

    建议查看一下对应的用户手册会清楚一点。

    另外,头文件中都定义好了所有用要到的寄存器,用户只需要根据识别名使用即可,为什么你一定要知道它们的地址呢?

  •  

    习惯了2407的寻址方式了。直接对应该用到的寄存器直接赋值,代码量小点。。

    补充个问题:

    dsp280x的例程Example_280xEPwmDeadBand(sprc191中的)

    里面DSP280x_PieVect.h中定义了结构体PIE_VECT_TABLE,是指针类型

    DSP280x_PieVect.c中又定义了个PieVectTableInit,是PIE_VECT_TABLE类型的常数量,是服务程序入口地址吗?这点不明白/

    此文件中的后面有

    void InitPieVectTable(void)

    {

             int16         i;

             Uint32 *Source = (void *) &PieVectTableInit;

             Uint32 *Dest = (void *) &PieVectTable;

                      

             EALLOW;

             for(i=0; i < 128; i++)

                       *Dest++ = *Source++;    

             EDIS;

     

             // Enable the PIE Vector Table

             PieCtrlRegs.PIECTRL.bit.ENPIE = 1;        

                               

    }看起来好像是把常量的指针付给变量的PieVectTable?这些个常量的内容并没有指定阿?而且下面的代码B已经将变量PieVectTable映射到向量表的内存地址了,为啥还需要PieVectTableInit的常量初始化呢?

     

    代码B::::#ifdef __cplusplus

    #pragma DATA_SECTION("PieVectTableFile")

    #else

    #pragma DATA_SECTION(PieVectTable,"PieVectTableFile");

    #endif

    struct PIE_VECT_TABLE PieVectTable;

     

    SECTIONS

    {

       PieVectTableFile : > PIE_VECT,   PAGE = 1

     

     

      PIE_VECT    : origin = 0x000D00, length = 0x000100     /* PIE Vector Table */

    以上这段代码是将变量PieVectTable映射到向量表的内存地址吧。

     

    而且在Example_280xEpwmDeadBand.c中还有   PieVectTable.EPWM1_INT = &epwm1_isr;和interrupt void epwm1_isr(void)

    这个是个中断处理程序,把入口地址付给PieVectTable.EPWM1_INT。

    而在例程的DSP280x_DefaultIsr.c文件中给出了各个中断处理程序,其中就有如下代码C

    interrupt void EPWM1_INT_ISR(void)     // EPWM-1

    {

      // Insert ISR Code here

     

      // To receive more interrupts from this PIE group, acknowledge this interrupt

      // PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;

     

      // Next two lines for debug only to halt the processor here

      // Remove after inserting ISR Code

      asm ("      ESTOP0");

      for(;;);

    }

    EPWM1_INT_ISR和epwm1_isr是一个作用吗?

    也就是我把epwm1_isr的代码写入EPWM1_INT_ISR中也能起到处理程序的作用吗?

  • 简单来说,这些内容有三个作用:中断向量表重映射,中断向量地址指定/内存映射和中断向量内容初始化:

    1、中断向量地址默认是在最后面,但实际运行时需要将它copy到0xD00起始的地址,因为在RAM上支持才能保证速度;你的问题,PieVectTableInit的初值,你搜索一下会找到它的初始化。

    2、中断向量地址指定/内存映射:PieVectTable需要在cmd文件中指定到对应的内存中。

    3、将所有中断向量内容进行初始化,统一完成是方便管理,同时也不会漏写,但实际你需要使用其中任何一个时,可以重新覆盖,所以你最后的问题,它们是起相同的作用。