//调试了一天 总结一下经验 下面是简化测试版 调试OK
/***************************************************************************************
描述: 初始化UART
****************************************************************************************/
void UART1_Init(void)
{
P1_MFP = P1_MFP & (~(P13_AIN3_TXD1 | P12_AIN2_RXD1)) | (TXD1 | RXD1); //配置P1.2和P1.3为UART功能
P0_MFP = P0_MFP & (~P01_AD1_RTS1) | (RTS1); //P01_AD1_RTS1
IPRSTC2 |= UART1_RST; //复位UART模块
IPRSTC2 &= ~UART1_RST; //UART模块从复位状态恢复到正常工作状态
APBCLK |= UART1_CLKEN; //使能UART时钟
CLKSEL1 = CLKSEL1 & (~UART_CLK) | UART_12M; //选择外部12M作为UART时钟源
CLKDIV &= ~(15<<8); //设置UART时钟除频值为0
UA1_FCR |= TX_RST; //复位发送FIFO
UA1_FCR |= RX_RST; //复位接收FIFO
UA1_LCR &= ~PBE; //校验位禁止
UA1_LCR = (UA1_LCR & (~WLS)) | WL_8BIT; //数据宽度为8位
UA1_LCR |= NSB_ONE_HALF; //2位停止位
UA1_BAUD |= DIV_X_EN; //模式2:DIV_X_EN = 1
UA1_BAUD |= DIV_X_ONE; //模式2:DIV_X_ONE =1
UA1_BAUD |= ((12000000 / 250000) - 2); //设置波特率为250K,模式2波特率=UART_CLK/(UA_BAUD+2)
//==================================================================================================
UA1_FUN_SEL = RS485_EN; //使能RS485
UA1_FCR = ~RX_DIS; //使能FIFO接收器
//UA1_FCR |= RX_DIS; //禁止FIFO接收器
UA1_RS485_CSR = RS485_NMM;// | RS485_ADD_EN; //使能 RS-485 普通操作模式 (NMM) / 使能RS-485 自动方向控制模式
//UA1_MCR = ~LEV_RTS_H; //接收 RTS (Request-To-Send) 信号
UA1_MCR |= LEV_RTS_H; //HIGH
UA1_MCR &= (~RTS); //RXD
//UA1_MCR |= RTS; //TXD
UA1_IER |= (RDA_IEN | RLS_IEN); //使能中断
NVIC_ISER = UART1_INT; //使能NVIC UART1中断
}
/***************************************************************************************
描述 : UART1中断代码
****************************************************************************************/
void UART1_IRQHandler(void)
{
static u16 Counter = 0; // DMX地址
if(UA1_ISR & RLS_INT) //线中断
{
if (UA1_ISR & RLS_IF) //OK M051多种选择
//if (UA1_FSR & BIF) //OK
//if (UA1_FSR & RS485_ADD_DE) //NG 不知道为什么
{
//UA1_FSR |= RS485_ADD_DE; //CLR
//UA1_FSR |= BIF; //下面隐藏代码 可不用
//UA1_FSR |= FEF;
//UA1_FSR |= PEF;
Counter=0;
DMX_Flag=0; //test?
}
}
else if(UA1_ISR & RDA_INT) //接收中断
{
TXDRXDData[Counter++] = UA1_RBR;
}
}
|