DSP技术笔记5--使用C语言操作DSP的寄存器

标签:
dsp教程杂谈 |
《手把手教你学DSP》第7节,使用c语言操作DSP寄存器。附上链接http://v.youku.com/v_show/id_XMjU4MTQyMjk2.html
2、位域长度不小于8;
3、位域可以无域名,这时候只是起到填充调整的作用。
本次实验是用SCI((Serial
Communication Interface)意为“串行通信接口”)的操作作为实例。
重点一,必须得了解的是“位域”。
位域的定义:与结构体定义相仿。
struct 位域名
{类型说明符 位域名 位域长度}
例:
struct bs
{int a:8;int b:2;int c:6;}data;注意这里的分号,否则报错。
说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。
注意:1、位域不可横跨2个字节
实例:
struct SCICCR-BITS
{
Uint16 SCICCHAR:3;字符长度控制位
Uint16 ADDRIDLEMODE:1;
......
Uint16 STOPbits:1;
Uint16 rsvd1:8;高八位地址是保留的,防止地址错位。rasvd1是固定用法。
}
关于位域的详细说明以及使用方法,可以参考百度百科的词条。
重点二,SCICCR的共同体定义。
Union SCICCR-REGS
{};
多个寄存器使用一个存储空间。
这里要注意一下,estern:外部全局变量声明。
volatile的用法很重要,视频中讲:volatile类型修饰过的寄存器可以被外部值改变,否则只能由代码改变。在学NIOS的时候我就注意到过volatile,当时的说法是防止编译器进行不必要的优化。详细讲解可以参考百度百科。(关于百度无耻侵权什么的,这里不讨论)
重点三,寄存器空间地址分配,与物理地址相结合
第一步:用DATA_SECTION的方法将寄存器文件分配到数据空间中的某个数据段。
第二步:在CMD文件中,将这个数据段直接映射到这个外设寄存器所占的存储空间。
通过这两步就可以将寄存器文件同物理寄存器相结合起来。
(1)使用DATA_SECTION方法将寄存器文件分配到数据空间
编译器产生可重新定位的数据和代码模块,这些模块就称为段。这些段可以根据不同的系统配置分配到相应的地址空间,各段的具体分配方式在CMD文件中定义,关于CMD文件,将在下一章节中详细讲解,在采用
硬件抽象层设计方法的情况下,变量可以用
“#pragma
DATA_SECTION”命令分配到特殊的数据空间 在C语言中,“#pragma
DATA_SECTION”的编程方式如下: #pragma DATA_SECTION(symbol"section name");
其中,symbol是变量名,而section name是数据段名,下面以变量sciaRegs和ScibRegs为例
(2)CMD文件,看例程:
MEMORY
{
PAGE1:
SCI_A : orign = 0x007050,length =
0x000010定义数据段的起始地址,和数据长度
SCI_B : orign = 0x007750,length = 0x000010
}
SECTIONS 映射
{
SciaRegsFile :>SCI_A PAGE = 1
ScibRegsFile :>SCI_B PAGE = 1
}
貌似还有其他写法
今天还学会可CCS自动提示的功能使用方法
输入正确的SciaRegs.当输入“.”的时候,CCS就自动提示可调用的位域了,非常方便。
http://s9/middle/65d639d5g783b41fcba98&690可以整体赋值:SciaRegs.SCICCR.all = 0x1f;
可以位域赋值:SciaRegs.SCICCR.bit.SCICHAR = 5;
还可以直接对一个字节直接赋值:SciaRegs.SCHBALL = 0x5d;
注意:若无自动感应提示,则:
首先检查头文件是否导入,其次查寄存器名是否正确,最后重新编译。
这节课就到这里了,下面继续学习CMD文件的写法。
继续加油!赶课设啊,这几天都没背单词了,唉!