各位大佬好,在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口唤醒掉电模式的中断函数有什么问题,这种方式可以唤醒掉电模式吗。
再一次感谢各位大佬。
问题1:是的,会保持进入掉电模式前的状态。 _奶咖君_ 发表于 2025-1-11 13:23
问题1:是的,会保持进入掉电模式前的状态。
谢谢大佬看来我对掉电模式的理解是错误的。 我继续检查任意中断函数为什么不能唤醒改变P11状态。。。 帕拉丁 发表于 2025-1-11 13:31
谢谢大佬看来我对掉电模式的理解是错误的。 我继续检查任意中断函数为什么不能唤醒改变P11状态。。。 ...
上面贴的是全部的代码么?没有看到你中断服务函数是什么,,,,开启了中断但是没有写中断服务函数是错误的,,触发中断后可能会让程序运行出问题。。 _奶咖君_ 发表于 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口中断 */ }
// }
//} emmmm,使用13中断的方式是否正确? _奶咖君_ 发表于 2025-1-11 14:07
emmmm,使用13中断的方式是否正确?
谢谢大佬指导,我又仔细查看手册上14.2.1例程 好像不是唤醒寄存器 是普通中断。。。。正在细细查阅这部分资料
_奶咖君_ 发表于 2025-1-11 14:07
emmmm,使用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]