首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STM32 WFI在被调用后立即退出

STM32 WFI在被调用后立即退出
EN

Stack Overflow用户
提问于 2018-09-19 18:11:40
回答 2查看 1.7K关注 0票数 1

我运行FreeRTOS并将tickless设置为空闲。我想让STM32L432KC芯片进入STOP2模式,但问题是WFI指令会立即退出。

我想使用RTC WAKEUP中断唤醒芯片。

RTC是这样初始化的:

代码语言:javascript
复制
  /* Disable RTC registers write protection */
  LL_RTC_DisableWriteProtection(RTC);

  // Disable wake up timer to modify it.
  LL_RTC_WAKEUP_Disable(RTC);

  // Wait until the registers could get changed.
  while(!LL_RTC_IsActiveFlag_WUTW(RTC))
        ;

  /* Setting the Wakeup time to 60 s */
  LL_RTC_WAKEUP_SetAutoReload(RTC, 60 - 1);

  // CKSPRE has 1Hz frequency.
  LL_RTC_WAKEUP_SetClock(RTC, LL_RTC_WAKEUPCLOCK_CKSPRE);

  /* Enable RTC registers write protection */
  LL_RTC_EnableWriteProtection(RTC);

  LL_EXTI_EnableRisingTrig_0_31(LL_EXTI_LINE_20);
  LL_EXTI_EnableIT_0_31(LL_EXTI_LINE_20);

我跳过了CubeMX生成的样板初始化代码。

FreeRTOSConfig.h中,我将无记号空闲配置为使用post和pre挂钩:

代码语言:javascript
复制
#define configUSE_TICKLESS_IDLE                     1

// You must manually convert milliseconds to ticks because pdMS_TO_TICKS won't work here.
#define configEXPECTED_IDLE_TIME_BEFORE_SLEEP       7

extern void pre_sleep(long unsigned int *expected_idle_time); 
#define configPRE_SLEEP_PROCESSING(xExpectedIdleTime) pre_sleep(xExpectedIdleTime)

extern void post_sleep(long unsigned int *expected_idle_time);
#define configPOST_SLEEP_PROCESSING(xExpectedIdleTime) post_sleep(xExpectedIdleTime)

pre_sleep函数将xExpectedIdleTime设置为0,以通知在预挂接中显式调用WFI

代码语言:javascript
复制
void pre_sleep(long unsigned int *expected_idle_time)
{

    *expected_idle_time = 0;

    enter_sleep_mode(LL_PWR_MODE_STOP2);
}

void post_sleep(long unsigned int *expected_idle_time) { }

进入休眠模式的函数:

代码语言:javascript
复制
void enter_sleep_mode(uint32_t low_power_mode)
  /* ######## ENABLE WUT #################################################*/
  /* Disable RTC registers write protection */
  LL_RTC_DisableWriteProtection(RTC);

  /* Enable wake up counter and wake up interrupt */
  /* Note: Periodic wakeup interrupt should be enabled to exit the device
     from low-power modes.*/
  LL_RTC_WAKEUP_Enable(RTC);
  LL_RTC_EnableIT_WUT(RTC);
  LL_RTC_ClearFlag_WUT(RTC);

  /* Enable RTC registers write protection */
  LL_RTC_EnableWriteProtection(RTC);

  /* ######## ENTER IN SLEEP MODE ######################################*/
  /** Request to enter a sleep mode.
    * Following procedure describe in STM32L4xx Reference Manual
    * See PWR part, section Low-power modes.
    */
  /* Reset Internal Wake up flag */
  LL_RTC_ClearFlag_WUT(RTC);

  /* Check that PWR Internal Wake-up is enabled */
  if (LL_PWR_IsEnabledInternWU() == 0)
  {
    /* Need to enable the Internal Wake-up line */
    LL_PWR_EnableInternWU();
  }

  /* Set the sleep mode */
  LL_PWR_SetPowerMode(low_power_mode);

  /* Set SLEEPDEEP bit of Cortex System Control Register */
  LL_LPM_EnableDeepSleep();

  /* This option is used to ensure that store operations are completed */
#if defined ( __CC_ARM)
  __force_stores();
#endif

  /* Request Wait For Interrupt */
  __WFI();
}

WAKEUP处理程序:

代码语言:javascript
复制
void RTC_WKUP_IRQHandler(void)
{
  if(LL_RTC_IsActiveFlag_WUT(RTC))
  {
    LL_RTC_ClearFlag_WUT(RTC);
    LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_20);
    xTaskNotifyFromISR(wakeup_task_handle);
  }
  else
  {
    NVIC_DisableIRQ(RTC_WKUP_IRQn);
  }
}

我检查了NVIC是否有任何挂起的中断,可以看到ICPRISPR寄存器都设置为零。

WFI也会在Debug Entry请求时退出,但即使我不进行调试(我使用STLinkV2),它也会立即退出。

我错过了什么?

EN

回答 2

Stack Overflow用户

发布于 2018-09-20 15:57:02

问题是,即使调试器连接到电路板上,它也不会工作。

只需断开STLink调试器的连接即可解决此问题。即使连接了调试器,但没有电源连接到调试器,调试器也无法工作。

票数 0
EN

Stack Overflow用户

发布于 2019-05-14 20:42:55

你可能没有阻止SysClk。该时钟将每毫秒产生一个中断,因此中断WFI。尝试添加:

代码语言:javascript
复制
   HAL_SuspendTick();
   // WFI 
   HAL_ResumeTick();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52403440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档