好的!根据 STC8H 数据手册 第 25.10.8 节 的说明,单个 PWM 口不能同时检测上升沿和下降沿信号,但可以通过芯片内部的两路捕获模块(CC3 + CC4)同时捕获 PWM3P(P1.4)这一个管脚,其中 CC3 捕获上升沿,CC4 捕获下降沿,从而实现在一个引脚上同时响应上升沿和下降沿中断。
来源:STC8H-20260625.md 手册第 25 章「16位高级PWM定时器」- 25.10.8 节 及 25.9.1 节
原理说明
- P1.4 是 PWM3P 的默认引脚(PWMA_PS 的 C3PS[1:0]=00 时)
- CC3(捕获通道3)配置为输入模式,映射到 TI3FP3(即 PWM3P 管脚),捕获上升沿
- CC4(捕获通道4)配置为输入模式,映射到 TI3FP4(也是 PWM3P 管脚,内部同源),捕获下降沿
- 两个通道各自产生独立的中断标志(CC3IF / CC4IF),在中断服务函数中分别判断即可区分
参考手册 25.10.8 节表格说明:
"CC3+CC4组合可以同时仅捕获PWM3P管脚,也可以同时仅捕获PWM4P管脚"
完整 C 代码(适用于 STC8H1K28,测试频率 11.0592MHz)
// 测试工作频率为 11.0592MHz
#include "stc8h.h"
#include "intrins.h"
void main()
{
P_SW2 |= 0x80; // 使能访问 XFR 特殊寄存器
// 设置 I/O 口模式(根据实际硬件调整)
P1M0 = 0x00;
P1M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
// ====== CC3 捕获 PWM3P(P1.4) 上升沿 + CC4 捕获 PWM3P(P1.4) 下降沿 ======
PWMA_CCER2 = 0x00; // 关闭 CC3/CC4,之后才能修改 CCMR3/CCMR4 的 CCxS 位
PWMA_CCMR3 = 0x01; // CC3 为输入模式,映射到 TI3FP3(PWM3P 管脚)
PWMA_CCMR4 = 0x02; // CC4 为输入模式,映射到 TI3FP4(也是 PWM3P 管脚)
PWMA_CCER2 = 0x11; // 使能 CC3E(bit0)=1, CC4E(bit4)=1
PWMA_CCER2 |= 0x00; // CC3P(bit1)=0,CC3 捕获上升沿
PWMA_CCER2 |= 0x20; // CC4P(bit5)=1,CC4 捕获下降沿
PWMA_CR1 = 0x01; // 使能 PWMA 计数器
PWMA_IER = 0x18; // 使能 CC3IE(bit3)=1 和 CC4IE(bit4)=1
EA = 1; // 开启总中断
while (1);
}
// PWMA 中断服务函数,中断号 26
void PWMA_ISR() interrupt 26
{
if (PWMA_SR1 & 0x08) // CC3IF 标志,表示 P1.4 上升沿
{
PWMA_SR1 &= ~0x08; // 清除标志
// ===== 在这里添加上升沿的处理代码 =====
// 例如:P37 = ~P37; (翻转测试引脚)
}
if (PWMA_SR1 & 0x10) // CC4IF 标志,表示 P1.4 下降沿
{
PWMA_SR1 &= ~0x10; // 清除标志
// ===== 在这里添加下降沿的处理代码 =====
// 例如:P37 = ~P37; (翻转测试引脚)
}
}
关键寄存器速查
| 寄存器 |
设置值 |
说明 |
PWMA_CCMR3 |
0x01 |
CC3 为输入,映射到 TI3FP3(PWM3P) |
PWMA_CCMR4 |
0x02 |
CC4 为输入,映射到 TI3FP4(也是 PWM3P) |
PWMA_CCER2 |
0x11 |
使能 CC3E+CC4E |
PWMA_CCER2 |
0x20 |
CC4P=1(下降沿) |
PWMA_IER |
0x18 |
使能 CC3IE(bit3) + CC4IE(bit4) |
PWMA_SR1 |
0x08 / 0x10 |
CC3IF=上升沿标志 / CC4IF=下降沿标志 |
注意事项
- 只有固定配对才能实现"一个端口双沿中断":CC1+CC2、CC3+CC4、CC5+CC6、CC7+CC8 这四种组合。CC3+CC4 专门适配 PWM3P/PWM4P。
- 如果希望 PWM3P 切换到其他引脚(非 P1.4),可通过
PWMA_PS 寄存器的 C3PS[1:0] 位修改(参考手册 25.9.1 节)。
- 中断标志必须软件清零,否则会反复进入中断。
- 在中断服务函数中,可以通过读取
PWMA_CCR3 和 PWMA_CCR4 获取捕获时的计数器值,用于测量脉冲宽度等高级应用。
如果您需要调整输入滤波以提高抗干扰能力,可以在 PWMA_CCMR3 和 PWMA_CCMR4 的高 4 位设置 IC3F[3:0] / IC4F[3:0] 滤波参数。如需进一步帮助请告诉我!
📖 数据来源:STC8H-20260625.md
🔍 搜索 "帮利用 STC8H1K28的P1.4的 PWM3P功能实现:
上升沿/下降沿 都可以产生中断"
📌 相关论坛讨论
- 8H1K28中断3只有下降沿中断/无上升沿中断 | 启动比较器的上升沿中断 P3.7/INT3/CMP+
- 求助!STC8H1K16(Pin32) P2口上升沿和下降沿中断
- 【AI助手】@AiCube-ISP-V6.96Y中,【自动生成程序】+【查错高手】