fzwdvune 发表于 2025-12-7 01:06:12

在睡眠模式下,串口RX1唤醒不了

在睡眠模式下,外部中断可以恢复,
使用串口1接收中断没反应,感觉是完全没收到数据,
也有可能是逻辑方面有问题。
在睡眠状态写,在中断设置LED翻转,毫无反应。

串口中断处理函数void Uart1_Isr(void) interrupt 4
{
      uint8_t data TxData;
      uint8_t data RxData;
    if (TI) {
      TI = 0;
      if (fifo_read(&Tx_fifo, &TxData, 1))
      {
            SBUF = TxData;
      }else
      {
            Busy = 0;
      }
    }

    if (RI) {
      RI = 0;
      RxData = SBUF;
      LED_PIN = ~LED_PIN;
      if (sys_data.Power_Enable == 0)
      {
            sys_data.Rx_Wake_Up_Flag = 1;
      }
      {
            fifo_write(&Rx_fifo, &RxData, 1);
      }
    }
}
void Led_Power_Control(void)
{
    static uint8_t tick_10s = 0;
   
    if ((sys_data.Power_Enable == 1) && (last_state == 0)) // 开机
    {
      EA = 0;
      TR0 = 1;
      last_state = 1;
      Sys_Data_Save();
      IAP_CONTR |= 0x60;   //直接复位()


    }
    else if (sys_data.Power_Enable == 0 && last_state == 1)
    {
      
      Sys_Data_Save();
      EA = 0;
      TR0 = 0;            //关闭定时器
      ADC_CONTR &= ~0x80; // 关闭ADC模块
      
      sys_data.tick_1ms_flag = 0;
      tick.tick_10ms = 0;
      tick.tick_100ms = 0;
      tick.tick_1000ms = 0;


      
      last_state = 2;
      PWM_SetDuty(0, 0);


      PWM_SetDuty(2, 0);
      PWM_PIN1 = 0;
      PWM_PIN2 = 0;
      ES = 1;
      EX1 = 1; // 使能INT0中断,用于唤醒MCU
      EA = 1;


    }else if (sys_data.Power_Enable == 0 && last_state == 2)
    {
      tick_10s++;
            
      WKTCL = 71;
      WKTCH = 215;
      if (tick_10s >= 6)
      {
            if (sys_data.Delay_On_Time > 0)
            {
                sys_data.Delay_On_Time --;
                if (sys_data.Delay_On_Time == 0 )
                {
                  last_state = 0;
                  sys_data.Power_Enable = 1;
                  sys_data.Rx_Wake_Up_Flag = 0;
                }
            }
            tick_10s = 0;
      }


      if (sys_data.Delay_On_Time == 0 && sys_data.Rx_Wake_Up_Flag == 0)
      {
            WKTCH &= ~0x80;
            last_state = 0;
      }
      Sleep();
    }else if (sys_data.Power_Enable == 0 && last_state == 0)
    {
      if(sys_data.Rx_Wake_Up_Flag == 0)
      {
            Sleep();
      }      
    }
}
是串口数据处理函数


void Uart_RxTask(void)
{
    static uint8_t Index = 0;
    uint8_t Byte;
    uint8_t Frame = {0};
    static uint32_t Tick = 0;


    Tick ++;


    if (Tick >= 5 || sys_data.Rx_Wake_Up_Flag)
    {
      Tick = 0;


      if (sys_data.Power_Enable)sys_data.Rx_Wake_Up_Flag = 0;
      
      while ((fifo_get_occupy_size(&Rx_fifo) + Index) >= FRAME_SIZE)
      {
            fifo_read(&Rx_fifo, &Byte, 1);
            if (Index == 0)
            {
                if (Byte == FRAME_HEAR)
                {
                  Frame = FRAME_HEAR;
                }
               
            }else
            {
                Frame = Byte;
                if (Index == FRAME_SIZE)
                {
                  if (Frame == FRAME_TAIL)
                  {
                        // UART_SendArray(Frame,FRAME_SIZE);
                        Analysis(Frame, Frame);
                        sys_data.Rx_Wake_Up_Flag = 0;
                  }
                  Index = 0;
                }
               
            }
      }
    }
}




在进入睡眠后,只有长时间给串口发送信息,开有可能唤醒,即使单独设置LED翻转也没有反应。
if (RI) {
      RI = 0;
      RxData = SBUF;
      LED_PIN = ~LED_PIN;
      if (sys_data.Power_Enable == 0)
      {
            RxData = 0XAC;
            sys_data.Power_Enable = 1;
      }
      {
            fifo_write(&Rx_fifo, &RxData, 1);
      }
    }






神农鼎 发表于 2025-12-7 10:56:35


乘风飞扬 发表于 2025-12-7 13:20:52

用附件例子试试

fzwdvune 发表于 2025-12-7 17:41:57

我找到问题了,是我睡眠间隔时间太短了,串口来不及回复以及解析就继续睡眠了,现在睡眠电流可以到3.6ua左右
页: [1]
查看完整版本: 在睡眠模式下,串口RX1唤醒不了