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

📄 serial.c

📁 微控制器为S3C44B0x
💻 C
字号:
/*************************************************************************
* File Name:Serial.c
* Description:串口DMA发送方式通信--CPU工作频率为60MHz(开发板外接8MHz),波
*              特率为19200bps,字符长度8位,奇偶校验位无,停止位1位。允许
*              UART发送DMA,启用FIFO,发送FIFO触发DMA级别为空。不使用Modem
*			   自动流控。采用DMA方式通信。
* Date:2007-10-09
*************************************************************************/

#include <S3C44B0X.H>					// S3C44B0X预定义文件

#define pUTXH0		0x01D00020
#define pURXH0		0x01D00024 

#define MCLK 60000000					// 主时钟频率
#define BR      19200					// 波特率
#define BRD ((int)(MCLK/16.0/BR+0.5)-1)	// 波特率除数因子
#define TXDATA_SIZE		0x100 

// 定时间隔= TCNTBn / ( MCLK / (预定标值+1) / 分频值)
// TCNTBn = MCLK / TCLK / (预定标值+1) / 分频值
#define TCLK     0.25						// 定时间隔为4s,则频率TCLK为0.25Hz
#define TCNT ((int)(MCLK/TCLK/256/16+0.5))	// 计数初值

void uart_init(void);					// Uart初始化
void init_timer(void);					// 定时器初始化
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初始化
	init_timer( );		// 定时器初始化
	isr_init( );		// 中断控制器初始化
	dmac_init( );		// DMA控制器初始化
	
	while(1)			// 死循环,等待中断
	{
	}
}


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


// 初始化Timer5以及开定时中断
void init_timer(void)
{
	pPWM->TCFG0 = 0xFF0000;			// Timer5预定标值为255
	pPWM->TCFG1 = MUX5_1_16;		// Timer5分频值为16
	pPWM->TCNTB5 = TCNT;			// 加载Timer5计数初值
	pPWM->TCON   = T5_UPDATE;		// 手动更新TCNTB5
	pPWM->TCON   = T5_START |		// 启动定时器5,清除手动更新位
				   T5_AUTOREL;		// 自动重装
}


// 中断控制器初始化
void isr_init(void)
{
	pIC->INTMSK &= ~(INT_GLOBAL |	// 全局开中断
					INT_BDMA0 |		// BDMA0中断允许
					INT_TIMER5);	// Timer5中断允许

	pIC->INTCON  = FIQ_DISABLE |	// 禁止FIQ
				   IRQ_ENABLE  |	// 允许IRQ
				   VECT_IRQ;		// IRQ采用中断向量模式
}


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



// 4s产生一次定时中断——UART定时发送
/* Timer 5 Interrupt Handler */
__irq void HandlerTIMER5(void)
{
    pBDMA->DICNT0 |= ((unsigned int)0x1<<20);	// DMA允许(0->1),重装初值,启动DMA操作
	pIC->I_ISPC = INT_TIMER5;					// 清除中断请求位
}


// 终止计数,则引起BDMA0中断,就会执行下面HandlerBDMA0中断服务子程序,
/* BDMA0 Interrupt Handler */
__irq void HandlerBDMA0(void)
{
	//准备新的数据

	pIC->I_ISPC = INT_BDMA0;					// 清除BDMA0中断请求位
}

⌨️ 快捷键说明

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