|
为了使用vTaskList()和vTaskGetRunTimeStats()这两个函数打印系统信息,我在freertos+deepsleep的例程中加了一个定时器GPTIM0,结果只要一开这个定时器的中断,程序就会运行一会儿后死机,少则几秒钟,多则几小时。关闭该定时器的中断,就不会死机
初始化函数:
void MF_GPTIM0_TimerBase_Init(void)
{
/*IO CONFIG*/
FL_GPTIM_InitTypeDef TimerBaseInitStruct;
NVIC_ConfigTypeDef InterruptConfigStruct;
TimerBaseInitStruct.prescaler = 1;
TimerBaseInitStruct.counterMode = FL_GPTIM_COUNTER_DIR_UP;
TimerBaseInitStruct.autoReload = 0xffU;
TimerBaseInitStruct.autoReloadState = FL_ENABLE;
TimerBaseInitStruct.clockDivision = FL_GPTIM_CLK_DIVISION_DIV1;
FL_GPTIM_Init(GPTIM0,&TimerBaseInitStruct );
FL_GPTIM_EnableIT_Update(GPTIM0 );
InterruptConfigStruct.preemptPriority = 0x03;
NVIC_Init(&InterruptConfigStruct,GPTIM0_IRQn );
Debug_DelayTicks=0;
FL_GPTIM_Enable(GPTIM0);
}
中断函数(优先级=3):
void GPTIM0_IRQHandler()
{
if(FL_GPTIM_IsEnabledIT_Update(GPTIM0) && FL_GPTIM_IsActiveFlag_Update(GPTIM0))
{
Debug_DelayTicks++;
FL_GPTIM_ClearFlag_Update(GPTIM0);
}
}
曾怀疑过是不是这个定时器意外把睡眠唤醒了,导致系统错乱,于是改了以下这段:
void prvSleep(void)
{
FL_LPTIM32_EnableIT_CC(LPTIM32, FL_LPTIM32_CHANNEL_1);
//使能LPTIMER的外设中断
NVIC_DisableIRQ(GPTIM0_IRQn );
NVIC_DisableIRQ(LPTIM_IRQn);
NVIC_SetPriority(LPTIM_IRQn, 2);
NVIC_EnableIRQ(LPTIM_IRQn);
sleepConfig();
FL_LPTIM32_DisableIT_CC(LPTIM32, FL_LPTIM32_CHANNEL_1);
NVIC_EnableIRQ(GPTIM0_IRQn );
}
结果还是不行,请问怎么破
|
|