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

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

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-03-20 11:16:04
已绑定手机

6

主题

15

回帖

110

积分

注册会员

积分
110
发表于 2025-1-11 13:13:56 | 显示全部楼层 |阅读模式
    先谢谢各位大佬、各位前辈。小弟最近才开始学习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口唤醒掉电模式的中断函数有什么问题,这种方式可以唤醒掉电模式吗。

再一次感谢各位大佬。
回复

使用道具 举报 送花

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

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2025-1-11 13:23:52 | 显示全部楼层
问题1:是的,会保持进入掉电模式前的状态。
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-03-20 11:16:04
已绑定手机

6

主题

15

回帖

110

积分

注册会员

积分
110
发表于 2025-1-11 13:31:29 | 显示全部楼层
_奶*** 发表于 2025-1-11 13:23
问题1:是的,会保持进入掉电模式前的状态。

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

使用道具 举报 送花

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

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2025-1-11 13:33:34 | 显示全部楼层
帕*** 发表于 2025-1-11 13:31
谢谢大佬  看来我对掉电模式的理解是错误的。 我继续检查  任意中断函数为什么不能唤醒改变P11状态。。。 ...

上面贴的是全部的代码么?没有看到你中断服务函数是什么,,,,开启了中断但是没有写中断服务函数是错误的,,触发中断后可能会让程序运行出问题。。
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-03-20 11:16:04
已绑定手机

6

主题

15

回帖

110

积分

注册会员

积分
110
发表于 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口中断 */ }
//    }
//}
回复 支持 反对

使用道具 举报 送花

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

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2025-1-11 14:07:54 | 显示全部楼层
emmmm,使用13中断的方式是否正确?
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-03-20 11:16:04
已绑定手机

6

主题

15

回帖

110

积分

注册会员

积分
110
发表于 2025-1-11 14:18:55 | 显示全部楼层
_奶*** 发表于 2025-1-11 14:07
emmmm,使用13中断的方式是否正确?

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

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-03-20 11:16:04
已绑定手机

6

主题

15

回帖

110

积分

注册会员

积分
110
发表于 2025-1-11 14:27:04 | 显示全部楼层
_奶*** 发表于 2025-1-11 14:07
emmmm,使用13中断的方式是否正确?

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

使用道具 举报 送花

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

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2025-1-11 14:39:13 | 显示全部楼层

qiang qiang

参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 13:16 , Processed in 0.121150 second(s), 99 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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