5、DSP28335 串口发送接收FIFO中断,自定义printf函数
#include "uart.h"
unsigned char data[8];
void MyUartInit(Uint32 baud)
{
unsigned char scihbaud = 0;
unsigned char scilbaud = 0;
Uint16 scibaud = 0;
EALLOW;
InitSciaGpio();
EDIS;
EALLOW;
//0:一位停止位;1:两位停止位
SciaRegs.SCICCR.bit.STOPBITS = 0;
//0:偶校验;1:奇校验
SciaRegs.SCICCR.bit.PARITY = 0;
//0:校验位失能,1:校验位使能
SciaRegs.SCICCR.bit.PARITYENA = 0;
//0:回环测试功能失能;1:回环测试功能使能
SciaRegs.SCICCR.bit.LOOPBKENA = 0;
//
SciaRegs.SCICCR.bit.ADDRIDLE_MODE = 0;
//字长:8位字长
SciaRegs.SCICCR.bit.SCICHAR = 0x7;
// SciaRegs.SCICCR.all = 0x0007;
//该DSP主频为 60MHz,通过LOSPCP寄存器将系统时钟分频为低速时钟
//在main函数的InitSysCtrl()里面配置了
//SysCtrlRegs.LOSPCP.all = 0x0002; 4分频 15MHz 串口时钟
//15M时钟 / (8 * baud) - 1, 分高八位和低八位
scibaud = 15000000 / (8 * baud) - 1;
scihbaud = scibaud >> 8;
scilbaud = scibaud & 0xff;
//设置波特率
SciaRegs.SCIHBAUD = scihbaud; //高8位
SciaRegs.SCILBAUD = scilbaud; //低8位
//发送接收使能,1:使能;0:失能
SciaRegs.SCICTL1.bit.RXENA = 1;
SciaRegs.SCICTL1.bit.TXENA = 1;
// SciaRegs.SCICTL1.all = 0x0003;
//接收中断使能,这里使用FIFO接收中断,就不用配置
// SciaRegs.SCICTL2.bit.RXBKINTENA = 1;
//0:FIFO失能;1:FIFO使能
SciaRegs.SCIFFTX.bit.SCIFFENA = 1;
//0:复位SCI接收和发送通道;1:SCI的FIFO恢复发送和接收
SciaRegs.SCIFFTX.bit.SCIRST = 1;
//0:失能FIFO发送中断;1:使能FIFO发送中断
SciaRegs.SCIFFTX.bit.TXFFIENA = 0;
//设置FIFO发送中断深度
SciaRegs.SCIFFTX.bit.TXFFIL = 0x00;
//0:无影响;1:清除TXFFINT标志7位
SciaRegs.SCIFFTX.bit.TXFFINTCLR = 1;
//0:重置FIFO指针和保持复位;1:重启发送FIFO操作
SciaRegs.SCIFFTX.bit.TXFIFOXRESET = 0;
//0:无影响;1:清除RXFFOVF标志第15位
SciaRegs.SCIFFRX.bit.RXFFOVRCLR = 1;
//0:无影响;1:清除RXFFINT标志第7位
SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;
//0:重置FIFO指针和保持复位;1:重启接收FIFO操作
SciaRegs.SCIFFRX.bit.RXFIFORESET = 0;
//0:接收FIFO中断失能;1:接收FIFO中断使能
SciaRegs.SCIFFRX.bit.RXFFIENA = 1;
//FIFO接收中断深度
SciaRegs.SCIFFRX.bit.RXFFIL = 0x08;
SciaRegs.SCIFFCT.all = 0x0000;
SciaRegs.SCICTL1.all = 0x0023;
SciaRegs.SCIFFTX.bit.TXFIFOXRESET = 1;
SciaRegs.SCIFFRX.bit.RXFIFORESET = 1;
PieVectTable.SCIRXINTA = &SciRxFifoIsr;
EDIS;
//使能PIE、CPU中断
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
PieCtrlRegs.PIEIER9.bit.INTx1 = 1;
IER |= M_INT9;
EINT;
ERTM;
}
void UartSendByte(Uint32 a)
{
while (SciaRegs.SCIFFTX.bit.TXFFST != 0);
SciaRegs.SCITXBUF = a;
}
void UartSendArray(unsigned char *Array, Uint16 ArrayLength)
{
Uint16 i;
for(i = 0; i < ArrayLength; i++)
{
UartSendByte(Array[i]);
}
}
void UartSendString(char *msg)
{
Uint32 i = 0;
while(msg[i] != '\0')
{
UartSendByte(msg[i]);
i++;
}
}
void uart_printf(char * fmt, ...) //自定义变参函数
{
char * arg_ptr;
unsigned int i , len;
static char write_buf[MAX_WRITE_LEN];
va_start(arg_ptr, fmt);
len = vsprintf((char *)write_buf, fmt, arg_ptr);
va_end(arg_ptr);
for (i = 0; i < len; i++)
{
if ( '\0' != write_buf[i] )
{
while (SciaRegs.SCIFFTX.bit.TXFFST != 0); //使用SCIA
SciaRegs.SCITXBUF=write_buf[i];
}
}
}
interrupt void SciRxFifoIsr(void)
{
Uint16 i;
for(i = 0; i < 8; i++)
{
data[i] = SciaRegs.SCIRXBUF.all;
}
SciaRegs.SCIFFRX.bit.RXFFOVRCLR = 1;
SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;
PieCtrlRegs.PIEACK.all |= PIEACK_GROUP9;
}
注:自定义的uart_printf函数需要修改cmd文件中分区的大小,根据报错信息修改即可,烧录到Flash和ram的两种方法,cmd文件也不同。