DSP281x_Device.h

合集下载

TMS320F2812产生PWM波程序

TMS320F2812产生PWM波程序

include "DSP281x_Device.h" // DSP281x Headerfile Include File# include "DSP281x_Examples.h" // DSP281x Examples Include Filevoid init_eva(void);void main(void){InitSysCtrl();// InitGpio(); 配置IO口功能为PWM模式EALLOW;GpioMuxRegs.GPAMUX.all = 0x00FF; // EVA PWM 1-6 pinsEDIS;DINT; //关CPU总中断InitPieCtrl(); //初始化PIE控制寄存器IER = 0x0000;IFR = 0x0000;InitPieVectTable(); //初始化PIE中断向量表init_eva(); //初始化EV-AEvaRegs.T1CON.bit.TENABLE=1; //手工启动定时器EINT; // 使能INTM(全局中断)ERTM; // Enable Global realtime interrupt DBGMfor(;;);}//EV-A初始化void init_eva(void){EvaRegs.T1PR = 37500; //周期值--连续增减时,PWM频率=TCLK/(2*T1PR)---频率设为1K, PWM=75M/(2*37500)EvaRegs.T1CMPR = 0x3C00; // Compare Reg--比较值EvaRegs.T1CNT = 0x0000; //计数器初值//连续增/减模式,x/1分频,内部时钟,使能比较,使用自己的周期,禁止定时器启动(等初始化全部完成后手工启动)EvaRegs.T1CON.all = 0x0802;EvaRegs.GPTCONA.bit.TCMPOE = 1; //通过逻辑产生T1 PWMEvaRegs.GPTCONA.bit.T1PIN = 1; //GP定时器1比较时低有效//使能比较产生1--6 PWM波1个比较单元控制2路互补的PWM输出,控制PWM占空比//连续增减--低有效时:PWM占空比=CMPR1/T1PR,高有效时:PWM占空比=(T1PR-CMPR1)/T1PR EvaRegs.CMPR1 = 15000; //第一路PWM占空比设为0.4,0.4=15000/37500EvaRegs.CMPR2 = 0x3C00;EvaRegs.CMPR3 = 0xFC00;// output pin 1 CMPR1 - 高有效,output pin 2 CMPR1 - 低有效// output pin 3 CMPR2 - 高有效,output pin 4 CMPR2 - 低有效// output pin 5 CMPR3 - 高有效,output pin 6 CMPR3 - 低有效EvaRegs.ACTRA.all = 0x0666; //比较方式控制寄存器,控制PWM引脚的高/低有效EvaRegs.DBTCONA.all = 0x0000; //静止死区CONA.all = 0xA600; //比较控制寄存器--禁止空间矢量PWM模式}总结:PWM波形产生流程1):将I/O口设置为PWM引脚模式2):设置装载TxCON,决定计数方式,启动比较操作3):设置装载TxPR,决定PWM波形周期4):初始化EvaRegs.CMPR1--3的值,每个比较单元控制2路互补的PWM输出,控制PWM占空比5):EvaRegs.ACTRA比较方式控制寄存器,控制PWM引脚的高/低有效6):EvaRegs.DBTCONA死区时间的设置7):CONA设置比较控制寄存器附:EvaRegs.DBTCONA.bit.DBT=5; //死区定时器周期为5EvaRegs.DBTCONA.bit.EDBT1=1; //死区定时器1使能EvaRegs.DBTCONA.bit.DBTPS=3; //死区定时器预定标因子,死区时钟为HSPCLK/8示例程序2:一个产生PWM波的样例程序,用于TMS320F2812(2006-07-24 21:59:09)转载这两个星期一直在做PWM波的程序,发现网上这方面的比较少,若有又没有中文注释。

2812控制精确的1秒LED闪烁程序

2812控制精确的1秒LED闪烁程序

第一个精确的1秒LED闪烁程序1 程序特点本程序使用F2812硬件,控制GPIOF14管脚上的一个LED做精确的1秒间隔闪烁,并且程序从Flash启动。

2 建立工程2.1 文件该工程包含以下文件:注:除了Main.c为自己写的之外,其他均为F2812DEMO自带的文件。

其中部分文件做了小小的修改,下文会详述2.2建立工程打开CCS3.1,选择Project—>New…,输入工程名,这里是MyFirstPjt,选择工程目录后点击确定,然后在左侧的工程管理窗口中选中MyFirstPjt.pjt,右键—>添加文件,将下列文件加入工程:然后再次选中MyFirstPjt.pjt,右键—>Scan All File Dependencies,CCS系统会自动搜索关联的文件,特别是.h头文件,并将所有.h头文件显示出来,如下图所示:如果你看不到,请点击+号展开文件列表。

但注意此时并没有完成,还需要设置编译环境:在左侧的工程管理窗口中选中MyFirstPjt.pjt,右键—>Bulid Options…做如下设置:很关键的一个设置是必须设置头文件的搜索路径,CCS在编译时先搜索安装目录下的头文件,然后再搜索用户指定的路径,如果再找不到,就报错。

头文件的搜索路径设置如下:其中$(Proj_dir)表示工程所在的目录,这里设置为“$(Proj_dir)\DSP281x_headers\include, $(Proj_dir)\DSP281x_common\include”多个路径中间用逗号隔开。

当然也可以设置绝对路径,但这样设置方便一些,便于在工程拷贝中不用再更改设置。

然后设置库和库的搜索路径:这里使用了CCS3.1自带的库rts2800_ml.lib,该库位于CCS安装目录的C2000\cgtools\lib下,此库中带有bootloader的obj文件,以便于与用户的应用程序连接,大信号模式下用rts2800_ml.lib,小信号模式下用rts2800.lib。

DSP28035CPU定时器中断设置

DSP28035CPU定时器中断设置

DSP28035CPU定时器中断设置#include "DSP281x_Device.h"#include "DSP281x_Examples.h"//定时器中断服务程序声明interrupt void cpu_timer0_isr(void);void main(void){InitSysCtrl(); //初始化系统控制寄存器、PLL、看门狗和时种//Step 2. 初始化 GPIO//InitGpio(); //本例中没有使⽤,跳过//Step 3. 清除所有中断,初始化PIE中断向量表DINT; //关CPU中断InitPieCtrl(); //初始化PIE控制寄存器组到默认状态,这个⼦程序在DSP281x_PieCtrl.cIER = 0x0000; //禁⽌所有CPU中断IFR = 0x0000; //清除所有CPU中断标志位InitPieVectTable(); //初始化PIE中断向量表,这个⼦程序在DSP281x_PieVect.cEALLOW; //关保护PieVectTable.TINT0 = &cpu_timer0_isr; //中断向量指向中断服务程序EDIS; //开保护InitCpuTimers(); //初始化定时器寄存器组ConfigCpuTimer(&CpuTimer0, 100, 1000000);//配置CPU-Timer 0 中断周期为1s,100MHz CPU频率,可以根据频率改变实参StartCpuTimer0(); //启动定时器 0//Step 5. ⽤户代码,打开中断IER |= M_INT1; //使能第⼀组PIE中断PieCtrlRegs.PIEIER1.bit.INTx7 = 1; //使能第⼀组的中断7EINT; //使能全局中断ERTM; //使能DEBUG中断//Step 6. 空循环,等待中断for(;;);}//中断服务⼦程序interrupt void cpu_timer0_isr(void){CpuTimer0.InterruptCount++;//⽤户可以在此处添加⾃⼰的代码,以完成某些特定的功能PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;//响应这个中断,以便CPU继续接收第1组中断}。

DSP读取EEPROM_AT25128.C

DSP读取EEPROM_AT25128.C

***********************************AT25128 EEPROM 的操作函数********************************************************************* *********************************/#include"DSP281x_Device.h"/******************************************************************** *函数名: void EEPROM_Write_Enable(void)目的: EEPROM的写使能输入:无输出:无********************************************************************* /void EEPROM_Write_Enable(void){//判断SPI发送准备好while(Spi_TxReady() == 0);//等于0 说明数据已移入SPITXBUF,等待//CS= 0;//CS拉低//发送SPISpiaRegs.SPITXBUF = WREN;//发送使能写指令////判断SPI发送准备好while(Spi_TxReady() == 0);//还没发送完成,等待//CS= 1;//cs拉高}/******************************************************************** *函数名: void EEPROM_Write_Disable(void)目的: EEPROM的写关闭输入:无输出:无/void EEPROM_Write_Disable(void){//判断SPI发送准备好while(Spi_TxReady() == 0);//CS= 0;//发送SPISpiaRegs.SPITXBUF = WRDI;//禁止写////判断SPI发送准备好while(Spi_TxReady() == 0);//CS= 1;}/******************************************************************** *函数名: unsigned int EEPROM_Read_Status(void)目的: EEPROM的读状态输入:无输出:无********************************************************************* /char EEPROM_Read_Status(void){Uint16 data;//判断SPI发送准备好while(Spi_TxReady() == 0);//CS= 0;//发送SPISpiaRegs.SPITXBUF = RDSR; //读状态寄存器//判断SPI发送准备好while(Spi_TxReady() == 0);//发送SPISpiaRegs.SPITXBUF = 0x0000;//发送伪数据,因为没有数据发送时,SCLK会停止,EEPROM也即不能向2812 发送数据//判断SPI接收准备好while(Spi_RxReady() == 0);data = SpiaRegs.SPIRXBUF;DELAY_US(10);//EEPROM 接收时必须加延时,等待接收完成CS= 1;//return data;}/******************************************************************** *函数名: void EEPROM_Write_Status(unsigned intwrite_status)目的: EEPROM的写状态输入: write_status 写状态寄存器的控制字输出:无********************************************************************* /void EEPROM_Write_Status(Uint16 write_status){//判断SPI发送准备好while(Spi_TxReady() == 0);//CS= 0;//CS拉低//发送SPISpiaRegs.SPITXBUF = WRSR;//发送读寄存器命令//判断SPI发送准备好while(Spi_TxReady() == 0);//发送SPISpiaRegs.SPITXBUF = write_status;//判断SPI发送准备好while(Spi_TxReady() == 0);//CS= 1;}/******************************************************************** *函数名: void EEPROM_Write(unsigned int address,unsigned int *data)目的: EEPROM的写输入: address 写地址*data 写数据输出:无********************************************************************* /void EEPROM_Write(Uint16 address,Uint16 data){Uint16 temp;temp = address<<8;//判断SPI发送准备好while(Spi_TxReady() == 0);//CS= 0;//发送SPISpiaRegs.SPITXBUF = WRITE;//发送写命令//判断SPI发送准备好while(Spi_TxReady() == 0);//发送SPISpiaRegs.SPITXBUF = address;//发送地址高8位,左对齐//判断SPI发送准备好while(Spi_TxReady() == 0);//发送SPISpiaRegs.SPITXBUF = temp;//发送地址低8位,左对齐//判断SPI发送准备好while(Spi_TxReady() == 0);SpiaRegs.SPITXBUF = data << 8;//发送数据,左对齐while(Spi_TxReady() == 0);CS= 1;}/******************************************************************** *函数名: unsigned int EEPROM_Read(unsigned int address)目的: EEPROM的读输入: length 读EEPROM的8位BYTE长度address 读EEPROM的首地址,16BIT输出:无********************************************************************* /char EEPROM_Read(Uint16 address){Uint16 data,temp;temp=address<<8;DELAY_US(20);//判断SPI发送准备好while(Spi_TxReady() == 0);//CS= 0;//发送SPISpiaRegs.SPITXBUF = READ;//发送读命令while(Spi_TxReady() == 0);//发送SPISpiaRegs.SPITXBUF = address;//发送地址高8位,左对齐//判断SPI发送准备好while(Spi_TxReady() == 0);//发送SPISpiaRegs.SPITXBUF = temp;//发送地址低8位,左对齐//判断SPI发送准备好while(Spi_TxReady() == 0);//发送SPISpiaRegs.SPITXBUF = 0x0000;//发送伪数据,没有数据发送时,SCLK 会停止,EEPROM也即不能向2812 发送数据//判断SPI发送准备好while(Spi_RxReady() == 0);DELAY_US(10);//此处延时也很必要,具体愿意不详,或许是等待数据接收完成吧//发送SPIdata = SpiaRegs.SPIRXBUF;DELAY_US(10);//EEPROM 接收时必须加延时,等待接收完成CS= 1;//return data;}。

