STM32L152 の Low-Power run モードへの入り方

この表題の件、STMicroelectronics の提供する Example にもあるのだが、 サンプルをビルドして走らせると、Low power run モードに移行するのに失敗する。
(デバッガだけの問題かも)

以下の修正でいけたのでメモ

元コード・Low-Power run モードへの移行


void HAL_PWREx_EnableLowPowerRunMode(void)
{
  /* Enters the Low Power Run mode */
  *(__IO uint32_t *) CR_LPSDSR_BB = (uint32_t)ENABLE;
  *(__IO uint32_t *) CR_LPRUN_BB  = (uint32_t)ENABLE;
}


ビットアクセスのために、レジスタの各Bit を32ビットに拡張するアドレス(BIT BAND REGION)を使用してますね。
Reference P.49



これを以下のように改造(関数名代えてます)

改造版・Low-Power run モードへの移行


static volatile void LowPowerRun(){
  do{
     PWR->CR |= PWR_CR_LPSDSR;
     PWR->CR |= PWR_CR_LPRUN;
  }  while(__HAL_PWR_GET_FLAG(PWR_FLAG_REGLP) == RESET);
}


同様に通常モードへの移行コード

元コード・通常モードへの移行


HAL_StatusTypeDef HAL_PWREx_DisableLowPowerRunMode(void)
{
  /* Exits the Low Power Run mode */
  *(__IO uint32_t *) CR_LPRUN_BB  = (uint32_t)DISABLE;
  *(__IO uint32_t *) CR_LPSDSR_BB = (uint32_t)DISABLE;
  return HAL_OK;
}


改造版・通常モードへの移行


static volatile void ExitLowPowerRun(){
  do{
     PWR->CR &= ~PWR_CR_LPRUN;
     PWR->CR &= ~PWR_CR_LPSDSR;
  }  while(__HAL_PWR_GET_FLAG(PWR_FLAG_REGLP) != RESET);
}




注意点

 Low-Power run モード中はST-Link でのデバッグがうまくいかない。
(さすがにクロック 65536KHz ではシリアル通信はキビシイ、USBは論外)
LEDか何かで状態が分るようにする必要がある。