STM8S(105K4)使用笔记——活跃停机模式的配置与AWU唤醒

STM8S提供的可编程的电源管理

等待(Wait)模式:

  • 通过WFI指令进入。该模式下CPU将停止运行,但外设与中断控制器仍保持运行。
  • 该模式下可以通过外设时钟门控、降低CPU时钟频率、选择低功耗时钟源(LSI,HSI)进一步降低功耗。
  • 在等待模式下,所有寄存器与RAM的内容不变,进入等待模式前所定义的时钟配置也不会在进入等待模式后改变。
  • 当一个内部或外部中断产生时,CPU从等待模式唤醒并恢复工作。

停机(Halt)模式:

  • 通过HALT指令进入。该模式下主时钟停止,即由fMASTER提供时钟的CPU及所有外设均被关闭。
  • 该模式下可以通过关闭主电压调节器、进一步降低功耗。需注意,主电压调节器关闭后,仅LSI时钟源可用,HSE时钟源对于低功耗电压调节器来说电流消耗太大。
  • 该模式下,FLASH是处于POWERDOWN状态的,此时FLASH处于低功耗状态,唤醒时间较长。可以通过配置FLASH_CR1的HALT位置1,使FLASH在进入停机模式时处于STANDBY状态,此时FLASH处于等待状态,唤醒时间短,但功耗较高。
  • 在等待模式下,所有寄存器与RAM的内容不变,进入停机模式前所定义的时钟配置也不会在进入等待模式后改变。
  • HSI RC的启动速度比HSE快,可以通过进入停机模式前将时钟切换为HSI作为fMASTER的时钟源,减少MCU的唤醒时间。
  • 当一个外部中断产生时,CPU从停机模式唤醒并恢复工作。

活跃停机(Active Halt)模式:

  • 使能AWU后,通过HALT指令进入。该模式下主振荡器、CPU及几乎所有外设都被停止。如果AWU和IWD已被使能,则只有LSI RC与HSE仍处于运行状态,以驱动AWU和IWD计数器。
  • 该模式下可以通过关闭主电压调节器、进一步降低功耗。需注意,主电压调节器关闭后,仅LSI时钟源可用,HSE时钟源对于低功耗电压调节器来说电流消耗太大。
  • 该模式下,FLASH是处于STANDBY状态的,此时FLASH处于等待状态,唤醒时间短,但功耗较高。可以通过配置FLASH_CR1的AHALT位置1,使FLASH在进入停机模式时处于POWERDOWN状态,此时FLASH处于低功耗状态,唤醒时间较长。
  • 在活跃等待模式下,所有寄存器与RAM的内容不变,进入活跃停机模式前所定义的时钟配置也不会在进入等待模式后改变。
  • HSI RC的启动速度比HSE快,可以通过进入活跃停机模式前将时钟切换为HSI作为fMASTER的时钟源,减少MCU的唤醒时间。
  • 当一个外部中断产生,或AWU中断产生时,CPU从活跃停机模式唤醒并恢复工作。

0、文章简介

本文章仅讲述活跃停机模式配置与通过AWU中断的唤醒。


1、AWU的时间间隔介绍

AWU的时间间隔取决于AWU_TBR寄存器的AWUTB[3:0]位的值与AWU_PAR寄存器的APR[5:0]位的值。

  • AWUTB[3:0]配置参考表
