DSP28335 串口中断收发及FIFO使用

基于研旭28335一体板测试

#include "DSP2833x_Device.h" // DSP2833x 头文件

#include "DSP2833x_Examples.h" // DSP2833x 例子相关头文件

#include "string.h"

#include "stdio.h"

void InitLedGpio(void);

/**************************************函数声明************************************************/

void scia_echoback_init(void); //声明SCI-A工作方式和参数配置

void scia_xmit(int a); //声明发送字节的函数

void scia_msg(char *msg); //声明发送数组的函数

void SCIASend(char* buff);

void SCIARecvPoll(void);

interrupt void SCIRXINTA_ISRHandler(void);

interrupt void SCITXINTA_ISRHandler(void);

interrupt void SCIRXINTAFIFO_ISRHandler(void);

interrupt void SCITXINTAFIFO_ISRHandler(void);

/**********************************************************************************************/

static char RecvLen = 0;

static char RecvBuf256 = {0};

static Uint16 SendLen = 0;

static char SendBuf256 = {0};

static Uint16 RecvOvtime = 0;

/****************************************主程序******************************************************/

#define FIFO_DEPTH 4

void main(void)

{

// 初始化系统控制:

// 设置PLL, WatchDog, 使能外设时钟

// 下面这个函数可以从DSP2833x_SysCtrl.c文件中找到..

InitSysCtrl();

// 初始化串口SCI-A的GPIO

InitSciaGpio();

InitLedGpio();

// 清除所有中断初始化中断向量表:

// 禁止CPU全局中断

DINT;

// 初始化PIE中断向量表,并使其指向中断服务子程序(ISR)

// 这些中断服务子程序被放在了DSP280x_DefaultIsr.c源文件中

// 这个函数放在了DSP2833x_PieVect.c源文件里面.

InitPieCtrl();

// 禁止CPU中断和清除所有CPU中断标志

IER = 0x0000;

IFR = 0x0000;

// PIE 向量表指针指向中断服务程(ISR)完成其初始化.

// 即使在程序里不需要使用中断功能,也要对 PIE 向量表进行初始化.

// 这样做是为了避免PIE引起的错误.

InitPieVectTable();

EALLOW;

//PieVectTable.SCIRXINTA = &SCIRXINTA_ISRHandler;

//PieVectTable.SCITXINTA = &SCITXINTA_ISRHandler;

PieVectTable.SCIRXINTA = &SCIRXINTAFIFO_ISRHandler;

PieVectTable.SCITXINTA = &SCITXINTAFIFO_ISRHandler;

EDIS;

// 初始化SCI-A工作方式和参数配置

scia_echoback_init();

PieCtrlRegs.PIECTRL.bit.ENPIE = 1;

PieCtrlRegs.PIEIER9.bit.INTx1 = 1;

PieCtrlRegs.PIEIER9.bit.INTx2 = 1;

IER |= PIEACK_GROUP9;

sprintf(SendBuf,"%s","\r\n\n\nHello !\0");

scia_msg(SendBuf); //发送函数

sprintf(SendBuf,"%s","\r\nYou will get what you send after terminal send from PC comm tools\n\0"); //发送语句

scia_msg(SendBuf); //发送函数

EINT;

for(;;)

{

DELAY_US(100);

RecvOvtime++;

if(RecvOvtime > 50 && RecvLen)

{

SCIARecvPoll();//查询接收帧字节对接收深度取余的字节数

GpioDataRegs.GPADAT.bit.GPIO0 = 1;

memcpy(SendBuf,RecvBuf,RecvLen);

//SendLen = RecvLen-1;

SendLen = RecvLen;

RecvLen = 0;

//启动发送

SCIASend(SendBuf);

}

else if(RecvLen == 0)//查询接收小于接收深度的字节

{

SCIARecvPoll();

}

}

}

void InitLedGpio(void)

{

EALLOW;

GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0; // GPIO0复用为GPIO功能

GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; // GPIO0设置为输出

GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0; // GPIO1复用为GPIO功能

GpioCtrlRegs.GPADIR.bit.GPIO1 = 1; // GPIO1设置为输出

EDIS;

}

// Test 1,SCIA DLB, 8-bit word, baud rate 0x000F, default, 1 STOP bit, no parity

void scia_echoback_init()

{

//SCI的工作模式和参数需要用户在后面的学习中,深入的了解一个寄存器底层相关的资料了,多看看芯片手册和寄存器的意思。

//因为28335的寄存器太多了,所以在以后的学习过程中,就不会对寄存器进行详细的注释了。

SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback

// No parity,8 char bits,

// async mode, idle-line protocol

SciaRegs.SCICTL1.bit.SWRESET = 0;

SciaRegs.SCICTL1.bit.RXENA = 1;

SciaRegs.SCICTL1.bit.TXENA = 1;

SciaRegs.SCICTL2.bit.TXINTENA = 0;

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.bit.SWRESET = 1; // Relinquish SCI from Reset

/*******************************************************************/

//增加FIFO功能

SciaRegs.SCIFFTX.bit.TXFIFOXRESET = 0;

SciaRegs.SCIFFRX.bit.RXFIFORESET = 0;

SciaRegs.SCIFFTX.bit.SCIRST = 1;

SciaRegs.SCIFFTX.bit.SCIFFENA = 1; //发送FIFO使能

SciaRegs.SCIFFTX.bit.TXFFIL = FIFO_DEPTH; //发送FIFO深度16

SciaRegs.SCIFFRX.bit.RXFFIENA = 1; //接收FIFO使能

SciaRegs.SCIFFRX.bit.RXFFIL = FIFO_DEPTH; //接收FIFO深度16

SciaRegs.SCIFFCT.all = 0x00; //无发送延迟

SciaRegs.SCIFFTX.bit.TXFIFOXRESET = 1;

SciaRegs.SCIFFRX.bit.RXFIFORESET = 1;

/*******************************************************************/

}

