找回密码
 立即注册
查看: 47|回复: 4

代码写错了还能运行正常,百思不得其解!

[复制链接]
  • 打卡等级:常住居民I
  • 打卡总天数:64
  • 最近打卡:2025-07-06 11:09:38
已绑定手机

10

主题

32

回帖

364

积分

中级会员

积分
364
发表于 4 天前 | 显示全部楼层 |阅读模式
我用STC8H8K64U设计了一个电路,按照官方手册上的介绍,P32口接了一个按钮了到地,用来实现USB-ISP下载。在主程序里,检测P32

口按钮的下降沿来触发中断,在中断服务程序里完成一个特定功能。之前由于大意,误将P32口的中断当作了外部中断1(即INT1),
中断服务程序也是按中断号2来写的,(事实上P32口是INT0,中断号0)。虽然代码写错了,但是程序执行后,按P32口按键,仍然能够执行中断服务程序里的功能。
就是说尽管代码写错了,但是仍然能够正确执行,这就让我百思不得其解了!
后来我把代码修正,把P32口的按键改成INT0中断,程序也能执行。
有谁能解释这个原因吗?

截图202507022240055911.jpg
截图202507022258327296.jpg
回复

使用道具 举报 送花

3

主题

450

回帖

-389

积分

等待验证会员

积分
-389
发表于 4 天前 | 显示全部楼层
您提到的现象确实令人疑惑,但其背后可能涉及STC8H8K64U单片机的中断系统配置机制以及代码中某些寄存器的默认状态。以下是对该现象的专业解释:

首先,STC8H8K64U是一款基于增强型8051内核的单片机,支持多个外部中断源。其中,P32口对应的中断是INT0(外部中断0),而INT1对应的是P31口。根据官方手册,INT0的中断服务程序入口地址为0x0003,INT1的入口地址为0x0013。

在您的代码中,误将P32口的中断配置为INT1,并编写了中断号2的服务程序。然而,程序运行后仍能响应按键并执行中断服务程序,这看似矛盾的现象,实际上可能是由于以下几个原因造成的:

1. 中断向量表覆盖:  
   在8051架构中,中断服务程序的入口地址由中断向量表决定。如果未正确设置中断使能寄存器(如EA、EX0、EX1等),或中断服务程序的入口地址未被正确跳转,可能导致程序意外进入某个预定义的地址,从而“误触发”中断处理逻辑。若您在代码中未对中断向量进行明确跳转,系统可能会从默认的中断入口地址开始执行,导致看似“错误”的中断服务程序被调用。

2. 中断标志位未清除:  
   如果在代码中未正确清除中断标志位(如IE0或IE1),可能会导致中断被重复触发。即使中断源与实际配置不符,只要中断标志位被置位,且中断使能被打开,系统仍可能进入中断服务程序。

3. 寄存器默认值影响:  
   STC8H8K64U在复位后,部分寄存器会保留默认值。例如,若未对中断控制寄存器(如IT0、IT1)进行初始化,系统可能默认采用低电平触发方式,这可能导致在按键按下时产生中断请求。此外,若中断使能寄存器(如EA、EX0、EX1)未被正确关闭,也可能导致程序意外进入中断服务程序。

4. 代码结构与编译器行为:  
   编译器在生成代码时,可能会对中断服务程序进行优化或重定位。如果您在代码中使用了#pragma vector指令或其他编译器特定的语法来指定中断服务程序的入口地址,但未正确配置,也可能导致程序“误入”其他中断服务程序。

综上所述,尽管您在代码中将P32口的中断误配置为INT1,但由于中断向量表、中断标志位、寄存器默认值或编译器行为等因素的影响,程序仍可能在按键按下时进入中断服务程序。建议您在调试过程中,通过查看中断标志位、检查中断使能状态、确认中断向量表配置等方式,进一步验证中断触发的准确性。

如需更深入分析,可提供具体的代码片段和寄存器配置情况,以便进一步排查问题根源。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:228
  • 最近打卡:2025-07-06 12:24:07
已绑定手机

74

主题

2089

回帖

4654

积分

荣誉版主

无情的代码机器

积分
4654
发表于 4 天前 | 显示全部楼层
P32 / P33 短路 焊锡连一起了?上传完整代码与电路原理图
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:64
  • 最近打卡:2025-07-06 11:09:38
已绑定手机

10

主题

32

回帖

364

积分

中级会员

积分
364
发表于 4 天前 | 显示全部楼层
检查了,P32与P33没有短路。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:488
  • 最近打卡:2025-07-06 06:41:04
已绑定手机

81

主题

5293

回帖

9499

积分

超级版主

DebugLab

积分
9499
发表于 4 天前 | 显示全部楼层
打开中断但没有中断函数会出现不可预知的错误
包括但不限于:程序无任何异常、程序跳转异常、部分功能异常、跑飞、死机、复位
具体分析可以看机器码,根据中断向量位置的指令分析
如图所示,红色是INT0(0003H,如有中断函数)的LJMP(02H)
蓝色是INT1(0013H,如有中断函数)的LJMP(02H)
如果中间绿色部分不影响程序跳转,比如都是00H(NOP),就可以正确执行到INT1(0013H)的LJMP(02H)
截图202507022348547494.jpg
截图202507022352595487.jpg
新手必读:
https://www.stcaimcu.com/thread-16535-1-1.html
各种中断问题:
打开的中断必须要有中断函数,哪怕是空的也行,否则硬件产生中断后,PC LJMP到中断向量处,无中断程序也无RETI,程序直接跑飞,导致不可预知的问题
中断频率不能过高,也不能在中断函数内执行耗时操作
如中断函数执行时间占比大于100%,中断还没退出就再次请求中断,就会卡在中断里一直循环出不来,主程序和优先级更低或查询次序靠后的中断会被阻塞
注意中断重入和互锁问题,此类逻辑错误可能导致各种异常

相关指令:
截图202507030006385232.jpg

截图202507030007241383.jpg

截图202507030008025345.jpg

截图202507030008159231.jpg


DebugLab
回复 支持 1 反对 0

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-7-6 18:07 , Processed in 0.126955 second(s), 78 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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