AWUTB Time interval range Interval range(fLS=128kHz) APRDIV
0b0001 2/fLS - 64/fLS 0.015625 ms - 0.5 ms 2 to 64
0b0010 2×32/fLS - 2×64/fLS 0.5ms - 1.0 ms 32 to 64
0b0011 2×2×32/fLS - 22×64/fLS 1 ms - 2 ms 32 to 64
0b0100 22×2×32/fLS - 23×64/fLS 2 ms - 4 ms 32 to 64
0b0101 23×2×32/fLS - 24×64/fLS 4 ms - 8 ms 32 to 64
0b0110 24×2×32/fLS - 25×64/fLS 8 ms - 16 ms 32 to 64
0b0111 25×2×32/fLS - 26×64/fLS 16 ms - 32 ms 32 to 64
0b1000 26×2×32/fLS - 27×64/fLS 32 ms - 64 ms 32 to 64
0b1001 27×2×32/fLS - 28×64/fLS 64 ms - 128 ms 32 to 64
0b1010 28×2×32/fLS - 29×64/fLS 128 ms - 256 ms 32 to 64
0b1011 29×2×32/fLS - 210×64/fLS 256 ms - 512 ms 32 to 64
0b1100 210×2×32/fLS - 211×64/fLS 512 ms - 1024 ms 32 to 64
0b1101 211×2×32/fLS - 212×64/fLS 1.024 s - 2.048 s 32 to 64
0b1110 211×130/fLS - 211×320/fLS 2.080 s - 5.120 s 26 to 64
0b1111 211×330/fLS - 212×960/fLS 5.280 s - 30.720 s 11 to 64
  • APR[5:0]配置参考表
APR APRDIV APR APRDIV APR APRDIV APR APRDIV
00h 2 01h 3 02h 4 03h 5
04h 6 05h 7 06h 8 07h 9
08h 10 09h 11 0Ah 12 0Bh 13
0Ch 14 0Dh 15 0Eh 16 0Fh 17
10h 18 11h 19 12h 20 13h 21
14h 22 15h 23 16h 24 17h 25
18h 26 19h 27 1Ah 28 1Bh 29
1Ch 30 1Dh 31 1Eh 32 1Fh 33
20h 34 21h 35 22h 36 23h 37
24h 38 25h 39 26h 40 27h 41
28h 42 29h 43 2Ah 44 2Bh 45
2Ch 46 2Dh 47 2Eh 48 2Fh 49
30h 50 31h 51 32h 52 33h 53
34h 54 35h 55 36h 56 37h 57
38h 58 39h 59 3Ah 60 3Bh 61
3Ch 62 3Dh 63 3Eh 64
  • 时间间隔配置
    假设此时fLS=128kHz,需要的时间间隔为175ms,选择时间范围应为128 ms - 256 ms
    则AWUTB[3:0]的值为0b1010。
    APRDIV = 175 ms × 128kHz / 2AWUTB[3:0] - 1
    = 0.175 s × 128000Hz / 29
    = 43.75 ≈ 44
    则APR[5:0]的值为2Ah。

2、AWU的配置

进入活跃停机模式,首先需要配置AWU。

  • 通过官方库"stm8s_awu"提供的函数初始化AWU
/**
  * @brief AWU Initialization Function
  * @param None
  * @retval None
  */
void _AWU_Init(void)
{
  /* Initialization of AWU */

  /* The delay corresponds to the time we will stay in Halt mode */
  AWU_Init(AWU_TIMEBASE_30S);
  // 官方库共提供16档预设的唤醒中断触发时长与1档无唤醒中断,作为AWU_Init()的参数,它们分别是:
  // AWU_TIMEBASE_NO_IT:无自动唤醒中断
  // AWU_TIMEBASE_250US,AWU_TIMEBASE_500US,AWU_TIMEBASE_1MS,AWU_TIMEBASE_2MS
  // AWU_TIMEBASE_4MS,AWU_TIMEBASE_8MS,AWU_TIMEBASE_16MS,AWU_TIMEBASE_32MS
  // AWU_TIMEBASE_64MS, AWU_TIMEBASE_128MS,AWU_TIMEBASE_256MS,AWU_TIMEBASE_512MS
  // AWU_TIMEBASE_1S,AWU_TIMEBASE_2S,AWU_TIMEBASE_12S,AWU_TIMEBASE_30S
}
  • 以175 ms时间间隔为例,通过寄存器初始化AWU(可以自定义唤醒时长)
/**
  * @brief AWU Initialization Function
  * @param None
  * @retval None
  */
void _AWU_Init(void)
{
  /* Initialization of AWU */
  
  /* Set the TimeBase */
  AWU->TBR &= (uint8_t)(~0x0F);
  AWU->TBR |= 0x0A;
  
  /* Set the APR divider */
  AWU->APR &= (uint8_t)(~0x3F);
  AWU->APR |= 0x2A;
  
  /* Enable the AWU peripheral */
  AWU->CSR |= 0x10;
}

