原创 DSP2812初学教程之C2000软件开发基础(2)

2008-9-24 09:42 2957 4 4 分类: 处理器与DSP

 


5、将变量分配到数据段<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


/********************************************************************


 


* 使用#pragma 将变量分配到数据段


 


* C C++ 采用不同的#pragma 形式


 


* 当编译一个C++程序时,编译器将自动定义__cplusplus


 


********************************************************************/


 


//—————————————-


 


#ifdef __cplusplus


 


#pragma DATA_SECTION(”SciaRegsFile”)


 


#else


 


#pragma DATA_SECTION(SciaRegs,”SciaRegsFile”);


 


#endif


 


volatile struct SCI_REGS SciaRegs;


 


//—————————————-


 


#ifdef __cplusplus


 


#pragma DATA_SECTION(”ScibRegsFile”)


 


#else


 


#pragma DATA_SECTION(ScibRegs,”ScibRegsFile”);


 


#endif


 


volatile struct SCI_REGS ScibRegs;


 


 


 


 


6、将数据段映射到寄存器对应的存储空间


/********************************************************************


 


* 存储器 linker.cmd文件


 


* SCI 寄存器文件结构分配到相应的存储空间


 


********************************************************************/


 


MEMORY


 


{


 



 


PAGE 1:


 


SCIA : origin = 0×007050, length = 0×000010 /* SCI-A 寄存器 */


 


SCIB : origin = 0×007750, length = 0×000010 /* SCI-B 寄存器 */


 



 


}


 


SECTIONS


 


{


 



 


SciaRegsFile : > SCIA, PAGE = 1


 


ScibRegsFile : > SCIB, PAGE = 1


 



 


}


 



 


 


7、通信控制器和控制寄存器1的位定义


/********************************************************************


 


* SCI header file


 


********************************************************************/


 


//———————————————————-


 


// SCICCR 通信控制寄存器位定义:


 


//


 


struct SCICCR_BITS { /位功能描述


 


Uint16 SCICHAR:3; // 2:0 字节长度控制


 


Uint16 ADDRIDLE_MODE:1; // 3 ADDR/IDLE 模式控制


 


Uint16 LOOPBKENA:1; // 4 循环自检模式选择


 


Uint16 PARITYENA:1; // 5 极性使能控制


 


Uint16 PARITY:1; // 6 奇偶极性选择


 


Uint16 STOPBITS:1; // 7 停止位长度


 


Uint16 rsvd1:8; // 15:8 保留


 


};


 


//——————————————-


 


// SCICTL1 控制寄存器1位定义:


 


//


 


struct SCICTL1_BITS { /位功能描述


 


Uint16 RXENA:1; // 0 SCI 接收模式


 


Uint16 TXENA:1; // 1 SCI 发送器使能


 


Uint16 SLEEP:1; // 2 SCI 睡眠


 


Uint16 TXWAKE:1; // 3 发送唤醒方法


 


Uint16 rsvd:1; // 4 保留


 


Uint16 SWRESET:1; // 5 软件复位


 


Uint16 RXERRINTENA:1; // 6 接收中断使能


 


Uint16 rsvd1:9; // 15:7 保留


 


};


 


 


 


 


 


8、通信控制器和控制寄存器1的共同体定义


/********************************************************************


 


* SCI header file


 


********************************************************************/


 


union SCICCR_REG {


 


Uint16 all;


 


struct SCICCR_BITS bit;


 


};


 


union SCICTL1_REG {


 


Uint16 all;


 


struct SCICTL1_BITS bit;


 


};


 


 


 


 


9、使用共同体定义寄存器文件结构体


/********************************************************************


 


* SCI header file


 


********************************************************************/


 


//—————————————————————————


 


// SCI Register File:


 


//


 


struct SCI_REGS {


 


union SCICCR_REG SCICCR; // 通信控制寄存器


 


union SCICTL1_REG SCICTL1; // 控制寄存器1


 


Uint16 SCIHBAUD; // 波特率设置寄存器,高位


 


Uint16 SCILBAUD; // 波特率设置寄存器,低位


 


union SCICTL2_REG SCICTL2; // 控制寄存器 2


 


union SCIRXST_REG SCIRXST; // 接收状态寄存器


 


Uint16 SCIRXEMU; // 接收仿真数据缓冲寄存器


 


union SCIRXBUF_REG SCIRXBUF; // 接收数据缓冲寄存器


 


Uint16 rsvd1; // 保留存储空间


 


Uint16 SCITXBUF; // 发送数据缓冲寄存器


 


union SCIFFTX_REG SCIFFTX; // FIFO 发送寄存器


 


union SCIFFRX_REG SCIFFRX; // FIFO 接收寄存器


 


union SCIFFCT_REG SCIFFCT; // FIFO 控制寄存器


 


Uint16 rsvd2; // 保留存储空间


 


Uint16 rsvd3; // 保留存储空间


 


union SCIPRI_REG SCIPRI; // FIFO优先级控制寄存器


 


};


 


 


 


 


10、在C/C++中使用位区操作寄存器


 


/********************************************************************


 


* 用户程序源代码


 


********************************************************************/


 


// 不使用位区定义访问寄存器(.all, .bit不使用)


 


SciaRegs.SCIHBAUD = 0;


 


SciaRegs.SCILBAUD = 1;


 


// SCI-A SCICTL1寄存器的位区写配置信息


 


SciaRegs.SCICTL1.bit.SWRESET = 0;


 


SciaRegs.SCICTL1.bit.SWRESET = 1;


 


SciaRegs.SCIFFCT.bit.ABDCLR = 1;


 


SciaRegs.SCIFFCT.bit.CDC = 1;


 


// Poll (i.e., read) a bit


 


while(SciaRegs.SCIFFCT.bit.CDC == 1) { }


 


// SCI-B SCICTL1/2寄存器写配置信息(使用 .all)


 


ScibRegs.SCICTL1.all = 0×0003;


 


ScibRegs.SCICTL2.all = 0×0000;

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
4
关闭 站长推荐上一条 /3 下一条