C2000LaunchPad学习记录(5)——SIC中断接收

调试SCI接收中断的过程有点折腾。中断也配置了,也使能了,也定义中断响应函数了,跟踪调试时候每次中断发生,总会莫名其妙的进入到一个 asm ("      ESTOP0"); for(;;);,然后卡死在这里,百思不得其解。

琢磨了半天,才发现原来CCS5.4已经给定义了一个中断响应函数,在F2802x_DefaultIsr.c里。把自己定义的中断函数屏蔽,在CCS5.4的中断响应函数里接收数据并发送,测试OK。太后知后觉了,就在这竟然卡了这么久。


主函数main.c

/* Includes ------------------------------------------------------------------*/
#include
#include
#include "SystemInit.h"
#include "SubFunction.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
void main(void)
{
	InitSysCtrl();	// 系统控制初始化
	InitGpio();		// GPIO 初始化
	PieVectTable_Configure();	// 中断向量表初始化
	LED_Configure();	// LED 引脚配置
	//EXTI_Configure();	// 按键中断配置
    SCI_Configure();	// SCI 初始化

	while(1){
		LED_Blink();
	}
}

系统初始化SystemInit.c

/* Includes ------------------------------------------------------------------*/
#include
#include
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

/*******************************************************************************
* Function Name  : PieVectTable_Configure
* Description    : 配置PIE中断向量表
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void PieVectTable_Configure(void)
{
	DINT;
	InitPieCtrl();
	// 禁止CPU中断
	IER = 0x0000;
	// 清楚CPU所有中断标志
	IFR = 0x0000;
	// 位向量表中的所有中断向量配置对应的入口地址
	InitPieVectTable();
	EINT;
}


/*******************************************************************************
* Function Name  : LED_Configure
* Description    : 配置LED对应GPIO
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void LED_Configure(void)
{
	// 允许访问受保护的空间
	EALLOW;
	// 配置LED0、1、2、3 对应的 GPIO0、1、2、3为输出IO
	GpioCtrlRegs.GPADIR.all=0x000f;
	// 禁止访问受保护的空间
	EDIS;
}

/*******************************************************************************
* Function Name  : LED_Blink
* Description    : LED流水灯
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void LED_Blink(void)
{
	GpioDataRegs.GPATOGGLE.bit.GPIO0=1;  //电平翻转
	DELAY_US(100000L);    				 //延时
	GpioDataRegs.GPATOGGLE.bit.GPIO1=1;
	DELAY_US(100000L);
	GpioDataRegs.GPATOGGLE.bit.GPIO2=1;
	DELAY_US(100000L);
	GpioDataRegs.GPATOGGLE.bit.GPIO3=1;
	DELAY_US(100000L);
}


SCI_Configure.c

/* Includes ------------------------------------------------------------------*/
#include
#include
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define CBR_110             11E1
#define CBR_300             3E2
#define CBR_600             6E2
#define CBR_1200            12E2
#define CBR_2400            24E2
#define CBR_4800            48E2
#define CBR_9600            96E2
#define CBR_14400           144E2
#define CBR_19200           192E2
#define CBR_38400           384E2
#define CBR_56000           56E3
#define CBR_57600           576E2
#define CBR_115200          1152E2
#define CBR_128000          128E3
#define CBR_256000          256E3

#define CPU_FREQ     		60E6
#define LSPCLK_FREQ  		(CPU_FREQ/4)

#define SCI_BAUD(baud) (LSPCLK_FREQ/(baud*8))-1
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
//static unsigned char SCI_Rx_Counter = 0;
//static unsigned char SCI_Rx_Buff[20];

