DSP28335基础教程——SCI串口通信实验(上位机收发显示)

Posted Sk Electronics

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DSP28335基础教程——SCI串口通信实验(上位机收发显示)相关的知识,希望对你有一定的参考价值。

0 前言

本期的实验目的为:使用核心板上的SCI串口通信功能,在电脑端上位机,输入数字0,1,2,3,4,分别控制五个LED亮灭。

1 DSP代码

注意:查看代码时双击点进去看,否则会内容不全)。

main.c

/**
 *  ********************************************************************************************
 *  @file                 main.c
 *  @file                 SK Electronics
 *  @version           V1.0
 *  @date               2020-xx-xx
 *  @brief               SCI串口通信中断接发测试
 *  *******************************************************************************************
 *  @attention
 *  实验平台:SK-F28335Mini   核心板
 *  CSDN博客:https://blog.csdn.net/weixin_46556696
 *  淘宝:https://shop409670932.taobao.com
 */

#include "DSP28x_Project.h"
#include "bsp_sci.h"
#include "bsp_led.h"
#define FLASH_RUN 1
#define SRAM_RUN 2
#define RUN_TYPE FLASH_RUN
#if RUN_TYPE==FLASH_RUN
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;
#endif
unsigned char i=0;
Uint16 ReceivedChar;  //变量定义
char *msg;            //指针
interrupt void scia_Tx_isr(void);
interrupt void scia_Rx_isr(void);

void delay_1ms(Uint16 t);
/**
 *  @brief                           主函数
 *  @parameter                  无
 *  @return_value               无
 */
void main(void)


/*第一步:初始化系统控制:*/
    InitSysCtrl();

/*第二步:初始化GPIO口*/
    InitGpio();

/* 第三步:清除所有中断 和初始化 PIE 向量表:*/
    DINT;// 关闭全局中断
    InitPieCtrl();// 初始化 PIE 控制寄存器到默认状态,默认状态是全部 PIE 中断被禁用和标志位被清除
    IER = 0x0000;// 禁用 CPU 中断和清除所有 CPU 中断标志位:
    IFR = 0x0000;
    InitPieVectTable();// 初始化 PIE 中断向量表
    // 中断重映射,注册中断程序入口(用户按需求添加)
    EALLOW;
    PieVectTable.SCITXINTA=&scia_Tx_isr;
    PieVectTable.SCIRXINTA=&scia_Rx_isr;
    EDIS;
    //

/*程序烧录入28335(可选的)*/
#if RUN_TYPE==FLASH_RUN
    MemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd,&RamfuncsRunStart);
    InitFlash();
#endif

/* 第四步: 初始化片上外设*/
    // InitPeripherals();  //初始化所有外设(本例程不需要)
    Sci_Init();//初始化和配置SCIA串口通信

/* 第五步:添加用户功能具体代码*/
    LED_GPIO_Config();//配置LED端口
    EINT;
    ERTM;

    msg = "\\r\\n\\n\\nHello SK Electronics!\\0";  //发送语句
    scia_msg(msg);                    //发送函数

    msg = "\\r\\n更详细的DSP基础教程,请关注支持本人博客哈!\\0";  //发送语句
    scia_msg(msg);                    //发送函数

    msg = "\\r\\nCSDN博客:https://blog.csdn.net/weixin_46556696\\0";  //发送语句
    scia_msg(msg);                    //发送函数

    msg = "\\r\\n淘宝店铺:https://shop409670932.taobao.com\\0";  //发送语句
    scia_msg(msg);                    //发送函数

    msg = "\\r\\n\\n\\n这是一个串口中断接收回显实验 \\n\\0"; //发送语句
    scia_msg(msg);

    msg = "\\r\\n\\r\\n请在串口调试助手输入单字符:\\n\\0"; //发送语句
    scia_msg(msg);                      //发送函数

/*第六步:进入主循环*/
    for(;;)
    

    


/**
 *  @brief                           1ms延迟函数
 *  @parameter                  t
 *  @return_value               无
 */
void delay_1ms(Uint16 t)

    while(t--)
    
        DELAY_US(1000);
    


interrupt void scia_Tx_isr()

    PieCtrlRegs.PIEACK.all=M_INT9;


interrupt void scia_Rx_isr()

   // while(SciaRegs.SCIRXST.bit.RXRDY !=1)   //等待从上位机收到数据
    PieCtrlRegs.PIEACK.all=M_INT9;
    ReceivedChar = SciaRegs.SCIRXBUF.all;//把接收BUF里的数据赋值给ReceivedChar

    msg = "  已发送: \\0";             //发送语句
    scia_msg(msg);                      //发送函数
    scia_xmit(ReceivedChar);            //发送ReceivedChar

    msg = "\\r\\n\\r\\n请在串口调试助手输入单字符:\\n\\0"; //发送语句
    scia_msg(msg);                      //发送函数

    /*根据接收到0~4控制对应LED灯*/
    switch(ReceivedChar)
    
        case '0': LED0_TOGGLE;
                break;
        case '1': LED1_TOGGLE;
                break;
        case '2': LED2_TOGGLE;
                break;
        case '3': LED3_TOGGLE;
                break;
        case '4': LED4_TOGGLE;
                break;
        default:
                break;
    

