| 
 
金牌会员  
 
	积分2357金钱2357 注册时间2019-10-29在线时间380 小时 | 
 
50金钱 
| 请教大家一个问题,我用F030芯片,裸机时,进入stop模式,然后唤醒可以正常的;在运行freertos时,进入stop模式,能唤醒(调试发现执行到了进入stop模式代码后),但是不会进入到任务中,执行任务相关的代码 
 RTC闹钟中断 5S进一次
 
 
 复制代码void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{
  RTC_TimeTypeDef sTime = {0};
//  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_11);
  HAL_GPIO_TogglePin(CH6_GPIO_Port,CH6_Pin);
  HAL_GPIO_TogglePin(CH6_GPIO_Port,CH6_Pin);
  sTime.Hours = 0;
  sTime.Minutes = 0;
  sTime.Seconds = 0;
  sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  sTime.StoreOperation = RTC_STOREOPERATION_RESET;
  HAL_RTC_SetTime(hrtc, &sTime, RTC_FORMAT_BIN);
  stop_cnt++;
}
 
 进入stop模式的代码
 
 在空闲任务中执行进入stop模式的代码复制代码void MCU_stop_FUNC(void)
{
  if(stop_cnt>4){//RTC中断中 每5s累加一次
      stop_cnt=0;
      
      HAL_GPIO_TogglePin(CH5_GPIO_Port,CH5_Pin);
      HAL_GPIO_TogglePin(CH5_GPIO_Port,CH5_Pin);
      HAL_ADC_Stop_DMA(&hadc);
      rf_sleep();
    
//    vTaskSuspend(rfTaskHandle);
//    vTaskSuspend(otherTaskHandle);
       HAL_GPIO_WritePin(LED_RED_GPIO_Port,LED_RED_Pin,GPIO_PIN_SET);
       HAL_GPIO_WritePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin,GPIO_PIN_SET);
       HAL_GPIO_WritePin(LED_BLUE_GPIO_Port,LED_BLUE_Pin,GPIO_PIN_SET);
       SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;  
      HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI ); //进入stop  PWR_MAINREGULATOR_ON  PWR_LOWPOWERREGULATOR_ON
       
      HAL_GPIO_TogglePin(CH5_GPIO_Port,CH5_Pin);
      HAL_GPIO_TogglePin(CH5_GPIO_Port,CH5_Pin);
      SystemClock_Config();
      HAL_ADC_Start_DMA(&hadc, (uint32_t*)adcBuf, 2);
      rf_out_of_sleep();
      HAL_GPIO_WritePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin,GPIO_PIN_RESET);  
      SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
//vTaskResume(rfTaskHandle);
//vTaskResume(otherTaskHandle);
//osKernelStart();//开启任务调度
    }
}
 复制代码static portTASK_FUNCTION( prvIdleTask, pvParameters )
{
        /* Stop warnings. */
        ( void ) pvParameters;
        for( ;; )
        {
                /* See if any tasks have deleted themselves - if so then the idle task
                is responsible for freeing the deleted task's TCB and stack. */
                prvCheckTasksWaitingTermination();
MCU_stop_FUNC();
............................
}
目前想实现的就是在任务跑时,能正常唤醒,执行任务
 
 我看了一些帖子,说进入stop前,关闭SysTick,唤醒后,初始化系统时钟,并开启SysTick;但是我试了还是不能正常跑起来
 
 请教下该如何在执行操作系统时(freertos),正常唤醒,正常执行任务??
 
 谢谢啦
 
 
 
 
 
 
 | 
 
最佳答案
查看完整内容[请看2#楼] 找到问题了
是这个函数有问题
 rf_out_of_sleep();
之前的是
参考SX1280文档这里,
后续我重新创建了个带有freertos的工程,进入低功耗,在唤醒,是没问题的,然后我就慢慢找目前的这个工程,结果发现
文档中这里写着,NSS拉低会唤醒...........
改成这样,可以正常唤醒并跑任务了。
下面是我测试创建的工程 |