第6章使用C语言操作DSP的寄存器《手把手教你学DSP——基于TMS320X281X》北京航空航天大学出版社作者:顾卫钢HELLODSP:专业的DSP开发工具和方案供应商,可定制承接项目欢迎访问:联系方式:13776600442《手把手教你学DSP——基于TMS320X281X》北京航空航天大学出版社作者:顾卫钢HELLODSP:专业的DSP开发工具和方案供应商,可定制承接项目欢迎访问:联系方式:137766004426.1寄存器的C语言访问由于DSP的寄存器能够实现对系统和外设功能的配置与控制,因此在DSP的开发过程中,对于寄存器的操作是极为重要的,也是很频繁的,也就是说对寄存器的操作是否方便会直接影响到DSP的开发是否方便。幸好,F2812为大家提供了位定义和寄存器结构体的方式,能够很方便的实现对DSP内部寄存器的访问和控制。6.1.1了解SCI的寄存器寄存器名地址占用空间/16b功能描述SCICCR0x000070501SCI-A通信控制寄存器SCICTL10x000070511SCI-A控制寄存器1SCIHBAUD0x000070521SCI-A波特率设置寄存器高字节SCILBAUD0x000070531SCI-A波特率设置寄存器低字节SCICTL20x000070541SCI-A控制寄存器2SCIRXST0x000070551SCI-A接收状态寄存器SCIRXEMU0x000070561SCI-A接收仿真数据缓冲寄存器SCIRXBUF0x000070571SCI-A接收数据缓冲寄存器SCITXBUF0x000070591SCI-A发送数据缓冲寄存器SCIFFTX0x0000705A1SCI-AFIFO发送寄存器6.1.2使用位定义的方法定义寄存器所谓“位域”就是把一个字节中的二进制位划分为几个不同的区域,并说明每个区域的位数。每个域都有一个域名,允许在程序中按域名进行操作。位域的定义和位域变量的说明同结构体定义和其成员说明类似,其语法格式为:Struct位域结构名{类型说明符位域名1:位域长度类型说明符位域名2:位域长度…类型说明符位域名n:位域长度};例6-1位域定义structbs//定义位域bs{inta:8;intb:2;intc:6;};abc07915例6-2用位域定义SCICCRstructSCICCR_BITS{Uint16SCICHAR:3;//2:0字符长度控制位Uint16ADDRIDLE_MODE:1;//3多处理器模式控制位Uint16LOOPBKENA:1;//4回送测试模式使能位Uint16PARITYENA:1;//5极性使能位Uint16PARITY:1;//6奇/偶极性选择位Uint16STOPBITS:1;//7停止位个数Uint16rsvd1:8;//15:8保留};structSCICCR_BITSbit;bit.SCICHAR=7;//SCI字符长度控制位为8位例6-3SCICCR的共同体定义unionSCICCR_REG{Uint16all;//可实现对寄存器整体操作structSCICCR_BITSbit;//可实现位操作};unionSCICCR_REGSCICCR;SCICCR.all=0x007F;SCICCR.bit.SCICHAR=5;例6-4SCI寄存器的结构体文件structSCI_REGS{unionSCICCR_REGSCICCR;//通信控制寄存器unionSCICTL1_REGSCICTL1;//控制寄存器1Uint16SCIHBAUD;//波特率寄存器(高字节)Uint16SCILBAUD;//波特率寄存器(低字节)unionSCICTL2_REGSCICTL2;//控制寄存器2unionSCIRXST_REGSCIRXST;//接收状态寄存器Uint16SCIRXEMU;//接收仿真缓冲寄存器unionSCIRXBUF_REGSCIRXBUF;//接收数据寄存器Uint16rsvd1;//保留Uint16SCITXBUF;//发送数据缓冲寄存器unionSCIFFTX_REGSCIFFTX;//FIFO发送寄存器unionSCIFFRX_REGSCIFFRX;//FIFO接收寄存器unionSCIFFCT_REGSCIFFCT;//FIFO控制寄存器Uint16rsvd2;//保留Uint16rsvd3;//保留unionSCIPRI_REGSCIPRI;//FIFO优先级控制寄存器};externvolatilestructSCI_REGSSciaRegs;externvolatilestructSCI_REGSScibRegs;例6-5对SCICCR按位进行操作SciaRegs.SCICCR.bit.STOPBITS=0;//1位停止位SciaRegs.SCICCR.bit.PARITYENA=0;//禁止极性功能SciaRegs.SCICCR.bit.LOOPBKENA=0;//禁止回送测试模式功能SciaRegs.SCICCR.bit.ADDRIDLE_MODE=0;//空闲线模式SciaRegs.SCICCR.bit.SCICHAR=7;//8位数据位例6-6对SCICCR整体进行操作SciaRegs.SCICCR.all=0x0007;例6-7对SCIHBAUD和SCILBAUD进行操作SciaRegs.SCIHBAUD=0;SciaRegs.SCILBAUD=0xF3;6.2寄存器文件的空间分配使用DATA_SECTION方法将寄存器文件分配到数据空间将数据段映射到寄存器对应的存储空间例6-8将变量分配到数据段#pragmaDATA_SECTION(SciaRegs,SciaRegsFile);volatilestructSCI_REGSSciaRegs;#pragmaDATA_SECTION(ScibRegs,ScibRegsFile);volatilestructSCI_REGSScibRegs;例6-9将数据段映射到寄存器对应的存储空间MEMORY{……PAGE1:SCI_A:origin=0x007050,length=0x000010SCI_B:origin=0x007750,length=0x000010……}SECTIONS{……SciaRegsFile:SCI_A,PAGE=1ScibRegsFile:SCI_B,PAGE=1……}