BLDC控制PIC程序

BLDC控制PIC程序

另一完整版#include "DSP281x_Device.h"#include "DSP281x_Examples.h"//#include "DSP281x_Globalprototypes.h"#include "DSP281x_Device.h"#include "DSP281x_Examples.h"void InitPieCtrl(void);void init_7219(void);void InitSysCtrl(void);void InitPieVectTable(void);void pdelay(void);void delay(void);interrupt void eva_capint1_isr(void);interrupt void eva_capint2_isr(void);interrupt void eva_timer1_isr(void);extern void DSP28x_usDelay(Uint32 Count);unsigned s=500;unsigned state;unsigned i,j;int32 x3=0,speed1,speed2=0;//数组供显示用unsigned K;unsigned y=0;int32 x1=0,x2=0;Uint16 counter=0;//===========PI参数===========float Kpspeed=10,Kispeed=0.01,Kcspeed=0.0046;int Nmin=0,Nmax=1500; //float RKspeed=0,Uspeed=0.0; //int Nref=300,N=0,Iref=0;int Espeed=0;//===============速度PID====================//void SPEED_PI(void) //{//Xispeed:速度调节器积分累积量Espeed=Nref-N;Uspeed=Kpspeed*Espeed+RKspeed;if(Uspeed<0){if((Nmin-Uspeed)>=0)Iref=Nmin;elseIref=(int)Uspeed;}else{if(Nmax-Uspeed<0)Iref=Nmax;elseIref=(int)Uspeed;}RKspeed=Kcspeed*(Iref-(int)Uspeed)+Espeed*Kispeed+RKspeed; Iref=1500-Iref;}//=============增调速=====================//void tiaosujian(void){if(Nref<=0){Nref=0;}else{Nref=Nref-1;}}//=============减调速=====================//void tiaosuzeng(void){if(Nref>=1500){Nref=1500;}else{Nref=Nref+1;}}//=============延时程序=====================//void pdelay(void){for(j=0;j<100;j++){ for (i = 0; i < 5; i++);}}//=============SPI初始化====================//void InitSpi(void){SpiaRegs.SPICCR.all=0x000F; //复位SPI模块,SPICLK 信号上升沿时,数据输出//单个移位序列周期移入,移出的位数为16SpiaRegs.SPICTL.all=0x000E; //SPICLK 信号延时半个周期,主模式,使能发送SpiaRegs.SPIBRR=120;SpiaRegs.SPICCR.bit.SPISWRESET=1; //SPI准备好发送或接收下一个字符//=============MAX7219 Init====================== GpioDataRegs.GPFCLEAR.bit.GPIOF3=1;SpiaRegs.SPIRXBUF=SpiaRegs.SPIRXBUF;SpiaRegs.SPITXBUF=0x09FF;while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG==1){};GpioDataRegs.GPFSET.bit.GPIOF3=1;GpioDataRegs.GPFCLEAR.bit.GPIOF3=1;SpiaRegs.SPIRXBUF=SpiaRegs.SPIRXBUF;SpiaRegs.SPITXBUF=0x0A0A;while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG==1){};GpioDataRegs.GPFSET.bit.GPIOF3=1;GpioDataRegs.GPFCLEAR.bit.GPIOF3=1;SpiaRegs.SPIRXBUF=SpiaRegs.SPIRXBUF;SpiaRegs.SPITXBUF=0x0B03;while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG==1){};GpioDataRegs.GPFSET.bit.GPIOF3=1;GpioDataRegs.GPFCLEAR.bit.GPIOF3=1;SpiaRegs.SPIRXBUF=SpiaRegs.SPIRXBUF;SpiaRegs.SPITXBUF=0x0C01;while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG==1){};GpioDataRegs.GPFSET.bit.GPIOF3=1;GpioDataRegs.GPFCLEAR.bit.GPIOF3=1;SpiaRegs.SPIRXBUF=SpiaRegs.SPIRXBUF;SpiaRegs.SPITXBUF=0x0F00;while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG==1){};GpioDataRegs.GPFSET.bit.GPIOF3=1;}//===========显示子程序=====================//void XianShi(long int m){Uint16 dizhi[4]={0x0100,0x0200,0x0300,0x0400};Uint16 shu[4];int i;for(i=3;i>=0;i--){shu[i]=m%10;m=m/10;GpioDataRegs.GPFCLEAR.bit.GPIOF3=1;SpiaRegs.SPIRXBUF=SpiaRegs.SPIRXBUF;SpiaRegs.SPITXBUF=dizhi[i]|shu[i];while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG==1){};GpioDataRegs.GPFSET.bit.GPIOF3=1;}}//==============EV A初始化子程序=============/void EV A_Timer1(){//EvaRegs.GPTCONA.all=0;EvaRegs.T1CNT=0x0000; //T1CNT(定时器1的计数寄存器)EvaRegs.T1PR=1500;EvaRegs.ACTRA.all = 0x0000; //比较方式寄存器,设置比较器输出引脚的方式EvaRegs.CMPR1 = 500; //全比较寄存器EvaRegs.CMPR2 = 500;EvaRegs.T2CNT=0x0000;EvaRegs.T2PR=0xFFFF;EvaRegs.T2CON.all=0x1740;EvaRegs.EV AIMRA.bit.T1UFINT=1; //EV AIMRA(EV A的中断屏蔽寄存器A).T1PINT(通用定时器1的周期中断使能)EvaRegs.EV AIFRA.bit.T1UFINT=1;//EV AIFRA(EV A的中断标志寄存器.T1PINT(通用定时器1的周期中断标志)//写1清除定时器1的周期中断标志CONA.all = 0x82FF; //比较器控制寄存器EvaRegs.T1CON.all=0x1002;//T1CON=000 10 000 0100 0000EvaRegs.T1CON.bit.TMODE=01;EvaRegs.T1CON.bit.TENABLE=1;EvaRegs.CAPCONA.all = 0;//EvaRegs.CAPCONA.all=0xA0F0;EvaRegs.CAPCONA.bit.CAP12EN = 1; //使能捕获单元1和2EvaRegs.CAPCONA.bit.CAP1EDGE = 3; //选用两边沿EvaRegs.CAPCONA.bit.CAP2EDGE = 3; //选用上两边沿EvaRegs.CAPCONA.bit.CAP12TSEL = 0; //选择定时器2*/EvaRegs.CAPFIFOA.bit.CAP1FIFO = 0; //状态寄存器清零EvaRegs.CAPFIFOA.bit.CAP2FIFO = 0; //状态寄存器清零EvaRegs.EV AIMRC.bit.CAP1INT = 1; //捕获1中断屏蔽位使能EvaRegs.EV AIFRC.bit.CAP1INT = 1; //复位标志位EvaRegs.EV AIMRC.bit.CAP2INT = 1; //捕获1中断屏蔽位使能EvaRegs.EV AIFRC.bit.CAP2INT = 1; //复位标志位}//===============主程序=====================//void main(void){Uint16 num=0;DINT; //关总中断IER=0x0000; //禁止使能IFR=0x0000;InitSysCtrl(); //系统初始化InitGpio();InitSpi();EALLOW;SysCtrlRegs.PLLCR.all=0x0002;SysCtrlRegs.HISPCP.all=0x0000; //HISPCP(高速外设时钟预定标寄存器)//bit0~2=011:高速时钟的频率=SYSCKLOUT/6//高速时钟的频率=25M EDIS;EALLOW; //关闭寄存器保护GpioMuxRegs.GPAMUX.all=0x030F;//将A0-A3设成pwm 口,将A8、A9设成CAP口,将A4、A5设成IO口,做测试用,A10为IO口按键做保护用GpioMuxRegs.GPADIR.bit.GPIOA4=1;GpioMuxRegs.GPADIR.bit.GPIOA5=1;GpioMuxRegs.GPADIR.bit.GPIOA10=0;GpioMuxRegs.GPBMUX.bit.PWM7_GPIOB0=0;GpioMuxRegs.GPBMUX.bit.PWM8_GPIOB1=0;GpioMuxRegs.GPBDIR.bit.GPIOB0=0;GpioMuxRegs.GPBDIR.bit.GPIOB1=0;GpioMuxRegs.GPFMUX.all=0x000f;GpioMuxRegs.GPFMUX.bit.SPICLKA_GPIOF2=1; //选择复用SPISIMO,SPISTE,SPICLKGpioMuxRegs.GPFMUX.bit.SPISIMOA_GPIOF0=1;// GpioMuxRegs.GPFMUX.bit.SPISTEA_GPIOF3=1;GpioMuxRegs.GPFMUX.bit.SPISTEA_GPIOF3=0;GpioMuxRegs.GPFDIR.bit.GPIOF3=1;EDIS;EV A_Timer1();InitPieCtrl(); //初始化PIE控制寄存器InitPieVectTable();//重新映射定时器1的比较中断入口EALLOW;PieVectTable.CAPINT1 = &eva_capint1_isr; //中断使能PieVectTable.CAPINT2 = &eva_capint2_isr; //中断使能PieVectTable.T1UFINT = &eva_timer1_isr; //定时器下溢中断使能EDIS;//使能T1下溢中断:PIE-组2,中断6,使能捕获中断PieCtrlRegs.PIEIER2.bit.INTx6 = 1;PieCtrlRegs.PIEIER3.bit.INTx5 = 1;PieCtrlRegs.PIEIER3.bit.INTx6 = 1;//使能CPU INT2,GP-Timer1的下溢中断连接到该中断,使能捕获中断IER = 0x0006;//全局中断使能,并使能具有更高优先级的实时调试方式EINT; //使能全局中断INTMERTM;//使能全局实时中断DBGMwhile(1){if(GpioDataRegs.GPBDAT.bit.GPIOB0==1){tiaosuzeng();}asm(" nop");asm(" nop");if(GpioDataRegs.GPBDAT.bit.GPIOB1==1){tiaosujian();}asm(" nop");asm(" nop");InitSpi();XianShi(N);num++;if(num==9999){num=0;}DELAY_US(80000L);InitSpi();}}//============捕获1 中断处理================// interrupt void eva_capint1_isr(void){// asm(" RPT #150 || NOP"); //空操作延时GpioMuxRegs.GPAMUX.all = 0x000F;GpioMuxRegs.GPADIR.bit.GPIOA8=0;GpioMuxRegs.GPADIR.bit.GPIOA9=0;if(GpioDataRegs.GPADAT.bit.GPIOA8==0&&GpioDataRegs.GPADAT.bit.GPIOA9==0){ state=0;}if(GpioDataRegs.GPADAT.bit.GPIOA8==1&&GpioDataRegs.GPADAT.bit.GPIOA9==1){state=3;}if(GpioDataRegs.GPADAT.bit.GPIOA8==1&&GpioDataRegs.GPADAT.bit.GPIOA9==0){state=2;}if(GpioDataRegs.GPADAT.bit.GPIOA8==0&&GpioDataRegs.GPADAT.bit.GPIOA9==1){state=1;}// x2=EvaRegs.T2CNT;x2=counter;x3=(long int)(x2-x1);if(x3<0){x3+=65536;}speed1=8330/x3;N=speed1*6;x1=x2;GpioMuxRegs.GPAMUX.all = 0x030F;EvaRegs.EV AIFRC.bit.CAP1INT = 1;PieCtrlRegs.PIEACK.all = PIEACK_GROUP3; }//============捕获2中断处理================// interrupt void eva_capint2_isr(void){//asm(" nop");GpioMuxRegs.GPAMUX.all = 0x000F;GpioMuxRegs.GPADIR.bit.GPIOA8=0;GpioMuxRegs.GPADIR.bit.GPIOA9=0;if(GpioDataRegs.GPADAT.bit.GPIOA8==1&&GpioDataRegs.GPADAT.bit.GPIOA9==0){state=2;}if(GpioDataRegs.GPADAT.bit.GPIOA8==0&&GpioDataRegs.GPADAT.bit.GPIOA9==1){state=1;}if(GpioDataRegs.GPADAT.bit.GPIOA8==0&&GpioDataRegs.GPADAT.bit.GPIOA9==0){ state=0;}if(GpioDataRegs.GPADAT.bit.GPIOA8==1&&GpioDataRegs.GPADAT.bit.GPIOA9==1){state=3;}GpioMuxRegs.GPAMUX.all = 0x030F;EvaRegs.EV AIFRC.bit.CAP2INT = 1;PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;}//============T1下溢中断处理================//interrupt void eva_timer1_isr(void){counter++;SPEED_PI();EvaRegs.CMPR1 = Iref;EvaRegs.CMPR2 = Iref;if(GpioDataRegs.GPADAT.bit.GPIOA10==1){ if(state==0){EvaRegs.ACTRA.all = 0x000A;GpioDataRegs.GPADAT.bit.GPIOA4=1;GpioDataRegs.GPADAT.bit.GPIOA5=1;}if( state==3){EvaRegs.ACTRA.all = 0x00A0;GpioDataRegs.GPADAT.bit.GPIOA4 = 0;GpioDataRegs.GPADAT.bit.GPIOA5 = 0;}if( state==2){EvaRegs.ACTRA.all = 0x0082;GpioDataRegs.GPADAT.bit.GPIOA4=0;GpioDataRegs.GPADAT.bit.GPIOA5=1;}if( state==1){EvaRegs.ACTRA.all = 0x0028;GpioDataRegs.GPADAT.bit.GPIOA4=1;GpioDataRegs.GPADAT.bit.GPIOA5=0;}} //通过以上不同的组合,可以改变I/O口的状态,//GpioDataRegs.GPEDAT.all查看I/O口状态EvaRegs.EV AIFRA.bit.T1UFINT=1;PieCtrlRegs.PIEACK.all=PIEACK_GROUP2; //#define PIEACK_GROUP2 0x0002;}。

