stm8 停机模式与外部中断唤醒中一个小问题

2023-02-18,,,,

  做了一个简单的项目,电路板使用电池供电,需要系统在待机时低功耗。而对外接口只有4个按键,也就是唤醒必须要通过这四个按键。

  系统功能就不介绍了,只给出进入低功耗的代码和退出低功耗的代码。

  使用芯片为stm8s103

 /*****************************************************************
//进入到停机模式
*****************************************************************/
void EnterHalt()
{
int j=; /* 防止定时器中断唤醒了CPU */
TIM1_CR1 &= 0xFE; /* 用户操作计数器关掉 */ asm("sim"); /* PC3 PC4 PC5 PC6 使能外部中断 */
PC_DDR_DDR3 = ;
PC_CR1_C13 = ;
PC_CR2_C23 = ; PC_DDR_DDR4 = ;
PC_CR1_C14 = ;
PC_CR2_C24 = ; PC_DDR_DDR5 = ;
PC_CR1_C15 = ;
PC_CR2_C25 = ; PC_DDR_DDR6 = ;
PC_CR1_C16 = ;
PC_CR2_C26 = ; EXTI_CR1 = 0x00; //PC端口 低电平和下降沿都中断 for(j=;j>;j--); //延时一会 asm("rim");
asm("HALT"); /* 进入停机模式 */
}

  先关闭中断,配置IO口为外部中断,开中断,进入低功耗。

  在外部中断中,配置IO口为普通IO。

 #pragma vector = 7
__interrupt void EXTI_PORTC_IRQHandler(void)
{
ExitHalt(); //开定时器 配置Lock键为普通IO
} /****************************************************************
//退出停机模式
*****************************************************************/
void ExitHalt()
{
TIM1_CR1 |= 0x01; /* 开用户操作定时器 */ //PC3 PC4 PC5 PC6配置为普通IO口 输入 用于按键检测
PC_DDR_DDR3 = ;
PC_CR1_C13 = ;
PC_CR2_C23 = ; PC_DDR_DDR4 = ;
PC_CR1_C14 = ;
PC_CR2_C24 = ; PC_DDR_DDR5 = ;
PC_CR1_C15 = ;
PC_CR2_C25 = ; PC_DDR_DDR6 = ;
PC_CR1_C16 = ;
PC_CR2_C26 = ; EXTI_CR1 = 0x00;
}

  流程如上,实际会出现一个小问题,就是配置IO口为外部中断,开了中断以后,就立即进入了中断程序(中断条件为低电平和下降沿)。进入了中断程序后,IO口配置又将IO口配置为普通引脚,接着进入低功耗。再按按键怎么也不能唤醒了。如果你也遇到这样的问题,请参照上面的进入低功耗的代码,在配置IO口为中断引脚后,延时一会,再开中断。

  使用stm8的停机模式后,在3.0V供电的情况下,电路板整体功耗为5.6uA。使用电池供电,待机也能使用1年以上。

  

stm8 停机模式与外部中断唤醒中一个小问题的相关教程结束。

《stm8 停机模式与外部中断唤醒中一个小问题.doc》

下载本文的Word格式文档,以方便收藏与打印。