现在使用CH547开发项目,需要用到UART0 作为与上位机的通讯端口,但是怎样设置都不能正常工作,以下是代码,请各位不吝赐教
/*******************************************************************************
* Function Name : mInitSTDIO()
* Description : CH559????0??????,????????T1×÷UART0???¨????·??ú?÷,??????????T2
×÷???¨????·??ú?÷
* Input : None
* Output : None+
* Return : None
*******************************************************************************/
void mInitSTDIO( ) //这是官方的代码
{
UINT32 x;
UINT8 x2;
SM0 = 0;
SM1 = 1;
SM2 = 0;
RCLK = 0;
TCLK = 0;
PCON |= SMOD;
x = 10 * FREQ_SYS / UART0BUAD / 16;
x2 = x % 10;
x /= 10;
if ( x2 >= 5 ) x ++;
TMOD = TMOD & ~ bT1_GATE & ~ bT1_CT & ~ MASK_T1_MOD | bT1_M1; //0X20??Timer1×÷??8??×????????¨?±?÷
T2MOD = T2MOD | bTMR_CLK | bT1_CLK;
TH1 = 0-x;
TR1 = 1;
TI = 1; // 自己增加的
RI = 1;
REN = 1;
ES = 1; //ENABLE UART0 INT
}
我的想法是用UART0的中断来接收发送数据
void UART0Interrupt( void ) interrupt INT_NO_UART0 using 1 //UART0 中断入口
{
if(SCON&0x02) //发射中断
{
TI=1;
if(++TranPointer >= TRANSMIT_DATA_BUFFER)
TranPointer = 0;
if(TranPointer != BakTranPointer)
{
SBUF = TranData[++TranPointer];
}
//CH549UART1SendByte(dat);
}else if(SCON&0X01) 接收中断
{
RI=1;
ReceiveData[++ReceivePointer]=SBUF;
if(ReceivePointer >= RECEIVE_DATA_BUFFER)
ReceivePointer = 0;
}
}
其中 TranData[],ReceiveData[] 分别是发送 BUFFER 和接收BUFERR
现在的问题 只要 设 ES=1; 我原本的程序都运行不正常了,请各位不吝指教 急
串口中断标志TI 和 RI写0清除中断。你的代码中初始化和进入中断都将这两个写了1
十分感谢回答,我会尽快测试,可能还有问题,到时请赐教
你好,进行了测试,但是发现,上电后UART0 功能依旧不正常,检测 TX(P3.1),RX(P3.0)均是低电平,初始化是否要单独设置 TX,RX 管脚,我也进行了设置,但是测量仍为低电平
GPIO_Init( PORT3,PIN0,MODE3); // RX
GPIO_Init( PORT3,PIN1,MODE1); // TX
P0 = 0;
P1 = 0;
P2 = 0;
P3 = 0x02;
请给予指导
是不是UART0 除了 作为下载使用,不能被用来作其他用?
EVT包中大部分例程制作好的HEX文件会用到串口打印,可以尝试烧录那些HEX文件看一下串口0能不能发送数据出来,排除一下硬件的问题。
其次在使用串口0的时候要避免使用标准库提供的printf函数,可能会导致程序卡在打印函数内部。可以通过在代码适当的地方对IO进行翻转,来监控程序是否正常运行。
您好,感谢答复,用UART0的串行口打印是没有问题的,因为客户临时要求加上位机通讯,而其他的UART口线已经被使用,所以改PCB 最简单的办法就使用 UART0跟上位机通讯,但是试过多次,都没能达到。。。所以请问贵司有UART0的通讯 source code ? 另外 客户要单线半双工通讯,不知现在的UART 能否实现?