stonychi 发表于 2024-11-14 17:00:04

求解 Ai32g8k64 uart2 只有加上 TMOD=0x01; uart2就無法使用, 收發均不能用

本帖最后由 DebugLab 于 2024-11-14 17:04 编辑

各位大老, 求解或問題所在


你好, 我有一個問題, 一直沒法解決
原本使用
Ai8g2k64s4和 Ai8h8k64
和式一直很正常

最近改用stc32g8k64
大部份問題都解決
但有個問題 uart2,一直解決不了
我把程序簡化到最簡單
發現   uart2 正常

但只要一加上
TMOD=0x01;

uart2   就無法收法正常







#include "stc32g.h"

sbit RS_485_2   = P4^1;

//===============================================================
//GLOBAL VARIABLE
//===============================================================
bit bU0TX_2 = 0;


    //------------------------------------------------------------------------
//UART222.11849600USE TIME21T
//------------------------------------------------------------------------

void Uart2_Init(void)    //9600bps@22.1184MHz
{
    S2CON = 0x50;      //8 bits and variable baudrate
    AUXR |= 0x04;      //imer clock is 1T mode
    T2L = 0xC0;            //Initial timer value
    T2H = 0xFD;            //Initial timer value
    AUXR |= 0x10;      //Timer2 start run
}

void UART2_Isr() interrupt 8
{

      // UART2TI
    if (S2CON & 0x02)
    {
      S2CON &= ~0x02;
      bU0TX_2    = 0;
    }

      // UART2 RI
    if (S2CON & 0x01)
    {
      S2CON &= ~0x01;

    }
}   


void PutByte2(unsigned char n_temp0)
{   
    bU0TX_2    = 1;
    S2BUF    = n_temp0;
    while(bU0TX_2)
    {
      ;
    }
}




void IO_init(void)
{
P0M0 = 0X00;P0M1 = 0X00;
P1M0 = 0X00;P1M1 = 0X00;
P2M0 = 0X00;P2M1 = 0X00;
P3M0 = 0X00;P3M1 = 0X00;
P4M0 = 0X00;P4M1 = 0X00;
P5M0 = 0X00;P5M1 = 0X00;
P6M0 = 0X00;P6M1 = 0X00;
P7M0 = 0X00;P7M1 = 0X00;   
}






void main()
{

//    STC32G8K64

    WTST = 0;          //設置程式指令延時參數,賦值為0可將CPU執行指令的速度設置為最快
    EAXFR = 1;         //擴展寄存器(XFR)訪問使能/
    CKCON = 0;         //提高訪問XRAM速度   

    IO_init();


    Uart2_Init();
ES2=1;


    // 只要加上行,因為我有程序, 需要要到TIME 的 模式一, 但一加上這行,UART2收發就都不正常
    // 我試了快2週, 還是解決不了
    //-----------------------------
    TMOD=0x10;
    //-----------------------------


EA   = 1;


    RS_485_2=1;
    PutByte2('2');
    PutByte2('2');   
    PutByte2('2');
    RS_485_2=0;


while(1)
{

}

}


stonychi 发表于 2024-11-14 17:01:33

本帖最后由 stonychi 于 2024-11-14 17:03 编辑

不加上TMOD=0x01;

送電會送出   9600, n, 8,1
222
三個2

但一加上TMOD=0x01;
uart2就不能通訊

一直試了二週, 程序已簡化
懹疑是不是蕊片 bug




DebugLab 发表于 2024-11-14 17:17:34


描述前后不符:




0x01是定时器0,0x10是定时器1,不知道你要用哪个定时器
建议使用TMOD|=0x01或TMOD|=0x10,避免影响其他位
没有看到其他配置定时器的语句
如打开定时器0或定时器1中断,必须有相应的中断函数

stonychi 发表于 2024-11-14 17:21:31

本帖最后由 stonychi 于 2024-11-14 17:49 编辑

不好意思,   上面   TMOD=0x10 , 才對

DebugLab 发表于 2024-11-14 17:46:35

stonychi 发表于 2024-11-14 17:21
不好意思,   上面   TMOD=0x10 , 才對




TMOD不应该影响作为波特率发生器的T2

stonychi 发表于 2024-11-14 17:58:39

本帖最后由 stonychi 于 2024-11-14 18:00 编辑

DebugLab 发表于 2024-11-14 17:46
TMOD不应该影响作为波特率发生器的T2
我 uart2便用time2
但只要   time1 便用mode 1, uart 就不能用

我使用    stc8g2k64s4,stc8h8k64    程序都能正常

換上   stc32g8k64    和   stc32g8k64beta 版   都不正常



time0   模式一
time1   模式0
(不影响uart 2 完全正常)

      //-----------------------------
                TMOD|=0x01;
                TH0=0x80;
                TL0=0x80;
                TR0=1;
               
                TH1=0x80;
                TL1=0x80;
                TR1=1;               
      //-----------------------------      



//-----------------------------------------------
//    下方uart2只接不能用
//-----------------------------------------------
time0   模式0
time1   模式1
(影响 ---- uart 2 不能用)
      //-----------------------------
                TMOD|=0x10;
                TH0=0x80;
                TL0=0x80;
                TR0=1;
               
                TH1=0x80;
                TL1=0x80;
                TR1=1;               
      //-----------------------------      
页: [1]
查看完整版本: 求解 Ai32g8k64 uart2 只有加上 TMOD=0x01; uart2就無法使用, 收發均不能用