找回密码
 立即注册
查看: 274|回复: 8

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-03-26 22:26:53
已绑定手机

1

主题

5

回帖

33

积分

新手上路

积分
33
发表于 2025-2-28 23:29:24 | 显示全部楼层 |阅读模式
我使用的是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)
     {
     }
}







中断.PNG

13分钟后迟来的中断响应

13分钟后迟来的中断响应
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-03-26 22:26:53
已绑定手机

1

主题

5

回帖

33

积分

新手上路

积分
33
发表于 2025-3-1 00:11:50 | 显示全部楼层
P33上升沿中断入口改为:
void        P3INT_ISR(void) interrupt 40    ///依旧无法进入中断

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

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:194
  • 最近打卡:2025-05-02 01:39:20
已绑定手机

5

主题

39

回帖

788

积分

高级会员

积分
788
发表于 2025-3-1 00:17:28 | 显示全部楼层

IO口中断需要软件清零吧

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-03-26 22:26:53
已绑定手机

1

主题

5

回帖

33

积分

新手上路

积分
33
发表于 2025-3-1 00:22:01 | 显示全部楼层
C_w*** 发表于 2025-3-1 00:17
IO口中断需要软件清零吧

是的,需要清除中断标志位,我做了,只是在这里没体现出来,关键是一次也没有进入过。INT0 都进入不了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:194
  • 最近打卡:2025-05-02 01:39:20
已绑定手机

5

主题

39

回帖

788

积分

高级会员

积分
788
发表于 2025-3-1 00:41:16 | 显示全部楼层

参考下这个吧

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

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-03-26 22:26:53
已绑定手机

1

主题

5

回帖

33

积分

新手上路

积分
33
发表于 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;
                }
        }
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-03-26 22:26:53
已绑定手机

1

主题

5

回帖

33

积分

新手上路

积分
33
发表于 2025-3-1 01:00:43 | 显示全部楼层
C_w*** 发表于 2025-3-1 00:41
参考下这个吧
STC32G-使用外中断和一个I/O读取正交编码器-7段虚拟数码管显示
https://www.stcaimcu.com/for ...

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-03-26 22:26:53
已绑定手机

1

主题

5

回帖

33

积分

新手上路

积分
33
发表于 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;
                }
                */
        }
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2025-3-1 17:14:24 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 02:38 , Processed in 0.146653 second(s), 103 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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