紫气东来 发表于 2025-2-28 23:29:24

求救!8H4K64TL无法进入外部中断问题

我使用的是8H4K64TL-45I-QFN48这个芯片,使用内部时钟,频率为:33.1776MHz。无法进入外部中断,请求大佬帮忙看看哪里存在问题。
期初还以为片子的问题,换了还是一样。
使用逻辑分析仪监控,发现在有信号触发后的800多秒,也就是13分钟后相应了,并且不变。不在相应。。又不行了
程序目的:使用P33 I/O口作为上升沿中断输入,P32作为INT0下降沿中断输入端口,两个端口设置为高阻输入,硬件用两个100欧姆电阻串联短接,两电阻中间接入触发信号。

keil C51软件安装有《拓展Keil的C代码中断号.exe》的补丁
程序如下:

#include <stc8h.h>
#include <intrins.h>
#include <string.h>

void P3_isr() interrupt P3INT_VECTOR
{
   P51 = 1;
   P52 = 0;
   P3INTF = 0x00;      ///清除P33端口中断标志
}
void INT0_Isr() interrupt 0
{
   P52 = 1;
   P51 = 0;
}
void main()
{
      P_SW2 |= 0x80; //使能访问 XFR,没有冲突不用关闭



    P3M0 = 0xa2;   //设置P30、P31为准双向口;设置P36为高阻输入P37为推挽输出,串口通信引脚;P35为:推挽输出,其他为高阻输入   蓝牙芯片复位引脚,低电平有效
    P3M1 = 0x5d;

   P3PU = 0x41;   //P30、P36设定内部上拉电阻



   P5M0 = 0x07;//设置P50,P51,P52为推挽输出,RGB_LED驱动,其他为高阻输入
   P5M1 = 0xF8;
   P5 = 0;


////...........此处忽略不相干程序////

      IP = 0x0B;      //设定外部中断0中断优先级最高3,定时器0中断优先级较低1,定时器1中断优先级最高3,串口1中断优先级较高2,ADC中断优先级最低0,
      IPH = 0x19;
      PINIPL = 0x08;    //设置P3口中断优先级为最高
      PINIPH = 0x08;
      P3IM1 = 0x00;      //配置P3口为上升沿中断
      P3IM0 = 0x08;
      P3INTE = 0x08;    //使能P33中断
      IT0 = 1;                                    //使能INT0下降沿中断
       EX0 = 1;                                    //使能INT0中断
       EA = 1;
      while (1)
   {
   }
}







紫气东来 发表于 2025-3-1 00:11:50

P33上升沿中断入口改为:
void      P3INT_ISR(void) interrupt 40    ///依旧无法进入中断

void common_isr() interrupt 13   ///也是不行

C_wolf 发表于 2025-3-1 00:17:28

<p>IO口中断需要软件清零吧</p>

紫气东来 发表于 2025-3-1 00:22:01

C_wolf 发表于 2025-3-1 00:17
IO口中断需要软件清零吧
是的,需要清除中断标志位,我做了,只是在这里没体现出来,关键是一次也没有进入过。INT0 都进入不了

C_wolf 发表于 2025-3-1 00:41:16

<p>参考下这个吧</p>
<p>STC32G-使用外中断和一个I/O读取正交编码器-7段虚拟数码管显示<br />
https://www.stcaimcu.com/forum.php?mod=viewthread&amp;tid=2291<br />
(出处: 国芯技术交流网站)</p>

紫气东来 发表于 2025-3-1 00:45:31

   使用中断查询方式也检测不到有中断标志置位,说明不论INT0还是P33外部中断就没开启。不知道哪里原因。

   while (1)
      {
                LEDdisplay();//////显示程序
                if(P3INTF == 0x08)
                {
                        P52 = 1;
                        P51 = 0;
                        P3INTF = 0x00;      ///清除P33端口中断标志
                }
                if(IE0)
                {
                        P52 = 0;
                        P51 = 1;
                        IE0 = 0;
                }
      }
}

紫气东来 发表于 2025-3-1 01:00:43

C_wolf 发表于 2025-3-1 00:41
参考下这个吧
STC32G-使用外中断和一个I/O读取正交编码器-7段虚拟数码管显示
https://www.stcaimcu.com/for ...

感谢您的帮助,我现在 在外部中断初始化时加入了对中断标志位的清零,没有作用。INT0依旧无法相应。

紫气东来 发表于 2025-3-1 11:44:16

经过测试,P33 I/O口外部中断只要使能,INT0外部中断也会一起不起作用,
我下面程序,把P33 I/O口外部中断使能语句屏蔽掉,INT0就可以用了。
哪位大哥给帮忙看看是哪里的问题,在这里先说声谢谢!!万分感谢
#include <stc8h.h>
#include <intrins.h>
#include <string.h>



