以前使用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是否也可以采用这种单独定义寄存器内存地址的方式呢
10#:
F28x芯片使用的是方法稍微有些不同。
它是将所有同一类的寄存器放在一起,只给定起始寄存器的地址,之后的寄存器使用偏移地址的方式指定地址,这样可以更高效地实现寻址。
建议查看一下对应的用户手册会清楚一点。
另外,头文件中都定义好了所有用要到的寄存器,用户只需要根据识别名使用即可,为什么你一定要知道它们的地址呢?
以前使用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是否也可以采用这种单独定义寄存器内存地址的方式呢
grant yang:
回复 10#:
习惯了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中也能起到处理程序的作用吗?
以前使用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是否也可以采用这种单独定义寄存器内存地址的方式呢
grant yang:
回复 10#:
谢谢!