void scia_xmit(int a)//发送字节的函数

{

//单个发送

//while (SciaRegs.SCICTL2.bit.TXRDY == 0) {}

//SciaRegs.SCITXBUF=a;

//使用发送FIFO

while(SciaRegs.SCIFFTX.bit.TXFFST >= FIFO_DEPTH) {}

SciaRegs.SCITXBUF = a;

}

void scia_msg(char * msg)//发送数组的函数

{

int i;

i = 0;

while(msgi != '\0')

{

scia_xmit(msgi);

i++;

}

}

//先发送第一个字节然后启动串口中断处理余下的字节

void SCIASend(char* buff)

{

SciaRegs.SCICTL1.bit.TXENA = 1; //使能串口发送

//SciaRegs.SCICTL2.bit.TXINTENA = 1; //常规中断

//scia_xmit(buff0);

SciaRegs.SCIFFTX.bit.TXFFIENA = 1; //串口FIFO发送中断

}

//查询接收,用来接收非整深度的字节数据

void SCIARecvPoll(void)

{

while(SciaRegs.SCIFFRX.bit.RXFFST > 0)

{

RecvBufRecvLen++ = SciaRegs.SCIRXBUF.all&0xff;

RecvOvtime = 0;

}

}

// INT9.1

interrupt void SCIRXINTA_ISRHandler(void) // SCI-A

{

GpioDataRegs.GPADAT.all &= 0xfffffffC;

// Insert ISR Code here

if(SciaRegs.SCIRXST.bit.RXRDY == 1)

{

RecvBufRecvLen++ = SciaRegs.SCIRXBUF.all&0xff;

RecvOvtime = 0;

}

// To receive more interrupts from this PIE group, acknowledge this interrupt

PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;

}

interrupt void SCIRXINTAFIFO_ISRHandler(void) // SCI-A

{

GpioDataRegs.GPADAT.all &= 0xfffffffC;

while(SciaRegs.SCIFFRX.bit.RXFFST > 0)

{

RecvBufRecvLen++ = SciaRegs.SCIRXBUF.all&0xff;

RecvOvtime = 0;

}

SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1; //清除FIFO接收中断标志

PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;

}

// INT9.2

interrupt void SCITXINTA_ISRHandler(void) // SCI-A

{

static Uint16 SendCnt = 1; //第一个字节已经发送用来触发进入发送中断

// Insert ISR Code here

if(SciaRegs.SCICTL2.bit.TXRDY == 1)

{

if(SendLen)

{

SciaRegs.SCITXBUF = SendBufSendCnt++;

SendLen--;

}

else

{

SendCnt = 1;

SciaRegs.SCICTL2.bit.TXINTENA = 0;

SciaRegs.SCICTL1.bit.TXENA = 0;

GpioDataRegs.GPADAT.bit.GPIO1 = 1;

}

}

// To receive more interrupts from this PIE group, acknowledge this interrupt

PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;

}

interrupt void SCITXINTAFIFO_ISRHandler(void) // SCI-A

{

static Uint16 SendCnt = 0;

// Insert ISR Code here

if(SendLen)

{

while(SciaRegs.SCIFFTX.bit.TXFFST < FIFO_DEPTH && SendLen)

{

SciaRegs.SCITXBUF = SendBufSendCnt++;

SendLen--;

}

}

else

{

SendCnt = 0;

SciaRegs.SCICTL2.bit.TXINTENA = 0;

SciaRegs.SCICTL1.bit.TXENA = 0;

GpioDataRegs.GPADAT.bit.GPIO1 = 1;

}

SciaRegs.SCIFFTX.bit.TXFFINTCLR = 1; //清除FIFO发送中断标志

// To receive more interrupts from this PIE group, acknowledge this interrupt

PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;

}

//===========================================================================

// No more.

//===========================================================================

相关推荐
洪核单片机8 小时前
DPJ-96基于STM32单片机wifi远程监控智慧教室 温湿度光照粉尘人数考勤
stm32·单片机·嵌入式硬件·智慧教室·教室人数考勤
m0_7527531210 小时前
单片机基础知识
单片机·51单片机
天空'之城10 小时前
单片机基础核心知识点汇总(三十六)
单片机·嵌入式硬件
JNX_SEMI16 小时前
OC5138T 8V~100V超宽输入降压恒流驱动:覆盖12V汽车至72V电动车全场景
单片机·嵌入式硬件
智购科技无人售货机工厂17 小时前
2026自动售货机AI智能体架构:从47个小模型到33.7亿Token的工程实践~YH
android·人工智能·驱动开发·单片机·pandas
单片机仿真设计18 小时前
【proteus仿真】基于 STM32 单片机太阳能双轴追踪系统 Proteus 仿真设计(仿真图+程序)
stm32·单片机·嵌入式硬件·proteus·课设
Lzh编程小栈19 小时前
STM32 DMA深度解析|原理、完整工作流程、寄存器、中断联动,嵌入式面试高频考点(F1系列)
c语言·stm32·单片机·mcu·面试
新晨单片机设计19 小时前
S016A-基于STM32单片机电子秤(LCD1602显示)【Proteus仿真+Keil程序+原理图】
stm32·单片机·proteus
辰域电子20 小时前
STM32项目开源:粮仓环境安防监测系统(代码 + 原理图 + 仿真)
stm32·单片机·嵌入式硬件·开源·毕业设计·proteus
深圳市尚想信息技术有限公司21 小时前
HITENX海速芯TM52F1363-SSOP24 8KB Flash存储+EEPROM,国产8位MCU单片机
单片机·mcu·flask·芯片·控制器·海速芯