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

📄 serial.c

📁 基于keil环境
💻 C
字号:
/*************************************************************************
* File Name:Serial.c
* Description:串口DMA发送方式通信--CPU工作频率为60MHz(开发板外接8MHz),波
*              特率为19200bps,字符长度8位,奇偶校验位无,停止位1位。允许
*              UART发送DMA,启用FIFO,发送FIFO触发DMA级别为空。不使用Modem
*			   自动流控。采用DMA方式通信。
* 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)

// DMA控制器寄存器定义
#define BDCON0		(*(volatile unsigned long *)0x01F80000)
#define BDISRC0		(*(volatile unsigned long *)0x01F80004)
#define BDIDES0		(*(volatile unsigned long *)0x01F80008)
#define BDICNT0		(*(volatile unsigned long *)0x01F8000C)
#define BDCSRC0		(*(volatile unsigned long *)0x01F80010)
#define BDCDES0		(*(volatile unsigned long *)0x01F80014)
#define BDCCNT0		(*(volatile unsigned long *)0x01F80018)

// 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 pUTXH0		0x01D00020
#define pURXH0		0x01D00024 

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

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

unsigned char txdata[TXDATA_SIZE];	// 发送缓冲区


int main(void)
{
	unsigned int k;
	
	// 初始化发送缓冲区
	for(k=0; k<TXDATA_SIZE; k++)
		txdata[k] = (unsigned char)k;

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


// 串口初始化
void uart_init(void)
{
	UBRDIV0 = BRD;			// 19200bps
	ULCON0 = 0x03;			// 帧长度8位,停止位1位,无校验
	UFCON0 = 0x21;			// 启用FIFO,发送FIFO触发级别为空
	UCON0 = 0x008;			// 发送BDMA0允许
}


// 中断控制器初始化
void isr_init(void)
{
	INTMSK &= 0x03FDFFFF;	// Global Interrupt Enable
							// BDMA0 Interrupt Enable
	INTCON = 0x01;			// Disable FIQ, Enable IRQ, 
							// IRQ Vectored Interrupt Mode
}


// DMA控制器初始化
void dmac_init(void)
{
    // BDMA0 Initialize---UART Tx
    BDISRC0 = ((unsigned int)0x0<<30)		// 字节传送
			+ ((unsigned int)0x1<<28)		// 内存地址递增
			+ (unsigned int)(txdata);		// txdata
    BDIDES0 = ((unsigned int)0x1<<30)		// 存储器到I/O端口
			+ ((unsigned int)0x3<<28)		// I/O端口固定
			+ (unsigned int)(pUTXH0);		// UTXH0
	BDICNT0 = ((unsigned int)0x2<<30)		// UART
			+ ((unsigned int)0x1<<26)		// 保留
			+ ((unsigned int)0x3<<22)		// TC到0产生中断
			+ (0x0<<21)						// 不自动重装
			+ (0x0<<20)						// DMA禁止
			+ TXDATA_SIZE;					// 传送计数
    BDICNT0 |= ((unsigned int)0x1<<20);		// DMA允许
    BDCON0 = 0x0<<2;						// 允许DMA请求
}

// 终止计数,则引起BDMA0中断,就会执行下面HandlerBDMA0中断服务子程序,
// BDMA0重新初始化——UART接着重新发送
/* BDMA0 Interrupt Handler */
__irq void HandlerBDMA0(void)
{
	I_ISPC = ((unsigned int)0x1<<17);		// 清除BDMA0 Interrupt

    BDICNT0 |= ((unsigned int)0x1<<20);		// DMA允许,重装初值,启动DMA传输
}

⌨️ 快捷键说明

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