找回密码
 立即注册
查看: 343|回复: 6

【已解决】求救!8H2K17U,普通IO无法唤醒STOP模式 | 已解决!

[复制链接]
已绑定手机

1

主题

2

回帖

11

积分

新手上路

积分
11
发表于 2025-3-5 02:29:47 | 显示全部楼层 |阅读模式
大神求救!
问题是这样的,我用的是8H2K17U,手册上写的是支持I/O 中断唤醒功能,我使用P1.4、P1.5、P1.6三个IO口,上拉到VCC,按下按键后到GND,预期目标是在没有按键按下的时候单片机保持在STOP模式下,当按下按键后唤醒单片机串口发送键值,发完键值后继续进入STOP模式。配置了P1IM1 = 0x00;   P1IM0 = 0x00;(下降沿)  P1WKUE = 0x70;  ,在进入STOP模式后,按键无法唤醒,不知道是为啥,下面贴上代码,大神帮看看,谢谢!

IO配置代码:
  1. void App_GPIO_Init_Work(void)//全部引脚工作
  2. {
  3. /************************设置IO口工作模式*******************************/
  4.     P0M1 = 0xFF;   P0M0 = 0x00;   //设置P0口为高阻输入
  5.     P1M1 = 0xFF;   P1M0 = 0x70;   //设置P1口为部分开漏,部分高阻输入
  6.         /*     B7 B6 B5 B4 B3 B2 B1 B0       */
  7.         /*PnM1  1  1  1  1  1  1  1  1  0xFF */
  8.         /*PnM0  0  1  1  1  0  0  0  0  0x70 */
  9.         /*     阻 漏 漏 漏 阻 阻 阻 阻       */
  10.     P2M1 = 0xFF;   P2M0 = 0x00;   //设置P2口为高阻输入
  11.     P3M1 = 0x1F;   P3M0 = 0x08;   //设置P3口为部分高阻输入,部分准双向口
  12.         /*     B7 B6 B5 B4 B3 B2 B1 B0       */
  13.         /*PnM1  0  0  0  1  1  1  1  1  0x1F */
  14.         /*PnM0  0  0  0  0  1  0  0  0  0x08 */
  15.         /*     双 双 双 阻 漏 阻 阻 阻       */
  16.     P4M1 = 0xFF;   P4M0 = 0x00;   //设置P4口为高阻输入
  17.     P5M1 = 0xFF;   P5M0 = 0x00;   //设置P5口为高阻输入
  18. /************************设置数字信号输入使能**************************/
  19.     P0IE = 0x00;
  20.     P1IE = 0x70;
  21.         /*     B7 B6 B5 B4 B3 B2 B1 B0       */
  22.         /*PnIE  0  1  1  1  0  0  0  0  0x70 */
  23.         /*     否 能 能 能 否 否 否 否       */
  24.     P2IE = 0x00;
  25.     P3IE = 0xE0;
  26.         /*     B7 B6 B5 B4 B3 B2 B1 B0       */
  27.         /*PnIE  1  1  1  0  0  0  0  0  0xE0 */
  28.         /*     能 能 能 否 否 否 否 否       */
  29.     P4IE = 0x00;
  30.     P5IE = 0x00;
  31.     CE = 0;
  32. }
  33. void App_GPIO_Init_Sleep(void)//休眠状态
  34. {
  35. /************************设置IO口工作模式*******************************/
  36.     P0M1 = 0xFF;   P0M0 = 0x00;   //设置P0口为高阻输入
  37.     P1M1 = 0xFF;   P1M0 = 0x70;   //设置P1口为部分开漏,部分高阻输入
  38.         /*     B7 B6 B5 B4 B3 B2 B1 B0       */
  39.         /*PnM1  1  1  1  1  1  1  1  1  0xFF */
  40.         /*PnM0  0  1  1  1  0  0  0  0  0x70 */
  41.         /*     阻 漏 漏 漏 阻 阻 阻 阻       */
  42.     P2M1 = 0xFF;   P2M0 = 0x00;   //设置P2口为高阻输入
  43.     P3M1 = 0xFF;   P3M0 = 0x00;   //设置P3口为高阻输入
  44.     P4M1 = 0xFF;   P4M0 = 0x00;   //设置P4口为高阻输入
  45.     P5M1 = 0xFF;   P5M0 = 0x00;   //设置P5口为高阻输入
  46. /************************设置数字信号输入使能**************************/
  47.     P0IE = 0x00;
  48.     P1IE = 0x00;
  49.     P2IE = 0x00;
  50.     P3IE = 0x00;
  51.     P4IE = 0x00;
  52.     P5IE = 0x00;
  53. }
  54. void App_GPIO_Init(void)//IO口中断配置
  55. {
  56. /**************************设置中断模式配置(下降沿)****************************/
  57.     P0IM1 = 0x00;   P0IM0 = 0x00;
  58.     P1IM1 = 0x00;   P1IM0 = 0x00;
  59.     P2IM1 = 0x00;   P2IM0 = 0x00;
  60.     P3IM1 = 0x00;   P3IM0 = 0x00;
  61.     P4IM1 = 0x00;   P4IM0 = 0x00;
  62.     P5IM1 = 0x00;   P5IM0 = 0x00;
  63. /************************设置中断掉电唤醒使能*************************/
  64.     P0WKUE = 0x00;
  65.     P1WKUE = 0x70;
  66.         /*       B7 B6 B5 B4 B3 B2 B1 B0       */
  67.         /*PNWKUE  0  1  1  1  0  0  0  0  0x70 */
  68.         /*       否 能 能 能 否 否 否 否       */
  69.     P2WKUE = 0x00;
  70.     P3WKUE = 0x00;
  71.     P4WKUE = 0x00;
  72.     P5WKUE = 0x00;
  73. /****************************设置中断使能******************************/
  74.     P0INTE = 0x00;
  75.     P1INTE = 0x70;
  76.         /*       B7 B6 B5 B4 B3 B2 B1 B0       */
  77.         /*P1INTE  0  1  1  1  0  0  0  0  0x70 */
  78.         /*       否 能 能 能 否 否 否 否       */
  79.     P2INTE = 0x00;
  80.     P3INTE = 0x00;
  81.     P4INTE = 0x00;
  82.     P5INTE = 0x00;
  83.    
  84.     P1INTF = 0x00;//清中断标志
  85.     EA = 1;
  86. }
  87. //由于中断向量大于 31,在 KEIL 中无法直接编译
  88. //必须借用第 13 号中断入口地址
  89. void common_isr() interrupt 13
  90. {
  91.     if (P1INTF & 0x10)//P1.4-K1上翻中断
  92.     {
  93.         B_Alarm = 1;
  94.         key = 1;
  95.     }
  96.     if (P1INTF & 0x20)//P1.5-K2首页中断
  97.     {
  98.         B_Alarm = 1;
  99.         key = 2;
  100.     }
  101.     if (P1INTF & 0x40)//P1.6-K3下翻中断
  102.     {
  103.         B_Alarm = 1;
  104.         key = 3;
  105.     }
  106.     P1INTF = 0x00;//清中断标志
  107. }
