(四)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_RUNMemCopy(&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里的数据赋值给ReceivedCharmsg = "  已发送: \0";             //发送语句scia_msg(msg);                      //发送函数scia_xmit(ReceivedChar);            //发送ReceivedCharmsg = "\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=1void 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 protocolSciaRegs.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;#endifSciaRegs.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 一起讨论!


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部