找回密码
 立即注册
查看: 89|回复: 8

8H8K64U D版本的芯片I/O口中断的问题 | 已解决, 焊接时有轻微连锡

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 15:22:39

6

主题

8

回帖

96

积分

注册会员

积分
96
发表于 2025-4-14 12:44:18 | 显示全部楼层 |阅读模式
void    GPIO_config(void)
{
    P0_MODE_IO_PU(GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 );       // 设置为准双向口 LED
    P1_MODE_IO_PU(GPIO_Pin_4 | GPIO_Pin_5 );                    // 设置为准双向口 KEY      
    P3_MODE_IO_PU(GPIO_Pin_2);                                  // 设置为准双向口 KEY

// ~~~~~~~~~~~~~~~~~~~~~~~P1.4, P1.5,P3.2下降沿中断~~~~~~~~~~~~~~~~~~~~~~~
    P1INTE |=  0x30;    // P1.4, P1.5中断使能   中断使能寄存器
    P3INTE |=  0x04;    // P3.2中断使能       中断使能寄存器

    P1IM0  &= ~0x30;
    P1IM1  &= ~0x30;    // P1.4, P1.5低电平中断

    P3IM0  &= ~0x04;
    P3IM1  &= ~0x04;    // P3.2下降沿中断

    // P1INTF  &=  ~0x10; // 1.4清中断标志
    // P1INTF  &=  ~0x20; // 1.5清中断标志
    // P3INTF  &=  ~0x04; // 3.2清中断标志
        P1INTF =  0x00; // 1.4清中断标志
        P3INTF =  0x00; // 3.2清中断标志
}
以上我的的io中断初始化部分


void RTC_ISR_Handler (void) interrupt 13//RTC_VECTOR
{
    u8 key  = P1INTF;
    u8 key1 = P3INTF;
    u32 i=MAIN_Fosc/500;
    switch (key)
    {
        case 0x10:         
                          while (i--);
                          if (P14==0)
                          {
                            P05 =!P05;// 1.4
                          }
                            P1INTF  &=  ~0x10; // 1.4清中断标志
            break;
        case 0x20:      
                           while (i--);
                          if (P15==0)
                          {
                            P07 =!P07;// 1.5
                          }
                            P1INTF  &=  ~0x20; // 1.5清中断标志
            break;
        default:
            break;
    }   
    switch (key1)
    {
        case 0x04:         
                        while (i--);
                        if (P32==0)
                        {
                            P06 =!P06;
                        }
                        P3INTF  &=  ~0x04; // 3.2清中断标志      
            break;
        default:
            break;
    }   
        // printf("P3INTF=%#x \r\n",P3INTF);

}
中断部分全部写在13号中断函数内,p14 p15中断可使用偶尔故障,出现无法清除中断标志的情况,

p32中断完全不能正常使用,当P32按键按下,可进入到中断程序中,但是无法检测到是P3口哪个端口过来的中断,
然后我把中断标志位寄存器值全部打印出来发现值都不为0,并且无法清除。

    printf("P0INTF=%#x \r\n",P0INTF);      
    printf("P1INTF=%#x \r\n",P1INTF);      
    printf("P2INTF=%#x \r\n",P2INTF);      
    printf("P3INTF=%#x \r\n",P3INTF);      
    printf("P4INTF=%#x \r\n",P4INTF);      
    printf("P5INTF=%#x \r\n",P5INTF);      
    printf("P6INTF=%#x \r\n",P6INTF);      
    printf("P7INTF=%#x \r\n",P7INTF);   
串口收到的内容
[12:31:44.410]接收←P0INTF=0xc2                     P1INTF=0xc2                     P2INTF=0xc2                     P3INTF=0x2c2                     P4INTF=0xc2                     P5INTF=0xc2                     P6INTF=0xc2                     P7INTF=0xc2
同样的写代码方式我用AI8051U一切都正常。寄存器值全部打印出来也都是0。









回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-4-14 12:48:00 | 显示全部楼层
在您提供的代码中,主要涉及到了GPIO口的配置以及中断的设置。以下是对代码的详细分析和建议:

1. GPIO配置
  1. c
  2. P0MODEIOPU(GPIOPin5 | GPIOPin6 | GPIOPin7 );       // 设置为准双向口 LED
  3. P1MODEIOPU(GPIOPin4 | GPIOPin5 );                    // 设置为准双向口 KEY      
  4. P3MODEIOPU(GPIOPin2);                                  // 设置为准双向口 KEY
复制代码
这部分代码将P0.5、P0.6、P0.7、P1.4、P1.5和P3.2配置为准双向口。准双向口的特点是既可以作为输入,也可以作为输出,并且在作为输入时具有上拉电阻。这种配置适用于LED和按键等外设。

2. 中断使能
  1. c
  2. P1INTE |=  0x30;    // P1.4, P1.5中断使能   中断使能寄存器
  3. P3INTE |=  0x04;    // P3.2中断使能       中断使能寄存器
复制代码
这部分代码使能了P1.4、P1.5和P3.2的中断功能。P1INTE和P3INTE是中断使能寄存器,通过设置相应的位来使能特定引脚的中断。

