本文主要是介绍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); //使用SCIASciaRegs.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文件也不同。
这篇关于5、DSP28335 串口发送接收FIFO中断,自定义printf函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!