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

📄 uart.bak

📁 此源码是用的NEC公司的MCU78F0396
💻 BAK
字号:
/******************************************************
//  Filename :	Uart.c
//  Abstract :	This file implements main function.
//
//  Device    :	uPD78F0396
//  CreateTime: 2006/11/01
//  Author    :  

******************************************************/
#pragma interrupt INTSR0  MD_INTSR0
#pragma interrupt INTST0  MD_INTST0
 

#pragma interrupt INTSR6   MD_INTSR6
#pragma interrupt INTST6   MD_INTST6
#pragma interrupt INTSRE6  MD_INTSRE6


#pragma interrupt INTTM000 MD_INTTime00

//#pragma interrupt INTTM51 MD_INTTime51


#include "UsrComm.h"
#include "Uart.h"

#define  UART0BUF_LENGTH   0x100
#define  UART6BUF_LENGTH   0x100

#define UART_BAUDRATE_K0 0xC0

#define UART_BAUDRATE_M6 0x3
#define UART_BAUDRATE_K6 0x82

#define  TM_TM00_INTERVALVALUE 0x2000


unsigned char   g_pUart0Buf[ UART0BUF_LENGTH];
unsigned short  g_wUart0Head;
unsigned short  g_wUart0Tail;
unsigned char   g_ucUart0RxFinish = 0;


unsigned char   g_pUart6Buf[ UART6BUF_LENGTH];
unsigned short  g_wUart6Head;
unsigned short  g_wUart6Tail;
unsigned char   g_ucUart6RxFinish = 0;

 



void UART0_Init( void ); 
__interrupt void MD_INTSR0( void );
__interrupt void MD_INTST0( void );

__interrupt void MD_INTSR6( void );
__interrupt void MD_INTST6( void );
__interrupt void MD_INTSRE6(void );

__interrupt void MD_INTTime00(void);
//__interrupt void MD_INTTime51(void);
 
//=============================================================== 

void UART0_Init( void )
{
	 
	P1.0 = 0;  
	P1.1 = 1;  
	PM1.0 = 0;   //TX output
	PM1.1 = 1;   //RX input

	STIF0 = 0;   //clear TX INT
	SRIF0 = 0;   //clear RX INT

	STMK0 = 1;  // Enable TX INT
	SRMK0 = 1;  // Enable RX INT

	SRPR0 = 0;  // low
	STPR0 = 0;  // low
    
	BRGC0 = UART_BAUDRATE_K0;
	//CL0 = 1;
	//RXE0 = 1;    // Enable Rx
	//TXE0 = 1;    //Enable Tx
	//PWRER0 = 1;  // Enable inter operation clock
	SetIORBit(ASIM0,0xE3 );

  g_wUart0Head = 0;
  g_wUart0Tail  = 0;
	 
}

 
//===============================================================
//**
//** Abstract:
//** This function is responsible for UART0 data transfering.
//**
//** Parameters:
//** txbuf: transfer buffer pointer
//** txnum: buffer size
//**
//** Returns:
//** MD_OK
//** MD_ERROR
//**
//===============================================================
 
MD_STATUS UART0_SendData( unsigned char  * pBuf, unsigned short wTxLength)
{

	unsigned short i; 
	if( wTxLength < 1 ){
		return MD_ERROR; /* 1 frame data at least */
	}

	for ( i = 0; i < wTxLength; i++)
	{   
		 
		TXS0 = pBuf[i];
		while((STIF0 == 0)); /* wait */
	}

	return MD_DATAEXISTS;
}
 
//======================================================================
//**
//** Abstract:
//** This function is the UART0 receive end interrupt handler.
//**
//** Parameters:
//** None
//**
//** Returns:
//** None
//**
//=============================================================== 
 
__interrupt void MD_INTSR0( void )
{
	unsigned char static ucCheckSum = 0;
	unsigned char i;
	
		g_pUart0Buf[g_wUart0Tail++ ] = RXB0;
		g_wUart0Head = g_wUart0Tail% UART0BUF_LENGTH;

		if(g_wUart0Tail >= 12 + g_pUart0Buf[9])
		{
		if(( g_pUart0Buf[0] == 0x68)&& (g_pUart0Buf[6] == 0x68) && (g_pUart0Buf[12 + g_pUart0Buf[9] -1] ==0x16))
			{
			//	for( i = 0; i < 9+ g_pUart0Buf[9])			 
			//		ucCheckSum += g_pUart0Buf[i] ;
		//		if(ucCheckSum == g_pUart0Buf[ 9+ g_pUart0Buf[9]])
		//			g_ucUart0RxFinish = 1;
		//		else return;              
		}
		}  

}

