ilysmile 发表于 2023-5-28 12:10:21

求助大佬,为什么普通IO口中断设置受P_SW2寄存器的影响?


求助大佬,为什么普通IO口中断设置受P_SW2寄存器的影响?

源码如下:

void main(void)
{
                EAXFR = 1;                                                                         // ʹÄÜ·ÃÎÊ XFR
                CKCON = 0x00;                                                         // ÉèÖÃÍⲿÊý¾Ý×ÜÏßËÙ¶ÈΪ×î¿ì
                WTST = 0x00;                                                                // ÉèÖóÌÐò´úÂëµÈ´ý²ÎÊý£¬µÈ´ýʱ¼äΪ0¸öʱÖÓ£¬CPUÖ´ÐгÌÐòËÙ¶È×î¿ì

//    P_SW2 |= 0x80;
    CLKDIV = 0;                                //24MHzÖ÷Ƶ£¬·ÖƵÉèÖÃ
//    P_SW2 &= 0x7F;

          P0M0 = 0x00;    P0M1 = 0x00;
    P1M0 = 0x00;    P1M1 = 0x00;
    P2M0 = 0x00;    P2M1 = 0x00;
    P3M0 = 0x00;    P3M1 = 0x00;
    P4M0 = 0x00;    P4M1 = 0x00;
    P5M0 = 0x00;    P5M1 = 0x00;
    P6M0 = 0x00;    P6M1 = 0x00;
    P7M0 = 0x20;    P7M1 = 0x00;

                P0IM1 = 0x00;P0IM0 = 0x00;        // P0.0ÉèÖÃΪϽµÑØ´¥·¢
//        P0IM1 = 0x00;P0IM0 = 0x01;        // P0.0ÉèÖÃΪÉÏÉýÑØ´¥·¢
//        P0IM1 = 0x01;P0IM0 = 0x00;        // P0.0ÉèÖÃΪµÍµçƽ´¥·¢
//        P0IM1 = 0x01;P0IM0 = 0x01;        // P0.0ÉèÖÃΪ¸ßµçƽ´¥·¢

                P0INTE = 0x01;                                                        // ʹÄÜP0.0¿ÚÖжÏ
                EA = 1;       

        while(1)
        {

其中的
//    P_SW2 |= 0x80;
//    P_SW2 &= 0x7F;
注释去掉之后,P0.0的端口中断就失效了,查了芯片手册,这样设置也没有发现有冲突呀,感觉有点奇怪,求了解的大佬指点,谢谢!

神农鼎 发表于 2023-5-28 12:15:27

扩展的 XFR 要能被访问,要设置允许访问


打开允许访问后,不要关闭

梁工 发表于 2023-5-28 13:11:53

IO中断寄存器是扩展寄存器,访问扩展寄存器必须要P_SW2的最高位为1才能访问。

9DHans 发表于 2023-10-22 16:39:50

梁工 发表于 2023-5-28 13:11
IO中断寄存器是扩展寄存器,访问扩展寄存器必须要P_SW2的最高位为1才能访问。 ...

老师您好,最近在学习STC32,按照网上的一些教程来不知道为何IO口的中断始终无法进入。
已经使用了KEIL中断号扩展工具,编译也没有发生错误。
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4716
代码整理到了这个贴上,属实困扰了许久,求助大佬能指点下
(另外不知道有没有不适用中断13号的IO中断例程?)

梁工 发表于 2023-10-23 12:10:08

本帖最后由 梁工 于 2023-10-23 12:11 编辑

9DHans 发表于 2023-10-22 16:39
老师您好,最近在学习STC32,按照网上的一些教程来不知道为何IO口的中断始终无法进入。
已经使用了KEIL中 ...不需要借用13号中断的程序,直接使用对应的中断号。

/*************      功能说明      **************

请先别修改程序, 直接下载"Objects"里的"interrupt.hex"测试, 主频选择11.0592MHZ. 测试正常后再修改移植.
由于使用的中断号超过了31,所以KEIL C251编译器要拓展Keil的C代码中断号, 运行一下"拓展Keil的C代码中断号.exe"即可。

P0~P7所有IO中断测试程序.
P0.0~P0.7中断对应取反P1.0~P1.7输出指示。
P1.0~P1.7中断对应取反P0.0~P0.7输出指示。
P2.0~P2.7中断对应取反P4.0~P4.7输出指示。
P3.0~P3.7中断对应取反P4.0~P4.7输出指示。
P4.0~P4.7中断对应取反P2.0~P2.7输出指示。
P5.0~P5.7中断对应取反P4.0~P4.7输出指示。
P6.0~P6.7中断对应取反P7.0~P7.7输出指示。
P7.0~P7.7中断对应取反P6.0~P6.7输出指示。

由于IO有限, 本例子只设置了P0.0~P0.7和P2.0~P2.7的中断, 中断函数分别取反P1.0~P1.7和P4.0~P4.7来指示进入中断.
用户可以根据例子随意设置自己需要的IO中断.
主函数取反P3.3输出一个方波信号, 方便用户测试.

******************************************/





9DHans 发表于 2023-10-23 12:49:52

梁工 发表于 2023-10-23 12:10
不需要借用13号中断的程序,直接使用对应的中断号。

/*************      功能说明      ************ ...

谢谢梁老师~

清风迎明月 发表于 2023-10-27 10:40:54

因为STC好多系列单片机是在传统80C51上升级了,扩展了好多功能,这些功能的使用要通过特殊功能寄存器来规定,传统单片机中内部特殊功能寄存器范围80H-FFH不够用,因此扩展了外部SFR,你要使用这一部分的SFR就要先允许开通这个区间后再用,也就用P_SW2 |= 0x80;来开通,显然P_SW2这个SFR肯定在内部80H-FFH范围内。
页: [1]
查看完整版本: 求助大佬,为什么普通IO口中断设置受P_SW2寄存器的影响?