//###########################################################################
//
//
//
// $Boot_Table:
//
// GPIO87 GPIO86 GPIO85 GPIO84
// XA15 XA14 XA13 XA12
// PU PU PU PU
// ==========================================
// 1 1 1 1 Jump to Flash
// 1 1 1 0 SCI-A boot
// 1 1 0 1 SPI-A boot
// 1 1 0 0 I2C-A boot
// 1 0 1 1 eCAN-A boot
// 1 0 1 0 McBSP-A boot
// 1 0 0 1 Jump to XINTF x16
// 1 0 0 0 Jump to XINTF x32
// 0 1 1 1 Jump to OTP
// 0 1 1 0 Parallel GPIO I/O boot
// 0 1 0 1 Parallel XINTF boot
// 0 1 0 0 Jump to SARAM <- "boot to SARAM"
// 0 0 1 1 Branch to check boot mode
// 0 0 1 0 Boot to flash, bypass ADC cal
// 0 0 0 1 Boot to SARAM, bypass ADC cal
// 0 0 0 0 Boot to SCI-A, bypass ADC cal
// Boot_Table_End$//
//###########################################################################
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
// 申明用到的子函数
void delay_loop(Uint32 a);
void Gpio_select(void);
void scia_echoback_init(void);
void scia_fifo_init(void);
unsigned char Step_table11[]={0x0001,0x0002};
unsigned char Step_table12[]={0x0002,0x0001};
unsigned char Step_table21[]={0x0004,0x0008};
unsigned char Step_table22[]={0x0008,0x0004};
unsigned char Step_table31[]={0x0010,0x0020};
unsigned char Step_table32[]={0x0020,0x0010};
unsigned char Step_table41[]={0x0040,0x0080};
unsigned char Step_table42[]={0x0080,0x0040};
unsigned char Step_table51[]={0x0100,0x0200};
unsigned char Step_table52[]={0x0200,0x0100};
unsigned char Step_table61[]={0x0400,0x0800};
unsigned char Step_table62[]={0x0800,0x0400};
// Global counts used in this example
Uint16 LoopCount;
Uint16 ErrorCount;
Uint16 rdata[18]; //SCI-A接收的数据
void main(void)
{
unsigned int i,j;
Uint16 k;
// 步骤 1. 初始化系统控制:
// 设置PLL, WatchDog, 使能外设时钟
// 下面这个函数可以从DSP2833x_SysCtrl.c文件中找到.
InitSysCtrl();
// 步骤 2. 初始化通用输入输出多路复用器GPIO:
// 这个函数在DSP2833x_Gpio.c源文件中被定义了
// 这个函数使GPIO控制类寄存器初始化到默认状态
// InitGpio(); // Skipped for this example
// For this example use the following configuration:
Gpio_select();
// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts
DINT;
// Initialize PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags
// are cleared.
// This function is found in the DSP2833x_PieCtrl.c file.
InitPieCtrl();
// Disable CPU interrupts and clear all CPU interrupt flags:
IER = 0x0000;
IFR = 0x0000;
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
// This will populate the entire table, even if the interrupt
// is not used in this example. This is useful for debug purposes.
// The shell ISR routines are found in DSP2833x_DefaultIsr.c.
// This function is found in DSP2833x_PieVect.c.
InitPieVectTable();
// Step 4. Initialize all the Device Peripherals:
// This function is found in DSP2833x_InitPeripherals.c
// InitPeripherals(); // Not required for this example
// 步骤 5. 用户特定的代码来允许中断
// 步骤 6. 空循环. 仅无限循环等待中断:
LoopCount = 0;
ErrorCount = 0;
scia_fifo_init(); // Initialize the SCI FIFO
scia_echoback_init(); // Initalize SCI for echoback
while(SciaRegs.SCIFFRX.bit.RXFFST != 1) { }
for(k=0;k<18;k++)
{
rdata[k]=SciaRegs.SCIRXBUF.all; //读取数据
}
if(rdata[0]==0 & rdata[1]!=0)
{
i=36000000/rdata[1];
j=rdata[2]/0.24; //改变这个值可以控制转动周数。
while(j--)
{
GpioDataRegs.GPADAT.all=Step_table11[i]; //GPIO2-GPIO5依次输出高电平
delay_loop(i);
}
}
//反转
if(rdata[0]==1 & rdata[1]!=0)
{
i=36000000/rdata[1];
j=rdata[2]/0.24; //改变这个值可以控制转动周数。
while(j--)
{
GpioDataRegs.GPADAT.all=Step_table12[i];
delay_loop(i);
}
}
if(rdata[3]==0 & rdata[4]!=0)
{
i=36000000/rdata[4];
j=rdata[5]/0.24;
while(j--)
{
GpioDataRegs.GPADAT.all=Step_table21[i];
delay_loop(i);
}
}
//反转
if(rdata[3]==1 & rdata[4]!=0)
{
i=36000000/rdata[4];
j=rdata[5]/0.24; //改变这个值可以控制转动周数。
while(j--)
{
GpioDataRegs.GPADAT.all=Step_table22[i];
delay_loop(i);
}
}
if(rdata[6]==0 & rdata[7]!=0)
{
i=36000000/rdata[7];
j=rdata[8]/0.24; //改变这个值可以控制转动周数。
while(j--)
{
GpioDataRegs.GPADAT.all=Step_table31[i];
delay_loop(i);
}
}
//反转
if(rdata[6]==1 & rdata[7]!=0)
{
i=36000000/rdata[7];
j=rdata[8]/0.24; //改变这个值可以控制转动周数。
while(j--)
{
GpioDataRegs.GPADAT.all=Step_table32[i];
delay_loop(i);
}
}
if(rdata[9]==0 & rdata[10]!=0)
{
i=36000000/rdata[10];
j=rdata[11]/0.24; //改变这个值可以控制转动周数。
while(j--)
{
GpioDataRegs.GPADAT.all=Step_table41[i];
delay_loop(i);
}
}
//反转
if(rdata[9]==1 & rdata[10]!=0)
{
i=36000000/rdata[10];
j=rdata[11]/0.24; //改变这个值可以控制转动周数。
while(j--)
{
GpioDataRegs.GPADAT.all=Step_table42[i];
delay_loop(i);
}
}
if(rdata[12]==0 & rdata[13]!=0)
{
i=36000000/rdata[13];
j=rdata[14]/0.24; //改变这个值可以控制转动周数。
while(j--)
{
GpioDataRegs.GPADAT.all=Step_table51[i];
delay_loop(i);
}
}
//反转
if(rdata[12]==1 & rdata[13]!=0)
{
i=36000000/rdata[13];
j=rdata[14]/0.24; //改变这个值可以控制转动周数。
while(j--)
{
GpioDataRegs.GPADAT.all=Step_table52[i];
delay_loop(i);
}
}
if(rdata[15]==0 & rdata[16]!=0)
{
i=36000000/rdata[16];
j=rdata[17]/0.24; //改变这个值可以控制转动周数。
while(j--)
{
GpioDataRegs.GPADAT.all=Step_table61[i];
delay_loop(i);
}
}
//反转
if(rdata[15]==1 & rdata[16]!=0)
{
i=36000000/rdata[16];
j=rdata[17]/0.24; //改变这个值可以控制转动周数。
while(j--)
{
GpioDataRegs.GPADAT.all=Step_table62[i];
delay_loop(i);
}
}
LoopCount++;
}
//延时函数
void delay_loop(Uint32 a)
{
while(a--);
}
//初始化GPIO
void Gpio_select(void)
{
EALLOW;
GpioCtrlRegs.GPAMUX1.all = 0x00000000; // All GPIO
GpioCtrlRegs.GPAMUX2.all = 0x00000000; // All GPIO
GpioCtrlRegs.GPBMUX1.all = 0x00000000; // All GPIO
GpioCtrlRegs.GPADIR.all = 0xFFFFFFFF; // All outputs
GpioCtrlRegs.GPBDIR.all = 0x0000000F; // All outputs
//GPIO0-GPIO31输出低电平
GpioDataRegs.GPADAT.all=0x00000000;
EDIS;
EDIS;
}
// Test 1,SCIA DLB, 8-bit word, baud rate 0x000F, default, 1 STOP bit, no parity
void scia_echoback_init()
{
// Note: Clocks were turned on to the SCIA peripheral
// in the InitSysCtrl() function
SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
SciaRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK,
// Disable RX ERR, SLEEP, TXWAKE
SciaRegs.SCICTL2.all =0x0003;
SciaRegs.SCICTL2.bit.TXINTENA =1;
SciaRegs.SCICTL2.bit.RXBKINTENA =1;
#if (CPU_FRQ_150MHZ)
SciaRegs.SCIHBAUD =0x0001; // 9600 baud @LSPCLK = 37.5MHz.
SciaRegs.SCILBAUD =0x00E7;
#endif
#if (CPU_FRQ_100MHZ)
SciaRegs.SCIHBAUD =0x0001; // 9600 baud @LSPCLK = 20MHz.
SciaRegs.SCILBAUD =0x0044;
#endif
SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset
}
// Transmit a character from the SCI
//void scia_xmit(int a)
//{
// while (SciaRegs.SCIFFTX.bit.TXFFST != 0) {}
// SciaRegs.SCITXBUF=a;
//}
//void scia_msg(char * msg)
//{
// int i;
// while(msg[i] != '\0')
// {
// scia_xmit(msg[i]);
// i++;
// }
//}
// Initalize the SCI FIFO
void scia_fifo_init()
{
SciaRegs.SCIFFTX.all=0xE040;
SciaRegs.SCIFFRX.all=0x204f;
SciaRegs.SCIFFCT.all=0x0;
}
//===========================================================================
// No more.
//===========================================================================
本人小白,东凑西凑代码,希望这个代码能够接收上位机的18个数据,然后使GPIO0~GPIO11引脚输出高电平(脉冲),然后DSP好像没反应,求解 |