CH547 使用中遇到的问题

现在使用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; 我原本的程序都运行不正常了,请各位不吝指教         急

使用特权

更多操作

收藏(0) 评分






使用特权

更多操作

收藏(0) 评分

串口中断标志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 能否实现?


只有登录才能回复,可以选择微信账号登录