⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 FREESCALE 9S08AW60 串口调试程序
💻 C
字号:
#include "config.h"

#define		UART0_REC_LENGTH	100
#define		UART0_TXD_LENGTH	150
#define        FIFO_LENGTH     14
/* 定义串口模式设置数据结构 */
typedef struct UartMode
{
	uint8 datab;		// 字长度,5/6/7/8可选
	uint8 stopb;		// 停止位,1/2可选
	uint8 parity;		// 奇偶校验位,0-无校验,1-奇校验,2-偶校验
}UARTMODE;

uint8 rcv_buf[100];		// UART0数据接收缓冲区
volatile uint8 rcv_new;	// 接收新数据标志

typedef	struct RecBuff
{   uint8		CheckSum,OverTime;
	uint8   	Buffer[UART0_REC_LENGTH];   
	
   uint8 	Command,Error,Receiving; 
   uint16  	Counter,Length;
}RECBUFF;


/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    
*/
typedef	struct TxdBuff
{
   uint8   Buffer[UART0_TXD_LENGTH+12];
   uint8   CheckSum,Sending;   
   uint16  Length;
}TXDBUFF;

uint8      *TxdP;
/*
*********************************************************************************************************
** 函数名称 :IRQ_UART0()
** 函数功能 :串口0接收中断服务程序
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void __irq IRQ_UART0 (void)
{
	 uint8   	IIR,rc;
    uint8   	i,FifoLen;
	uint16	Len;
    RECBUFF REC;
    RECBUFF TXD;
	IIR = U0IIR;
	switch (IIR & 0x0e)		  
	{
     	case 0x02:		    // Transmit interrupt $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$	  
     		
			if(TXD.Length)
			{
     			if(TXD.Length>FIFO_LENGTH)	 	
					Len = FIFO_LENGTH;
				else					 	
					Len = TXD.Length;
				for(i=0;i<Len;i++)	{	U0THR = *TxdP;		TxdP++;	}
				TXD.Length -= Len;
				//TXD.Sending = TRUE;
     		}
			else
			{
     			//ClearTransmitFlag();			
				//UserEvtFlag.UART0 = UART0_TRANSMIT_OK_EVT_FLAG;
				//isr_evt_set(UART0_TRANSMIT_OK_EVT_FLAG,TaskID.UART0);				
			}
		break;	//	  
		case 0x0c:		// 接收数据有效,超时。注:这里不能用break语句			
			REC.OverTime = 1;
	  	case 0x04:     // 接收数据有效 $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
			
			FifoLen = 0;
	   	while((U0LSR&0x01) == 1)		 //  最多14字节
	   	{
	   		rc = U0RBR;
	   		//////////////////////////////////// 接收数据
	   			   
			   if(REC.Counter<UART0_REC_LENGTH)		// 不能超出缓冲区长度
			   {			   	
			   	REC.Buffer[REC.Counter++] = rc;	
			   	// rcv_buf[i++]	= rc;		   					   	
			   //	REC.CheckSum ^= rc;
					FifoLen ++;
			   }			   
	   	}	
	   	if (REC.Counter==58)
	   	{rcv_new = 1;			// 设置接收到新的数据标志
	   	REC.Counter=0;}
	   	///////////////////////////////////// 判断是否为帧头
	  // 	if(REC.Receiving==0)
	   //	{
	   		//if((REC.Buffer[0]==0xaa)&&(REC.Buffer[1]==0x75))
	   		//{
	   			//REC.Command = REC.Buffer[2];
	   			//REC.Length = REC.Buffer[3];
	   			//REC.Length <<= 8;
	   			//REC.Length |= (0x00ff&((uint8)REC.Buffer[4]));	   			
	   			//for(i=0;i<8;i++) 
	   			//{ REC.Buffer[i] = REC.Buffer[i+6];}
	   			//REC.Counter = FifoLen-6;
	   			//REC.Receiving = TRUE;
	   		//}
	   		//else
	   			//REC.Error = TRUE;
	   //	}
	   	/////////////////////////////////// 判断是否有超时,超时则为帧尾
	   	//if((REC.OverTime)||(REC.Counter>=(REC.Length+1)))
	   //	{
	   	//	REC.CheckSum ^= REC.Buffer[REC.Counter-1];	   		
	   	//	if(REC.CheckSum!=REC.Buffer[REC.Counter-1])
	   	//		REC.Error = TRUE;					   		
				//UserEvtFlag.UART0 = UART0_RECEIVE_OK_EVT_FLAG;
				//isr_evt_set(UART0_RECEIVE_OK_EVT_FLAG,TaskID.UART0);   //
	   //	}
	  	  		
	 
		break;
		default: break;
	}	// End of Switch  		  		
	VICVectAddr = 0;	
	
}  // End of UART0 Interrupt function

/*
*********************************************************************************************************
** 函数名称 :UART0_SendByte()
** 函数功能 :向串口0发送1字节数据
** 入口参数 :dat	要发送的数据
** 出口参数 :无
*********************************************************************************************************
*/
void UART0_SendByte (uint8 dat)
{
	U0THR = dat;	// 要发送的数据
}

