📄 uart.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 + -