DSP跑马灯实验程序

DSP跑马灯实验程序

在输出跑马灯的实验历程中/*led输出跑马灯实验,用软件延时方法循环点亮发光管DS4-DS19*/#include "DSP281x_Device.h"#include "DSP281x_Device.h" // DSP281x头文件#include "DSP281x_Examples.h" // DSP281x Examples 头文件void LedOut(Uint16 led);void Delay(Uint16 data);unsigned int LedCount;Uint16 led=0x0001; //led初值void IOinit() //I/O口初始化{EALLOW;//将GPIOB8~GPIOB15配置为一般I/O口,D0~D7GpioMuxRegs.GPBMUX.all = GpioMuxRegs.GPBMUX.all&0x00ff;//将GPIOB8~GPIOB15配置为输出,D0~D7GpioMuxRegs.GPBDIR.all = GpioMuxRegs.GPBDIR.all|0xff00;//将GPIOE0~GPIOE2配置为一般I/O口输出,作138译码GpioMuxRegs.GPEMUX.all = GpioMuxRegs.GPEMUX.all&0xfff8;GpioMuxRegs.GPEDIR.all = GpioMuxRegs.GPEDIR.all|0x0007;EDIS;}void main(void){InitSysCtrl(); /*初始化系统*/DINT; /*关中断*/IER = 0x0000;IFR = 0x0000;IOinit(); //I/O口初始化while (1){LedOut(led);Delay(60000);Delay(60000);Delay(60000);Delay(60000);Delay(60000);Delay(60000);Delay(60000);Delay(60000);Delay(60000);Delay(60000);led =led << 1; //led的值左移1位LedCount++;if (LedCount>=16){LedCount=0 ;led=0x0001;}}}void LedOut(Uint16 led){Uint16 i;EALLOW;GpioMuxRegs.GPBDIR.all = GpioMuxRegs.GPBDIR.all|0xff00; //将GPIOB8~GPIOB15配置为输出,D0~D7EDIS;GpioDataRegs.GPEDA T.all = 0xfffb; //LEDB选通GpioDataRegs.GPBDA T.all = ~led; //显示高8位for (i=0; i<100; i++){} //延时GpioDataRegs.GPEDA T.all = 0xffff; //锁存高8位GpioDataRegs.GPEDA T.all = 0xfffa; //LEDA选通GpioDataRegs.GPBDA T.all = ~(led<<8);//显示低8位for (i=0; i<100; i++){}GpioDataRegs.GPEDA T.all = 0xffff; //锁存低8位}void Delay(Uint16 data){Uint16 i;for (i=0;i<data;i++) { ; }}红色的语句是什么意思呀那个延时程序中的data是什么,为什么要等于60000,最多可以多少谢谢各位高手!。

DSP对程序中常出现的EINT、DINT、ERTM、DRTM的理解

DSP对程序中常出现的EINT、DINT、ERTM、DRTM的理解

对程序中常出现的EINT、DINT、ERTM、DRTM的理解一、参考DSP281x_Device.h#define EINT asm(" clrc INTM") //INTM置0,开中断#define DINT asm(" setc INTM") //INTM置1,关中断#define ERTM asm(" clrc DBGM") //使能调试事件#define DRTM asm(" setc DBGM") //禁止调试事件二、参考《TMS320C28x DSP CPU和指令集参考指南》中对INTM和DBGM 的解释(译的不好,凑合看吧。

)1、DBGMBit 1:调试启用屏蔽位。

当DBGM置位时,仿真器无法在实时状态下访问内存或寄存器。

调试器无法更新其窗口。

在实时调试模式中,若DBGM = 1,则CPU忽略停止请求或硬件断点,直到DBGM清零。

DBGM并不阻止CPU停止在软件断点。

这点的一个影响可以在实时调试模式中看到。

如果你在实时调试模式中单步执行一个指令,并且这条指令置位DBGM,CPU继续执行指令,直到DBGM被清零。

当你给TI调试器“实时”命令时(进入实时模式),DBGM强制为0。

令DBGM = 0确保了允许调试和测试直接内存访问(DT-DMAs);内存和寄存器的值可传递到主处理器,用于更新调试器窗口。

CPU在执行中断服务程序(ISR)之前将DBGM置位。

当DBGM = 1时,来自主处理器和硬件断点的停止请求被忽略。

如果你想要单步执行程序或在对时间要求不严格的ISR中设置断点,那么你必须在ISR的开始处增加一条CLRC DBGM指令。

DBGM主要用在时间要求严格的程序代码部分的仿真,来阻止调试事件。

DBGM使能或禁止调试事件,如下:0 调试事件使能。

1 调试事件禁止。

当CPU响应中断时,DBGM的当前值存储到堆栈中(当ST1存储在堆栈中时),然后DBGM置位。

dsp28335的一些常识

dsp28335的一些常识

对程序中常出现的EINT、DINT、ERTM、DRTM的理解(2010-09-03 11:55:22)标签:分类:dsp学习杂谈一、参考DSP281x_Device.h#define EINT asm(" clrc INTM") //INTM置0,开中断#define DINT asm(" setc INTM") //INTM置1,关中断#define ERTM asm(" clrc DBGM") //使能调试事件#define DRTM asm(" setc DBGM") //禁止调试事件二、参考《TMS320C28x DSP CPU和指令集参考指南》中对INTM和DBGM 的解释(译的不好,凑合看吧。

)1、DBGMBit1:调试启用屏蔽位。

当DBGM置位时,仿真器无法在实时状态下访问内存或寄存器。

调试器无法更新其窗口。

在实时调试模式中,若DBGM=1,则CPU忽略停止请求或硬件断点,直到DBGM清零。

DBGM并不阻止CPU停止在软件断点。

这点的一个影响可以在实时调试模式中看到。

如果你在实时调试模式中单步执行一个指令,并且这条指令置位DBGM,CPU继续执行指令,直到DBGM被清零。

当你给TI调试器“实时”命令时(进入实时模式),DBGM强制为0。

令DBGM = 0确保了允许调试和测试直接内存访问(DT-DMAs);内存和寄存器的值可传递到主处理器,用于更新调试器窗口。

CPU在执行中断服务程序(ISR)之前将DBGM置位。

当DBGM = 1时,来自主处理器和硬件断点的停止请求被忽略。

如果你想要单步执行程序或在对时间要求不严格的ISR中设置断点,那么你必须在ISR的开始处增加一条CLRC DBGM指令。

