现在我已经获取了完整的资料,可以回答这个问题了。
关于 STC8H4K64TLCD 芯片 INT0/INT1 能否只配置上升沿中断
您好!我是 STC 的 FAE 工程师,针对您的问题,回答如下:
传统外部中断 INT0/INT1 的触发方式
根据 STC8H 系列手册「中断系统」 章节的说明,INT0 和 INT1 的触发方式由 IT0/IT1 位(在 TCON 寄存器中)控制:
- IT0/IT1 = 0:上升沿和下降沿都触发中断(即电平触发方式,低电平有效)
- IT0/IT1 = 1:仅下降沿触发中断(边沿触发方式)
传统 INT0/INT1 的触发方式只有两种选择:"下降沿触发" 或 "低电平触发",不支持单独配置为上升沿触发。
解决方案:使用"所有 I/O 口均可中断"功能
不过,STC8H4K64TLCD 芯片支持 "所有 I/O 口均可中断" 功能(详见手册「所有的I/O口均可中断,不是传统外部中断」章节)。根据手册中的功能支持表格:
| 产品线 |
I/O中断 |
I/O中断优先级 |
I/O中断唤醒功能 |
| STC8H4K64TLCD系列 |
● |
4级 |
● |
●:有此功能,且功能正常
该功能支持 4 种独立的中断模式,通过 PxIM0 和 PxIM1 寄存器配置:
| PnIM1.x |
PnIM0.x |
Pn.x口中断模式 |
掉电唤醒支持 |
| 0 |
0 |
下降沿中断 |
支持 |
| 0 |
1 |
上升沿中断 |
支持 |
| 1 |
0 |
低电平中断 |
不支持 |
| 1 |
1 |
高电平中断 |
不支持 |
所以,如果您需要只配置上升沿中断,可以使用 I/O 口中断功能,将对应引脚(如 P3.2/INT0 或 P3.3/INT1 所在的引脚)配置为上升沿中断模式。
示例代码(使用 I/O 口中断实现上升沿触发)
// 测试工作频率为11.0592MHz
#include "stc8h.h"
#include "intrins.h"
void main()
{
P_SW2 |= 0x80; // 使能访问XFR
// 设置所有I/O口为准双向口
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
// 以P3.2(INT0引脚)为例,配置为上升沿中断
P3IM0 |= 0x04; // P3.2 IM0 = 1
P3IM1 &= ~0x04; // P3.2 IM1 = 0 → 上升沿中断
P3INTE |= 0x04; // 使能P3.2口中断
EA = 1; // 开总中断
while (1);
}
// 由于中断向量大于31,需借用第13号中断入口地址
// 同时需要在项目中添加ISR.ASM文件(见手册范例)
void common_isr() interrupt 13
{
unsigned char intf;
intf = P3INTF;
if(intf)
{
P3INTF = 0x00; // 清中断标志
if(intf & 0x04) // P3.2中断
{
// 上升沿触发,在此处添加您的处理代码
}
}
}
注意:由于 I/O 口中断的中断向量大于 31,Keil C51 默认不支持。您需要:
- 使用手册中提供的 ISR.ASM 跳转文件(将中断入口跳转到 13 号中断)
- 或者使用 Keil 中断向量拓展插件(运行"拓展Keil的C代码中断号.exe")
总结
| 方式 |
是否支持仅上升沿 |
说明 |
| 传统 INT0/INT1(TCON 寄存器控制) |
❌ 不支持 |
仅支持下降沿或低电平 |
| I/O 口中断功能(PxIM0/PxIM1 寄存器控制) |
✅支持 |
可独立配置为上升沿中断 |
建议方案:使用 I/O 口中断功能,将 INT0/INT1 对应的引脚(P3.2/P3.3)配置为上升沿中断模式,即可实现您需要的功能。
信息来源:STC8H 系列手册「中断系统」章节及「所有的I/O口均可中断,不是传统外部中断」章节。
🔍 搜索 "https://www.stcaimcu.com/thread-25041-1-1.html"
⏱️ 查找用时 9.8s | 总回答用时 22.9s