//===============================================================
//MCU Serial Communications
//180
//**
//** Abstract:
//** This function is the UART0 transfer end interrupt handler.
//**
//** Parameters:
//** None
//**
//** Returns:
//** None
//**
//===============================================================
 
__interrupt void MD_INTST0( void )
{
	
	if((ASIM0 & 0x80) == 0x80)
	{
		g_wUart0Tail++;
          TXS0= g_pUart0Buf[g_wUart0Tail];
 
	}
	 g_wUart0Tail = g_wUart0Tail % UART0BUF_LENGTH;

	 
}

//*************************************************************** 
// Uart6 
//***************************************************************
void UART6_Init( void )
{
ASIM6 = 0;
SetIORBit(P1, 0x08); /* port setting in transmit/receive mode */
ClrIORBit(PM1, 0x08);

SetIORBit(ASICL6, 0x02); /* LSB first transfer */
ClrIORBit(ASICL6, 0x01); /* normal output of TxD6 */

CKSR6 = UART_BAUDRATE_M6; /* baudrate selection */
BRGC6 = UART_BAUDRATE_K6;

ClrIORBit(IF0H, 0x02);
ClrIORBit(MK0H, 0x02); /* transfer end interrupt enable */
ClrIORBit(IF0H, 0x01);
ClrIORBit(MK0H, 0x01); /* receive end interrupt enable */
ClrIORBit(PR0H, 0x01); /* interrupt high */
SetIORBit(PR0H, 0x02); /* interrupt low */

/* this is corrected code */
/* SREIF6 is IF0L.7, SREMK6 is MK0L.7, SREPR6 is PR0L.7 */
ClrIORBit(IF0L, 0x80);
ClrIORBit(MK0L, 0x80); /* error interrupt enable */
ClrIORBit(PR0L, 0x80); /* interrupt high */

SetIORBit(ISC ,0x03); //enable RxD6 
SetIORBit(ASIM6,0xFD);//data length 8,stop length 1 bits,LSB first transfer
                      // even parity mode
SetIORBit(ASIM6, 0x60); /* transmit/receive mode */
}

//===============================================================
__interrupt void MD_INTSR6( void )
{

}
  
//===============================================================
__interrupt void MD_INTST6( void )
{


}

//===============================================================
__interrupt void MD_INTSRE6(void )
{

}
//===============================================================


//***************************************************************
// TM00
//***************************************************************
void TM00_Init(void)
{
	TMC00=0x00;   // stop 16 time/count
	PRM00 = 0x00; // select internal clock fclock = FPRS/2^8	  
	TOC00 = 0x00;
	SetIORBit(PR0H, 0x40); // low priority level  
	ClrIORBit(IF0H, 0x40);
	CRC00 = 0x00 ; // CRC0000 as compare register	 
	CR000 = TM_TM00_INTERVALVALUE;
  	
	TMC00 = 0x0c;   //external event count start  
	ClrIORBit(MK0H, 0x40); // INTTM000 enable 



}
//===========================================================

__interrupt void MD_INTTime00(void)
{
 static unsigned short wCount;
    wCount++;
	if(wCount == 0x500)
	{
		wCount = 0;

	}

}
//===========================================================


void TM00_Start(void)
{	
	
	TMC00 = 0x0c;   //external event count start  
	ClrIORBit(MK0H, 0x40); // INTTM000 enable 
}

//===========================================================
 
void TM00_Stop()
{
	TMC00=0x0;
	SetIORBit(MK0H, 0x40);
}

//===========================================================


//*********************************************************** 

void TM51_Init(void)
{

ClrIORBit(TMC51, 0x80);
 TCL51 = 0x02; /* countclock=fx */
/* TM51 PWM output */
ClrIORBit(P3, 0x08);
ClrIORBit(PM3, 0x08); /* TO51 output */
SetIORBit(TMC51, 0x1);
SetIORBit(TMC51, 0x40);
ClrIORBit(TMC51, 0x8);
SetIORBit(TMC51, 0x4);
ClrIORBit(TMC51, 0x2); /* active high */
CR51 = 0x77;
ClrIORBit(TMC51, 0x8);
SetIORBit(TMC51, 0x4);
SetIORBit(TMC51, 0x80);
}


⌨️ 快捷键说明

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