/*
*********************************************************************************************************
** 函数名称 :UART0_SendBuf()
** 函数功能 :向串口发送8字节数据
** 入口参数 :dat	要发送的数据
** 出口参数 :无
*********************************************************************************************************
*/
void UART0_SendBuf (void)
{
	uint8 i;
	
	for (i=0; i<8; i++)
		UART0_SendByte(rcv_buf[i]);
	while ((U0LSR & 0x20) == 0);	// 等待数据发送完毕
}

/*
*********************************************************************************************************
** 函数名称 :UART0_Init()
** 函数功能 :串口初始化,设置工作模式和波特率。
** 入口参数 :baud	波特率
**			  set	模式设置(UARTMODE数据结构)
** 出口参数 :1-初始化成功,  0-初始化失败
*********************************************************************************************************
*/
int8 UART0_Init (uint32 baud, UARTMODE set)
{
	uint32 bak;
	
	/* 参数过滤 */
	if ((baud ==0 ) || (baud > 115200))	return (0);
	if ((set.datab <5) || (set.datab > 8))	return (0);
	if ((set.stopb == 0) || (set.stopb > 2)) 	return (0);
	if (set.parity > 4)	return (0);
	
	/* 设置串口波特率 */
	U0LCR = 0x80;						// DLAB = 1	
	bak   = (Fpclk >> 4) / baud;
	U0DLM = bak >> 8;
	U0DLL = bak & 0xFF;
	
	/* 设置串口模式 */
	bak   = set.datab - 5;				// 设置字长
	if (set.stopb == 2)	bak |= 0x04;	// 判断是否为2位停止位
	
	if (set.parity != 0)
	{
		set.parity = set.parity - 1;
		bak |= 0x08;
	}
	bak |= set.parity << 4;				// 设置奇偶校验
	
	U0LCR = bak;
	
	return (1);
}


/*
*********************************************************************************************************
** 函数名称 :main()
** 函数功能 :从串口UART0接收字符串"ABCDEFGH",并发送回上位机显示。
** 调试说明 :需要PC串口显示终端软件如EasyARM.exe。
*********************************************************************************************************
*/
int main (void)
{
	UARTMODE set;

	set.datab  = 8;
	set.stopb  = 1;
	set.parity = 0;
	
	rcv_new = 0;
	
	PINSEL0 = 0x00000005;				// 设置I/O连接到UART0
	
	UART0_Init(115200, set);			// 串口初始化
	//U0FCR = 0x81;						// 使能FIFO,并设置触发点为8字节
	//U0IER = 0x01;						// 允许RBR中断,即接收中断
	 U0IER = 0x03;                       // Enable RDA and THRE interrupts 
	U0FCR = 0xc7;                       // Eable FIFO
	IRQEnable();						// 使能IRQ中断
	/* 使能UART0中断 */
	VICIntSelect = 0x00000000;			// 设置所有的通道为IRQ中断
	VICVectCntl0 = 0x20 | 0x06;			// UART0分配到IRQ slot0,即最高优先级
	VICVectAddr0 = (uint32)IRQ_UART0;	// 设置UART0向量地址
	VICIntEnable = 1 << 0x06;			// 使能UART0中断

	while (1)
	{
		if (rcv_new == 1)
		{	
			rcv_new =0;
			UART0_SendBuf();
		}
	}
    return 0;
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -