Instrucción WFI que ralentiza la interrupción SYStick

Configuré mi kit de relajación Infineon para una frecuencia máxima (120 MHz). Configuré mi SYSTick para una interrupción periódica de 10 ms. Para ahorrar energía, uso una instrucción de ensamblador WFI cada vez que mi procesador está inactivo. WFI (esperar interrupción) debe poner el procesador en modo de bajo consumo hasta que ocurra una interrupción. Entonces mi procesador debería activarse cada 10 ms. Pero de alguna manera, esta instrucción WFI redujo mi frecuencia de interrupción a casi 3 veces y se activa cada tres interrupciones. ¿Cuál puede ser la razón posible por la que WFI no se despierta en cada interrupción?

¿La hoja de datos dice algo sobre cuánto tiempo lleva despertarse del modo de bajo consumo? ¿También menciona la latencia de interrupción y cualquier retraso en llegar a la frecuencia máxima? ¿Puede proporcionar un enlace a la hoja de datos? ¿Qué reloj funciona durante el modo de bajo consumo?
¿Cómo sabes que solo se despierta cada tercera interrupción? ¿Es posible que su MCU entre en un modo de suspensión más profundo, lo que reduce la frecuencia central?
Enlace a la hoja de datos: keil.com/dd/docs/datashts/infineon/xmc4500/xmc4500_um.pdf La hoja de datos no dice nada sobre la latencia de interrupción. Habilité el reloj del sistema (CCU) en el registro de SleepCR para contrarrestar cualquier efecto de activación del reloj, pero fue en vano. @Roger Rowland
@corecode Tengo una variable que se incrementa en cada interrupción del sistema. Sin WFI, aumenta a 1000 en 10 segundos, pero con WFI, aumenta a solo 330. Esto significa que mi interrupción se manejó en cada tercera llamada. O alternativamente, mi frecuencia efectiva se ha reducido a 3 veces. Mi MCU entra en modo de suspensión (no en suspensión profunda) de forma predeterminada.
Cortex M4F necesita 6 ciclos para volver a funcionar desde WFI normal, no debería ser un problema si los relojes siguen siendo los mismos (que trato de averiguar pero el manual del usuario es horrible). ¿Puede generar el reloj utilizado para sysstick y sondear qué sucede si va a WFI?
@Arsenal En realidad, no puedo dar salida al reloj. Obviamente, hay más de 6 ciclos en 10 ms cuando se ejecuta en 120 MHz. ¿Es posible que WFI también controle el reloj del sistema que produce interrupciones en SYSTick?

Respuestas (1)

No estoy familiarizado con estos dispositivos, pero en el manual del usuario se menciona que:

El estado de suspensión del sistema corresponde al estado de suspensión de la CPU. El estado se ingresa a través de la instrucción WFI o WFE de la CPU. En este estado, el reloj de la CPU se detiene. La fuente del reloj del sistema puede estar alterada. Los relojes de los periféricos están activados de acuerdo con el registro SLEEPCR.

Echando un vistazo a la descripción del registro SLEEPCR se muestra:

Field  Bits Type Description 
SYSSEL 0    rwh  System Clock Selection Value
                 0 -> f OFI clock, 1 -> f PLL clock

como el valor de reinicio de dicho registro es 0, por defecto es el F O F I reloj. Que funciona a 36,5 MHz sin calibrar o 24 MHz calibrado. Tiene un rango de precisión bastante grande si no está calibrado (consulte la hoja de datos ) de al menos + -15%, junto con el hecho de que obtendrá algunos syssticks con 120 MHz nuevamente durante su ejecución, podría resultar ser aproximadamente 40MHz en promedio.

Solución (con suerte): establezca el bit SYSSEL en 1.

Gracias por el consejo. No se me ocurrió. Estaba configurando el bit CCU en el registro SLEEPCR.