以AD寄存器的文件结构,说明AD寄存器的命名,分配地址空间以及调用和使用。
1.在DSP28_Adc.h中定义一个ADC_REGS类型的寄存器AdcRegs。
ADC_REGS是一个结构体类型,这个结构体类型如structADC_REGS所义。
Union是一种声明共用体的的关键字,即ADCTRL1是一unionADCTR1_REG类型。
unionADCTR1_REG的定义如下,Uint16的一个16位整形和结构体ADCTRL1_BITS共用一个内存空间,也就是说这16位内存空间既可以按照DCTRL1_BITS中定义的位域进行寻址操作,也可以按照Uint16定义的16位进行整体寻址操作。
然后在定义了一种ADC_REGS结构体,该结构体包含所有定义的寄存器。externvolatilestruct ADC_REGSAdcRegs,定义一种可硬件改变的ADC_REGS类型的结构体变量AdcRegs,用extern将其修饰为全局变量,可以被其他文件所引用。
定义一种
structADCTRL1_BITS{ //bits description
Uint16 rsvd1:4; //3:0 reserved
……
};
unionADCTRL1_REG{
Uint16 all;
structADCTRL1_BITS bit;
};
structADC_REGS{
unionADCTRL1_REGADCTRL1; //ADCControl1
……
……
};
externvolatilestructADC_REGSAdcRegs;
2.在文件DSP28_Device.h中将所有的寄存器头文件包含在内
如:
#include"DSP28_Gpio.h" // 通用I/O模块寄存器
#include"DSP28_Adc.h" //ADC 寄存器
……
……
3.在文件DSP28_GlobalVariableDefs.c中,首先包含#include"DSP28_Device.h",这样DSP28_GlobalVariableDefs.c就可以使用所有定义好的寄存器。
这个文件的作用是将AdcRegs用汇编语言给其分配段AdcRegsFile,就是将AdcRegs写入内存中的段AdcRegsFile。
#pragmaDATA_SECTION(AdcRegs,"AdcRegsFile");
volatilestructADC_REGSAdcRegs;
4.SRAM.cmd主要是分配内存,定义
MEMORY
{
PAGE1:
GPIODAT :origin=0x0070E0,length=0x000020
ADC :origin=0x007100,length=0x000020
}
首先分配一个名为ADC的段,起始地址为0x007100,长度为0x000020。
Section{
AdcRegsFile :>ADC, PAGE=1
}
这段的作用是将#pragmaDATA_SECTION(AdcRegs,"AdcRegsFile");
产生的AdcRegsFile写入在内存中分配的段ADC 这样就将相应的寄存器和DSP
中对应的外设帧一一映射起来。
5.文件名:DSP28_Adc.c中,首先包含#include "DSP28_Device.h",这样就可以使用所有的寄存器。
voidInitAdc(void)
{
AdcRegs.ADCTRL1.bit.RESET=1; //ADC软件复位
AdcRegs.ADCTRL1.all=0x4f00; //ADC控制寄存器初始化ADC
软件复位,
}
在这个文件中,定义关于ADC的函数。
6.在文件DSP28_GlobalPrototypes.h中,将所有的.c文件中定义的函数变为全局函数,这样,如要引用函数,只要在DSP28_GlobalPrototypes.h添加extern 函数。
如:
externvoidInitAdc(void);
然后在需要引用此函数的文件中加入DSP28_GlobalPrototypes.h,这样就可以引用所有的函数。
7.如主函数中,
#include"DSP28_Device.h"
// 包含此头文件,即包含了所有.h文件,如ADC.h,这样就可以调用任何寄存器。
#include"DSP28_Globalprototypes.h"
// 包含此头文件,即可以调用所有加入DSP28_GlobalPrototypes.h中x.c中的函数。
#include"DSP28_GlobalVariable.h"
// 里面没有内容,留给用户自己所有的全局变量。