复制代码



main代码:
  1. #define MAIN_Fosc  5529600L   //定义主时钟
  2. #define CE         P35        //无线模块片选,高电平或悬空SLEEP,低电平唤醒
  3. #define LED        P33        //LED灯,0亮,1不亮
  4. #define K1         P14
  5. #define K2         P15
  6. #define K3         P16
  7. bit B_Alarm = 0;       //唤醒标志,1醒,0没醒
  8. unsigned char key = 0; //哪个按键按下,0没有,1=K1,2=K2,3=K3
  9. unsigned char send = 0; //发送键值标志,1发送了,0没发送
  10. /********************** 主函数 ************************/
  11. void main(void)
  12. {
  13.     Delay_ms(10);
  14.     BSP_Configuration();//硬件驱动初始化函数
  15.     LED = 1;
  16.     Delay_ms(10);
  17.     App_STC8_Sleep();//开始休眠
  18.     while(1)
  19.     {
  20.         if(B_Alarm)//休眠醒来
  21.         {
  22.             B_Alarm = 0;//清除休眠标志
  23.             P1INTE = 0x00;//禁止中断
  24.             App_GPIO_Init_Work();//全部引脚工作
  25.             Delay_ms(100);//等待无线模块醒来
  26.             if(key == 1)
  27.             {
  28.                 App_UART1_SendByte(0x01);
  29.             }
  30.             else if(key == 2)
  31.             {
  32.                 App_UART1_SendByte(0x02);
  33.             }
  34.             else if(key == 3)
  35.             {
  36.                 App_UART1_SendByte(0x03);
  37.             }
  38.             key = 0;//清除键值
  39.             P1INTE = 0x70;//允许中断
  40.             send = 1;//已发送键值
  41.             Delay_ms(100);//等待无线模块发送完
  42.         }
  43.         
  44.         if((K1==0)||(K2==0)||(K3==0))//亮灯
  45.         {
  46.             LED = 0;
  47.         }
  48.         if((K1==1)&&(K2==1)&&(K3==1))//灭灯
  49.         {
  50.             LED = 1;
  51.           if(send == 1)//如果发送了键值才休眠
  52.             {
  53.                 send = 0;//清发送标志
  54.                 App_STC8_Sleep();//开始休眠
  55.             }
  56.         }
  57.     }
  58. }
  59. void App_STC8_Sleep(void)
  60. {
  61.     _nop_();
  62.     _nop_();
  63.     App_GPIO_Init_Sleep();//休眠前配置引脚
  64.     PCON |= (1<<1);       //进入掉电模式
  65.     _nop_();
  66.     _nop_();
  67.     _nop_();
  68.     _nop_();
  69.     _nop_();
  70.     _nop_();
  71. }
  72. /***********************************************************************
  73. *   函 数 Name: BSP_Configuration
  74. *   功能说明: 初始化硬件设备。配置CPU寄存器和外设的寄存器并初始化一些全局变量。
  75. ***********************************************************************/
  76. void BSP_Configuration(void)
  77. {  
  78.     P_SW2 |= 0x80;
  79.     App_GPIO_Init_Work();//全部引脚工作
  80.     App_GPIO_Init();
  81.     App_UART1_Init();
  82.     EA = 1;//打开总中断
  83. }