bsp_led.h

/**
 *  ********************************************************************************************
 *  @file                 bsp_led.h
 *  @file                 SK Electronics
 *  @version           V1.0
 *  @date               2020-xx-xx
 *  @brief               LED应用函数接口头文件
 *  *******************************************************************************************
 *  @attention
 *  实验平台:SK-F28335Mini   核心板
 *  CSDN博客:https://blog.csdn.net/weixin_46556696
 *  淘宝:https://shop409670932.taobao.com
 */

#ifndef _BSP_LED_H_
#define _BSP_LED_H_
#include "DSP28x_Project.h"

/* 宏带参,可以像内联函数一样使用,低电平亮灯*/
#define LED0(a) if (a)  \\
                    GpioDataRegs. GPACLEAR.bit.GPIO0=1;\\
                    else        \\
                    GpioDataRegs. GPASET.bit.GPIO0=1

#define LED1(a) if (a)  \\
                    GpioDataRegs. GPACLEAR.bit.GPIO1=1;\\
                    else        \\
                    GpioDataRegs. GPASET.bit.GPIO1=1

#define LED2(a) if (a)  \\
                    GpioDataRegs. GPACLEAR.bit.GPIO2=1;\\
                    else        \\
                    GpioDataRegs. GPASET.bit.GPIO2=1

#define LED3(a) if (a)  \\
                    GpioDataRegs. GPACLEAR.bit.GPIO3=1;\\
                    else        \\
                    GpioDataRegs. GPASET.bit.GPIO3=1

#define LED4(a) if (a)  \\
                    GpioDataRegs. GPACLEAR.bit.GPIO4=1;\\
                    else        \\
                    GpioDataRegs. GPASET.bit.GPIO4=1

/*定义IO口的宏*/
#define LED0_TOGGLE     GpioDataRegs. GPATOGGLE.bit.GPIO0=1
#define LED0_OFF        GpioDataRegs. GPASET.bit.GPIO0=1
#define LED0_ON         GpioDataRegs. GPACLEAR.bit.GPIO0=1

#define LED1_TOGGLE     GpioDataRegs. GPATOGGLE.bit.GPIO1=1
#define LED1_OFF        GpioDataRegs. GPASET.bit.GPIO1=1
#define LED1_ON         GpioDataRegs. GPACLEAR.bit.GPIO1=1

#define LED2_TOGGLE     GpioDataRegs. GPATOGGLE.bit.GPIO2=1
#define LED2_OFF        GpioDataRegs. GPASET.bit.GPIO2=1
#define LED2_ON         GpioDataRegs. GPACLEAR.bit.GPIO2=1

#define LED3_TOGGLE     GpioDataRegs. GPATOGGLE.bit.GPIO3=1
#define LED3_OFF        GpioDataRegs. GPASET.bit.GPIO3=1
#define LED3_ON         GpioDataRegs. GPACLEAR.bit.GPIO3=1

#define LED4_TOGGLE     GpioDataRegs. GPATOGGLE.bit.GPIO4=1
#define LED4_OFF        GpioDataRegs. GPASET.bit.GPIO4=1
#define LED4_ON         GpioDataRegs. GPACLEAR.bit.GPIO4=1

void LED_GPIO_Config(void);
#endif /*_BSP_LED_H_ */

bsp_led.c

/**
 *  ********************************************************************************************
 *  @file                 bsp_led.c
 *  @file                 SK Electronics
 *  @version           V1.0
 *  @date               2020-xx-xx
 *  @brief               LED应用函数接口
 *  *******************************************************************************************
 *  @attention
 *  实验平台:SK-F28335Mini   核心板
 *  CSDN博客:https://blog.csdn.net/weixin_46556696
 *  淘宝:https://shop409670932.taobao.com
 */
