4 votos

Dormir en Arm Cortex

Estoy tratando de poner un cortex m4 procesador (m3 con dsp extensiones), para dormir un poco menos de un segundo. Quiero ser capaz de decir a dormir, a continuación, un segundo más tarde, o cuando se pulsa un botón, recoger justo donde lo dejé. He mirado en el manual de referencia y VLP o LLS modos de ver como se ajusta a mis necesidades. Idealmente me gustaría una glorificado función de retardo, para que el sueño de un segundo. No sé cómo empezar a entrar en ese modo o la forma de programar el NVIC. Estoy usando C en bare metal.

Cualquier ayuda sería muy apreciada.

Aquí está el código:

#include "IntervalTimer.h"

//The following is where the SLEEPDEEP flag is at
#define SCR         (*((volatile unsigned long *) 0xE000ED10))

volatile uint32_t timerCounter0;
boolean printNow = false;

void timerCallback0() {
  timerCounter0++;
  printNow = true;
}

void setup() {
  SCR = SCR | 0x04;    //Set SLEEPDEEP
  Serial.begin(true);
  IntervalTimer timer0;
  timer0.begin(timerCallback0, 1000000);
}

void loop() {
  if (printNow) {
    Serial.println(timerCounter0);
    printNow = false;
    asm("wfi\n");
  }
}

3voto

jarrodn Puntos 99

No estoy seguro de que el MCU está utilizando exactamente, así que me registré en la STM32F4 manual de referencia, el que estoy más familiarizado. Desde los modos de suspensión son implementados por el núcleo ARM, debe ser similar a la de cualquier otro Cortex M4 MCU. La sección 5.3.3 discutir entrar/salir del modo sueño (comprobar hacia fuera para más detalles).

Para entrar en modo de suspensión:

El modo de suspensión se introduce por la ejecución de la WFI (Esperar Para la Interrupción) o WFE (Esperar para el Evento) instrucciones.

Dependiendo de algún registro del valor, el modo de suspensión se introduce de forma inmediata o sólo después de salir de la prioridad más baja de ISR.

Para salir después de 1 segundo, necesitará configurar un temporizador que va a desencadenar un ISR después de 1 segundo. (Ya que es la MCU aplicación dependientes, voy a omitir los detalles para la STM32F4.) Si el sueño que entró en modo con WIFI, esta interrupción (así como cualquier otra interrupción) se despierta el MCU. Si usted necesita un control más detallado sobre lo que debería reactivar el MCU, se debe dormir con WFE y la instalación de los sucesos de activación (sección 10.2.3 del manual).

1voto

Andrew Walker Puntos 9038

Usted cuenta con muchos períodos de un corto temporizador, cada uno de vencimiento de los cuales requiere que usted se despierte. Para obtener el máximo ahorro de energía, se necesita poner el calendario completo de hardware, de modo que sólo generar una interrupción al final de dicho período, o al menos con mucha frecuencia. Probablemente, usted debe mirar en el uso de un valor mayor en el temporizador de registro, y posiblemente con un prescalar divisor. (Incluso si usted está despertando sólo un par de veces por segundo, y así no perder mucho poder, esto hará que sea un dolor para medir el consumo de energía a menos que se utilice un ámbito medir a través de un resistor en serie)

Sin embargo, incluso entonces usted probablemente todavía se ejecuta en un rápido PLL reloj, que consume una gran cantidad de energía. Así que para más ahorro de energía que se desea cambiar a una baja potencia de la fuente de reloj como un interno o externo KHz-rango de copia de seguridad del reloj, o al menos deshabilitar el PLL y, posiblemente, poner encima de todo el sistema de reloj prescale divisor.

Y también es probable que tengan muchas partes del chip de encendido y la velocidad de reloj que no son necesarios en el modo de suspensión - probablemente desea apagar y de-reloj todo excepto el GPIO, controlador de interrupciones, módulo de contador y la memoria RAM.

Además, se necesita auditar su diseño de circuito para los casos donde usted está conduciendo una señal en contra de una subida o resistencia pull-down, o incluso dejar una entrada digital flotan en la vecindad de una lógica de la transición.

Conseguir un sistema para microamperios modos en espera puede ser un implicadas en el proyecto, como eliminar una fuente de lixiviación después de la otra. También mirar hacia fuera para el depurador, serial, USB, etc conexiones - no sólo como posibles cargas, pero también el potencial de sigilo fuentes de energía para el sistema de alimentación mientras omitir lo que usted está midiendo (sí, usted puede obtener energía a partir de los datos de los pines).

0voto

Adrian Puntos 134

No estoy seguro si esto es lo que estaba buscando, pero me voy a ir de todos modos.

El uso de C, usted debe ser capaz de tener el procesador no hacer nada (es decir: el sueño) el uso de la sleep() función de <time.h>.

Repaso:

#include <time.h>

 int main() {
     int sleepms;
     sleep(sleepms); //Sleep for "sleepms" milliseconds
 }

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X