DBGM主要用在时间要求严格的程序代码部分的仿真,来阻止调试事件。

DBGM使能或禁止调试事件,如下:0调试事件使能。

跑马灯程序

跑马灯程序
int i;
InitSysCtrl();//初始化DSP运行时钟
while ( 1 )
{
for ( i=0;i<4;i++ )
{
LBDS=uLED[i];//正向顺序送控制字
Delay(256);//延时
}
for ( i=3;i>=0;i-- )
{
LBDS=uLED[i];//反向顺序送控制字
Delay(256);//延时
// No more.
//========================================
实验结果:
#define CTRLCDCMDR *(int *)0x108001
#define CTRKEY *(int *)0x108001
#define CTRLCDCR *(int *)0x108002
#define CTRCLKEY *(int *)0x108002
#define CTRLCDLCR *(int *)0x108003
CTRGR=0;//初始化ICETEK-CTR
CTRGR=0x80;
CTRGR=0;
CTRLR=0;//关闭东西方向的交通灯
CTRLR=0x40;//关闭南北方向的交通灯
uPort8000=CTRCLKEY;
while ( 1 )
{};
}
interrupt void cpu_timer0_isr(void)
跑马灯程序:
#include "DSP281x_Device.h" // DSP281x Headerfile Include File
#include "DSP281x_Examples.h" // DSP281x Examples Include File

DSP2812-实验要求以及参考程序

DSP2812-实验要求以及参考程序

实验一DSP数据存取实验实验要求:1、找到main函数入口地址4、观察从地址0x80000到0x80007的存储内容操作步骤:1、打开Setup CCStudio v3.3 ,系统配置为F2812 Device Simultor2、打开CCStudio v3.3,打开工程F2812\DSP281x_examples\Lab0201-Memory\Memory.pjt3、在main函数处设断点(F9),运行程序4、打开反汇编窗口(View>Disassembly),观察入口地址5、修改Memory.c中程序,完成存储区数据修改6、编译通过,加载.out 文件7、设置在变量定义处设置断点,点击运行(F5),单步运行(F11)8、打开观察窗(View>Watch Window)观察自己所设变量在单步运行时变化9、打开存储区窗口(View>Memory)观察地址为0x80000到0x80007的数据变化实验二指示灯与拨码开关实验实验要求:1、熟悉板上指示灯控制寄存器、开关控制寄存器2、指示灯点亮规则:只闭合拨码开关1:全灭;只闭合拨码开关2:全亮;只闭合拨码开关3: 顺序依次点亮;只闭合拨码开关4:反向顺序依次点亮;开关的其它状态:全灭;操作步骤:1、打开Setup CCStudio v3.3 ,系统配置为F2812 XDS510 Emulator_12、打开CCStudio v3.3,打开工程F2812\DSP281x_examples\Lab0201-Memory\led.pjt3、修改led.c,注意板上DIP开关控制寄存器地址为C0001h,板上指示灯控制寄存器地址为:C0000h。

这两个寄存器都是低四位有效。

4、观察实验现象实验三DSP定时器实验要求:1、利用定时器中断代替软件延时函数控制指示灯显示频率,要求1秒闪烁一次2、实物仿真时,通过CCS中的Clock功能统计延时函数的延时时间,与设定值进行比较操作步骤:1、打开Setup CCStudio v3.3 ,系统配置为F2812 XDS510 Emulator_12、打开CCStudio v3.3,打开工程F2812\DSP281x_examples\Lab0201-Memory\time.pjt3、修改time.c程序,写一个由定时器中断产生的以1s为单位的延时函数void delay(int time);4、在菜单中选择profile>Enable\View5、在延时函数前后各设置一个断点6、清零时钟计数器(双击清零),点击Run运行程序7、计算时间t=测得值/150000000(假如系统的时钟工作在150MHZ),与设定值进行比较实验四事件管理器实验实验要求1、利用事件管理器中的16路中的PWM1,输出一段连续变化的PWM波2、驱动扬声器蜂鸣器播放一段音乐声(声音频率文件参考Speaker.pjt)操作步骤1、打开Setup CCStudio v3.3 ,系统配置为F2812 XDS510 Emulator_12、打开CCStudio v3.3,打开工程F2812\DSP281x_examples\Lab0201-Memory\PWM.pjt和F2812\DSP281x_examples\Lab0201-Memory\Speaker.pjt3、在例程Speaker.c中是使用通用定时器TIME0来连续输出频率的方波,这里要求改为用EVA中的PWM1代替之。

对程序中常出现的EINT、DINT、ERTM、DRTM的理解

对程序中常出现的EINT、DINT、ERTM、DRTM的理解
此M在中断操作期间被自动置位。复位时,DBGM置位。执行ABORTI (中止中断)指令也可以将DBGM置位。
2、INTM
Bit 0:中断全局屏蔽位。此位从全局上使能或禁止所有可屏蔽CPU中断(那些可由软件阻止的中断):
#define ERTM asm(" clrc DBGM") //使能调试事件
#define DRTM asm(" setc DBGM") //禁止调试事件
二、参考《TMS320C28x DSP CPU和指令集参考指南》中对INTM和DBGM的解释(译的不好,凑合看吧。。。)
1、DBGM
对程序中常出现的EINT、DINT、ERTM、DRTM的理解
一、参考DSP281x_Device.h
#define EINT asm(" clrc INTM") //INTM置0,开中断
#define DINT asm(" setc INTM") //INTM置1,关中断
0 可屏蔽中断被全局使能。为了被CPU认可,则可屏蔽中断也必须被中断使能寄存器(IER)局部使能。
1 可屏蔽中断被全局禁止。即使一个可屏蔽中断被IER局部使能,也不会被CPU认可。
INTM对非可屏蔽中断没有影响,包括硬件复位或软件复位中断NMI。此外,当CPU在实时仿真模式下被停止时,由IER和DBGIER使能的中断将被响应,即使INTM设置为禁止可屏蔽中断。
当CPU响应中断时,INTM的当前值存储到堆栈中(当ST1存储在堆栈中时),然后INTM置位。当由中断返回时,INTM由堆栈中恢复。
此位可分别由SETC INTM指令和CLRC INTM指令复位和清零。复位时,INTM置位。INTM的值不会引起中断标志寄存器(IFR)、中断使能寄存器(IER)或调试中断使能寄存器(DBGIER)的改变。

dsp28335的一些常识

dsp28335的一些常识

对程序中常出现的EINT、DINT、ERTM、DRTM的理解(2010-09-03 11:55:22)分类:dsp学习标签:杂谈一、参考DSP281x_Device.h#define EINT asm(" clrc INTM") //INTM置0,开中断#define DINT asm(" setc INTM") //INTM置1,关中断#define ERTM asm(" clrc DBGM") //使能调试事件#define DRTM asm(" setc DBGM") //禁止调试事件二、参考《TMS320C28x DSP CPU和指令集参考指南》中对INTM和DBGM 的解释(译的不好,凑合看吧。

)1、DBGMBit 1:调试启用屏蔽位。

当DBGM置位时,仿真器无法在实时状态下访问内存或寄存器。

调试器无法更新其窗口。

在实时调试模式中,若DBGM = 1,则CPU忽略停止请求或硬件断点,直到DBGM清零。

DBGM并不阻止CPU停止在软件断点。

这点的一个影响可以在实时调试模式中看到。

如果你在实时调试模式中单步执行一个指令,并且这条指令置位DBGM,CPU继续执行指令,直到DBGM被清零。

当你给TI调试器“实时”命令时(进入实时模式),DBGM强制为0。

令DBGM = 0确保了允许调试和测试直接内存访问 (DT-DMAs);内存和寄存器的值可传递到主处理器,用于更新调试器窗口。

CPU在执行中断服务程序(ISR)之前将DBGM置位。

当DBGM = 1时,来自主处理器和硬件断点的停止请求被忽略。

如果你想要单步执行程序或在对时间要求不严格的ISR中设置断点,那么你必须在ISR的开始处增加一条CLRC DBGM指令。

DBGM主要用在时间要求严格的程序代码部分的仿真,来阻止调试事件。

DBGM使能或禁止调试事件,如下:0 调试事件使能。

DSP2812总结之(1)

DSP2812总结之(1)

DSP总结之(1)第一部分:TMS320F2812简介♦DSP(Digital Signal Processor)数字信号处理器,主要研究如何将理论上的数据处理技术应用于DSP中。

♦DSP采用哈佛结构,通过独立的数据总线在程序空间和数据空间同时访问。

♦在一个指令周期内(150MHz,6.67ns)可以完成一次乘法和一次加法运算。

♦TMS320F2812是TI(Texas Instruments)公司推出的32位定点DSP芯片,属于C2000系列。

向下是2407,向上是28335。

TMS表合格产品,320表TI DSP系列,F表Flash EEROM (内核电压1.8/1.9V,I/O口电压3.3V),PGF表176脚LQFP封装,A表40℃-85℃。

♦DSP开发所需准备的工具:CCS3.3+仿真器XDS100+目标板F2812+具体外围电路♦F2812片内外设(DSP内部集成的外部设备)6个:EV A EVB ADC SCIA SCIB SPI CAN McBSP♦常用地:脚86,常用3.3V:脚81♦用ADC时,脚175和176相连♦常用到F14作为I/O口输出,作指示使用♦JTAG(Joint Test Action Group ,联合测试行动小组) 是一种国际标准测试协议,主要用于芯片内部测试及对系统进行仿真、调试,如今大多数比较复杂的器件都支持JTAG 协议,如ARM 、DSP 、FPGA 器件等。

♦工程文件放在MyProjects文件夹中肯定好使,放在其他地方(桌面除外)亦可。

♦.h文件定义了DSP内部寄存器的数据结构、中断服务程序等内容软件开发时编写的代码都是写在.c中.cmd文件规定了把哪些代码放到哪个区域,管存储空间分配♦.h中宏定义、变量、函数声明.c所有变量和函数的定义♦DSP281x_Device.h中有一段代码已经包含了其他的头文件(具体多少个在其中看,2个未加DSP281x_Device.h)。

dsp电机代码

dsp电机代码

