找回密码
 立即注册
查看: 13|回复: 3

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-06-27 22:35:18
已绑定手机

3

主题

6

回帖

53

积分

注册会员

积分
53
发表于 昨天 22:35 | 显示全部楼层 |阅读模式
如果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才不会拉高引脚电平。

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

使用道具 举报 送花

3

主题

542

回帖

-205

积分

等待验证会员

积分
-205
发表于 昨天 22:38 | 显示全部楼层
尊敬的用户:

您好!感谢您对STC8G系列单片机的深入使用和问题反馈。针对您提出的问题,即“在进入掉电模式前初始化PCA模块导致P31引脚电平固定为高”,我们已进行详细分析,并结合STC8G的硬件特性与PCA模块的工作机制,给出如下专业解释与建议。

首先,根据您的描述,您在main()函数中调用了PCACONFIG()函数对PCA模块进行初始化,随后调用SLEEP()进入掉电模式。然而,在掉电唤醒后,P31引脚被固定为高电平,即使在睡眠函数中尝试关闭PCA电源(设置CR = 0)并手动拉低该引脚,仍无法改变其状态。

一、PCA模块与掉电模式的关系

STC8G系列单片机的PCA(可编程计数器阵列)模块是一个独立于CPU运行的硬件模块,具备一定的自主性。在掉电模式下,大部分系统时钟和功能模块会被关闭,以降低功耗。然而,PCA模块在掉电模式下的行为需特别关注:
掉电模式下PCA是否保持工作:STC8G的掉电模式通常会关闭所有内部时钟源,包括用于PCA工作的系统时钟。因此,PCA模块在掉电状态下应处于停止状态。
PCA配置寄存器是否保留:部分型号的MCU在掉电模式下会保留部分寄存器内容,但PCA相关寄存器可能因电源断开而丢失或复位,这可能导致唤醒后PCA模块的状态异常。

二、P31引脚电平异常的原因分析

您提到P31引脚被设置为CCP0输出,且通过PSW1 = 0x10切换了其功能。但在掉电唤醒后,该引脚被固定为高电平,可能有以下几种原因:

1. PCA模块未正确关闭  
   您在SLEEP()函数中设置了CR = 0以关闭PCA,但需要注意的是,PCA模块的关闭操作需要确保其所有相关寄存器也被正确复位或清除。例如,CCON寄存器中的CR位仅控制PCA的启动/停止,但若其他配置寄存器(如CCAPM0、CMOD等)未被清零,PCA可能在唤醒后仍处于某种非正常工作状态,从而影响引脚电平。

2. 掉电模式下PCA模块的输出状态未被重置  
   在掉电模式下,PCA模块可能因电源中断而导致其输出状态无法自动恢复到默认值。如果PCA模块在掉电前处于PWM模式,并且CCAP0H和CCAP0L寄存器中存储了非零值,那么在唤醒后,PCA可能仍然按照这些配置驱动引脚,导致P31持续输出高电平。

3. 引脚复用功能冲突  
   P31引脚在默认状态下是UART功能,虽然您通过PSW1 = 0x10将其切换为CCP0输出,但在掉电唤醒过程中,如果系统未能正确恢复引脚功能配置,可能导致引脚被误认为仍处于UART模式,进而出现电平异常。

三、解决方案与建议

1. 在进入睡眠前彻底关闭PCA模块  
   在调用SLEEP()之前,不仅需要将CR = 0,还应将CCON = 0x00,并将CCAPM0、CMOD等寄存器复位,确保PCA模块完全停止工作。

  
  1. c
  2.    void SLEEP(void) {
  3.        CCON = 0x00;    // 关闭PCA
  4.        CR = 0;         // 停止PCA
  5.        PCON |= 0x01;   // 进入掉电模式
  6.    }
复制代码

2. 在唤醒后重新配置PCA模块  
   掉电唤醒后,建议重新执行PCACONFIG()函数,以确保PCA模块的配置正确无误,并避免因掉电导致的寄存器状态异常。

3. 检查引脚功能切换的稳定性  
   在唤醒后,可以再次确认PSW1的设置是否正确,并在必要时重新配置引脚功能,确保其始终处于CCP0输出模式。

4. 增加唤醒后的延时与状态检测  
   在唤醒后加入适当的延时,等待系统稳定后再进行引脚操作,避免因系统未完全恢复而导致的误判。

四、结论

综上所述,P31引脚在掉电唤醒后被固定为高电平,可能是由于PCA模块未被彻底关闭、寄存器状态异常或引脚功能配置未正确恢复所致。建议在进入睡眠前对PCA模块进行完整关闭,并在唤醒后重新配置,以确保系统的稳定性和可靠性。

如果您还有其他关于STC8G系列单片机的疑问或需要进一步技术支持,欢迎随时联系国芯人工智能团队,我们将竭诚为您服务。

此致  
敬礼!

国芯人工智能技术团队  
2025年4月

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-06-27 22:35:18
已绑定手机

3

主题

6

回帖

53

积分

注册会员

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

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:480
  • 最近打卡:2025-06-28 00:00:59
已绑定手机

80

主题

5212

回帖

9301

积分

超级版主

DebugLab

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-28 08:16 , Processed in 0.378536 second(s), 68 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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