3. 中断模式配置
  1. c
  2. P1IM0  &= ~0x30;
  3. P1IM1  &= ~0x30;    // P1.4, P1.5低电平中断
  4. P3IM0  &= ~0x04;
  5. P3IM1  &= ~0x04;    // P3.2下降沿中断
复制代码
这部分代码配置了P1.4、P1.5和P3.2的中断触发模式。P1IM0、P1IM1、P3IM0和P3IM1是中断模式寄存器,用于设置中断的触发条件。根据代码,P1.4和P1.5被配置为低电平触发中断,而P3.2被配置为下降沿触发中断。

4. 中断标志清除
  1. c
  2. // P1INTF  &=  ~0x10; // 1.4清中断标志
  3. // P1INTF  &=  ~0x20; // 1.5清中断标志
  4. // P3INTF  &=  ~0x04; // 3.2清中断标志
  5. P1INTF =  0x00; // 1.4清中断标志
  6. P3INTF =  0x00; // 3.2
复制代码
这部分代码用于清除中断标志位。P1INTF和P3INTF是中断标志寄存器,用于指示中断是否发生。在中断服务程序中,通常需要清除这些标志位以避免重复触发中断。您可以选择逐个清除标志位,或者直接清零整个寄存器。

5. 建议与优化
中断触发模式:根据实际应用需求,确保选择合适的中断触发模式。低电平触发和下降沿触发适用于不同的场景,需根据具体外设的行为进行选择。
中断标志清除:在中断服务程序中,建议在中断处理完成后立即清除中断标志位,以避免重复触发中断。
代码可读性:建议在代码中添加注释,说明每个寄存器的功能和配置的目的,以提高代码的可读性和可维护性。

6. 总结
您的代码已经正确地配置了GPIO口和中断功能。通过合理设置中断触发模式和及时清除中断标志位,可以确保系统稳定运行。根据实际应用需求,进一步优化代码结构和注释,将有助于提高代码的可读性和可维护性。

希望以上分析对您有所帮助。如有进一步问题,欢迎继续讨论。

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 15:22:39

6

主题

8

回帖

96

积分

注册会员

积分
96
发表于 2025-4-14 12:52:32 | 显示全部楼层
整了快两天了,崩溃了,竟然傻傻的把精力都耗费在研究芯片上。、
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2025-4-14 13:05:32 | 显示全部楼层
使用printf打印的话,需要注意数据格式参数,C51跟C251有所不同,参考以下帖子:

printf函数 的 格式参数; USB接口 使用 printf 打印数据
https://www.stcaimcu.com/thread-6864-1-1.html
(出处: 国芯技术交流网站)

此外,如果串口打印使用P3.0,P3.1的话,在打印过程中,由于P31输出信号时脚位产生变化,会触发中断标志位置位(没开启中断也会产生标志),判断时排除这些中断标志的干扰。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 15:22:39

6

主题

8

回帖

96

积分

注册会员

积分
96
发表于 2025-4-14 13:16:39 | 显示全部楼层
乘风*** 发表于 2025-4-14 13:05
使用printf打印的话,需要注意数据格式参数,C51跟C251有所不同,参考以下帖子:

printf函数 的 格式参数 ...

AI8051U一切都正常。寄存器值全部打印出来也都是0。
[13:15:50.607]接收←P0INTF=0x0
                    P1INTF=0x0
                    P2INTF=0x0
                    P3INTF=0x0
                    P4INTF=0x0
                    P5INTF=0x0
                    P6INTF=0x0
                    P7INTF=0x0
                    
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 15:22:39

6

主题

8

回帖

96

积分

注册会员

积分
96
发表于 2025-4-14 13:21:03 | 显示全部楼层
有谁使用过stc8h芯片的io中断,给看看问题
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2025-4-14 13:21:03 | 显示全部楼层
49680*** 发表于 2025-4-14 13:16
AI8051U一切都正常。寄存器值全部打印出来也都是0。
[13:15:50.607]接收←P0INTF=0x0
                  ...

AI8051U如果使用32位模式的话是C251编译器,8H是C51编译器。
这两种编译器的printf使用有所不同。

AI8051U的8位模式就是跟8H通用的,不信可以将AI8051U实验箱例程包,8Bit模式目录下“86-普通IO口中断-休眠唤醒”这个例子里面的hex文件直接烧录到8H8K64U芯片里试试。烧录时IRC频率设置24M,直接就能正常工作。
实验箱例程包下载地址:https://www.stcai.com/syx

截图202504141323316019.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2025-4-14 14:00:21 | 显示全部楼层
%#X,,,是个啥意思0.0
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 15:22:39

6

主题

8

回帖

96

积分

注册会员

积分
96
发表于 2025-4-14 15:11:28 | 显示全部楼层
天哪,问题最终解决,
原来是芯片P33,P32引脚在焊接时有轻微连锡
当P32按键按下时,造成中断标志位混乱,
串口输出时一定要注意printf函数 的 格式参数;


回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 02:34 , Processed in 0.175367 second(s), 98 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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