[单片机芯片]

CH547 使用中遇到的问题

[复制链接]
3010|1
手机看帖
扫描二维码
随时随地手机跟帖
wangjunn|  楼主 | 2021-11-23 13:51 | 显示全部楼层 |阅读模式
   现在使用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;                                                                   //´®¿Ú0ʹÓÃģʽ1
                                                                               //ʹÓÃTimer1×÷Ϊ²¨ÌØÂÊ·¢ÉúÆ÷
    RCLK = 0;                                                                  //UART0½ÓÊÕʱÖÓ
    TCLK = 0;                                                                  //UART0·¢ËÍʱÖÓ
    PCON |= SMOD;
    x = 10 * FREQ_SYS / UART0BUAD / 16;                                        //Èç¹û¸ü¸ÄÖ÷Ƶ£¬×¢ÒâxµÄÖµ²»ÒªÒç³ö                           
    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;                                        //Timer1ʱÖÓÑ¡Ôñ
    TH1 = 0-x;                                                                 //12MHz¾§Õñ,buad/12Ϊʵ¼ÊÐèÉèÖò¨ÌØÂÊ
    TR1 = 1;                                                                   //Æô¶¯¶¨Ê±Æ÷1E
    TI = 1;
    RI = 1;
    REN = 1;                                                                   //´®¿Ú0½ÓÊÕʹÄÜ
               
    ES = 1;              //ENABLE UART0 INT
}

我的想法是用UART0的中断来接收发送数据

void UART0Interrupt( void ) interrupt INT_NO_UART0 using 1                //´®¿Ú0ÖжϷþÎñ³ÌÐò,ʹÓüĴæÆ÷×é1
{
   
    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; 我原本的程序都运行不正常了,请各位不吝指教

使用特权

评论回复
wchtech| | 2022-3-21 13:48 | 显示全部楼层
串口使用中断方式实现。但是你的代码在初始化中将中断标志TI和RI都提前写了1,将导致串口没有实际动作,但是处于中断产生状态。
且TI和RI是写0清0,中断标志得不到有效清除,也就不存在正常运行程序的可能性了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

57

帖子

0

粉丝