STM32
直播中

李莉

7年用户 1345经验值
私信 关注
[问答]

STM8L151怎么进入Active-halt模式?

各位高手,请教个问题,我想在STM8L151主电掉电的情况下使起进入Active-halt模式(只启用RTC)使用电池供电,主电恢复后由上电复位电路复位进入正常工作
下面是部分程序,因第一次用该芯片,不知道怎么进入Active-halt模式,下面是部分程序,实测电流超过3mA,请高手们帮我看看那里出问题了
void power_init(void)//电源管理
{
PWR_DeInit();
PWR_PVDLevelConfig(PWR_PVDLevel_3V05);//阀值电压3.05
PWR_PVDCmd(ENABLE);
PWR_FastWakeUpCmd(ENABLE);
PWR_PVDITConfig(ENABLE);
}

void lowpower_config(void)
{
  GPIO_DeInit(GPIOA);
  GPIO_DeInit(GPIOB);
  GPIO_DeInit(GPIOC);
  GPIO_DeInit(GPIOD);
  GPIO_DeInit(GPIOE);
  GPIO_DeInit(GPIOF);
  ADC_DeInit(ADC1);
  TIM2_DeInit();
  TIM1_DeInit();
  USART_DeInit(USART1);
  CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, DISABLE);
  CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, DISABLE);
  GPIO_Init(GPIOA, GPIO_Pin_4, GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOA, GPIO_Pin_5, GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOA, GPIO_Pin_6, GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOD, GPIO_Pin_1, GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOD, GPIO_Pin_2, GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOD, GPIO_Pin_3, GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOB, GPIO_Pin_0, GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOB, GPIO_Pin_1, GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOB, GPIO_Pin_7, GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOF, GPIO_Pin_0, GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOB, GPIO_Pin_2, GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOB, GPIO_Pin_3, GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOB, GPIO_Pin_4, GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOB, GPIO_Pin_5, GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOE, GPIO_Pin_6, GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOC, GPIO_Pin_1, GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOC, GPIO_Pin_0, GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOD, GPIO_Pin_7, GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOB, GPIO_Pin_5, GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOB, GPIO_Pin_7, GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOD,GPIO_Pin_5,GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOD,GPIO_Pin_4,GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOB,GPIO_Pin_6,GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOA,GPIO_Pin_7,GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOE,GPIO_Pin_0,GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOE,GPIO_Pin_1,GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOE,GPIO_Pin_2,GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOE,GPIO_Pin_3,GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOE,GPIO_Pin_4,GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOE,GPIO_Pin_5,GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOD,GPIO_Pin_0,GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOD,GPIO_Pin_6,GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOE,GPIO_Pin_7,GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOC, GPIO_Pin_2, GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOC, GPIO_Pin_3, GPIO_Mode_In_PU_No_IT);
  GPIO_Init(GPIOC, GPIO_Pin_4, GPIO_Mode_In_PU_No_IT);
  CLK_PeripheralClockConfig(CLK_Peripheral_USART1, DISABLE);
  CLK_PeripheralClockConfig(CLK_Peripheral_TIM2, DISABLE);
  CLK_PeripheralClockConfig(CLK_Peripheral_TIM1, DISABLE);

  PWR_UltraLowPowerCmd(ENABLE);
  CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);
  CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_LSE);
  CLK_SYSCLKSourceSwitchCmd(ENABLE);
  while (CLK_GetSYSCLKSource() != CLK_SYSCLKSource_LSE){};
  CLK_HSEConfig(CLK_HSE_OFF);
  CLK_HaltConfig(CLK_Halt_FastWakeup,ENABLE);//快速唤醒
  halt();
}


INTERRUPT_HANDLER(EXTIE_F_PVD_IRQHandler, 5)
{
  lowpower_config();
  PWR_PVDITConfig(DISABLE);

}


回帖(1)

1652711011.026500

2024-5-9 16:40:46
要在STM8L151主电掉电的情况下进入Active-halt模式(只启用RTC)使用电池供电,您需要按照以下步骤操作:

1. 配置电源管理器:首先,您需要配置电源管理器以允许进入低功耗模式。您已经提供了部分电源管理初始化代码,但还需要配置一些其他参数。

```c
void power_init(void) {
    PWR_DeInit(); // 重置电源管理器
    PWR_PVDLevelConfig(PWR_PVDLevel_3V05); // 设置电源电压检测阈值
    PWR_PVDCmd(ENABLE); // 启用电源电压检测
    PWR_FastWakeUpCmd(ENABLE); // 启用快速唤醒功能
    PWR_PVDITConfig(ENABLE); // 启用PVD中断
}
```

2. 配置时钟:为了在Active-halt模式下使用RTC,您需要配置时钟系统以使用LSE(低速度外部时钟)或LSI(低速度内部时钟)作为RTC时钟源。

```c
void clock_init(void) {
    CLK_DeInit(); // 重置时钟系统
    CLK_HSECmd(DISABLE); // 禁用外部高速时钟
    CLK_LSEConfig(CLK_LSE_ON); // 启用低速度外部时钟
    while (CLK_GetFlagStatus(CLK_FLAG_LSEReady) == RESET); // 等待LSE稳定
    CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE); // 启用RTC时钟
    RTC_ITConfig(RTC_IT_ALR, ENABLE); // 启用RTC闹钟中断
}
```

3. 配置RTC:在进入Active-halt模式之前,您需要配置RTC以使用LSE或LSI作为时钟源,并设置闹钟以唤醒MCU。

```c
void rtc_init(void) {
    RTC_DeInit(); // 重置RTC
    RTC_WaitForSynchro(); // 等待RTC同步
    RTC_LSEConfig(RTC_LSE_ON); // 设置RTC时钟源为LSE
    RTC_ITConfig(RTC_IT_ALR, ENABLE); // 启用RTC闹钟中断
    RTC_AlarmStructInit(RTC_AlarmStruct); // 初始化RTC闹钟结构
    RTC_SetAlarm(RTC_Format_BIN, RTC_AlarmStruct); // 设置RTC闹钟
    RTC_AlarmCmd(ENABLE); // 启用RTC闹钟
}
```

4. 进入Active-halt模式:在配置好电源管理器、时钟和RTC之后,您可以通过以下代码进入Active-halt模式。

```c
void enter_active_halt_mode(void) {
    PWR_ActiveHaltModeCmd(ENABLE); // 进入Active-halt模式
    while (1) {
        if (RTC_GetITStatus(RTC_IT_ALR) != RESET) { // 检查RTC闹钟中断
            RTC_ClearITPendingBit(RTC_IT_ALR); // 清除RTC闹钟中断标志
            // 在此处添加您的正常工作代码
            break; // 退出Active-halt模式
        }
    }
}
```

5. 唤醒MCU:当RTC闹钟触发时,MCU将被唤醒并执行您在`enter_active_halt_mode`函数中的正常工作代码。完成正常工作后,您可以再次进入Active-halt模式以节省能量。

请注意,您需要根据您的具体需求调整上述代码。例如,您可能需要调整RTC闹钟设置以适应您的应用场景。此外,确保在主电恢复后使用上电复位电路复位MCU,以便重新进入正常工作模式。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分