帕拉丁 发表于 2025-1-11 13:13:56

各位大佬好,在AI8H8K64U,无法进入掉电状态 | 已解决

    先谢谢各位大佬、各位前辈。小弟最近才开始学习AI8H8K64U 芯片版本B版。在大佬的指点下测试了STC ISP软件中的 AI8H系列-使用掉电唤醒定时器唤醒省电模式   这个例程。可以正常运转 P11电平不停切换。于是我参照这个例程,以及手册例程14.2.1 写了下面这段代码。

#include "STC8h.h"
#include "intrins.h"
// 定义常用的数据类型
typedef unsigned char u8;
typedef unsigned int u16;
// 自定义延时函数
void delay(u16 ms) {
    u16 i, j;
    for (i = ms; i > 0; i--)
      for (j = 228; j > 0; j--);
}
void main()
{
    P_SW2|=0X80;
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;

    P0IM0=0X00; //下降沿中断
                P0IM1=0X00;
                P0INTE=0XFF;   //使能P0口中断

               
                EA=1;


    while (1)
    {
               
               
               _nop_();
      _nop_();
      PCON=0x02;                           //MCU进入掉电模式
      _nop_();
      _nop_();
      _nop_();
      _nop_();
                              
   
                              
               
                              
    }
}

//void common_isr() interrupt 13 // 必须借用第13号中断入口地址
//{
//    unsigned char psw2_st;
//    unsigned char intf;

//    intf = P0INTF;
//    if (intf)
//    {
//      P0INTF = 0x00; // 清除所有中断标志
//      if (intf & 0x01) { /* P0.0口中断 */ }
//      if (intf & 0x02) { /* P0.1口中断 */ }
//      if (intf & 0x04) { /* P0.2口中断 */ }
//      if (intf & 0x08)
//                              {
//                              /* P0.3口中断 */
//                              P11 = ~P11;
//      delay(4000);
//                              }
//      if (intf & 0x10) { /* P0.4口中断 */ }
//      if (intf & 0x20) { /* P0.5口中断 */ }
//      if (intf & 0x40) { /* P0.6口中断 */ }
//      if (intf & 0x80) { /* P0.7口中断 */ }
//    }
//}

    这段代码的意图是 让单片机开机后就进入掉电模式 然后根据不同的IO中断唤醒单片机 , 执行对应任务。思路非常简单。但是目前遇到一个问题我使用 _nop_();
      _nop_();
      PCON=0x02;                           //MCU进入掉电模式
      _nop_();
      _nop_();
      _nop_();
      _nop_();
这部分指令 似乎无法让单片机进入掉电模式 。我判断的依据是上电后 测量P11的电压 一直是3.3V ,我理解掉电模式 ,P11准双向口输出请问在掉电后会变为低电平,一直是高电平 似乎掉电代码没有执行。   

请问各位大佬
1,在掉电状态下 IO口仍然会保持以前的输出状态吗 ?
2,我注释掉的任意IO口唤醒掉电模式的中断函数有什么问题,这种方式可以唤醒掉电模式吗。

再一次感谢各位大佬。

_奶咖君_ 发表于 2025-1-11 13:23:52

问题1:是的,会保持进入掉电模式前的状态。

帕拉丁 发表于 2025-1-11 13:31:29

_奶咖君_ 发表于 2025-1-11 13:23
问题1:是的,会保持进入掉电模式前的状态。

谢谢大佬看来我对掉电模式的理解是错误的。 我继续检查任意中断函数为什么不能唤醒改变P11状态。。。

_奶咖君_ 发表于 2025-1-11 13:33:34

帕拉丁 发表于 2025-1-11 13:31
谢谢大佬看来我对掉电模式的理解是错误的。 我继续检查任意中断函数为什么不能唤醒改变P11状态。。。 ...

上面贴的是全部的代码么?没有看到你中断服务函数是什么,,,,开启了中断但是没有写中断服务函数是错误的,,触发中断后可能会让程序运行出问题。。

帕拉丁 发表于 2025-1-11 13:47:21

_奶咖君_ 发表于 2025-1-11 13:33
上面贴的是全部的代码么?没有看到你中断服务函数是什么,,,,开启了中断但是没有写中断服务函数是错误 ...

大佬 上面的就是全部代码了中断函数在下面 我在调试时候注释掉了我取消注释以后 依然无法改变 P11的状态   
中断函数内容如下//void common_isr() interrupt 13 // 必须借用第13号中断入口地址
//{
//    unsigned char psw2_st;
//    unsigned char intf;

//    intf = P0INTF;
//    if (intf)
//    {
//      P0INTF = 0x00; // 清除所有中断标志
//      if (intf & 0x01) { /* P0.0口中断 */ }
//      if (intf & 0x02) { /* P0.1口中断 */ }
//      if (intf & 0x04) { /* P0.2口中断 */ }
//      if (intf & 0x08)
//                              {
//                              /* P0.3口中断 */
//                              P11 = ~P11;
//      delay(4000);
//                              }
//      if (intf & 0x10) { /* P0.4口中断 */ }
//      if (intf & 0x20) { /* P0.5口中断 */ }
//      if (intf & 0x40) { /* P0.6口中断 */ }
//      if (intf & 0x80) { /* P0.7口中断 */ }
//    }
//}

_奶咖君_ 发表于 2025-1-11 14:07:54

emmmm,使用13中断的方式是否正确?

帕拉丁 发表于 2025-1-11 14:18:55

_奶咖君_ 发表于 2025-1-11 14:07
emmmm,使用13中断的方式是否正确?

谢谢大佬指导,我又仔细查看手册上14.2.1例程 好像不是唤醒寄存器 是普通中断。。。。正在细细查阅这部分资料

帕拉丁 发表于 2025-1-11 14:27:04

_奶咖君_ 发表于 2025-1-11 14:07
emmmm,使用13中断的方式是否正确?

谢谢大佬指点 已经解决了,原因是要启用唤醒寄存器。 普通中断不行。

_奶咖君_ 发表于 2025-1-11 14:39:13

<p><img alt="qiang" class="emoji" src="https://www.stcaimcu.com/static/image/smiley/default/qiang.gif" title="qiang" /> <img alt="qiang" class="emoji" src="https://www.stcaimcu.com/static/image/smiley/default/qiang.gif" title="qiang" /></p>
页: [1]
查看完整版本: 各位大佬好,在AI8H8K64U,无法进入掉电状态 | 已解决