最具参考价值的程序例程TMS320F28xx黄书程序电子版.docx
- 文档编号:7973170
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:50
- 大小:37.52KB
最具参考价值的程序例程TMS320F28xx黄书程序电子版.docx
《最具参考价值的程序例程TMS320F28xx黄书程序电子版.docx》由会员分享,可在线阅读,更多相关《最具参考价值的程序例程TMS320F28xx黄书程序电子版.docx(50页珍藏版)》请在冰豆网上搜索。
最具参考价值的程序例程TMS320F28xx黄书程序电子版
第3章TMS320X28xx处理器及其应用
例1、初始化锁相环及外设时钟函数
//---------------------------------------------------------------------------------------------------------------------
//初始化锁相环及外设时钟函数:
InitPll:
//---------------------------------------------------------------------------------------------------------------------
voidInitPll(Uint16val)
{
volatileUint16iVol;
if(SysCtrlRegs.PLLCR.bit.DIV!
=val)
{
EALLOW;
SysCtrlRegs.PLLCR.bit.DIV=val;
EDIS;
//在锁相环时钟频率切换过程中,只有当锁相环稳定后CPU才会切换到新的PLL设置。
因此在设置完PLLCR后需要等待PLL稳定。
PLL的切换时间大约等于131072个输入时钟周期。
DisableDog();
for(iVol=0;iVol<((131072/2)/12);iVol++)
{
}
}
}
//为降低系统功耗,不使用的外设时钟需要屏蔽。
//但如果使用外设必须首先使能相应的外设时钟。
voidInitPeripheralClocks(void)
{
EALLOW;
//HISPCP/LOSPCP预定表寄存器设置
SysCtrlRegs.HISPCP.all=0x0001;
SysCtrlRegs.LOSPCP.all=0x0002;
//使能使用的外设时钟
SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
SysCtrlRegs.PCLKCR.bit.EVBENCLK=1;
SysCtrlRegs.PCLKCR.bit.SCIAENCLK=1;
SysCtrlRegs.PCLKCR.bit.SCIBENCLK=1;
SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=1;
SysCtrlRegs.PCLKCR.bit.SPIENCLK=1;
SysCtrlRegs.PCLKCR.bit.ECANENCLK=1;
SysCtrlRegs.PCLKCR.bit.ADCENCLK=1;
EDIS;
}
例2、.cmd格式文件举例
MEMORY
{
PAGE0:
/*本例中H0分成PAGE0和PAGE1*/
/*BEGINisusedforthe"boottoHO"bootloadermode*/
/*如果从XINTFZone7空间boot,RESET装载复位向量,*/
/*其他复位矢量从BOOTROM中装载*/
RAMM0:
origin=0x000000,length=0x000400
BEGIN:
origin=0x3F8000,length=0x000002
PRAMH0:
origin=0x3F8002,length=0x0014FE
BOOTROM:
origin=0x3FF000,length=0x000FC0
RESET:
origin=0x3FFFC0,length=0x000002
PAGE1:
RAMM1:
origin=0x000400,length=0x000400
L0L1RAM:
origin=0x008000,length=0x002000
DRAMH0:
origin=0x3f9500,length=0x000B00
}
SECTIONS
{
/*设置"boottoH0"模式:
代码起始段(DSP281x_CodeStartBranch.asm)*/
/*然后重新定位用户代码开始入口。
将该段放在H0的起始*/
codestart:
>BEGIN,PAGE=0
ramfuncs:
>PRAMH0PAGE=0
.text:
>PRAMH0,PAGE=0
.cinit:
>PRAMH0,PAGE=0
.pinit:
>PRAMH0,PAGE=0
.switch:
>RAMM0,PAGE=0
.reset:
>RESET,PAGE=0,TYPE=DSECT/*没用*/
.stack:
>RAMM1,PAGE=1
.ebss:
>DRAMH0,PAGE=1
.econst:
>DRAMH0,PAGE=1
.esysmem:
>DRAMH0,PAGE=1
DLOG:
>L0L1RAM,PAGE=1
/********************************************************************/
/*IQmath函数表定位:
*/
/********************************************************************/
/*对于没有BOOTROM的器件使用:
*/
/*IQmathTables:
load=BOOTROM,PAGE=0*/
/*F2810/12器件(BootROM内包含相应函数的查表信息)使用:
*/
IQmathTables:
load=BOOTROM,type=NOLOAD,PAGE=0
/********************************************************************/
/*IQmath函数定位:
*/
/********************************************************************/
IQmath:
load=PRAMH0,PAGE=0
}
例3、定时器中断应用举例
//==============================================================
//文件名称:
Example_281xCpuTimer.c
//功能描述:
采用CPUTimer0定时,在定时器中断服务程序中记录中断的次数。
//
//观察的变量:
//CpuTimer0.InterruptCount
//
//==============================================================
#include"DSP281x_Device.h"//DSP281xHeaderfileIncludeFile
#include"DSP281x_Examples.h"//DSP281xExamplesIncludeFile
//函数声明
interruptvoidcpu_timer0_isr(void);
voidmain(void)
{
//Step1、初始化系统控制寄存器,PLL,看门狗,时钟位默认状态
//该函数在后面的DSP28_SysCtrl.c文件中查找
InitSysCtrl();
//Step2、GPIO初始化本例中不使用
//InitGpio();
//Step3、清除所有中断并初始化PIE中断向量表,禁止所有CPU中断
DINT;
//初始化PIE控制寄存器为其默认状态(所有PIE中断被禁止并且标志被清除)
InitPieCtrl();
//禁止所有CPU中断并清除所有中断标志
IER=0x0000;
IFR=0x0000;
//初始化PIE控制寄存器,参考DSP28_PieCtrl.c文件
InitPieVectTable();
//将本例程所使用的中断向量重新映射,使其指向中断服务相应的程序
EALLOW;
PieVectTable.TINT0=&cpu_timer0_isr;
EDIS;
//Step4、初始化所有外设(本例中不需要)
//InitPeripherals();
InitCpuTimers();//在本例程中仅初始化Cpu定时器
//配置CPU-Timer0每间隔1秒产生一次中断
//150MHzCPU频率,周期为1秒(采用微妙的形式描述)
ConfigCpuTimer(&CpuTimer0,100,1500000);
StartCpuTimer0();
//Step5.、用户特定代码,使能中断
//使能连接到CPU-Timer0的CPUINT1
IER|=M_INT1;
//使能位于PIE中的组1的第7个中断TINT0
PieCtrlRegs.PIEIER1.bit.INTx7=1;
//使能全局中断,并配置位real-timedebug模式
EINT;//使能全局中断INTM
ERTM;//使能全局realtime中断DBGM
//Step6.、IDLEloop等待产生中断
for(;;);
}
interruptvoidcpu_timer0_isr(void)
{
CpuTimer0.InterruptCount++;
//响应中断并准备接收更多的中断
PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;
}
//==============================================================
//
//文件名称:
DSP281x_CpuTimers.c
//
//功能描述:
DSP281xCPU32-bit定时器初始化及相关函数
//
//==============================================================
#include"DSP281x_Device.h"//包含的DSP281x头文件
#include"DSP281x_Examples.h"//DSP281xExamples头文件
structCPUTIMER_VARSCpuTimer0;
//CpuTimer1的CpuTimer2保留,由DSPBIOS&其他RTOS使用
//structCPUTIMER_VARSCpuTimer1;
//structCPUTIMER_VARSCpuTimer2;
//---------------------------------------------------------------------------
//初始化CPU定时器
//---------------------------------------------------------------------------
//该函数将3个定时器初始化为一个确定的状态
//
voidInitCpuTimers(void)
{
//CPUTimer0
//初始化各自定时器的寄存器指向相应的地址
CpuTimer0.RegsAddr=&CpuTimer0Regs;
//初始化定时器周期为最大值
CpuTimer0Regs.PRD.all=0xFFFFFFFF;
//初始化预定标计数器,分频系数为1(时钟:
SYSCLKOUT)
CpuTimer0Regs.TPR.all=0;
CpuTimer0Regs.TPRH.all=0;
//确认定时器处于停止计数状态
CpuTimer0Regs.TCR.bit.TSS=1;
//使用周期寄存器的值装载定时器计数寄存器
CpuTimer0Regs.TCR.bit.TRB=1;
//复位中断计数标量InterruptCount=0
CpuTimer0.InterruptCount=0;
//CpuTimer1的CpuTimer2为DSPBIOS&其他RTOS保留
//因此相应的定时器初始化代码被注释
//初始化各自定时器的寄存器指向相应的地址
//CpuTimer1.RegsAddr=&CpuTimer1Regs;
//CpuTimer2.RegsAddr=&CpuTimer2Regs;
//初始化定时器周期为最大值
//CpuTimer1Regs.PRD.all=0xFFFFFFFF;
//CpuTimer2Regs.PRD.all=0xFFFFFFFF;
//确认定时器处于停止计数状态
//CpuTimer1Regs.TCR.bit.TSS=1;
//CpuTimer2Regs.TCR.bit.TSS=1;
//使用周期寄存器的值装载定时器计数寄存器
//CpuTimer1Regs.TCR.bit.TRB=1;
//CpuTimer2Regs.TCR.bit.TRB=1;
//复位中断计数标量
//CpuTimer1.InterruptCount=0;
//CpuTimer2.InterruptCount=0;
}
//---------------------------------------------------------------------------
//配置Cpu定时器函数
//---------------------------------------------------------------------------
//该函数初始化指定定时器的周期和频率
voidConfigCpuTimer(structCPUTIMER_VARS*Timer,floatFreq,floatPeriod)
{
Uint32temp;
//初始化周期
Timer->CPUFreqInMHz=Freq;
Timer->PeriodInUSec=Period;
temp=(long)(Freq*Period);
Timer->RegsAddr->PRD.all=temp;
//设置预定标参数(SYSCLKOUT):
Timer->RegsAddr->TPR.all=0;
Timer->RegsAddr->TPRH.all=0;
//初始化定时器控制寄存器
Timer->RegsAddr->TCR.bit.TSS=1;//1=Stoptimer,0=Start/RestartTimer
Timer->RegsAddr->TCR.bit.TRB=1;//1=reloadtimer
Timer->RegsAddr->TCR.bit.SOFT=1;
Timer->RegsAddr->TCR.bit.FREE=1;//TimerFreeRun
Timer->RegsAddr->TCR.bit.TIE=1;//0=Disable/1=EnableTimerInterrupt
//复位中断计数
Timer->InterruptCount=0;
}
例4、利用事件管理器输出多种频率的正弦信号输出例程
//***************************************************************************
//
//文件名称:
EVsine.c
//
//主要功能:
DSP28T1PWM-输出产生正弦波,
//使能看门狗
//
//***************************************************************************
#include"DSP281x_Device.h"
#include"IQmathLib.h"
#pragmaDATA_SECTION(sine_table,"IQmathTables");
_iq30sine_table[512];
//函数原型声明
voidGpio_select(void);
voidInitSystem(void);
interruptvoidT1_Compare_isr(void);//定时器1中断服务程序
voidmain(void)
{
InitSystem();//初始化DSP内核寄存器
Gpio_select();//设置GPIO引脚功能
InitPieCtrl();//初始化外设中断扩展单元(代码在:
DSP281x_PieCtrl.c)
InitPieVectTable();//初始化外设中断扩展向量表(代码在:
DSP281x_PieVect.c)
//重新映射定时器1(Timer1)的比较中断入口
EALLOW;//允许更改保护的寄存器
PieVectTable.T1CINT=&T1_Compare_isr;
EDIS;//禁止更改保护的寄存器
//使能T1比较中断:
PIE-组2,中断5
PieCtrlRegs.PIEIER2.bit.INTx5=1;
//使能CPUINT2,GP-Timer1的比较中断连接到该中断
IER=2;
//全局中断使能,并使能具有更高优先级的适时调试方式
EINT;//使能全局中断INTM
ERTM;//使能全局适时中断DBGM
//配置事件管理器AEVA
//假定事件管理器A的时钟已经在InitSysCtrl()中使能;
//T1/T2逻辑驱动T1PWM/T2PWM;
EvaRegs.GPTCONA.bit.TCMPOE=1;
//GPTimer1比较输出配置:
低电平有效
EvaRegs.GPTCONA.bit.T1PIN=1;
EvaRegs.T1CON.bit.FREE=0;//仿真操作时挂起
EvaRegs.T1CON.bit.SOFT=0;//仿真操作时挂起
EvaRegs.T1CON.bit.TMODE=2;//连续递增计数模式
EvaRegs.T1CON.bit.TPS=0;//预定标系数=1:
75MHz
EvaRegs.T1CON.bit.TENABLE=0;//禁止GPTimer1操作
EvaRegs.T1CON.bit.TCLKS10=0;//使用内部时钟
EvaRegs.T1CON.bit.TCLD10=0;//等于0时比较装载
EvaRegs.T1CON.bit.TECMPR=1;//使能比较操作
EvaRegs.T1PR=1500;
EvaRegs.T1CMPR=EvaRegs.T1PR/2;
EvaRegs.EVAIMRA.bit.T1CINT=1;
EvaRegs.T1CON.bit.TENABLE=1;//使能GPTimer1
while
(1)
{
EALLOW;
SysCtrlRegs.WDKEY=0xAA;//看门狗操作
EDIS;
}
}
//通用IO选择
voidGpio_select(void)
{
EALLOW;
GpioMuxRegs.GPAMUX.all=0x0;//所有GPIO端口配置成I/O方式
GpioMuxRegs.GPAMUX.bit.T1PWM_GPIOA6=1;//T1PWM有效
GpioMuxRegs.GPBMUX.all=0x0;
GpioMuxRegs.GPDMUX.all=0x0;
GpioMuxRegs.GPFMUX.all=0x0;
GpioMuxRegs.GPEMUX.all=0x0;
GpioMuxRegs.GPGMUX.all=0x0;
GpioMuxRegs.GPADIR.all=0x0;//GPIOPORT作为输入
GpioMuxRegs.GPBDIR.all=0x0;//GPIOPORT作为输入
GpioMuxRegs.GPDDIR.all=0x0;//GPIOPORT作为输入
GpioMuxRegs.GPEDIR.all=0x0;//GPIOPORT作为输入
GpioMuxRegs.GPFDIR.all=0x0;//GPIOPORT作为输入
GpioMuxRegs.GPGDIR.all=0x0;//GPIOPORT作为输入
GpioMuxRegs.GPAQUAL.all=0x0;//设置GPIO量化值为0
GpioMuxRegs.GPBQUAL.all=0x0;
GpioMuxRegs.GPDQUAL.all=0x0;
GpioMuxRegs.GPEQUAL.all=0x0;
EDIS;
}
//系统初始化
voidInitSystem(void)
{
EALLOW;
SysCtrlRegs.WDCR=0x00AF;//配置看门狗
//0x00E8禁止看门狗,预定标系数Prescaler=1
//0x00AF使能看门狗,预定标系数Prescaler=64
SysCtrlRegs.SCSR=0;//看门狗产生RESET
SysCtrlRegs.PLLCR.bit.DIV=10;//设置系统锁相环倍频系数5
SysCtrlRegs.HISPCP.all=0x1;//配置高速外设时钟预定标系数:
除以2
SysCtrlRegs.LOSPCP.all=0x2;//配置低速外设时钟预定标系数:
除
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 参考 价值 程序 例程 TMS320F28xx 黄书 电子版