mppqgqha 发表于 2026-5-19 17:44:43

IO口中断

void Port2_ISR_Handler(void) interrupt 0
{
        P2INTF = 0x00;// 中断标志位清零
        Sleep_Flag = 0;
        //port2_Flag = 1;
}

void PortInt_Init(void)
{
        P2INTE = 0x30;                        //使能P2口中断使能位
        P2IM0 = 0x00;                        //设置P2口中断模式 (00:下降沿, 01:上升沿)
        P2IM1 = 0x00;                        //设置P2口中断模式 (10:低电平, 11:高电平)
        P2WKUE = 0x30;                        //设置P2口中断唤醒省电模式
}

P2.4 P2.5这两个IO口中断由于中断号大于31于是我将其跳转到外部中断0ISR文件如下


      CSEG    AT0123H         ;RTC_ISR
      JMP   RTC_ISR
      CSEG    AT012BH         ;P0INT_VECTOR
      JMP   P0INT_ISR
      CSEG    AT0133H         ;P1INT_VECTOR
      JMP   P1INT_ISR
      CSEG    AT013BH         ;P2INT_VECTOR
      JMP   P2INT_ISR
      CSEG    AT0143H         ;P3INT_VECTOR
      JMP   P3INT_ISR
      CSEG    AT014BH         ;P4INT_VECTOR
      JMP   P4INT_ISR
      CSEG    AT0153H         ;P5INT_VECTOR
      JMP   P5INT_ISR
      CSEG    AT015BH         ;P6INT_VECTOR
      JMP   P6INT_ISR
      CSEG    AT0163H         ;P7INT_VECTOR
      JMP   P7INT_ISR
      CSEG    AT016BH         ;P8INT_VECTOR
      JMP   P8INT_ISR
      CSEG    AT0173H         ;P9INT_VECTOR
      JMP   P9INT_ISR
      CSEG    AT017BH         ;M2MDMA_VECTOR
      JMP   M2MDMA_ISR
      CSEG    AT0183H         ;ADCDMA_VECTOR
      JMP   ADCDMA_ISR
      CSEG    AT018BH         ;SPIDMA_VECTOR
      JMP   SPIDMA_ISR
      CSEG    AT0193H         ;U1TXDMA_VECTOR
      JMP   U1TXDMA_ISR
      CSEG    AT019BH         ;U1RXDMA_VECTOR
      JMP   U1RXDMA_ISR
      CSEG    AT01A3H         ;U2TXDMA_VECTOR
      JMP   U2TXDMA_ISR
      CSEG    AT01ABH         ;U2RXDMA_VECTOR
      JMP   U2RXDMA_ISR
      CSEG    AT01B3H         ;U3TXDMA_VECTOR
      JMP   U3TXDMA_ISR
      CSEG    AT01BBH         ;U3RXDMA_VECTOR
      JMP   U3RXDMA_ISR
      CSEG    AT01C3H         ;U4TXDMA_VECTOR
      JMP   U4TXDMA_ISR
      CSEG    AT01CBH         ;U4RXDMA_VECTOR
      JMP   U4RXDMA_ISR
      CSEG    AT01D3H         ;LCMDMA_VECTOR
      JMP   LCMDMA_ISR
      CSEG    AT01DBH         ;LCMIF_VECTOR
      JMP   LCMIF_ISR
      CSEG    AT021BH         ;TIMER11_VECTOR
      JMP   TIMER11_ISR

RTC_ISR:
P0INT_ISR:
P1INT_ISR:
P2INT_ISR:JMP        0003H
P3INT_ISR:
P4INT_ISR:
P5INT_ISR:
P6INT_ISR:
P7INT_ISR:
P8INT_ISR:
P9INT_ISR:
M2MDMA_ISR:
ADCDMA_ISR:
SPIDMA_ISR:
U1TXDMA_ISR:
U1RXDMA_ISR:
U2TXDMA_ISR:
U2RXDMA_ISR:
U3TXDMA_ISR:
U3RXDMA_ISR:
U4TXDMA_ISR:
U4RXDMA_ISR:
LCMDMA_ISR:
LCMIF_ISR:
TIMER11_ISR:
      JMP   006BH
      END

无论P2INT_ISR:后面加不加JMP        0003H都可以触发中断这是为什么呢

乘风飞扬 发表于 2026-5-20 09:20:54

发可以复现问题的最简测试项目出来,个别代码不一定能看到问题点。

mppqgqha 发表于 2026-5-20 10:02:32

乘风飞扬 发表于 2026-5-20 09:20
发可以复现问题的最简测试项目出来,个别代码不一定能看到问题点。



进入掉电模式,然后使用IO口中断唤醒 中断号跳转到0   在isr文件中没有做任何修改也可以中断唤醒做了修改也能唤醒 这是为什么

乘风飞扬 发表于 2026-5-20 11:57:09

如果P2INT_ISR:后面加不加JMP      0003H
产生中断是不会进入Port2_ISR_Handler 中断函数,你可以在中断函数里面翻转一个IO口,通过测量IO口信号就能验证。
产生中断时会跳转到006BH地址运行,这个位置没有写对应的中断函数的话,程序就跑飞了。

mppqgqha 发表于 2026-5-20 14:12:29

乘风飞扬 发表于 2026-5-20 11:57
如果P2INT_ISR:后面加不加JMP      0003H
产生中断是不会进入Port2_ISR_Handler 中断函数,你可以在中断 ...


这里写了个13号的中断函数,是DMA_ADC,   可是里面没有写关于P2端口中断的代码,连标志位都没有清除还是能正常唤醒工作


乘风飞扬 发表于 2026-5-20 18:27:00

只要使能了P2口唤醒功能,就能通过它进行唤醒。
映射地址错误只是产生中断后进入错误的中断函数,没有清中断标志会导致不断的产生中断。
你可以在中断函数里面加个IO口翻转,用示波器测测看。不断产生中断会占用大量CPU资源,会导致主循环执行速度变慢。
页: [1]
查看完整版本: IO口中断