#include "DSP281x_Device.h"#include "DSP281x_Examples.h"#define LCD_DELAY_nUS(A) Delay(((((long double) A * 1000.0L) / (long double)6.666667) - 18.0L) / 14.0L)void Delay(unsigned long loopCnt);//'''''''''''''''''''''''''液晶显示值/'''''''''''''''''''''''''''''''''''''extern unsigned char number[10];extern unsigned char a,b,c,d,e, biao_zhi;unsigned char f;int NowSpd=0;long Place_now_display=0;//'''''''''''''''''''''''''''end'''''''''''''''''''''''''''''''////::::::::::::::::::::::::电机初始化变量定义:::::::::::::::::::::::::::::::::char motor_OK=1, shan_qu=0;//;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;/*::::::::::::::::::::::::::速度变量值定义:::::::::::::::::::::::::::::::::::::::::::*/int temp=0, temp1=0, temp2=0;long SatErr_speed=0,OutPreSat_speed=0; //速度变量值定义long speed_now=0, Up_speed=0, speed_error=0, Ui_speed=0;long speed_set=0;//:::::::::::::::::::::::::::位置环变量定义:::::::::::::::::::::::::::long PlaceSet=0, PlaceError=0,Place_now=0, Now_P=0,//圈数OutPreSat_Place=0; //位置变量值定义unsigned char PlaceSetBit=0; //位置设定标志位//--------------------------------------------------------------------//:::::::::::::::::::::::::空间矢量变量定义:::::::::::::::::::::::::::::::::::::::::int extent_temp=0, extent_temp1=0, extent_temp2=0;//位置变量值定义unsigned int extent[14]={0x3999, 0x2999, 0x6999, 0x4999, 0x5999, 0x1999, 0x3999, 0x2999, 0x6999, 0x4999, 0x5999, 0x1999, 0x3999, 0x2999 }; //区域数组定义int extent_i=0, extent_D=0, extent_Q=0, extent_D_1=0; //扇区变量,extent_i, extent_D, extent_Q(extent_Q比extent_D超前90度//-----------------------------------extern const int sin_theta[1000];//外部SIN表extern const int cos_theta[1000];//外部cos表//cos_theta[theta]为Q15格式, ID, IQ为Q7格式1-128, Id,Iq为LONG型int t1=0, t2=0, CMPR_temp=1250, theta=0, pwm_temp=0;// turn=0;long Id=0, Iq=0, ID=0, IQ=0, Ualfa=0, Ubeta=0, x=0, y=0, z=0, temp_volue=0;//===========================电流环变量定义=========================int AD2_temp=0,Ki_Q_temp=0, Ki_D_temp=0, pwm_x=0,theta_add_60=0;long Iu=0,Iv=0, I_d=0, I_q=0, I_ref_D=0, I_ref_Q=0, I_er_Q=0,I_er_D=0, I_order_Q=0,OutPreSat_IQ=0, SatErr_IQ=0, Ui_IQ=0, Up_IQ=0,OutPreSat_ID=0, SatErr_ID=0, Ui_ID=0, Up_ID=0;//------------------------------------------------------------------// long adc_x0=0, adc_x1=0, adc_restul1=0, adc_restul0=0,adc_i=0;//===========================测试变量==============================// unsigned int TimeClash=0, timer2_x=0,timer2_x1=0, timer1_test[1000]={0},// timer2_test[1000]={0}, timer3_test[500]={0}, //timer4_test[500]={0}, // test_i=0, ICTs=0;unsigned int TimeClash=0;extern unsigned int IsrTest;//-------------------------------------------------------------------//==========================串口程式变量定义==========================int ReceiveTemp = 0, SciCommand_i=0, SciCommand_j=0, SetBit=0;int SpeedSetTemp = 0, PlaceEnable=1, SpeedSetAD=0;long PlaceSetTemp=0, SciCommand[14]={0};//--------------------------------------------------------------------////////////////外部中断初始化/////////////////////// void init_Xint1(void){EALLOW;PieCtrlRegs.PIEIER1.bit.INTx4=1; //中断允许PieCtrlRegs.PIEIFR1.bit.INTx4=0; //清除中断标志PieCtrlRegs.PIEACK.bit.ACK1=1;XIntruptRegs.XINT1CR.bit.POLARITY=1; // 上升沿触发XIntruptRegs.XINT1CR.bit.ENABLE=1;EDIS;EINT;}////////////////ADC初始化/////////////////////void init_ADC(void){//AdcRegs.ADCTRL1.bit.RESET = 1;//AdcRegs.ADCTRL1.bit.RESET = 0;AdcRegs.ADCTRL3.bit.ADCPWDN = 1;LCD_DELAY_nUS(2000);AdcRegs.ADCTRL3.bit.ADCBGRFDN = 3;LCD_DELAY_nUS(2000);AdcRegs.ADCTRL1.bit.CONT_RUN = 1; //连续运行;AdcRegs.ADCTRL1.bit.CPS = 0;AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1 = 1;AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1;AdcRegs.ADCTRL3.bit.ADCCLKPS = 3; //25MHZAdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 2;AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0;AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 1;AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 2;}///////////////初始化事件管理器EVA//////////////////// void Init_Evx(void){//=======定时器3定时中断初始化====================== EALLOW;EvbRegs.T3PR=9375; //一毫秒EvbRegs.T3CON.all=0x1340; //8分频PieCtrlRegs.PIEIER4.bit.INTx4=1;//定时器3周期中断允许PieCtrlRegs.PIEIFR4.bit.INTx4=0;//清除中断标志位PieCtrlRegs.PIEACK.bit.ACK4=1;EvbRegs.EVBIMRA.bit.T3PINT=1;EvbRegs.EVBIFRA.bit.T3PINT=1;EDIS;//-------------------------------------------//========定时器1下溢中断&(svpwm)初始化====================EALLOW;EvaRegs.T1CON.all = 0x0842; //定时器1,连续增减,一分频,使能,比较使能,立即重载EvaRegs.T1PR = 1250; //30MHZ PWMEvaRegs.CMPR1 = 0; //测试用EvaRegs.CMPR2 = 0; //测试用CONA.all |= 0X9200; //使能比较操作, 使能SVPWM模式, T0下溢重载, PWM比较输出使能EvaRegs.ACTRA.all = 0X0999; //SV正转, PWM 1,3,5低有效& pWM 2,4,6高有效;// EvaRegs.EXTCONA.bit.INDCOE = 1; //独立输出比较使能// EvaRegs.GPTCONA.all |= 0x0052;EvaRegs.T1CNT = 0;EvaRegs.EVAIMRA.bit.T1UFINT = 1; //下溢中断允许EvaRegs.EVAIFRA.bit.T1UFINT = 1; //清除下溢中断标志位PieCtrlRegs.PIEIER2.bit.INTx6 = 1;//下溢中断向量允许PieCtrlRegs.PIEIFR2.bit.INTx6 = 0;//清除下溢中断标志PieCtrlRegs.PIEACK.bit.ACK2 = 1;/////////////////QEP初始化////////////////EvaRegs.T2CON.all = 0x1870;EvaRegs.T2CNT = 0x0000;EvaRegs.T2PR = 0xffff;//------------------------------------------/*////////////// EVB捕获功能初始化/////////EvbRegs.CAPCONB.bit.CAP45EN = 1; //使能捕捉单元4和5 EvbRegs.CAPCONB.bit.CAP45TSEL = 3; //44和5选择定时器3 EvbRegs.CAPCONB.bit.CAP4EDGE = 3; // 单元4上升和下降沿触发EvbRegs.CAPCONB.bit.CAP5EDGE = 3; // 单元5上升和下降沿触发EvbRegs.EVBIFRC.bit.CAP4INT = 1; //复位捕捉4标志位EvbRegs.EVBIFRC.bit.CAP5INT = 1; //复位捕捉5标志位EvbRegs.EVBIMRC.bit.CAP4INT = 1; //允许捕捉中断4 EvbRegs.EVBIMRC.bit.CAP5INT = 1; //允许捕捉中断5PieCtrlRegs.PIEIER5.bit.INTx5 = 1; //允许捕捉中断4向量PieCtrlRegs.PIEIER5.bit.INTx6 = 1; //允许捕捉中断5向量PieCtrlRegs.PIEIFR5.bit.INTx5 = 0; //清除捕捉中断4标志位PieCtrlRegs.PIEIFR5.bit.INTx6 = 0; //清除捕捉中断5标志位PieCtrlRegs.PIEACK.bit.ACK5 = 1; *///------------------------------------------EDIS;}///////////////////SCI初始化////////////////////////////////// void InitSci(void){EALLOW;//SendSciaRegs.SCICTL1.bit.SWRESET = 1;SciaRegs.SCICCR.bit.SCICHAR = 7; //取八位数据SciaRegs.SCICTL1.bit.TXENA = 1; //open send//ReceiveSciaRegs.SCICTL1.bit.RXENA = 1; //open receiveSciaRegs.SCICTL2.bit.RXBKINTENA = 1; //允许接收中断SciaRegs.SCIHBAUD = 0x01;SciaRegs.SCILBAUD = 0xE7; //9600PieCtrlRegs.PIEIER9.bit.INTx1 = 1; //允许接收中断PieCtrlRegs.PIEIFR9.bit.INTx1 = 0;PieCtrlRegs.PIEACK.bit.ACK9 = 1;///////////////功率保护中断初始化////////////////EvaRegs.EVAIMRA.bit.PDPINTA = 1; //PDPINTA中断允许EvaRegs.EVAIFRA.bit.PDPINTA = 1; //PDPINTA中断标志清零PieCtrlRegs.PIEIER1.bit.INTx1 = 1; //PDPINTA中断允许PieCtrlRegs.PIEIFR1.bit.INTx1 = 0;PieCtrlRegs.PIEACK.bit.ACK1 = 1; //EDIS;}//-----------------------------------------------------------///////////////////电机初始化函数(位置确定)//////////////////////////// void motor_init(void){switch(GpioDataRegs.GPADAT.all & 0xE000){case 0xA000: shan_qu=0; break;case 0x2000: shan_qu=1; break;case 0x6000: shan_qu=2; break;case 0x4000: shan_qu=3; break;case 0xC000: shan_qu=4; break;case 0x8000: shan_qu=5; break;default: motor_OK = 0; break;}extent_D = 833 * shan_qu + 416 ;}//////////////////中虾 ?////////////////////////// interrupt void MY_XINT1_ISR(void);//T1捕获中断interrupt void MY_T3PINT_ISR(void);interrupt void MY_T1UFINT_ISR(void);interrupt void MY_SCI_ISR(void);interrupt void MY_PDPINDA_ISR(void);//---------------------------------------------------------void SciSendChar(unsigned char SciSendTemp);void SciSendString(unsigned char *x);void main(void)/***********************************************************************/ InitSysCtrl(); //初始化系统控制寄存器,PLL,看门狗...InitGpio(); //初始化GPIO工作模式InitPeripheralClocks(); //初始化外设时钟InitPieCtrl(); //初始化PIE寄存器InitPieVectTable(); //初始化PIE中断向量表motor_init(); //电机初始化if(motor_OK==1) //如果电机工作正常才允许使用{init_Xint1(); //初始化外部中断1init_ADC(); //初始化ADCInit_Evx(); //初始化事件管理A}Init_LCD(); //液晶初始化两次Init_LCD();InitSci();EALLOW;PieVectTable.XINT1 = &MY_XINT1_ISR; //外部中断XINT1向量地址PieVectTable.T3PINT = &MY_T3PINT_ISR; //TIMER3比较中断PieVectTable.T1UFINT = &MY_T1UFINT_ISR; //time 1 下溢中断PieVectTable.RXAINT = &MY_SCI_ISR; //SciInterruptPieVectTable.PDPINTA = &MY_PDPINDA_ISR; //PDPINDAEDIS;IER = 0x0000;IER = 0x010b; //xint1 tiufint t3pint rxaint(int1 int2 int4 int9)IFR = 0x0000;EINT; //开放全局中断/********************************************************************/while (1){if(motor_OK==1){display_a_string(0,0, "NowSpd=");display_a_string(12,0, "r/m");if(speed_now>=0){NowSpd = speed_now;display_a_char(7,0,'+');}else{NowSpd =-speed_now;display_a_char(7,0,'-');}a=NowSpd/1000;b=NowSpd%1000/100;c=NowSpd%100/10;d=NowSpd%10;display_a_char(8,0,number[a]); display_a_char(9,0,number[b]); display_a_char(10,0,number[c]); display_a_char(11,0,number[d]);display_a_string(0,1,"Now_P="); display_a_string(13,1,"r");if(Now_P>=0){Place_now_display=Now_P;display_a_char(6,1,'+');}else{Place_now_display=-Now_P;display_a_char(6,1,'-');}f=Place_now_display/100000;e=Place_now_display%100000/10000;a=Place_now_display%10000/1000;b=Place_now_display%1000/100;c=Place_now_display%100/10;d=Place_now_display%10;display_a_char(7,1,number[f]);display_a_char(8,1,number[e]);display_a_char(9,1,number[a]);display_a_char(10,1,number[b]);display_a_char(11,1,number[c]);display_a_char(12,1,number[d]);if(SetBit==0)//清除位置信号数组{for(SciCommand_j=0;SciCommand_j<14;SciCommand_j++){ SciCommand[SciCommand_j]=0; }}//////////////////返回位置完成信息///////////////////////////////////if((PlaceError<=2)&&(PlaceError>=-2)) //当脉冲数相差+-1时,速度为0{if(PlaceSetBit == 1){PlaceSetBit = 0;SciSendString("Place Ok!");}}}else{display_a_string(0,0,"Motor error! ");display_a_string(0,1,"Please check it!");}}}/////////////////外部中断1程序//////////////////////interrupt void MY_XINT1_ISR(void){if(TimeClash == 0){if(EvaRegs.GPTCONA.bit.T2STAT==1) //圈数{ Now_P++; } //正转else{ Now_P--; } //反转extent_temp2=EvaRegs.T2CNT;extent_D=0;}PieCtrlRegs.PIEACK.bit.ACK1=1;EINT;}//////////////////定时器3中断程序///////////////////// interrupt void MY_T3PINT_ISR(void){EvbRegs.T3CNT=0; //从载计数器值EVBtemp1 = EvaRegs.T2CNT;if((temp1-temp2)>=50000){temp=65536-temp1+temp2;Place_now-=temp;temp = -temp;}//电机(反转)过峰值else if((temp2-temp1)>=50000){temp=65536-temp2+temp1;Place_now+=temp; //电机(正转)过峰值}else if(temp1 >= temp2){ temp=temp1-temp2; Place_now+=temp; }//电机(正转)else{temp=temp2-temp1;Place_now-=temp; //电机(反转)temp = -temp;}temp2 = temp1;speed_now = 6*temp;//==================位置环PI控制======================if(PlaceEnable ==1){PlaceError = PlaceSet - Place_now;OutPreSat_Place = PlaceError;if((PlaceError<=10000)&&(PlaceError>=-10000)){OutPreSat_Place = PlaceError/3;}{ if (OutPreSat_Place> 2000)speed_set = 2000;else if (OutPreSat_Place< -2000)speed_set = -2000;elsespeed_set = OutPreSat_Place;}}//----------------- 位置环PI控制结束------------------//******************************************************************* if(SpeedSetAD==1){AD2_temp=AdcRegs.ADCRESULT2>>4;speed_set = AD2_temp-2048;}//********************************************************************//================速度环PI控制====================== speed_error = speed_set - speed_now;Up_speed = 10*speed_error; //25Ui_speed = Ui_speed + 32*Up_speed/100 + 1*SatErr_speed;OutPreSat_speed = Up_speed + Ui_speed ;{if (OutPreSat_speed > 1600)I_order_Q = 1600;else if (OutPreSat_speed < -1600)I_order_Q = -1600;elseI_order_Q = OutPreSat_speed;}SatErr_speed = I_order_Q - OutPreSat_speed;//----------------- 速度环PI控制结束------------------/*{//测试用if((GpioDataRegs.GPADAT.bit.GPIOA12 == 0)&&(timer2_x1==0)) { timer2_x1=1; }if(timer2_x1==1){timer1_test[timer2_x] = speed_set;timer2_test[timer2_x] = speed_now;timer3_test[timer2_x] = Place_now;// timer4_test[timer2_x] = speed_set;timer2_x++;if(timer2_x>=500){ timer2_x=500; }}}//测试用*/PieCtrlRegs.PIEACK.bit.ACK4=1;EvbRegs.EVBIMRA.bit.T3PINT=1;EvbRegs.EVBIFRA.bit.T3PINT=1;EINT;}//////////////////定时器1下溢中断//////////////////////interrupt void MY_T1UFINT_ISR(void){pwm_x++;//>>>>>>>>>>>>>>>>>>>>直轴位置确定>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>{ //位置范?extent_temp1=EvaRegs.T2CNT;if((extent_temp1-extent_temp2)>=50000) //电机反转{ extent_temp= 65536 - extent_temp1 + extent_temp2; extent_D-= extent_temp; }else if((extent_temp2-extent_temp1)>=50000) //电机正传{ extent_temp= 65536 - extent_temp2 + extent_temp1; extent_D+= extent_temp; }else if(extent_temp1 >= extent_temp2) //电机正传{ extent_temp= extent_temp1 - extent_temp2; extent_D+= extent_temp; }else //电机反转{ extent_temp= extent_temp2 - extent_temp1; extent_D-= extent_temp; }extent_temp2= extent_temp1;} //位置确定if(extent_D < 0){ extent_D = 10000 + extent_D; }//保证extent_D不超过10000if(extent_D >= 10000){ extent_D = extent_D - 10000; }//####################### 计算电机角度THETA###########################extent_D_1 = extent_D + 105; //加105是为了补偿电机脉冲平均误差,电机脉冲为105if(extent_D_1 >= 10000){ extent_D_1 = extent_D_1 - 10000; }//交轴值由10000减去现值theta = extent_D_1/10; //现在电机D轴的位置if(pwm_x==3) //加入电流环{pwm_x=0;theta_add_60 = theta + 83; //加83为了对应电机的相位+60度(电流环专用)if(theta_add_60 >= 1000){ theta_add_60 = theta_add_60 - 1000; }if(theta_add_60 < 0){ theta_add_60 = theta_add_60 + 1000; }//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>//======================读取电流值,CLARKE和Park变换作电流反馈之用========================================Iu = AdcRegs.ADCRESULT0>>4;Iu = Iu - 1831; //读取U相的电流值1845 |Iv = AdcRegs.ADCRESULT1>>4;Iv = Iv - 1833; //读取V相电流值1853 | 电流CLARKE变换I_d = Iu;I_q = ((2*Iv + Iu)*18919)>>15; //其中式为(2*Ib+Id)*1.732/3 |I_ref_D = ( I_d*cos_theta[theta_add_60] + I_q*sin_theta[theta_add_60])>>15; //|电流Park变换I_ref_Q = (-I_d*sin_theta[theta_add_60] + I_q*cos_theta[theta_add_60])>>15; //|//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++//==========================电流环的Q轴PI控制=======================================//I_er_Q = I_order_Q - I_ref_Q;Up_IQ = 9*I_er_Q/10; //35*I_er_Q/10Ui_IQ = Ui_IQ + 1*Up_IQ/10 + 1*SatErr_IQ/10;OutPreSat_IQ = Up_IQ + Ui_IQ ;if (OutPreSat_IQ > 1023)IQ = 1023;else if (OutPreSat_IQ < -1023)IQ = -1023;elseIQ = OutPreSat_IQ;SatErr_IQ = IQ - OutPreSat_IQ;//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++//==========================电流环的D轴PI控制=======================================//I_er_D = 0 - I_ref_D;Up_ID = 9*I_er_D/10;Ui_ID = Ui_ID + 1*Up_ID/10 + 1*SatErr_ID/10;OutPreSat_ID = Up_ID + Ui_ID ;if (OutPreSat_ID > 500)ID = 500;else if (OutPreSat_ID < -500)ID = -500;elseID = OutPreSat_ID;SatErr_ID = ID - OutPreSat_ID;//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++}//电流环计算结束if((speed_set==0)&&(speed_error==0)&&(PlaceSetBit == 0)) //防止电机静止时的噪声{ IQ=0; ID=0; }//********SVPWM控制---相当于直流电机的PWM控制(最大值1023 最小值-1023; 正值正转,负值反转*****if(IQ>=0)//当MOTOR正转时{/* Id=ID*cos(sita)-IQ*sin(sita);Iq=ID*sin(sita)+IQ*cos(sita);Ualfa=Id; Ubeta=Iq;x=Ubeta;y=(1.732051*Ualfa+Ubeta)/2;z=(-1.732051*Ualfa+Ubeta)/2;*///cos_theta[theta]为Q15格式, ID, IQ为Q7格式1-128, Id,Iq为LONG型Id=ID*cos_theta[theta] - IQ*sin_theta[theta]; /*逆PARK变换*/Iq=ID*sin_theta[theta] + IQ*cos_theta[theta];Ualfa=Id>>10;Ubeta=Iq>>10; //Ualfa & Ubeta type is longtemp_volue=(56756 * Ualfa)>>15;//==1.732051*Ualfax=Ubeta;y=(temp_volue + Ubeta)>>1; //除远?移一位z=(-temp_volue + Ubeta)>>1;extent_Q = extent_D_1 + 1250; //交轴值由10000减去现值{//+++if(extent_Q >= 10000){extent_Q = extent_Q - 10000; //如果实际交轴的值超过了要减去10000}if(extent_Q < 0){extent_Q = extent_Q + 10000;}} //---extent_i = extent_Q / 833; //实际交轴的角度if(extent_i > 11){ extent_i = 11; }EvaRegs.ACTRA.all=extent[extent_i]; //把扇区位置写入PWM控制寄存器switch(extent_i){case 0:{t1=(-z*CMPR_temp)>>15; t2=(x*CMPR_temp)>>15; break; }case 1:{ t1=(y*CMPR_temp)>>15; t2=(z*CMPR_temp)>>15; break; }case 2:{ t1=(x*CMPR_temp)>>15; t2=(-y*CMPR_temp)>>15; break; }case 3:{t1=(z*CMPR_temp)>>15; t2=(-x*CMPR_temp)>>15; break; }case 4:{t1=(-y*CMPR_temp)>>15; t2=(-z*CMPR_temp)>>15; break; }case 5:{ t1=(-x*CMPR_temp)>>15; t2=(y*CMPR_temp)>>15; break; }//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++case 6:{t1=(-z*CMPR_temp)>>15; t2=(x*CMPR_temp)>>15; break; }case 7:{ t1=(y*CMPR_temp)>>15; t2=(z*CMPR_temp)>>15; break; } case 8:{ t1=(x*CMPR_temp)>>15; t2=(-y*CMPR_temp)>>15; break; } case 9:{t1=(z*CMPR_temp)>>15; t2=(-x*CMPR_temp)>>15; break; } case 10:{t1=(-y*CMPR_temp)>>15; t2=(-z*CMPR_temp)>>15; break; } case 11:{ t1=(-x*CMPR_temp)>>15; t2=(y*CMPR_temp)>>15; break; } default:break;}if(t1<0){ t1=0;}if(t2<0){ t2=0;}EvaRegs.CMPR1=t1;EvaRegs.CMPR2=t1+t2;}//+++++++++++++++++反向旋转+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ if(IQ<0)//当MOTOR反转时{//cos_theta[theta]为Q15格式, ID, IQ为Q7格式-1023-1023, Id,Iq为LONG型Id=ID*cos_theta[theta] - IQ*sin_theta[theta]; //逆PARK变换Iq=ID*sin_theta[theta] + IQ*cos_theta[theta];Ualfa=Id>>10;Ubeta=Iq>>10; //Ualfa & Ubeta type is longtemp_volue=(56756 * Ualfa)>>15;//==1.732051*Ualfax=Ubeta;y=(temp_volue + Ubeta)>>1; //除以二,移一位z=(-temp_volue + Ubeta)>>1;extent_Q= extent_D_1 - 1250; //交轴值=直轴-1250 减90度if(extent_Q<0){extent_Q=extent_Q+10000;}extent_i=extent_Q/833; //实际交轴的角度EvaRegs.ACTRA.all=extent[extent_i+1]|0x8000; //反向旋转SVDIR=1; 扇区数组值比正转超前一个扇区switch(extent_i){case 0:{t1=(x*CMPR_temp)>>15; t2=(-z*CMPR_temp)>>15; break; }case 1:{ t1=(z*CMPR_temp)>>15; t2=(y*CMPR_temp)>>15; break; }case 2:{ t1=(-y*CMPR_temp)>>15; t2=(x*CMPR_temp)>>15; break; }case 3:{t1=(-x*CMPR_temp)>>15; t2=(z*CMPR_temp)>>15; break; }case 4:{t1=(-z*CMPR_temp)>>15; t2=(-y*CMPR_temp)>>15; break; }case 5:{ t1=(y*CMPR_temp)>>15; t2=(-x*CMPR_temp)>>15; break; }//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++case 6:{t1=(x*CMPR_temp)>>15; t2=(-z*CMPR_temp)>>15; break; } case 7:{ t1=(z*CMPR_temp)>>15; t2=(y*CMPR_temp)>>15; break; } case 8:{ t1=(-y*CMPR_temp)>>15; t2=(x*CMPR_temp)>>15; break; } case 9:{t1=(-x*CMPR_temp)>>15; t2=(z*CMPR_temp)>>15; break; } case 10:{t1=(-z*CMPR_temp)>>15; t2=(-y*CMPR_temp)>>15; break; } case 11:{ t1=(y*CMPR_temp)>>15; t2=(-x*CMPR_temp)>>15; break; } default:break;}if(t1<0){ t1=0;}if(t2<0){ t2=0;}EvaRegs.CMPR1=t1;EvaRegs.CMPR2=t1+t2;}// TimeClash = 0; //防止外部中断与之冲突EvaRegs.EVAIMRA.bit.T1UFINT = 1; //下溢中断允许EvaRegs.EVAIFRA.bit.T1UFINT = 1; //清除下溢中断标志位PieCtrlRegs.PIEACK.bit.ACK2 = 1;EINT;}//---------------------------------------------------------///////////////////////接收中断/////////////////////////// interrupt void MY_SCI_ISR(void){ReceiveTemp = SciaRegs.SCIRXBUF.bit.RXDT;if(ReceiveTemp=='S')//S{ SetBit=1; }if(( SetBit==1)&&(ReceiveTemp!='S')){SciCommand[SciCommand_i] = ReceiveTemp;SciCommand_i++;}if(ReceiveTemp=='Y') //Y{if((SciCommand[0]=='P')&&(PlaceSetBit == 0)) //P{PlaceSetTemp = (SciCommand[2]-48)*1000000000 + (SciCommand[3]-48)*100000000+ (SciCommand[4]-48)*10000000 + (SciCommand[5]-48)*1000000+ (SciCommand[6]-48)*100000 +(SciCommand[7]-48)*10000+ (SciCommand[8]-48)*1000 + (SciCommand[9]-48)*100+ (SciCommand[10]-48)*10 + (SciCommand[11]-48);if( SciCommand[1] == '+')//+{ PlaceSet = PlaceSetTemp; }if( SciCommand[1] == '-')//-{ PlaceSet = -PlaceSetTemp; }SetBit = 0;SciCommand_i=0;PlaceSetBit = 1;}if(SciCommand[0]=='V')//V速度设置{PlaceEnable = 0; //禁止位置环if(SciCommand[1]=='B')//BUS B{SpeedSetTemp = (SciCommand[3]-48)*1000 + (SciCommand[4]-48)*100+(SciCommand[5]-48)*10 + (SciCommand[6]-48);if( SciCommand[2] == '+')//+{ speed_set= SpeedSetTemp; }if( SciCommand[2] == '-')//-{ speed_set= -SpeedSetTemp; }SpeedSetAD = 0; //禁止速度设置FOR AD}if(SciCommand[1]=='A')//ADC A{SpeedSetAD = 1; //允许AD转换FOR AD}SetBit = 0;SciCommand_i=0;}}PieCtrlRegs.PIEACK.bit.ACK9 = 1;}//--------------------------------------------------------//////////////////////功率保护中断///////////////////////// interrupt void MY_PDPINDA_ISR(void){motor_OK = 0;EvaRegs.EVAIFRA.bit.PDPINTA = 1;PieCtrlRegs.PIEACK.bit.ACK1 = 1; //}//*****************函数程式***************************//=========SciSendChar===========void SciSendChar(unsigned char SciSendTemp){while(!SciaRegs.SCICTL2.bit.TXRDY){;}SciaRegs.SCITXBUF = SciSendTemp;}//_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-//===================SciSendString====================void SciSendString(unsigned char *x) {while(*x){SciSendChar(*x);x++;}}//----------------------------------------------------。

