例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;
文章评论(0条评论)
登录后参与讨论