当前位置: 首页 > article >正文

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文件也不同。


http://www.kler.cn/a/226929.html

相关文章:

  • 深度学习的进展
  • 计算机网络_1.6.2 计算机网络体系结构分层的必要性
  • nginx初学者指南
  • FlashFXP 下载、安装、使用
  • 在多线程编程中使用 `std::future` 和 `std::vector<std::future<void>>`
  • 【问题解决】VSCode1.86.0版+拓展Remote-SSHv0.108 无法连接到VSCode服务器(VSCode无法远程连接到Linux)
  • MySQL 用户管理
  • 神经网络 | 基于多种神经网络模型的轴承故障检测
  • centOS linux 宝塔 部署django 遇坑小记
  • 基础算法bfs -剪枝问题
  • ep-bg-purple-dark element-plus 不生效
  • react 之 useCallback
  • Kafka常见生产问题详解
  • .locked.locked1勒索病毒爆发:如何有效保护和恢复您的文件
  • AVL树
  • 微信小程序(三十三)promise异步写法
  • 系统添加多版本支持
  • ASP.NET Core 自定义解压缩提供程序
  • 两个重要极限【高数笔记】
  • Java面试——计网篇