找回密码
 立即注册
查看: 77|回复: 3

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-12-08 08:01:21
已绑定手机

0

主题

1

回帖

8

积分

新手上路

积分
8
发表于 2025-12-7 01:06:12 | 显示全部楼层 |阅读模式
在睡眠模式下,外部中断可以恢复,
使用串口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[FRAME_SIZE] = {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[Index++] = FRAME_HEAR;
                }
               
            }else
            {
                Frame[Index++] = Byte;
                if (Index == FRAME_SIZE)
                {
                    if (Frame[FRAME_SIZE - 1] == FRAME_TAIL)
                    {
                        // UART_SendArray(Frame,FRAME_SIZE);
                        Analysis(Frame[1], Frame[2]);
                        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);
        }
    }






截图202512070100284328.jpg
截图202512070103254702.jpg
截图202512070105414269.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:268
  • 最近打卡:2025-12-18 08:51:37

814

主题

1万

回帖

2万

积分

管理员

积分
21314
发表于 2025-12-7 10:56:35 | 显示全部楼层
截图202512071056227891.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:586
  • 最近打卡:2025-12-18 09:02:22
已绑定手机

49

主题

2369

回帖

8422

积分

论坛元老

积分
8422
发表于 2025-12-7 13:20:52 | 显示全部楼层
用附件例子试试

串口发指令休眠-串口唤醒.zip

8.64 KB, 下载次数: 5

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-12-08 08:01:21
已绑定手机

0

主题

1

回帖

8

积分

新手上路

积分
8
发表于 2025-12-7 17:41:57 | 显示全部楼层
我找到问题了,是我睡眠间隔时间太短了,串口来不及回复以及解析就继续睡眠了,现在睡眠电流可以到3.6ua左右
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-12-18 13:57 , Processed in 0.105556 second(s), 58 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表