- 打卡等级:初来乍到
- 打卡总天数:2
- 最近打卡:2025-12-08 08:01:21
已绑定手机
新手上路
- 积分
- 8
|
在睡眠模式下,外部中断可以恢复,
使用串口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);
}
}
|
|