|
|
附我的UART相关代码:
//-------------------------------------------------
//UART1 DMA 接收传送完指定字节数:
void S1R_DMA_Intr(void) interrupt 51
{
P_SW2 |= 0x80; //因需操作SFR
if (DMA_UR1R_STA & 0x01) //接收完成
{ DMA_UR1R_STA &= ~0x01;
DMA_UR1R_RXA = Rece;
DRx_OK = 1;
}
if (DMA_UR1R_STA & 0x02) //数据丢弃
{ DMA_UR1R_STA &= ~0x02;
DRx_LO = 1; //数据丢失
}
P_SW2 &= 0x7F; //这里是否关倒是无所谓
}
//================================================
// 函数: void UART1_DMA_Intr(void) interrupt 50/51
// 描述: UART1 DMA中断函数
//================================================
//UART1 DMA 发送传送完指定字节数:
void S1T_DMA_Intr(void) interrupt 50
{
P_SW2 |= 0x80; //因需操作SFR
if (DMA_UR1T_STA & 0x01) //发送完成
{ DMA_UR1T_STA &= ~0x01;
// DTx_OK = 1;
// DTc_OV = 0; //清数据覆盖标志
Txd_In = 0;
}
if (DMA_UR1T_STA & 0x04) //数据覆盖
{ DMA_UR1T_STA &= ~0x04;
// DTc_OV = 1; //置数据覆盖标志
// DTx_OK = 0;
}
P_SW2 &= 0x7F; //这里必须关!
}
//=====================================================
#define MAIN_Fosc 22118400UL
//-----------------------------------------------------
//串口1初始化:
void S1_Init(u16 Baud)
{ u16 Tn_IV;
Tn_IV = (65536UL-MAIN_Fosc/4/Baud);
... 略 ...
}
//=====================================================
// 函数: void DMA_Config(void)
// 描述: UART DMA 功能配置.
//=====================================================
void DMA_Config(void)
{
P_SW2 |= 0x80; //因操作的是:扩展SFR
//收完:
DMA_UR1R_CFG = 0x8A; //b7 1:使能中断
DMA_UR1R_STA = 0x00;
DMA_UR1R_AMT = AMT_RLEN-1; //传输总字节数:n+1
// DMA_UR1R_AMT = 255;
DMA_UR1R_RXA = Rece; //接收数组
DMA_UR1R_CR = 0xA1; //b7 1:使能DMA,
//b5 1:开始 自动接收,
//发完: //b0 1:清除 FIFO
//-------------------------------------------------
DMA_UR1T_CFG = 0x8A; //b7 1:使能中断
DMA_UR1T_STA = 0x00;
DMA_UR1T_AMT = AMT_TLEN-1; //设置传输总字节数:n+1
DMA_UR1T_TXA = Send; //发送数组
DMA_UR1T_CR = 0x80; //b7 1:使能DMA,
//b6 1:开始DMA 自动发送
P_SW2 &= 0x7F; //手册说:也可以不关,实测不行!
}
|
|