一、主函数:如下,利用串口助手给DSP2812发送1,2,3,4,5,6;SCIA接收,发送中断函数中对步进电机模式进行切换,有六种模式,单步(正/反),双步(正/反),八拍(正/反),同时数码管显示当前模式数字。编译显示无错误,第一次发送任意数字时电机能正确切换到设定模式,第二次发送其他数不能接收,无反应。也不知道为啥?恳请高手指点
。
#include "DSP28_Device.h"
unsigned int Sci_VarRx[100]; //用于存放接收到的数据,"hellodsp"一共8个字符
unsigned int i;
unsigned int j;
//unsigned int Send_Flag; //发送标志位。1:有数据需要发送 0:无数据需要发送
#define led_7seg (*((unsigned int *)0x002400))
unsigned int aa;
/****************************************************************************/
const Uint16 Forward_direction1[]={0x20,0x30,0x10,0x18,0x08,0x0A,0x04,0x21};/*逆时针 四相,八拍*/
const Uint16 Forward_direction2[]={0x20,0x10,0x08,0x04};/*逆时针 单四拍*/
const Uint16 Forward_direction3[]={0x30,0x18,0x0A,0x21};/*逆时针 单四拍*/
const Uint16 aLED[10]={0x0024,0x00af,0x0094,0x8c,0x00f,0x4c,0x044,0x0ae,0x004,0x0c};
/****************************************************************************/
int ii=0;
long tt=1300;
void delay(Uint16 data)//步进电机延时
{
Uint16 jj=0;
int kk=0;
for(jj=0;jj<data;jj++)
{
for(kk=0;kk<20;kk++);
}
}
/****************************************************************************
*
*名 称:main()
*
*功 能:完成初始化工作,并采用查询方式实现SCIA的发送和接收功能,同时切换电机运动模式电机
****************************************************************************/
void main(void)
{
InitSysCtrl(); //初始化系统函数
DINT;
IER = 0x0000; //禁止CPU中断
IFR = 0x0000; //清除CPU中断标志
InitPieCtrl(); //初始化PIE控制寄存器
PieCtrl.PIEIER9.bit.INTx1=1;
PieCtrl.PIEIER9.bit.INTx2=1;
InitPieVectTable(); //初始化PIE中断向量表
InitGpio(); //初始化Gpio口
InitPeripherals(); //初始化SCIA
InitSci();
for(i = 0; i < 100; i++) //初始化数据变量
{
Sci_VarRx = 0;
}
i = 0;
/* j = 1;
Send_Flag = 0;*/
IER|=M_INT9; //开CPU中断
EINT; //开全局中断
ERTM; //开全局实时中断
for(;;)
{
}
}
/****************************************************************************
*步进电机模式,正向四相四拍,四相八拍,半步;反向。。。。
****************************************************************************/
void Forward1(void)
{
for(;;)
{
for(ii=0;ii<8;ii++)
{
GpioDataRegs.GPADAT.all=Forward_direction1[ii];
delay(tt);
} //等待中断
}
}
void Backward1(void)
{
for(;;)
{
for(ii=7;ii>=0;ii--)
{
GpioDataRegs.GPADAT.all=Forward_direction1[ii];
delay(tt);
} //等待中断
}
}
/********************************************/
void Forward2(void)
{
for(;;)
{
for(ii=0;ii<4;ii++)
{
GpioDataRegs.GPADAT.all=Forward_direction2[ii];
delay(tt);
} //等待中断
}
}
void Backward2(void)
{
for(;;)
{
for(ii=3;ii>=0;ii--)
{
GpioDataRegs.GPADAT.all=Forward_direction2[ii];
delay(tt);
} //等待中断
}
}
/**************************************************/
void Forward3(void)
{
for(;;)
{
for(ii=0;ii<4;ii++)
{
GpioDataRegs.GPADAT.all=Forward_direction3[ii];
delay(tt);
} //等待中断
}
}
void Backward3(void)
{
for(;;)
{
for(ii=3;ii>=0;ii--)
{
GpioDataRegs.GPADAT.all=Forward_direction3[ii];
delay(tt);
} //等待中断
}
}
//===========================================================================
// No more.
//===========================================================================
二.中断函数
interrupt void SCIRXINTA_ISR(void) // SCI-A接收中断函数
{
Sci_VarRx= SciaRegs.SCIRXBUF.all; //接收数据
SciaRegs.SCITXBUF=Sci_VarRx; //启动第一次发送,然后才能使用发送中断
aa=Sci_VarRx;
led_7seg=aLED[aa];
if(Sci_VarRx==1)
{
Forward1();
}
if(Sci_VarRx==2)
{
Backward1();
}
if(Sci_VarRx==3)
{
Forward2();
}
if(Sci_VarRx==4)
{
Backward2();
}
if(Sci_VarRx==5)
{
Forward3();
}
if(Sci_VarRx==6)
{
Backward3();
}
PieCtrl.PIEACK.all=0x0100; //使得同组其他中断能够得到响应
EINT; //开全局中断vcc
}
/****************************************************************************
*
*名 称:SCITXINTA_ISR()
*
*功 能:发送中断函数
*
*入口参数:无
*
*出口参数:无
*
****************************************************************************/
interrupt void SCITXINTA_ISR(void) // SCI-A发送中断函数
{
i++;
if(i>100)
{i=0;}
PieCtrl.PIEACK.all=0x0100; //使得同组其他中断能够得到响应
EINT; //开全局中断
//SCITXBUF中的数据移入TXSHF寄存器,将数据发送出去,TXRDY标志位置1
}
三。初始化函数
系统初始化
void InitSysCtrl(void)
{
Uint16 i;
EALLOW;
// 对于TMX产品,为了能够使得片内RAM模块M0/M1/L0/L1LH0能够获得最好的性能,控制寄存器的位
// 必须使能,这些位在设备硬件仿真寄存器内。TMX是TI的试验型产品
DevEmuRegs.M0RAMDFT = 0x0300;
DevEmuRegs.M1RAMDFT = 0x0300;
DevEmuRegs.L0RAMDFT = 0x0300;
DevEmuRegs.L1RAMDFT = 0x0300;
DevEmuRegs.H0RAMDFT = 0x0300;
// 禁止看门狗模块
SysCtrlRegs.WDCR= 0x0068;
// 初始化PLL模块
SysCtrlRegs.PLLCR = 0xA; //如果外部晶振为30M,则SYSCLKOUT=30*10/2=150MHz
// 延时,使得PLL模块能够完成初始化操作
for(i= 0; i< 5000; i++){}
// 高速时钟预定标器和低速时钟预定标器,产生高速外设时钟HSPCLK和低速外设时钟LSPCLK
SysCtrlRegs.HISPCP.all = 0x0001; // HSPCLK=150/2=75MHz
SysCtrlRegs.LOSPCP.all = 0x0002; // LSPCLK=150/4=37.5MHz
// 对工程中使用到的外设进行时钟使能
// SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
// SysCtrlRegs.PCLKCR.bit.EVBENCLK=1;
SysCtrlRegs.PCLKCR.bit.SCIENCLKA=1; // SCIA模块时钟使能
// SysCtrlRegs.PCLKCR.bit.SCIENCLKB=1;
EDIS;
}
GPIO初始化
void InitGpio(void)
{
EALLOW;
GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4=1; //设置SCIA的发送引脚
GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5=1; //设置SCIA的接收引脚
GpioMuxRegs.GPAMUX.all=0;
GpioMuxRegs.GPADIR.all=0xffff;
EDIS;
}
SCI 初始化
void InitSci(void)
{
SciaRegs.SCICCR.bit.STOPBITS=0; //1位停止位
SciaRegs.SCICCR.bit.PARITYENA=0; //禁止极性功能
SciaRegs.SCICCR.bit.LOOPBKENA=0; //禁止回送测试模式功能
SciaRegs.SCICCR.bit.ADDRIDLE_MODE=0; //空闲线模式
SciaRegs.SCICCR.bit.SCICHAR=7; //8位数据位
SciaRegs.SCICTL1.bit.TXENA=1; //SCIA模块的发送使能
SciaRegs.SCICTL1.bit.RXENA=1; //SCIA模块的接收使能
SciaRegs.SCIHBAUD=0;
SciaRegs.SCILBAUD=0xF3; //波特率为19200
SciaRegs.SCICTL2.bit.RXBKINTENA=1; //SCIA模块接收中断使能
SciaRegs.SCICTL2.bit.TXINTENA=1; //SCIA模块发送中断使能
SciaRegs.SCICTL1.bit.SWRESET=1; //重启SCI
}
中断控制初始化
void InitPieCtrl(void)
{
// 禁止PIE模块
PieCtrl.PIECRTL.bit.ENPIE = 0;
// 禁止PIE所有中断
PieCtrl.PIEIER1.all = 0;
PieCtrl.PIEIER2.all = 0;
PieCtrl.PIEIER3.all = 0;
PieCtrl.PIEIER4.all = 0;
PieCtrl.PIEIER5.all = 0;
PieCtrl.PIEIER6.all = 0;
PieCtrl.PIEIER7.all = 0;
PieCtrl.PIEIER8.all = 0;
PieCtrl.PIEIER9.all = 0;
PieCtrl.PIEIER10.all = 0;
PieCtrl.PIEIER11.all = 0;
PieCtrl.PIEIER12.all = 0;
// 清除所有PIEIFR的中断标志位
PieCtrl.PIEIFR1.all = 0;
PieCtrl.PIEIFR2.all = 0;
PieCtrl.PIEIFR3.all = 0;
PieCtrl.PIEIFR4.all = 0;
PieCtrl.PIEIFR5.all = 0;
PieCtrl.PIEIFR6.all = 0;
PieCtrl.PIEIFR7.all = 0;
PieCtrl.PIEIFR8.all = 0;
PieCtrl.PIEIFR9.all = 0;
PieCtrl.PIEIFR10.all = 0;
PieCtrl.PIEIFR11.all = 0;
PieCtrl.PIEIFR12.all = 0;
// 使能PIE模块
PieCtrl.PIECRTL.bit.ENPIE = 1;
PieCtrl.PIEACK.all = 0xFFFF;
}
|