3、配置软件中断

在活跃停机模式中触发AWU中断,AWU_CSR的AWUF将会置1。
AWU_CSR的AWUF置1,将进入INTERRUPT_HANDLER(AWU_IRQHandler, 1)中断函数中,通过读取AWU->CSR寄存器清除该标志位。

/**
  * @brief Auto Wake Up Interrupt routine.
  * @param  None
  * @retval None
  */
INTERRUPT_HANDLER(AWU_IRQHandler, 1)
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
  /* Clear AWU peripheral pending bit */
  AWU_GetFlagStatus();
  // AWU->CSR;
}

4、低功耗可选项

  • 主电压调节器控制
    主电压调试器关闭后,功耗将进一步降低。此时仅LSI时钟可用,且CPU唤醒时长增加。
// 通过官方库"stm8s_clk"提供的函数关闭主电压调试器
/* Enable Slow Active Halt Wake Up Moed*/
CLK_SlowActiveHaltWakeUpCmd(ENABLE);
/* Disable Slow Active Halt Wake Up Moed*/
// CLK_SlowActiveHaltWakeUpCmd(DISABLE);

// 通过寄存器关闭主电压调试器
/* Enable Slow Active Halt Wake Up Moed*/
/* Set S_ACTHALT bit */
CLK->ICKR |= 0x20;
/* Reset S_ACTHALT bit */
// CLK->ICKR &= (uint8_t)(~0x20);
  • FLASH低功耗模式控制
    活跃停机模式的默认FLASH低功耗模式为开启。此时功耗将降低,但FLASH唤醒时长增加。
// 通过官方库"stm8s_flash"提供的函数控制FLASH低功耗模式
/* Set Flash Low Power Mode To Power Down */
FLASH_SetLowPowerMode(FLASH_LPMODE_POWERDOWN);
/* Set Flash Low Power Mode To STANDBY */
//FLASH_SetLowPowerMode(FLASH_LPMODE_STANDBY);

// 通过寄存器控制FLASH低功耗模式
/* Set Flash Low Power Mode */
/* Set Flash Low Power Mode To Power Down */
FLASH->CR1 &= (uint8_t)(~0x04);
/* Set Flash Low Power Mode To STANDBY */
// FLASH->CR1 |= (uint8_t)(~0x04);

5、例程

void main(void)
{
  /*
    系统时钟配置;
    外设配置;
    ……
  */
  /* AWU configuration    ---------------------------------------- */
  _AWU_Init();
  /*
    低功耗可选项;
  */
  /* enable interrupts   ----------------------------------------- */
  enableInterrupts();
  while (1)
  {
    /*
      业务代码;
    */
  	if(/* 进入低功耗条件成立 */) {
  	  FlagStatus flag_HaltHold = TRUE;
  	}
  	while (flag_HaltHold) {
  	  halt();
  	  if(/* 唤醒条件成立 */) {
  	    flag_HaltHold = FALSE;
  	  }
  	}
  }
}

注意:

  • 进入活跃停机模式后,由于IWDG基于LSI时钟,因此IWDG不会停止计数;而由于WWDG基于HSI,因此WWDG将停止计数,但仍推荐在进入活跃停机模式前,刷新WWDG计数器。
  • 进入活跃停机模式后,GPIO的状态将保持进入活跃停机模式前的状态,这一部分的电流消耗不能忽视。若有必要,请将所有GPIO引脚设置浮空输入,进一步降低功耗。

6、AWU寄存器简介

  • CSR控制/状态寄存器
    STM8S(105K4)使用笔记——活跃停机模式的配置与AWU唤醒_第1张图片
  • APR异步分频寄存器
    STM8S(105K4)使用笔记——活跃停机模式的配置与AWU唤醒_第2张图片
  • TBR时基选择寄存器
    STM8S(105K4)使用笔记——活跃停机模式的配置与AWU唤醒_第3张图片

你可能感兴趣的:(嵌入式相关)