6092|4

1万

帖子

28

TA的资源

裸片初长成(高级)

楼主
 

【C2000使用经验】CCS的绝对地址定位 [复制链接]



一、概述
绝对地址定位,对于控制类(或叫嵌入式)编程人员来说,是必须使用的方法。不同的编译器有不同的定位方法。
相信控制类编程人员都使用过51机,一个较普遍的编译器Keil,它对绝对地址是这样操作的:
1、先定义地址:
#define            MOSI                P1_1   (P1_1已在头文件中定义了地址)
#define            CLK                P1_0
2、向绝对地址送数据:
……
MOSI=1;
这样就完成对绝对地址的操作。
一个用着非常好的编译器IAR,也是直接定义地址而后使用的:
1、定义地址:
#define USART1   ((USART_TypeDef *) USART1_BASE)
USART1_BASE是在其它地方已经定义了的绝对地址,USART_TypeDef是一个结构体,用于操作USART1_BASE基地址下的几个寄存器。
2、使用直接地址:
……
USART1->DR =0x5a;

在CCS中,当然也可以同以上方法使用,然而,TI不建议这样用,它评论使用#define宏的观点是:
优点:
--简单、快速、容易;
--变量名与寄存器名相匹配,容易记忆
缺点:
--位域不容易存取,必须使用位掩膜去操纵;
--在CCS的监视窗口中不容易看到位域;
--宏不能发挥CCS中的自动完成特性;
--宏在重复外设的重用上体现不出优势
TI的观点是对是错笔者评论不了。对直接地址的控制效率,不仅与编译器有关,也与CPU的结构有关。

二、位域和寄存器文件结构
CCS使用位域和寄存器文件来代替#define宏,实现对寄存器的操作的。
---寄存器文件结构:
寄存器文件是外设寄存器的集合,这些寄存器在C/C++中作为结构的成员互相成组,称作寄存器文件结构。这些寄存器文件结构在编译时,在存储器中直接对应于外设寄存器。在编译时,这种对应关系有利于CPU的数据指针对寄存器的操作。
--位域定义:
对于每一寄存器结构,位域可以分配一个名字和宽度,编译器可以单个控制寄存器内定义的位域。
下面将以SCI外设为例,说明寄存器文件结构。
例1,以#define宏定义的寄存器控制方法
#define SCICCRA         (volatile Uint16 *)0x7050 // 0x7050 SCI-A 通讯控制寄存器
#define SCICTL1A         (volatile Uint16 *)0x7051 // 0x7051 SCI-A 控制寄存器1
#define SCIHBAUDA        (volatile Uint16 *)0x7052 // 0x7052 SCI-A 波特率寄存器,高位
#define SCILBAUDA        (volatile Uint16 *)0x7053 // 0x7053 SCI-A 波特率寄存器,低位
#define SCICTL2A        (volatile Uint16 *)0x7054 // 0x7054 SCI-A 控制寄存器2
#define SCIRXSTA         (volatile Uint16 *)0x7055 // 0x7055 SCI-A 接收状态寄存器
#define SCIRXEMUA        (volatile Uint16 *)0x7056 // 0x7056 SCI-A 接收数据仿真缓冲器
#define SCIRXBUFA        (volatile Uint16 *)0x7057 // 0x7057 SCI-A 接收数据缓冲器
#define SCITXBUFA        (volatile Uint16 *)0x7059 // 0x7059 SCI-A 发送数据缓冲器
#define SCIFFTXA        (volatile Uint16 *)0x705A // 0x705A SCI-A 发送FIFO
#define SCIFFRXA        (volatile Uint16 *)0x705B // 0x705B SCI-A 接收FIFO
#define SCIFFCTA        (volatile Uint16 *)0x705C // 0x705C SCI-A 控制FIFO
#define SCIPRIA         (volatile Uint16 *)0x705F // 0x705F SCI-A 优先控制
#define SCICCRB         (volatile Uint16 *)0x7750 // 0x7750 SCI-B 通讯控制
#define SCICTL1B         (volatile Uint16 *)0x7751 // 0x7751 SCI-B 控制寄存器1
#define SCIHBAUDB        (volatile Uint16 *)0x7752 // 0x7752 SCI-B 波特率寄存器,高位
#define SCILBAUDB        (volatile Uint16 *)0x7753 // 0x7753 SCI-B 波特率寄存器,低位
#define SCICTL2B         (volatile Uint16 *)0x7754 // 0x7754 SCI-B 控制寄存器2
#define SCIRXSTB         (volatile Uint16 *)0x7755 // 0x7755 SCI-B 接收状态寄存器
#define SCIRXEMUB        (volatile Uint16 *)0x7756 // 0x7756 SCI-B 接收数据仿真缓冲器
#define SCIRXBUFB        (volatile Uint16 *)0x7757 // 0x7757 SCI-B 接收数据缓冲器
#define SCITXBUFB        (volatile Uint16 *)0x7759 // 0x7759 SCI-B 发送数据缓冲器
#define SCIFFTXB         (volatile Uint16 *)0x775A // 0x775A SCI-B 发送FIFO
#define SCIFFRXB         (volatile Uint16 *)0x775B // 0x775B SCI-B 接收FIFO
#define SCIFFCTB         (volatile Uint16 *)0x775C // 0x775C SCI-B 控制FIFO
#define SCIPRIB         (volatile Uint16 *)0x775F // 0x775F SCI-B优先控制


最新回复

哇塞 学习受教了  详情 回复 发表于 2017-7-19 10:16
 
点赞 关注(1)

回复
举报

3404

帖子

6

TA的资源

裸片初长成(初级)

沙发
 
楼主挺热心。不过好像没有说全啊。上面的例子只定义了某个寄存器的绝对位置,但是没有寄存器中某一位的绝对定位。位域正好是用来处理具体到某一位的定位的。我用C2000三年了,一直用CCS,觉得CCS里面的CMD文件配合位域的方法不管是用起来还是给别人看都挺直观方便的。

点评

这是我以前搞C2000时做的笔记,现贴了出来。没有仔细看哈。  详情 回复 发表于 2015-4-5 23:03
 
 

回复

1万

帖子

28

TA的资源

裸片初长成(高级)

板凳
 
jishuaihu 发表于 2015-4-5 08:35
楼主挺热心。不过好像没有说全啊。上面的例子只定义了某个寄存器的绝对位置,但是没有寄存器中某一位的绝对定位。位域正好是用来处理具体到某一位的定位的。我用C2000三年了,一直用CCS,觉得CCS里面的CMD文件配合位域的方法不管是用起来还是给别人看都挺直观方便的。

这是我以前搞C2000时做的笔记,现贴了出来。没有仔细看哈。
 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

4
 
看到你的另一个帖子了,专门说CMD文件的。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(中级)

5
 
哇塞 学习受教了
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表