在DSP的寄存器头文件中使用到VOLATILE(TMS320F2812)

 
 
在DSP的寄存器头文件中使用到VOLATILE(TMS320F2812)
2009-02-26 14:28
在链接器配置文件中的SECTIONS段中为各种外设的寄存器结构映射了他们在dsp内部存储器中的地址。例如tms320f2812的链接器配置文件中有下面部分:(以CPU定时器0为例)

MEMORY中:

PAGE 1 :

   /* Peripheral Frame 0:   */

   CPU_TIMER0 : origin = 0x000C00, length = 0x000008

SECTIONS中:

   /* Allocate Peripheral Frame 0 Register Structures:   */

   CpuTimer0RegsFile   : > CPU_TIMER0 PAGE = 1     

如此一来就将CpuTimer0RegsFile 定位到片内rom中特定的位置。接下来就是要将这些位置的寄存器一一指定:

在DSP281x_GlobalVariableDefs.c中有如下内容:

#ifdef __cplusplus

#pragma DATA_SECTION("CpuTimer0RegsFile")

#else

#pragma DATA_SECTION(CpuTimer0Regs,"CpuTimer0RegsFile");

#endif

******        ******

volatile struct CPUTIMER_REGS CpuTimer0Regs;//在此处定义timer0的结构体

#define CPUTimer0Regs CpuTimer0Regs

在DSP281x_CpuTimers.h中有如下内容:

extern volatile struct CPUTIMER_REGS CpuTimer0Regs;       //声明外部变量

extern struct CPUTIMER_VARS CpuTimer0;                               //声明外部变量

其中CPUTIMER_VARS与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

};//定时器寄存器结构体

struct CPUTIMER_VARS {

   volatile struct CPUTIMER_REGS *RegsAddr;

   Uint32    InterruptCount;

   float   CPUFreqInMHz;

   float   PeriodInUSec;

};//定时器0组合结构体,包含寄存器结构体、中断次数、CPU主频、周期

CpuTimer0则是在DSP281x_CpuTimers.c中定义的供用户使用的CPU定时器0组合结构体:

struct CPUTIMER_VARS CpuTimer0;               //timer0包含中断次数、寄存器组等的组合结构体。

CpuTimer0.RegsAddr = &CpuTimer0Regs;    //将timer0寄存器结构体赋值给组合结构体

如此经过以上几层映射关系,我们在向CpuTimer0. CpuTimer0Regs. TIM.all写数据时就可以准确的写入DSP内部寄存器所在的存储器的位置。并且在读取寄存器的值时由于有 volatile 的作用,每次都是从源地址读取出来的值,保证了数据的正确性。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值