DSP28035串口中断接收

  1. 串口初始化

void Sci_init()
{
    Uint16 scibaud ,scihbaud,scilbaud;
    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1;
    EDIS;

    EALLOW;
    GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0;
    GpioCtrlRegs.GPAPUD.bit.GPIO29 = 0;
    GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3;


    GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1;
    GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1;
    EDIS;


    SciaRegs.SCIFFTX.all=0xE040;
    SciaRegs.SCIFFRX.all=0x6061;   
    SciaRegs.SCIFFCT.all=0x0;

    SciaRegs.SCICCR.all =0x0007;
    SciaRegs.SCICTL1.all =0x0003;
    SciaRegs.SCICTL2.bit.RXBKINTENA =1;

    scibaud=15000000/(8*SCI_BAUD)-1;
    scihbaud=scibaud>>8;
    scilbaud=scibaud&0xff;
    SciaRegs.SCIHBAUD    =scihbaud;
    SciaRegs.SCILBAUD    =scilbaud;


    SciaRegs.SCICTL1.all =0x0023;
}
  1. 串口中断配置
    此处不同芯片的表不一样
    此处
	//中断服务函数配置
	EALLOW; // This is needed to write to EALLOW protected registers
    PieVectTable.SCIRXINTA = &Scia_RX_ISR;
    EDIS;
 	EALLOW;
	// 使能PIE中断
    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
    PieCtrlRegs.PIEIER9.bit.INTx1=1;
    IER |= M_INT9;// Enable CPU INT9 foreCAN and SCI-RX
    EINT;   // Enable Global interrupt INTM
    ERTM;   // Enable Global realtime interrupt DBGM
    EDIS;
  1. 串口中断服务函数
int reecv_count = 0 ; // 接收计数
char recv_str[64];	  //接收字符串
char recvdd = 0;	  //接收缓冲区
__interrupt void Scia_RX_ISR()
{
    recvdd = SciaRegs.SCIRXBUF.bit.RXDT;  //接收缓冲
    recv_str[reecv_count] = recvdd;		  //保存数据
    reecv_count++;						  //移动索引
    if(recvdd == '\n'){					  //判断换行结束
		
		Deal_Data(recv_str ,reecv_count); //真正的处理函数
        memset(recv_str , 0 , sizeof(recv_str));
        reecv_count =0;					  //索引复位
    }
    SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1; //清除中断   
    PieCtrlRegs.PIEACK.all |= M_INT9;    //	     
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的DSP28035串口485通信发送和接收的示例代码,供您参考。请注意,这只是一个简单的示例,您需要根据您的实际应用进行相应的修改。 ``` #include "DSP28035_Device.h" // 定义发送和接收缓冲区大小 #define TX_BUF_SIZE 16 #define RX_BUF_SIZE 16 // 定义发送和接收缓冲区 Uint16 tx_buf[TX_BUF_SIZE]; Uint16 rx_buf[RX_BUF_SIZE]; // 初始化串口模块 void InitUART(void) { // 配置GPIO口为UART模式 GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1; // UART1_TXD GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1; // UART1_RXD // 配置UART1模块 SciaRegs.SCICCR.all = 0x0007; // 8位数据,无校验位,1个停止位 SciaRegs.SCICTL1.all = 0x0003; // 使能接收和发送 SciaRegs.SCICTL2.bit.TXINTENA = 0; // 禁止发送中断 SciaRegs.SCICTL2.bit.RXBKINTENA = 1; // 使能接收中断 SciaRegs.SCIHBAUD.all = 0x0000; // 配置波特率为9600 SciaRegs.SCILBAUD.all = 0x00C2; // 配置波特率为9600 SciaRegs.SCIFFTX.all = 0xC022; // FIFO发送使能,发送中断水位为16 SciaRegs.SCIFFRX.all = 0x0022; // FIFO接收使能,接收中断水位为16 SciaRegs.SCIFFCT.all = 0x00; } // 发送数据 void SendData(Uint16* data, Uint16 len) { // 将RS485芯片的控制线设置为发送状态 GpioDataRegs.GPASET.bit.GPIO10 = 1; // DE GpioDataRegs.GPASET.bit.GPIO11 = 1; // RE // 将数据写入发送缓冲区 Uint16 i; for (i = 0; i < len; i++) { SciaRegs.SCITXBUF = data[i]; while (SciaRegs.SCIFFTX.bit.TXFFST != 0); } // 等待数据发送完成 while (SciaRegs.SCIFFTX.bit.TXFFST != 0); while (SciaRegs.SCICTL2.bit.TXEMPTY != 1); // 将RS485芯片的控制线设置为接收状态 GpioDataRegs.GPACLEAR.bit.GPIO10 = 1; // DE GpioDataRegs.GPACLEAR.bit.GPIO11 = 1; // RE } // 接收数据 void ReceiveData(Uint16* data, Uint16 len) { // 等待接收到足够的数据 while (SciaRegs.SCIFFRX.bit.RXFFST < len); // 从接收缓冲区中读取数据 Uint16 i; for (i = 0; i < len; i++) { data[i] = SciaRegs.SCIRXBUF.all; } } // UART1中断服务程序 interrupt void UART1_ISR(void) { // 处理接收中断 if (SciaRegs.SCIRXST.bit.RXRDY == 1) { // 读取接收缓冲区中的数据 while (SciaRegs.SCIFFRX.bit.RXFFST != 0) { rx_buf[SciaRegs.SCIFFRX.bit.RXFFST - 1] = SciaRegs.SCIRXBUF.all; } // 清除接收中断标志 SciaRegs.SCIFFRX.bit.RXFFOVFCLR = 1; SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1; PieCtrlRegs.PIEACK.all |= PIEACK_GROUP9; } } int main(void) { // 初始化系统 InitSysCtrl(); InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitUART(); InitPieVectTable(); // 配置RS485控制线为输出模式 GpioCtrlRegs.GPADIR.bit.GPIO10 = 1; // DE GpioCtrlRegs.GPADIR.bit.GPIO11 = 1; // RE // 配置UART1接收中断 PieVectTable.SCIRXINTA = &UART1_ISR; PieCtrlRegs.PIEIER9.bit.INTx1 = 1; IER = 0x100; EINT; ERTM; // 发送和接收数据 while (1) { // 发送数据 SendData(tx_buf, TX_BUF_SIZE); // 接收数据 ReceiveData(rx_buf, RX_BUF_SIZE); } } ``` 在上面的示例代码中,我们首先初始化了UART模块,并将RS485控制线配置为输出模式。然后配置UART1接收中断,并在主循环中不断发送和接收数据。在发送数据时,我们将RS485芯片的控制线设置为发送状态,并将数据写入发送缓冲区;在接收数据时,我们将RS485芯片的控制线设置为接收状态,并从接收缓冲区中读取数据。同时,在UART1中断服务程序中处理接收中断,将接收到的数据存储到接收缓冲区中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值