📄 uart.c
字号:
#include <string.h>
#include "44b.h"
#include "UART.H"
static void __irq Uart0_RxInt() //串口接受中断服务程序
{
unsigned char i;
unsigned char data[16];
unsigned char DataCount=0;
memset(data,0,sizeof(data));
do
{
data[DataCount]= RdURXH0();
DataCount++;
}while( (rUFSTAT0&0xf) >0 ); //若RxD_FIFO计数器为0退出
for(i=0;i<DataCount;i++)
{
}
rI_ISPC = BIT_URXD0; //清除中断标志
}
static TX_DATA *pTxData;
static void __irq Uart0_TxInt() //串口发送中断程序,当FIFO为空时中断发生
{
unsigned char *pBuf = &pTxData->TxBuf[0];
while(!(rUFSTAT0 & 0x200) && pTxData->TxLen) //当TxD FIFO满或者TxLen为0时退出
{
rUTXH0 = *(pBuf+pTxData->TxCnt);
pTxData->TxCnt++;
pTxData->TxLen--;
}
if(!pTxData->TxLen) //这段代码是必须的,当TxLen为0表示传输完毕.
{
while(1)
{
if((rUTRSTAT0 & 0x04) == 0x04)
break;
}
rINTMSK |= BIT_UTXD0; //若这里不把中断关掉,TxD FIFO永远为空,也就是说中断永远都会发生!!
}
rI_ISPC = BIT_UTXD0;
}
static void Uart0_IntInit(void) //中断注册
{
unsigned int kc;
kc = 0xffffff & ( ( (int)Uart0_RxInt - (unsigned int)ISR_URXD0-8 )>>2 );
*(unsigned int*)ISR_URXD0 = 0xEA000000 |kc ;
kc = 0xffffff & ( ( (int)Uart0_TxInt - (unsigned int)ISR_UTXD0-8 )>>2 );
*(unsigned int*)ISR_UTXD0 = 0xEA000000 |kc ;
}
void Uart0_Init(int mclk,int baud)
{
int i;
rPCONE &= ~(0x0f<<2);
rPCONE |= (0x0a<<2); //GPE1 = TxD0,GPE2 = RxD0;
rPDATE |= (0x03<<1); //GPE1 = 1,GPE2 = 1;
rPUPE |= (0x03<<1); //GPE1\GPE2 Disable pull-up
rULCON0 = 0x03; //Normal,No parity,1 bit stop,8 bit data
rUCON0 = 0x02c5; //Tx Int->Level;Rx int->Pules;Rx time out enable;
//Error int enable;Tx mode->int;Rx mode->int;
rUFCON0 = 0xe7; //FIFO enable;RxD FIFO = 12 Bytes;Tx FIFO = 12 Bytes
rUMCON0 = 0x00;
rUBRDIV0=( (int)(mclk/16./baud + 0.5) -1 );//设置波特率;
Uart0_IntInit(); //初始化串口0中断;
for(i=0;i<100;i++);
}
void Uart0_Send(TX_DATA *pTx) //串口发送函数,先发送一个字节,然后开中断,剩下的字节在中断服务程序里发送
{
pTxData = pTx;
if(pTxData->TxLen>0 && (pTxData->TxCnt+pTxData->TxLen)<sizeof(pTxData->TxBuf))
{
rUTXH0 = pTxData->TxBuf[pTxData->TxCnt];
pTxData->TxCnt++;
pTxData->TxLen--;
rINTMSK &= ~BIT_UTXD0;
}
}
void Uart0_SendChar(char data)
{
if(data=='\n')
{
while(!(rUTRSTAT0 & 0x2));
WrUTXH0('\r');
}
while(!(rUTRSTAT0 & 0x2)); //Wait until THR is empty.
WrUTXH0(data);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -