ST意法半导体
直播中

李秀兰

8年用户 1538经验值
私信 关注
[问答]

STM32F107无法从待机模式正确唤醒的原因?如何处理?

我正在尝试使用 STM32F 的待机模式并通过 WKUP (PA0) 引脚唤醒它。
进入待机似乎还可以,功耗达到 4 uA。
如果我用 RESET 引脚重置 MCU,它会正常启动:在 250 ms 延迟后它会进入睡眠状态并消耗 4 uA
https://i.stack.imgur.com/nDM6f.png
但是,如果我用 WKUP 引脚唤醒它,它会表现得很奇怪:消耗量保持在“运行”水平,我看到我的 250 延迟周期结束,MCU 不断重启而不是进入睡眠状态。
https://i.stack.imgur.com/KYPqM.png
我的代码非常简单:
  • #include
  • #ifdef __cplusplus
  • extern "C"
  • #endif
  • void Systick_Handler(void)
  • {
  •         HAL_IncTick();
  •         HAL_SYSTICK_IRQHandler();
  • }
  • void Error_Handler()
  • {
  •         __asm("bkpt 255");
  •         __asm("bx lr");
  • }
  • void SystemClock_Config(void)
  • {
  •         RCC_OscInitTypeDef RCC_OscInitStruct = { 0 };
  •         RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 };
  •         __HAL_RCC_AFIO_CLK_ENABLE();
  •         __HAL_RCC_PWR_CLK_ENABLE();
  •         /** Initializes the RCC Oscillators according to the specified parameters
  •         * in the RCC_OscInitTypeDef structure.
  •         */
  •         RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSI;
  •         RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  •         RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  •         RCC_OscInitStruct.LSIState = RCC_LSI_ON;
  •         RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  •         RCC_OscInitStruct.PLL2.PLL2State = RCC_PLL_NONE;
  •         if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  •         {
  •                 Error_Handler();
  •         }
  •         /** Initializes the CPU, AHB and APB buses clocks
  •         */
  •         RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
  •                       | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
  •         RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  •         RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  •         RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  •         RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  •         if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  •         {
  •                 Error_Handler();
  •         }
  •         /** Configure the Systick interrupt time
  •         */
  •         __HAL_RCC_PLLI2S_ENABLE();
  • }
  • int main(void)
  • {
  •         HAL_Init();
  •         SystemClock_Config();
  •         __HAL_AFIO_REMAP_SWJ_NOJTAG();
  •         HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
  •         HAL_Delay(250);
  •         HAL_PWR_EnterSTANDBYMode();
  • }







回帖(1)

李莉

2023-1-29 14:47:37
在 Internet 的帮助下,在勘误表中找到了解决方案:


  • int main(void)
  • {
  •         HAL_Init();
  •       
  •         SystemClock_Config();

  •         __HAL_AFIO_REMAP_SWJ_NOJTAG();
  •         HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1);
  •       
  •         PWR->CR |= PWR_CR_CWUF;
  •         if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET) {
  •                 /* System resumed from STANDBY mode */
  •                 __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);
  •                 /* Clear StandBy flag */
  •                 __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
  •                 /* Clear Wakeup flag */
  •         }
  •       
  •         HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);

  •         HAL_Delay(250);
  •       
  •         HAL_PWR_EnterSTANDBYMode();      
  • }
举报

更多回帖

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