(四)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 一起讨论!

  • 17
    点赞
  • 145
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sk Electronics

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值