#include "bsp_led.h"
void LED_GPIO_Config(void)

    EALLOW;
    GpioCtrlRegs.GPAMUX1.bit.GPIO0=0;//普通IO模式
    GpioCtrlRegs.GPAPUD.bit.GPIO0=0;//使能内部上拉
    GpioCtrlRegs.GPADIR.bit.GPIO0=1;//配置成输出

    GpioCtrlRegs.GPAMUX1.bit.GPIO1=0;//普通IO模式
    GpioCtrlRegs.GPAPUD.bit.GPIO1=0;//使能内部上拉
    GpioCtrlRegs.GPADIR.bit.GPIO1=1;//配置成输出

    GpioCtrlRegs.GPAMUX1.bit.GPIO2=0;//普通IO模式
    GpioCtrlRegs.GPAPUD.bit.GPIO2=0;//使能内部上拉
    GpioCtrlRegs.GPADIR.bit.GPIO2=1;//配置成输出

    GpioCtrlRegs.GPAMUX1.bit.GPIO3=0;//普通IO模式
    GpioCtrlRegs.GPAPUD.bit.GPIO3=0;//使能内部上拉
    GpioCtrlRegs.GPADIR.bit.GPIO3=1;//配置成输出

    GpioCtrlRegs.GPAMUX1.bit.GPIO4=0;//普通IO模式
    GpioCtrlRegs.GPAPUD.bit.GPIO4=0;//使能内部上拉
    GpioCtrlRegs.GPADIR.bit.GPIO4=1;//配置成输出

    GpioDataRegs. GPASET.bit.GPIO0=1;
    GpioDataRegs. GPASET.bit.GPIO1=1;
    GpioDataRegs. GPASET.bit.GPIO2=1;
    GpioDataRegs. GPASET.bit.GPIO3=1;
    GpioDataRegs. GPASET.bit.GPIO4=1;
    EDIS;

bsp_sci.h

/**
 *  ********************************************************************************************
 *  @file                 bsp_sci.h
 *  @file                 SK Electronics
 *  @version           V1.0
 *  @date               2020-xx-xx
 *  @brief               串口通信函数接口头文件
 *  *******************************************************************************************
 *  @attention
 *  实验平台:SK-F28335Mini   核心板
 *  CSDN博客:https://blog.csdn.net/weixin_46556696
 *  淘宝:https://shop409670932.taobao.com
 */

#ifndef _BSP_SCI_H_
#define _BSP_SCI_H_
#include "DSP28x_Project.h"

void Sci_Init(void);
void scia_xmit(int a);//发送字节的函数
void scia_msg(char * msg);//发送数组的函数
#endif /*_BSP_SCI_H_ */

bsp_sci.c

/**
 *  ********************************************************************************************
 *  @file                 bsp_sci.c
 *  @file                 SK Electronics
 *  @version           V1.0
 *  @date               2020-xx-xx
 *  @brief               串口通信应用函数接口
 *  *******************************************************************************************
 *  @attention
 *  实验平台:SK-F28335Mini   核心板
 *  CSDN博客:https://blog.csdn.net/weixin_46556696
 *  淘宝:https://shop409670932.taobao.com
 */
#include "bsp_sci.h"
/**
 *  @brief                   初始化SCI串口配置
 *  @parameter                  无
 *  @return_value               无
 */
void Sci_Init(void)

    //SCI的工作模式和参数需要用户在后面的学习中,深入的了解一个寄存器底层相关的资料了,多看看芯片手册和寄存器的意思。
    //因为28335的寄存器太多了,所以在以后的学习过程中,就不会对寄存器进行详细的注释了。
    InitSciaGpio();
    SciaRegs.SCICCR.all=0x07;// 1 stop bit,  No loopback
                             // No parity,8 char bits
                             // async mode, idle-line protocol
    SciaRegs.SCICTL1.all=0x03;// enable TX, RX, internal SCICLK,

    #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.SCICTL2.bit.RXBKINTENA=1;
    SciaRegs.SCICTL2.bit.TXINTENA=1;
    //SciaRegs.SCICCR.bit.LOOPBKENA=1;
    SciaRegs.SCICTL1.bit.SWRESET=1;

    PieCtrlRegs.PIECTRL.bit.ENPIE=1;
    IER|=M_INT9;
    PieCtrlRegs.PIEIER9.bit.INTx1=1;
    PieCtrlRegs.PIEIER9.bit.INTx2=1;



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

    while (SciaRegs.SCICTL2.bit.TXRDY == 0) 
    SciaRegs.SCITXBUF=a;



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

    int i;
    i = 0;
    SciaRegs.SCICTL2.bit.TXINTENA=0;
    while(msg[i] != '\\0')
    
        scia_xmit(msg[i]);
        i++;
    
    SciaRegs.SCICTL2.bit.TXINTENA=1;

2 结论

通过此例程,上位机发送单字符的数字 0,1,2,3,4 可以分别控制对应LED状态反转。大家可以尝试一下!
更详细的讲解请关注公众号:电力电子学社

QQ群:945257491 一起讨论!

以上是关于DSP28335基础教程——SCI串口通信实验(上位机收发显示)的主要内容,如果未能解决你的问题,请参考以下文章

DSP28335基础教程——ECAP实验(超声波测距)

DSP28335基础教程——ECAP实验(超声波测距)

DSP28335基础教程——ECAP实验(超声波测距)

DSP28335基础教程——ECAP实验(超声波测距)

DSP28335基础教程——I2C通信实验(OLED显示控制)

DSP28335基础教程——I2C通信实验(OLED显示控制)