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串口通信实验(上位机收发显示)的主要内容,如果未能解决你的问题,请参考以下文章