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

📄 serial.c

📁 基于keil环境编写
💻 C
字号:
/*************************************************************************
* File Name:Serial.c
* Description:串口中断方式通信--CPU工作频率为60MHz(开发板外接8MHz),波特率
*              为19200bps,字符长度8位,奇偶校验位无,停止位1位。允许发送/接
*              收中断,允许接收超时、错误中断,启用FIFO,发送FIFO触发级别为
*			   空,接收FIFO触发级别为12字节。不使用Modem自动流控。采用中断方
*			   式通信。
* Date:2006-07-19
*************************************************************************/

// 中断控制器寄存器定义
#define INTCON		(*(volatile unsigned long *)0x01E00000)
#define INTPND		(*(volatile unsigned long *)0x01E00004)
#define INTMOD		(*(volatile unsigned long *)0x01E00008)
#define INTMSK		(*(volatile unsigned long *)0x01E0000C)
#define I_ISPC		(*(volatile unsigned long *)0x01E00024)

// UART寄存器定义
#define ULCON0		(*(volatile unsigned long *)0x01D00000)
#define UCON0		(*(volatile unsigned long *)0x01D00004)
#define UFCON0		(*(volatile unsigned long *)0x01D00008)
#define UMCON0		(*(volatile unsigned long *)0x01D0000C)
#define UTRSTAT0	(*(volatile unsigned long *)0x01D00010)
#define UERSTAT0	(*(volatile unsigned long *)0x01D00014)
#define UFSTAT0		(*(volatile unsigned long *)0x01D00018)
#define UMSTAT0		(*(volatile unsigned long *)0x01D0001C)
#define UTXH0		(*(volatile unsigned long *)0x01D00020)
#define URXH0		(*(volatile unsigned long *)0x01D00024) 
#define UBRDIV0		(*(volatile unsigned long *)0x01D00028)

#define MCLK 60000000	/* Master Clock */
#define BR      19200	/* Baud Rate */
#define BRD ((int)(MCLK/16.0/BR+0.5)-1)	/* Baud Rate Divisor */

#define BUF_SIZE	17	// 缓冲区大小,不能超过16个+1,FIFO限制

void uart_init(void);	// Uart初始化
void isr_init(void);	// 中断控制器初始化

int eventRX = 0;		// 接收到新的数据标志
char rxdata[BUF_SIZE];
char txdata[BUF_SIZE] = "Comm Testting!\r\n";

int main()
{
	uart_init( );		// Uart初始化
	isr_init( );		// 中断控制器初始化
	
	while(1)			// 死循环,等待中断
	{
	}
}


// 串口初始化
void uart_init(void)
{
	UBRDIV0 = BRD;			// 19200bps
	ULCON0 = 0x03;			// 帧长度8位,停止位1位,无校验
	UFCON0 = 0x21;			// 启用FIFO,发送FIFO触发级别为空,
							// 接收FIFO触发级别为12字节
	UCON0 = 0x0C5;			// 接收中断/查询允许,发送中断允许
							// 允许接收错误中断,允许接收超时中断
}


// 中断控制器初始化
void isr_init(void)
{
	INTMSK &= 0x03FFBF77;	// Global Interrupt Enable
							// UART0/1 Error Interrupt Enable
							// UART0 Rx Interrupt Enable
							// UART0 Tx Interrupt Enable
	INTCON  =  0x01;		// Disable FIQ, Enable IRQ, 
							// IRQ Vectored Interrupt Mode
}


// 如果UART0/1接收错误,则引起错误中断,就会执行下面
// HandlerUERR01中断服务子程序,
// 读错误状态寄存器,如果是溢出错误,读接收缓冲区,以清除错误
/* UART0/1 Error Interrupt Handler */
__irq void HandlerUERR01(void)
{
	unsigned char errdata, errflag;
	
	I_ISPC = ((unsigned int)0x1<<14);// 清除UERR01 Error Interrupt
	
	errflag = UERSTAT0;		// 读错误状态寄存器
	if(errflag&0x01)		// 溢出错误
		errdata = URXH0;	// 读接收缓冲区
	// 未进一步处理
}


// 如果UART0接收(超时)中断,则引起接收中断,就会执行下面
// HandlerURXD0中断服务子程序,从UART0接收缓冲区读走数据
/* UART0 Rx Interrupt Handler (包括超时中断) */
__irq void HandlerURXD0(void)
{
	int rxcount, k;

	I_ISPC = ((unsigned int)0x1<<7);// 清除UART0 Rx Interrupt
	
	rxcount = UFSTAT0&0x0f;	// 接收FIFO的数据量
	for(k=0; k<rxcount; k++)
		rxdata[k]=URXH0 ;	// 从接收FIFO读入数据
	
	rxdata[k]='\0' ;		// 添加字符串结束符
	eventRX = 1;			// 新数据标志置位
}


// 如果UART0发送中断,则引起发送中断,就会执行下面
// HandlerUTXD0中断服务子程序,填充UART0发送缓冲区
/* UART0 Tx Interrupt Handler */
__irq void HandlerUTXD0(void)
{
	int k;
	char *pTx = txdata;
	
	I_ISPC = ((unsigned int)0x1<<3);// 清除UART0 Tx Interrupt
	
	if(eventRX)
	{
		eventRX = 0;				// 新数据标志清零
		for(k=0; k<BUF_SIZE; k++)
			txdata[k]=rxdata[k];	// 从接收缓冲区拷贝数据到发送缓冲区
	}
	
	while(*pTx!='\0')
	{
		UTXH0 = *pTx;		// 写新的字符进入发送FIFO
		pTx++;
	}
}

⌨️ 快捷键说明

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