复制代码

本帖被以下淘专辑推荐:

回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-3-5 02:33:00 | 显示全部楼层
针对您描述的STC8H2K17U无法通过I/O中断唤醒STOP模式的问题,建议从以下几个方面进行排查:

1. **I/O配置**:确保P1.4、P1.5、P1.6已正确配置为输入模式,且上拉电阻正常。检查P1M1和P1M0寄存器,确保设置为准双向或输入模式。

2. **中断配置**:确认P1IM0和P1IM1寄存器已正确配置为下降沿触发。P1IM1 = 0x00; P1IM0 = 0x00; 表示下降沿触发,但需确保其他相关中断设置无误。

3. **唤醒使能**:P1WKUE寄存器应正确使能对应引脚。P1WKUE = 0x70; 已使能P1.4、P1.5、P1.6,但建议检查是否在进入STOP模式前正确设置了该寄存器。

4. **电源管理**:确保STOP模式下的电源管理配置正确,且系统时钟在唤醒后能正常恢复。

5. **硬件检查**:确认按键电路和连接无问题,按键按下时电平确实能拉低到GND。

建议逐步排查上述问题,并确保代码逻辑无误。如有必要,可参考STC官方手册或技术支持进一步确认。

[本文内容由国芯人工智能辅助生成,仅供参考]

点评

占楼淘理由:使用IO中断唤醒STOP模式时,需要注意不能关闭IO的数字输入寄存器,否则无法触发中断。4# 王哥哥相关描述  发表于 2025-3-5 15:20
回复 支持 反对

使用道具 举报 送花

已绑定手机

1

主题

2

回帖

11

积分

新手上路

积分
11
发表于 2025-3-5 02:37:22 | 显示全部楼层
备注掉两句App_STC8_Sleep();的话,按键发送键值是正常的,加上这两句之后,进入STOP模式后就唤醒不了,我测了电流(因为有无线模块,所以电流大一些),不加进入休眠的语句有20多毫安电流(单片机+无线模块一起工作),进入休眠后大概20微安电流(单片机+无线模块一起休眠),按下一个按键大概500微安(单片机+无线模块一起休眠+1个按键上拉电阻接地的电流)

点评

是这样的,配置休眠前的引脚配置中,错误将所有引脚的数字输入都关闭了。 数字输入关闭后,引脚就不能读取到外部电平了,自然也无法唤醒 修改睡眠前初始化引脚时,保留需要唤醒对应io的数字输入即可  详情 回复 发表于 2025-3-5 06:05
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5452

积分

版主

积分
5452
发表于 2025-3-5 06:05:43 | 显示全部楼层
小*** 发表于 2025-3-5 02:37
备注掉两句App_STC8_Sleep();的话,按键发送键值是正常的,加上这两句之后,进入STOP模式后就唤醒不了,我 ...

是这样的,配置休眠前的引脚配置中,错误将所有引脚的数字输入都关闭了。
数字输入关闭后,引脚就不能读取到外部电平了,自然也无法唤醒
修改睡眠前初始化引脚时,保留需要唤醒对应I/O的数字输入即可
同时在唤醒后,需要将所有的I/O的数字输入再恢复,否则都无法读取到外部电平

回复 支持 1 反对 0

使用道具 举报 送花

已绑定手机

1

主题

2

回帖

11

积分

新手上路

积分
11
发表于 2025-3-5 13:15:12 | 显示全部楼层
王*** 发表于 2025-3-5 06:05
是这样的,配置休眠前的引脚配置中,错误将所有引脚的数字输入都关闭了。
数字输入关闭后,引脚就不能读取 ...

已解决!感谢大神!
在休眠引脚配置里把3个按键打开数字信号输入使能后就可以正常唤醒了。
之前没考虑到IO中断也需要数字信号使能,大神不愧是大神,非常感谢

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 01:37 , Processed in 0.143655 second(s), 77 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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