我运行FreeRTOS并将tickless设置为空闲。我想让STM32L432KC芯片进入STOP2模式,但问题是WFI指令会立即退出。
我想使用RTC WAKEUP中断唤醒芯片。
RTC是这样初始化的:
/* 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挂钩:
#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:
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) { }进入休眠模式的函数:
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处理程序:
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是否有任何挂起的中断,可以看到ICPR和ISPR寄存器都设置为零。
WFI也会在Debug Entry请求时退出,但即使我不进行调试(我使用STLinkV2),它也会立即退出。
我错过了什么?
发布于 2018-09-20 15:57:02
问题是,即使调试器连接到电路板上,它也不会工作。
只需断开STLink调试器的连接即可解决此问题。即使连接了调试器,但没有电源连接到调试器,调试器也无法工作。
发布于 2019-05-14 20:42:55
你可能没有阻止SysClk。该时钟将每毫秒产生一个中断,因此中断WFI。尝试添加:
HAL_SuspendTick();
// WFI
HAL_ResumeTick();https://stackoverflow.com/questions/52403440
复制相似问题