最具参考价值的程序例程TMS320F28xx(黄书程序电子版)

最具参考价值的程序例程TMS320F28xx(黄书程序电子版)

第3章TMS320X28xx处理器及其应用例1、初始化锁相环及外设时钟函数//--------------------------------------------------------------------------------------------------------------------- // 初始化锁相环及外设时钟函数: InitPll://--------------------------------------------------------------------------------------------------------------------- void InitPll(Uint16 val){volatile Uint16 iV ol;if (SysCtrlRegs.PLLCR.bit.DIV != val){EALLOW;SysCtrlRegs.PLLCR.bit.DIV = val;EDIS;// 在锁相环时钟频率切换过程中,只有当锁相环稳定后CPU才会切换到新的PLL设置。

因此在设置完PLLCR后需要等待PLL稳定。

PLL的切换时间大约等于131072个输入时钟周期。

DisableDog();for(iVol= 0; iV ol< ( (131072/2)/12 ); iVol++){}}}// 为降低系统功耗,不使用的外设时钟需要屏蔽。

// 但如果使用外设必须首先使能相应的外设时钟。

void InitPeripheralClocks(void){EALLOW;// HISPCP/LOSPCP预定表寄存器设置SysCtrlRegs.HISPCP.all = 0x0001;SysCtrlRegs.LOSPCP.all = 0x0002;// 使能使用的外设时钟SysCtrlRegs.PCLKCR.bit.EV AENCLK=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{PAGE 0 :/* 本例中H0分成PAGE 0和PAGE 1 *//* BEGIN is used for the "boot to HO" bootloader mode *//* 如果从XINTF Zone 7空间boot,RESET装载复位向量,*//* 其他复位矢量从BOOTROM中装载*/RAMM0 :origin = 0x000000,length = 0x000400BEGIN :origin = 0x3F8000,length = 0x000002PRAMH0 :origin = 0x3F8002,length = 0x0014FEBOOTROM :origin = 0x3FF000,length = 0x000FC0RESET :origin = 0x3FFFC0,length = 0x000002PAGE 1 :RAMM1 :origin = 0x000400,length = 0x000400L0L1RAM :origin = 0x008000,length = 0x002000DRAMH0 :origin = 0x3f9500,length = 0x000B00}SECTIONS{/* 设置"boot to H0"模式:代码起始段(DSP281x_CodeStartBranch.asm)*//* 然后重新定位用户代码开始入口。

基于Modbus协议的DSP2812的Sci模块与触摸屏通信程序

基于Modbus协议的DSP2812的Sci模块与触摸屏通信程序

{
//写多个寄存器的应答帧构造函数
Uint16 i=0,j=0;
ModbusModule.Buf[i++] = board_adr;
ModbusModule.Buf[i++] = SET_N_HLD_REG;
ModbusModule.Buf[i++] = WORD_HI(start_address);
//将缓冲寄存器中断使能位置位,以此判断是否发送完毕
ConfigureModbus();
}
SciaRegs.SCIFFTX.bit.TXINTCLR=1;
//清除 FIFO 发送中断标志位
PieCtrlRegs.PIEACK.bit.ACK9=1;
//清除 PIE 中断标志位
}
//--------------------------------------------// SciaRxInt MODBUS RTU // 以两字符时间停顿为 3.5 个字符时间 // 程序用 5ms 时间判断 对应 9600--5 个字符时间 // 程序帧结束数据在主程序里面处理 //--------------------------------------------interrupt void SciaRxInt(void)
//状态判断函数
//---------------------------------------------
// 程序第一部分:串口程序
// 串口初始化
// 串口收发数据
//---------------------------------------------
void ConfigureModbus(void)

