Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > TI TMS320F2812 DSP编程之一
【标  题】:TI TMS320F2812 DSP编程之一
【关键字】:TI,TMS320F2812,DSP
【来  源】:http://blog.csdn.net/china_bai/archive/2007/02/10/1507273.aspx

TI TMS320F2812 DSP编程之一

Your Ad Here

TMS320F2812处理器是TI 公司C2000系列处理器中的一款,主频可以达到150Mhz,我目前在项目中就是使用这款处理器。该处理器在电机控制等工业控制领域,有着大量的应用。TMS320C28x™ 控制器是 业界第一款 32 位基于 DSP 的控制器,具有板载快闪存储器和高达 150MIPS 的性能。它将微控制器 (MCU) 综合控制外设和简便易用与 TI 一流的 DSP 技术的处理能力与 C 效率相结合。

在编程工具上,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文件,为我们做好了这些工作。在编程时,我们只需要搞清楚需要把那个头文件包含进来就行了。
【Scott Meyers】C++5×5断想之四:C++历史上最重要人物:【上一篇】
C++ Primer Plus 读书笔记 (1 -2 章):【下一篇】
【相关文章】
  • WebWork In Action学习笔记(二) WebWork方式的HelloWorld
  • First Microsoft SaaS Application Demo Release!
  • 最优化WPF 3D性能(基于“Tier-2”硬件)
  • Reporting Services 7: Dynamic ServerReport & the ReportServer Database
  • 实际项目中remoting的自定义sink问题
  • sting COW
  • TAU G2的错误信息:TSC0134: Transition must end with stop, nextstate or join action.
  • 在Oracle8中通过DBLink存取Oracle9中Timestamp类型的问题
  • WebWork In Action学习笔记(一) WebWork的概貌
  • ActiveMQ 实践之路(一) 启动你的ActiveMQ
  • 【随机文章】
  • 搭建linux+jdk+tomcat+postgres的环境
  • Adobe College专业认证专案
  • ESFramework介绍之(34)―― ITcpServerAgent和IUdpServerAgent组件关系图
  • 一个对数据库进行操作的程序(之一)
  • Cisco Works安装后
  • [转贴]Google你都会用了么?
  • zzShell 编程
  • PHP5面向对象
  • Win XP SP2升级你准备好了吗?
  • 推荐一个好工具:Refactor! for ASP.NET 2.0
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.