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.