求救!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)
{
}
}
P33上升沿中断入口改为:
void P3INT_ISR(void) interrupt 40 ///依旧无法进入中断
void common_isr() interrupt 13 ///也是不行
<p>IO口中断需要软件清零吧</p>
C_wolf 发表于 2025-3-1 00:17
IO口中断需要软件清零吧
是的,需要清除中断标志位,我做了,只是在这里没体现出来,关键是一次也没有进入过。INT0 都进入不了 <p>参考下这个吧</p>
<p>STC32G-使用外中断和一个I/O读取正交编码器-7段虚拟数码管显示<br />
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=2291<br />
(出处: 国芯技术交流网站)</p>
使用中断查询方式也检测不到有中断标志置位,说明不论INT0还是P33外部中断就没开启。不知道哪里原因。
while (1)
{
LEDdisplay();//////显示程序
if(P3INTF == 0x08)
{
P52 = 1;
P51 = 0;
P3INTF = 0x00; ///清除P33端口中断标志
}
if(IE0)
{
P52 = 0;
P51 = 1;
IE0 = 0;
}
}
}
C_wolf 发表于 2025-3-1 00:41
参考下这个吧
STC32G-使用外中断和一个I/O读取正交编码器-7段虚拟数码管显示
https://www.stcaimcu.com/for ...
感谢您的帮助,我现在 在外部中断初始化时加入了对中断标志位的清零,没有作用。INT0依旧无法相应。 经过测试,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;
}
*/
}
}
所有普通I/O口都支持的外部中断演示程序,8H系列、32G系列, 中断号37~44 - I/O读写及点灯,外部中断 ,所有I/O都支持的普通I/O中断,按键扫描 国芯技术交流网站 - AI32位8051交流社区
深圳国芯人工智能有限公司-工具软件
页:
[1]