?? serial.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 + -