Usando el modo de parada en freeRTOS en un STM32L0 y despertando usando la interrupción EXTI

0

Quiero hacer un dispositivo de bajo consumo, ejecutando freeRTOS. Hay 3 hilos, que planeaba suspender normalmente en el modo de parada y reanudar la ejecución en función de las interrupciones EXTI.

Tenía la intención de hacerlo por este gancho inactivo

void vApplicationIdleHook(){
    trace_printf("Enter Idle \n");
    HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
}

Lo que debería ser activado por esta interrupción

void initInterrupts(){
    HAL_NVIC_EnableIRQ(EXTI0_1_IRQn);
}

void EXTI0_1_IRQHandler(void) {
     __HAL_GPIO_EXTI_CLEAR_IT(BTN_PIN);
     trace_printf("interrupt\n");
     xTaskResumeFromISR(thread_handle);
}

Está funcionando hasta ahora, ya que mi consumo de energía cae de 1.7mA a 1.5mA de alguna manera, supongo, pero encuentro dos problemas:

  • que parece que el RTOS ya no se activa
  • el depurador pierde su conexión con el tablero

No sé, lo que me falta. ¿Cuáles son los pasos generales para habilitar RTOS después de ingresar al modo de parada?

Con respecto a la conexión del depurador, la declaración de impresión llega de alguna manera a la PC, pero openOCD se queja por

Info : Previous state query failed, trying to reconnect 
Error: jtag status contains invalid mode value - communication failure 
Polling target stm32l0.cpu failed, trying to reexamine

He configurado el registro de debbuging como este, pero no parece suficiente. ¿Puedo mantener el puente de depuración en modo de parada? Me refiero a que el bit DBGMCU_CR_DBG_STOP me hace suponer que sí, pero ¿qué opciones deben configurarse allí?

__DBGMCU_CLK_ENABLE();
DBGMCU->CR |= DBGMCU_CR_DBG_SLEEP_Msk | DBGMCU_CR_DBG_STOP_Msk | DBGMCU_CR_DBG_STANDBY_Msk;

Para mí es muy confuso, que la MCU aún puede enviar a la PC, pero el OpenOCD no puede reanudar o mantener la conexión.

Muchas gracias a todos por cualquier sugerencia.

    
pregunta Paul Würtz

0 respuestas

Lea otras preguntas en las etiquetas