sfr         LED         =         0xc8;
sbit      B_LED         =         P5^0;
sbit      G_LED         =         P5^1;
sbit      R_LED         =         P5^2;

///**************端口初始化程序***********************////////
void IO_init(void)
{
                P_SW2 |= 0x80; //使能访问 XFR,没有冲突不用关闭
      
                P0M0 = 0x00;//设置P0为高阻输入,
                P0M1 = 0xFF;
                P0IE = 0xfd; //关闭P01数字输入,设PO1为AD1电池电量检测输入端


      
                P1M0 = 0x00; //设置P16、P17为准双向口,其他为高阻输入
                P1M1 = 0x3f;
                P1IE = 0x3f; //关闭P16、P17数字输入,作为晶振输入输出端

                P2M0 = 0x01;   //设置P20为推挽输出,其他为高阻输入   蓝牙恢复出厂设置引脚,低电平有效
                P2M1 = 0xfe;
      P2 = 0x01;

                P3M0 = 0xa2;   //设置P30、P31为准双向口;设置P36为高阻输入P37为推挽输出,串口通信引脚;P35为:推挽输出,其他为高阻输入   蓝牙芯片复位引脚,低电平有效
    P3M1 = 0x5d;

                P3PU = 0x41;   //P30、P36设定内部上拉电阻
                P3NCS = 0xFF;
                P3IE = 0xff;
      P35 = 1;
                P_SW1 = (P_SW1 & ~0xc0) | 0x40;                //UART1/USART1: RxD(P3.6), TxD(P3.7)
      //P3 = 0x00;//串口不能赋值,否则会导致通信失败。
                P4M0 = 0xb4;//设置P44开楼输出蓝牙低功耗控制引脚,低电平有效,蓝牙芯片内置上拉电阻、P42、P45、P47为推挽输出,其他为高阻输入流控:准备好接收数据:低电平有效
                P4M1 = 0x5b;
      P4 = 0x30; //P44、P45为输出高电平
      
      ///P41:流控:查询是否可以发送数据:低电平有效; P43:连接状态指示:高电平为连接成功; P45:12V      电压源控制端,高电平有效。P47为电池电压检测开关,高电平有效。

               
                P5M0 = 0x07;//设置P50,P51,P52为推挽输出,RGB_LED驱动,其他为高阻输入
                P5M1 = 0xF8;
      P5 = 0;

}


void common_isr() interrupt 13
{
   P52 = 0;
   P51 = 1;
   P3INTF = 0x00;      ///清除P33端口中断标志
}
void INT0_Isr() interrupt 0
{
   P52 = 1;
   P51 = 0;
}
void main()
{
      P_SW2 |= 0x80; //使能访问 XFR,没有冲突不用关闭
      IO_init();


    P3M0 = 0xa2;   //设置P30、P31为准双向口;设置P36为高阻输入P37为推挽输出,串口通信引脚;P35为:推挽输出,其他为高阻输入   蓝牙芯片复位引脚,低电平有效
    P3M1 = 0x5d;

   P3PU = 0x41;   //P30、P36设定内部上拉电阻



   P5M0 = 0x07;//设置P50,P51,P52为推挽输出,RGB_LED驱动,其他为高阻输入
   P5M1 = 0xF8;
   P5 = 0;


////...........此处忽略不相干程序////

                IP = 0x0B;      //设定外部中断0中断优先级最高3,定时器0中断优先级较低1,定时器1中断优先级最高3,串口1中断优先级较高2,ADC中断优先级最低0,
                IPH = 0x19;
                PINIPL = 0x08;    //设置P3口中断优先级为最高
                PINIPH = 0x08;
//*
                P3IM1 = 0x00;      //配置P3口为上升沿中断
                P3IM0 = 0x08;
      //      P3INTE = 0x08;    //使能P33中断
//*/
                IT0 = 1;                                    //使能INT0下降沿中断
         EX0 = 1;                                    //使能INT0中断
         EA = 1;
      while (1)
      {
                /*
                         if(P33)
                {
                        P52 = 0;
                        P51 = 1;
                }
                */
                /*
                if(P32)
                {
                        P52 = 1;
                        P51 = 0;
                }
                */
      }
}

神农鼎 发表于 2025-3-1 17:14:24



所有普通I/O口都支持的外部中断演示程序,8H系列、32G系列, 中断号37~44 - I/O读写及点灯,外部中断 ,所有I/O都支持的普通I/O中断,按键扫描 国芯技术交流网站 - AI32位8051交流社区


深圳国芯人工智能有限公司-工具软件
页: [1]
查看完整版本: 求救!8H4K64TL无法进入外部中断问题