![]() |
|
||||||||||||||
| . 网站首页 . 新闻 . 新品 . 方案 . 专访 . 活动 . DSP . EDA . 评测 . 技术文库 . 会员区 . 商城 . 服务导航 . 邮购 . 资源 . | ||
|
||
|
|||||
| TI TMS320F2812 DSP编程之一 | |||||
作者:Free 文章来源:本站原创 点击数: 更新时间:2008-2-21 ![]() |
|||||
|
TMS 在编程工具上,Code Composer Studio™ IDE 提供强健、成熟的核心功能与简便易用的配置和图形可视化工具,在开发过程中可以提供很多帮助。我使用的是CCS2.1版,我觉得该版本有的功能还需要改进。CCS与MS Visual Studio开发环境很相似,所以上手很快。但是在VS可以在上下文菜单中快速的查看函数、Struct等的定义,在我使用的CCS版本中似乎没有,这使我感到很不方便。看来TI的软件产品,和微软帝国比起来,还是有差距滴。(我是比尔盖茨的忠实拥趸,呵呵) F2812中有大量的外设寄存器, 在具体的应用中,要把这些寄存器根据实际需要进行配置。这也是程序在初始化期间需要做的主要工作,在配置完成后,才可以进入正常的流程,即业务逻辑处理阶段。以我的应用为例,F2812主要完成下列工作:2路A/D采样,2路PWM输出,6路GPIO输出。在此基础上,我将进行运算处理,实现主要功能。 传统的寄存器访问方式,通过Macro定义实现。在TI提供的头文件中,提供了一种新的方式:bit field 和struct 方式,即位域加结构的方式。在这种方式中,定义struct来表示与某个外设相关的一组寄存器,然后由Linker程序负责将寄存器映射到内存中。如对于定时器寄存器,定义: struct CPUTIMER_REGS { Uint32 TIM; // Timer counter register Uint32 PRD; // Period register Uint16 TCR; // Timer control register Uint16 rsvd1; // reserved Uint16 TPR; // Timer pre-scale low Uint16 TPRH; // Timer pre-scale high }; 这样,如果DSP内有多个定时器,则可以通过声明多个变量实现对三个定时器寄存器的访问,便于代码复用。 利用编译器的DATA_SECTION #pragma,为每个变量分配一个数据段。然后,通过在cmd文件,Linker将每个数据段映射为内存中与该外设寄存器相对应的内存地址。 这时,还不能实现对寄存器,如TIM中的每一位的访问。需要对每个寄存器,为其定义位域,使每一位都可以访问,如定义TCR的位域: struct TCR_BITS { // bits description Uint16 rsvd1:4; // 3:0 reserved Uint16 TSS:1; // 4 Timer Start/Stop Uint16 TRB:1; // 5 Timer reload Uint16 rsvd2:4; // 9:6 reserved Uint16 SOFT:1; // 10 Emulation modes Uint16 FREE:1; // 11 Uint16 rsvd3:2; // 12:13 reserved Uint16 TIE:1; // 14 Output enable Uint16 TIF:1; // 15 Interrupt flag }; 然后,定义一个Union,允许该寄存器既可以按bit访问,也可以作为整体访问: union TCR_REG { Uint16 all; struct TCR_BITS bit; }; 在如此这样对每个寄存器都定义好后,重写struct CPUTIMER_REGS如下: struct CPUTIMER_REGS { union TIM_GROUP TIM; // Timer counter register union PRD_GROUP PRD; // Period register union TCR_REG TCR; // Timer control register Uint16 rsvd1; // reserved union TPR_REG TPR; // Timer pre-scale low union TPRH_REG TPRH; // Timer pre-scale high }; 这时,每个寄存器都可以按bit或作为整体访问了。 这样的方式,对于程序员来说,更容易理解,程序也更容易维护。 这样做的坏处:产生的代码长度稍大一些。 另外,对于有些特殊的寄存器,如WDCR,就没有定义Bit field和Union。 上面讲了这么多,那么我们是否需要将这些寄存器全部自己定义呢?答案是不需要。因为TI公司已经为我们提供了现成的.H文件,为我们做好了这些工作。在编程时,我们只需要搞清楚需要把那个头文件包含进来就行了。 |
|||||
| 欢迎点击进入:TI德州中文网 (国内唯一针对TI应用的中文技术网站) 文章录入:admin 责任编辑:admin | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 最新热点 | 最新推荐 | 相关文章 | ||
| TMS320F2812 ADC初始化问题 TMS320F2812外部存储器的疑问 如何软件模拟出硬件中断 F2812 XINT1中断后,程序总是… 关于调试仿真时的问题 DSP/BIOS问题? 如何在分配数组时,让它的首… TMS320F2812的.sect "ramfun… TMS3202812外扩RAM代替FLASH… 成功烧写TMS320F2812经验 |
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 管理登录 | | |||
|
|