概述
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 = "rnnnHello SK Electronics! ";
//发送语句
scia_msg(msg);
//发送函数
msg = "rn更详细的DSP基础教程,请关注支持本人博客哈! ";
//发送语句
scia_msg(msg);
//发送函数
msg = "rnCSDN博客:https://blog.csdn.net/weixin_46556696 ";
//发送语句
scia_msg(msg);
//发送函数
msg = "rn淘宝店铺:https://shop409670932.taobao.com ";
//发送语句
scia_msg(msg);
//发送函数
msg = "rnnn这是一个串口中断接收回显实验 n "; //发送语句
scia_msg(msg);
msg = "rnrn请在串口调试助手输入单字符:n "; //发送语句
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 = "
已发送: ";
//发送语句
scia_msg(msg);
//发送函数
scia_xmit(ReceivedChar);
//发送ReceivedChar
msg = "rnrn请在串口调试助手输入单字符:n "; //发送语句
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] != '