进入休眠配置部分:
CANCON = 0x20;//禁止/休眠模式
while(CANSTATbits.OPMODE !=0x01);
CAN_SetMode(CAN_MODE_STANDBY);//CAN收发器进入待机模式
OSCCONbits.IDLEN = 0;//配置休眠模式
Sleep();//进入休眠模式
App_System_Init();
CAN总线唤醒配置部分:
RXB0CON = 0x20;//只接收有效的标准标识符信息
/* 初始化CAN的中断,PIR5为CAN的外围中断标志寄存器 */
PIR5=0X00; // 清所有CAN中断标志
PIE5bits.RXB0IE = 1; //使能接收缓冲器0的接收中断
PIE5bits.WAKIE = 1; //允许CAN总线活动唤醒中断
IPR5bits.RXB0IP = 1; // 接收缓冲器0的接收中断为高优先级
IPR5bits.WAKIP = 1; //CAN总线活动唤醒中断为高优先级
CAN_SetMode(CAN_MODE_NORMAL);//CAN收发器设置为正常模式
CAN中断服务程序:
void interrupt high_priority High_ISR(void)
{
if(PIR5bits.WAKIF==1)//CAN总线活动唤醒中断
{
PIR5bits.WAKIF = 0;
}
if(PIR5bits.RXB0IF==1)//接收缓冲区0接收到报文
{
PIR5bits.RXB0IF=0; // 清接收中断标志
ECAN_Receive(&g_tCanRxMsg);
//........
}
}
疑问1、如果CAN总线活动可以唤醒中断是先进入中断,然后执行Sleep后面的程序吗?疑问2、之所以不能唤醒是不是因为当OSCCONbits.IDEN = 0,CPU及外设全部关闭,所有时钟被禁止导致不能被唤醒?如下图
|