DSP2812相关代码和程序

DSP2812相关代码和程序
XIntruptRegs.XNMICR.bit.POLARITY=0;//下降沿产生中断
XIntruptRegs.XNMICR.bit.SELECT=0; //CPU_Timer1连接到XINT13
XIntruptRegs.XNMICR.bit.ENABLE=1; //使能非屏蔽中断NMI
PieVectTable.XNMI= &KEY; //中断服务程序入口地址放入中断向量表
/*------------------------------------------*/
/*形式参数:void */
/*返回值:void*/
/*函数描述:主函数*/
/*------------------------------------------*/
void main(void)
{
InitSysCtrl(); //系统初始化子程序
{
volatile Uint16 temp;
//写入密钥,应将0xFFFF替换成密钥值
EALLOW;
CsmRegs.KEY0 = 0xFFFF;
CsmRegs.KEY1 = 0xFFFF;
CsmRegs.KEY2 = 0xFFFF;
CsmRegs.KEY3 = 0xFFFF;
CsmRegs.KEY4 = 0xFFFF;
/*函数描述:按键S1的处理程序*/
/*------------------------------------------*/
void Manage_S1(void)
{
LED1_TOGGLE=1;//取反
}
/*------------------------------------------*/

对程序中常出现的EINT、DINT、ERTM、DRTM的理解

对程序中常出现的EINT、DINT、ERTM、DRTM的理解
2、INTM
Bit 0:中断全局屏蔽位。此位从全局上使能或禁止所有可屏蔽CPU中断(那些可由软件阻止的中断):
0 可屏蔽中断被全局使能。为了被CPU认可,则可屏蔽中断也必须被中断使能寄存器(IER)局部使能。
1 可屏蔽中断被全局禁止。即使一个可屏蔽中断被IER局部使能,也不会被CPU认可。
此位可分别由SETC INTM指令和CLRC INTM指令复位和清零。复位时,INTM置位。INTM的值不会引起中断标志寄存器(IFR)、中断使能寄存器(IER)或调试中断使能寄存器(DBGIER)的改变。
INTM对非可屏蔽中断没有影响,包括硬件复位或软件复位中断NMI。此外,当CPU在实时仿真模式下被停止时,由IER和DBGIER使能的中断将被响应,即使INTM设置为禁止可屏蔽中断。
当CPU响应中断时,INTM的当前值存储到堆栈中(当ST1存储在堆栈中时),然后INTM置位。当由中断返回时,INTM由堆栈中恢复。
一、参考DSP281x_Device.h
#define EINT asm(" clrc INTM") //INTM置0,开中断
#define DINT asm(" setc INTM") //INTM置1,关中断
#define ERTM asm(" clrc DBGM") //使能调试事件
0 调的当前值存储到堆栈中(当ST1存储在堆栈中时),然后DBGM置位。当由中断返回时,DBGM由堆栈中恢复。
此位可分别由SETC DBGM指令和CLRC DBGM指令复位和清零。DBGM在中断操作期间被自动置位。复位时,DBGM置位。执行ABORTI (中止中断)指令也可以将DBGM置位。

DSP281x_Device.h(可打印修改)

DSP281x_Device.h(可打印修改)

//###########################################################################//// FILE: DSP281x_Device.h//// TITLE: DSP281x Device Definitions.////###########################################################################//// Ver | dd mmm yyyy | Who | Description of changes//=====|=============|======|============================================= ==// 1.00| 11 Sep 2003 | L.H. | Changes since previous version (v.58 Alpha)// | | | Added symbols created by the linker// | | | cmd file for relocating code.// | | | Added float to the datatype typedefs// | | | Added #if DSP28_DATA_TYPES wrapper around the// | | | typedefs// | | | Added DSP28_BIOS and DSP28_NONBIOS switches// | | | to include or not include the default ISR's// | | | Moved files and info specific to the DSP28 examples// | | | to DSP28_common\include\DSP28_Examples.h// | | | Changed F2812 -> DSP28_F2812// | | | Changed F2810 -> DSP28_F2810//############################################################################ifndef DSP281x_DEVICE_H#define DSP281x_DEVICE_H#ifdef __cplusplusextern "C" {#endif#define TARGET 1//---------------------------------------------------------------------------// User To Select Target Device:#define DSP28_F2812 TARGET#define DSP28_F2810 0//---------------------------------------------------------------------------// Common CPU Definitions://extern cregister volatile unsigned int IFR; extern cregister volatile unsigned int IER;#define EINT asm(" clrc INTM")#define DINT asm(" setc INTM") #define ERTM asm(" clrc DBGM") #define DRTM asm(" setc DBGM") #define EALLOW asm(" EALLOW") #define EDIS asm(" EDIS")#define ESTOP0 asm(" ESTOP0")#define M_INT1 0x0001#define M_INT2 0x0002#define M_INT3 0x0004#define M_INT4 0x0008#define M_INT5 0x0010#define M_INT6 0x0020#define M_INT7 0x0040#define M_INT8 0x0080#define M_INT9 0x0100#define M_INT10 0x0200#define M_INT11 0x0400#define M_INT12 0x0800#define M_INT13 0x1000#define M_INT14 0x2000#define M_DLOG 0x4000#define M_RTOS 0x8000#define BIT0 0x0001#define BIT1 0x0002#define BIT2 0x0004#define BIT3 0x0008#define BIT4 0x0010#define BIT5 0x0020#define BIT6 0x0040#define BIT7 0x0080#define BIT8 0x0100#define BIT9 0x0200#define BIT10 0x0400#define BIT11 0x0800#define BIT12 0x1000#define BIT13 0x2000#define BIT14 0x4000#define BIT15 0x8000//---------------------------------------------------------------------------// For Portability, User Is Recommended To Use Following Data Type Size// Definitions For 16-bit and 32-Bit Signed/Unsigned Integers://#ifndef DSP28_DATA_TYPES#define DSP28_DATA_TYPEStypedef int int16;typedef long int32;typedef unsigned int Uint16;typedef unsigned long Uint32;typedef float float32;typedef long double float64;#endif//---------------------------------------------------------------------------// Include All Peripheral Header Files://#include "DSP281x_SysCtrl.h" // System Control/Power Modes #include "DSP281x_DevEmu.h" // Device Emulation Registers #include "DSP281x_Xintf.h" // External Interface Registers#include "DSP281x_CpuTimers.h" // 32-bit CPU Timers#include "DSP281x_PieCtrl.h" // PIE Control Registers#include "DSP281x_PieVect.h" // PIE Vector Table#include "DSP281x_Spi.h" // SPI Registers#include "DSP281x_Sci.h" // SCI Registers#include "DSP281x_Mcbsp.h" // McBSP Registers#include "DSP281x_ECan.h" // Enhanced eCAN Registers#include "DSP281x_Gpio.h" // General Purpose I/O Registers #include "DSP281x_Ev.h" // Event Manager Registers#include "DSP281x_Adc.h" // ADC Registers#include "DSP281x_XIntrupt.h" // External Interrupts#include "DSP281x_DefaultISR.h" // DefaultISR#ifdef __cplusplus}#endif /* extern "C" */#endif // end of DSP281x_DEVICE_H definition//===================================================================== ======// No more.//===================================================================== ======。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//########################################################################### //// FILE: DSP281x_Device.h//// TITLE: DSP281x Device Definitions.////########################################################################### //// Ver | dd mmm yyyy | Who | Description of changes//=====|=============|======|============================================= ==// 1.00| 11 Sep 2003 | L.H. | Changes since previous version (v.58 Alpha)// | | | Added symbols created by the linker// | | | cmd file for relocating code.// | | | Added float to the datatype typedefs// | | | Added #if DSP28_DA TA_TYPES wrapper around the// | | | typedefs// | | | Added DSP28_BIOS and DSP28_NONBIOS switches// | | | to include or not include the default ISR's// | | | Moved files and info specific to the DSP28 examples// | | | to DSP28_common\include\DSP28_Examples.h// | | | Changed F2812 -> DSP28_F2812// | | | Changed F2810 -> DSP28_F2810//############################################################################ifndef DSP281x_DEVICE_H#define DSP281x_DEVICE_H#ifdef __cplusplusextern "C" {#endif#define TARGET 1//---------------------------------------------------------------------------// User To Select Target Device:#define DSP28_F2812 TARGET#define DSP28_F2810 0//---------------------------------------------------------------------------// Common CPU Definitions://extern cregister volatile unsigned int IFR; extern cregister volatile unsigned int IER;#define EINT asm(" clrc INTM")#define DINT asm(" setc INTM") #define ERTM asm(" clrc DBGM") #define DRTM asm(" setc DBGM") #define EALLOW asm(" EALLOW") #define EDIS asm(" EDIS")#define ESTOP0 asm(" ESTOP0")#define M_INT1 0x0001#define M_INT2 0x0002#define M_INT3 0x0004#define M_INT4 0x0008#define M_INT5 0x0010#define M_INT6 0x0020#define M_INT7 0x0040#define M_INT8 0x0080#define M_INT9 0x0100#define M_INT10 0x0200#define M_INT11 0x0400#define M_INT12 0x0800#define M_INT13 0x1000#define M_INT14 0x2000#define M_DLOG 0x4000#define M_RTOS 0x8000#define BIT0 0x0001#define BIT1 0x0002#define BIT2 0x0004#define BIT3 0x0008#define BIT4 0x0010#define BIT5 0x0020#define BIT6 0x0040#define BIT7 0x0080#define BIT8 0x0100#define BIT9 0x0200#define BIT10 0x0400#define BIT11 0x0800#define BIT12 0x1000#define BIT13 0x2000#define BIT14 0x4000#define BIT15 0x8000//---------------------------------------------------------------------------// For Portability, User Is Recommended To Use Following Data Type Size// Definitions For 16-bit and 32-Bit Signed/Unsigned Integers://#ifndef DSP28_DA TA_TYPES#define DSP28_DA TA_TYPEStypedef int int16;typedef long int32;typedef unsigned int Uint16;typedef unsigned long Uint32;typedef float float32;typedef long double float64;#endif//---------------------------------------------------------------------------// Include All Peripheral Header Files://#include "DSP281x_SysCtrl.h" // System Control/Power Modes #include "DSP281x_DevEmu.h" // Device Emulation Registers #include "DSP281x_Xintf.h" // External Interface Registers#include "DSP281x_CpuTimers.h" // 32-bit CPU Timers#include "DSP281x_PieCtrl.h" // PIE Control Registers#include "DSP281x_PieV ect.h" // PIE Vector Table#include "DSP281x_Spi.h" // SPI Registers#include "DSP281x_Sci.h" // SCI Registers#include "DSP281x_Mcbsp.h" // McBSP Registers#include "DSP281x_ECan.h" // Enhanced eCAN Registers#include "DSP281x_Gpio.h" // General Purpose I/O Registers #include "DSP281x_Ev.h" // Event Manager Registers#include "DSP281x_Adc.h" // ADC Registers#include "DSP281x_XIntrupt.h" // External Interrupts#include "DSP281x_DefaultISR.h" // DefaultISR#ifdef __cplusplus}#endif /* extern "C" */#endif // end of DSP281x_DEVICE_H definition//===================================================================== ======// No more.//===================================================================== ======。

相关文档
最新文档