fzwdvune 发表于 2026-2-7 14:33:11

STC8H8K64U在掉电模式下串口接收数据不正确

在掉电模式下,测试把接收数据进行回传,少了一个字节,而且数据不对。系统设置频率为24Mhz


图1是波特率在100000下的测试,图二是9600波特率下的,在100000下波特率接收的数据完全不对,9600下还有时候数据是正确的,但是大部分都是异常数据,在4800波特率下会好一点,发几次可以收到一帧正常数据


void Uart1_Init(void)      //200000bps@24.000MHz
{
      
      fifo_register(&Tx_fifo, Tx_Buf, TX_FIFO_BUFF_SIZE, fifo_lock, fifo_unlock);
      fifo_register(&Rx_fifo, Rx_Buf, RX_FIFO_BUFF_SIZE, fifo_lock, fifo_unlock);
      SCON = 0x50;                //8位数据,可变波特率
      AUXR |= 0x40;                //定时器时钟1T模式
      AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
      TMOD &= 0x0F;                //设置定时器模式
      //200000
//      TL1 = 0xE2;                        //设置定时初始值
//      TH1 = 0xFF;                        //设置定时初始值
      
      //100000
      // TL1 = 0xC4;                        //设置定时初始值
      // TH1 = 0xFF;                        //设置定时初始值
      
      // 9600
      TL1 = 0x8F;                        //设置定时初始值
      TH1 = 0xFD;                        //设置定时初始值

      ET1 = 0;                        //禁止定时器中断
      TR1 = 1;                        //定时器1开始计时
      ES = 1;                              //使能串口1中断
}


volatile uint8_t Sleep_Rx = {0};
void Uart1_Isr(void) interrupt 4
{
      uint8_t data TxData;
      uint8_t data RxData;
      static uint8_t Rx_count = 0;

      if (TI)                              //检测串口1发送中断
      {
                TI = 0;                        //清除串口1发送中断请求位
                if (fifo_read(&Tx_fifo, &TxData, 1))
                {
                        SBUF = TxData;
                }else{
                        // Busy = 0;
                        uart1_actrive = 0;
                }
      }
      if (RI)                              //检测串口1接收中断
      {
                RI = 0;                        //清除串口1接收中断请求位
                RxData = SBUF;
                if (g_sys.state == SYS_OFF){
                        Sleep_Rx= RxData;
                        if(Rx_count > 4)
                        {
                              g_run.Rx_Wake_Up_Flag = 1;
                              Rx_count = 0;
                        }
                        Uart1_SendByte(RxData);
                }else{
                        fifo_write(&Rx_fifo, &RxData, 1);
                }
      }
}


if ((g_sys.state == SYS_OFF) && status == 1)      
    {

      if (g_run.Rx_Wake_Up_Flag)
      {
            if(Sleep_Rx == 0XAB && Sleep_Rx == 0xCD)
            {
                Analysis(Sleep_Rx, (uint16_t)Sleep_Rx << 8 | Sleep_Rx);
               
            }else
            {
                Delay_ms(5);
            }
            g_run.Rx_Wake_Up_Flag = 0;
      }else if ((!fifo_get_occupy_size(&Tx_fifo)) && (!g_run.Rx_Wake_Up_Flag) && (!uart1_actrive))
      {
            Delay_ms(1);
            MCU_Sleep();
      }else if (g_sys.state == SYS_ON && status == 1)
    {
      status = 0;
      Power_On();
    }







ercircle 发表于 2026-2-7 16:40:10

没看到在哪进出掉电模式

现成的例程可参考:

https://www.stcaimcu.com/forum.php?mod=redirect&goto=findpost&ptid=11499&pid=116488
页: [1]
查看完整版本: STC8H8K64U在掉电模式下串口接收数据不正确