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

📄 uart.c

📁 ARM入门学习源码
💻 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 + -