找回密码
 立即注册
查看: 117|回复: 4

求助:AI8G在在进入掉电模式前初始化PCA导致引脚电平固定为高

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-07-05 10:36:05
已绑定手机

7

主题

11

回帖

101

积分

注册会员

积分
101
发表于 2025-6-27 22:35:18 | 显示全部楼层 |阅读模式
如果AI8进入掉电模式前,初始化了PCA模块:
void main然后
PCA_CONFIG();初始化PCA
SLEEP();进入睡眠
然后进入睡眠,则会在PCA输出引脚固定输出高电平。
即使在sleep函数中设置CR = 0关闭PCA电源,然后将引脚设置为低电平也无效!
我设置的输出引脚是P31,这个位置好像是UART,但已经通过操作P_SW1 = 0X10来切换为ccp0输出。
pca部分是这么配置的

void PCA_CONFIG(void){
    P_SW1 = 0x10;   // P3.1切换为PWM输出
    CCON = 0x00;    // 复位PCA
    CMOD = 0x0A;    // 系统时钟/4,6MHZ下为23.5khz
    CL = 0x00;      // 复位低字节
    CH = 0x00;      // 复位高字节
    CCAPM0 = 0x42;  // PCA0 PWM模式
    PCA_PWM0 = 0x80;// 6位PWM模式
    CCAP0H = ccapvalues[ccapcounter];//对CCAP0H赋值,CCAP0L由硬件自动赋值
    CR = 1;         // 启动PCA
}

但是如果在进入睡眠之后,唤醒再初始化PCA,就不会影响P31的电平。
我以为是PCA部分工作不稳定导致的,我在睡眠函数部分添加了很多nop,也无效!

    CR = 0;//关闭PCA,避免影响P31电平
    _nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();
    initcurrentseg = 0;//清空电压迟滞比较初始化标志
    P30 = 1;//LED灭,由于定时器中断已经停止,所以不会再被改变
    P55 = 0;//关闭12V使能
    P31 = 0;//再次把P31拉低,因为PCA打开会导致P31被拉
只有上电后先进入休眠,再初始化PCA才不会拉高引脚电平。

我想知道这个问题是什么原因?虽然不影响代码功能,只需要调换位置就能解决。
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-07-05 10:36:05
已绑定手机

7

主题

11

回帖

101

积分

注册会员

积分
101
发表于 2025-6-27 22:58:05 | 显示全部楼层
国芯人*** 发表于 2025-6-27 22:38
尊敬的用户:

您好!感谢您对STC8G系列单片机的深入使用和问题反馈。针对您提出的问题,即“在进入掉电模 ...

实际上只有上电初始化时会这样,上电后再通过长按进入睡眠模式,引脚是正常的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:514
  • 最近打卡:2025-08-01 07:33:38
已绑定手机

87

主题

5796

回帖

1万

积分

超级版主

DebugLab

积分
10406
发表于 2025-6-28 00:22:16 | 显示全部楼层
进入省电模式之前建议关闭所有不需要的功能,IO设置为没有电流的状态,IO电平会变化的关闭数字输入
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-07-05 10:36:05
已绑定手机

7

主题

11

回帖

101

积分

注册会员

积分
101
发表于 2025-6-28 01:27:19 | 显示全部楼层
Debu*** 发表于 2025-6-28 00:22
进入省电模式之前建议关闭所有不需要的功能,IO设置为没有电流的状态,IO电平会变化的关闭数字输入 ...

应该不是这个问题,那个电压显然是直接推挽输出高了,而且就算正常进入睡眠,他10次里面也可能有一次是没有拉低输出引脚的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-07-05 10:36:05
已绑定手机

7

主题

11

回帖

101

积分

注册会员

积分
101
发表于 2025-6-28 01:28:48 | 显示全部楼层
我进入休眠的方式是调用下面的函数,
void SLEEP(void){
    TR1 = 0;
    TR0 = 0;//先关闭定时器,避免中断干扰
    CR = 0;//关闭PCA,避免影响P31电平
    _nop_();_nop_();_nop_();_nop_();
    initcurrentseg = 0;//清空电压迟滞比较初始化标志
    P30 = 1;//LED灭,由于定时器中断已经停止,所以不会再被改变
    P55 = 0;//关闭12V使能
    P31 = 0;//再次把P31拉低,因为PCA打开会导致P31被拉高
    IRCDB = 0X08;//上电后持续2^4个时钟后开始执行程序
    poweron = 0;//确认关机
    PCON = 0X02;//进入掉电模式
////////////唤醒后从这里继续执行//////////////
    _nop_();_nop_();_nop_();_nop_();//空指令,避免CPU上电后的不稳定
    TR0 = 1;//先打开定时器1,确保可以正常的
    while(!poweron);//死循环,按键长按将poweron置1之前,都不会退出
    TR1 = 1;//打开两个定时器
    CR = 1;//打开PCA电源已经定义了P31的电平,不需要再次配置
    P30 = 0;
    P55 = 1;
    //不需要改变poweron,因为按键部分已经改变
    //如果是初次上电,会继续去执行主循环
}
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-8-1 23:28 , Processed in 0.149795 second(s), 69 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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