/****************************************************************************
* Function Name  : SCI_Configure
* Description    : SCI 引脚和参数配置
* Input          : None
* Output         : None
* Return         : None
******************************************************************************/
void SCI_Configure(void)
{
	EALLOW;

	// GPIO28/SCI_RX,配置成上拉输入,输入限定脉冲周期为3*2=6个时钟周期
	GpioCtrlRegs.GPADIR.bit.GPIO28 = 0;		// 配置为输入
	GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0;		// 使能上拉
	GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1;    // 配置 GPIO28 为SCI_RX
	GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3;   // 限定输入脉冲为6
	// GPIO29/SCI_TX,配置为无上拉输出
	GpioCtrlRegs.GPADIR.bit.GPIO29 = 1;		// 配置为输出
	GpioCtrlRegs.GPAPUD.bit.GPIO29 = 1;		// 禁止上拉
	GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1;    // 配置 GPIO29 为SCI_TX
	EDIS;

	SciaRegs.SCICTL1.bit.SWRESET = 0;		// 复位SCI寄存器
	SciaRegs.SCICTL1.bit.SWRESET = 1;		// 完成复位

	// 配置SCI	8位数据位,1个停止位,无校验,波特率 115200
	SciaRegs.SCICCR.bit.STOPBITS = 0;		// 0:1个停止位	1:两个停止位
	SciaRegs.SCICCR.bit.PARITY = 0;			// 0:奇校验		1:偶校验
	SciaRegs.SCICCR.bit.PARITYENA = 0;		// 0:禁止校验		1:允许校验
	SciaRegs.SCICCR.bit.SCICHAR = 7;		// 7:数据位8位
	SciaRegs.SCIHBAUD = 0;
	SciaRegs.SCILBAUD = SCI_BAUD(CBR_115200);

	SciaRegs.SCICTL1.bit.RXENA = 1;			// 0:禁止接收		1:使能接收
	SciaRegs.SCICTL1.bit.TXENA = 1;			// 0:禁止发送		1:使能发送

	SciaRegs.SCICTL2.bit.RXBKINTENA = 1;	// 0:禁止接收中断	1:允许接收中断
	SciaRegs.SCICTL2.bit.TXINTENA = 0;		// 0:禁止发送中断	1:允许发送中断

	PieVectTable.SCIRXINTA = &SCIRXINTA_ISR;
	PieCtrlRegs.PIECTRL.bit.ENPIE = 1;			//使能PIE
	PieCtrlRegs.PIEIER9.bit.INTx1 = 1;			//使能int9.1

	IER |= M_INT9;								//使能int9
	ERTM;

}

/****************************************************************************
* Function Name  : SCI_SendByte
* Description    : SCI 发送一个字节
* Input          : unsigned char TxByte:待发送的字节
* Output         : None
* Return         : None
******************************************************************************/
void SCI_SendByte(unsigned char TxByte)
{
	while(SciaRegs.SCICTL2.bit.TXRDY != 1);
	SciaRegs.SCITXBUF = TxByte;
}

/****************************************************************************
* Function Name  : SCI_PrintfStringTest
* Description    : SCI 发送一个字符串测试
* Input          : None
* Output         : None
* Return         : None
******************************************************************************/
void SCI_PrintfStringTest(void)
{
	unsigned char retry = 0;
	char buff[] = "\nwww.ccnu.edu.cn";
	for(retry=0; retry!=sizeof(buff); ++retry){
		SCI_SendByte(buff[retry]);
	}
}

F2802x_DefaultIsr.c里的SCI中断响应

/*******************************************************************************
* Function Name  : SCIRXINTA_ISR
* Description    : SIC中断响应函数
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
interrupt void SCIRXINTA_ISR(void)     // SCI-A
{
  // Insert ISR Code here
	if(SciaRegs.SCIRXST.bit.RXRDY == 1){
		// 把接收到的数据送往发送寄存器
		SciaRegs.SCITXBUF = (SciaRegs.SCIRXBUF.bit.RXDT);
	}
  // To receive more interrupts from this PIE group, acknowledge this interrupt
	PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;	
}

你可能感兴趣的:(C2000LaunchPad,C2000,LaunchPad,TMS320F28027)