Ir al contenido principal

Modos de bajo consumo en MSP430

En el artículo hicimos un repaso al módulo de reloj, que está íntimamente ligado a los modos de bajo consumo del microcontrolador MSP430. Una de las ventajas de éste sobre otros microcontroladores es la gran flexibilidad que ofrece a la hora de configurar los relojes y, por ende, el modo de bajo consumo.

El MSP430 permite la desactivación de las fuentes de reloj y de los propios relojes, lo que permite desactivar la CPU y los periféricos mientras no sean necesarios. Además, el módulo de gestión de energía (PMM o Power Management Module) hace posible incluso apagar el core (CPU) del microcontrolador.

MSP430 Launchpad

En la práctica, la mayoría de las aplicaciones no requieren que la CPU o los periféricos estén siempre funcionando. Imaginemos un dispositivo IoT que envía información sobre contaminación atmosférica a un servidor remoto. En este caso, no es necesario estar constantemente consultando el estado de los sensores y enviando información, sino que puede hacerse cada pocos segundos o incluso minutos. Si la operación de lectura de los sensores más en envío de los datos necesitan, por simplificar, 1 segundo y esta operación se realiza cada 60 segundos, aproximadamente el 98% del tiempo el microcontrolador está ocioso, pero consumiendo energía. Si "dormimos" la CPU y los periféricos durante ese tiempo, el consumo cae drásticamente, y eso en un dispositivo autónomo es lo más importante. Además de poder "dormirlo" necesitaremos una forma de "despertarlo", lo que en general conseguiremos mediante el uso de interrupciones. Evidentemente, esta operación de dormir-despertar conlleva una penalización en tiempo que podría no ser viable en un dispositivo que necesita responder en tiempo real.

Modos de bajo consumo

Los modos de bajo consumo se configuran mediante el registro de estado de la CPU (registro SR).

Registro de estado SR

En concreto se utilizan los bits SCG0, SCG1, OSCOFF y CPUOFF. Mediante la activación de estos bits podemos seleccionar alguno de los modos de bajo consumo definidos en la siguiente tabla.

Modos de bajo consumon LPM

Los modos LPM3.4 y LPM4.5 no están disponibles en todas las versiones del microcontrolador. En el MSP430F5529, que es el que estoy usando, el modo LPM3.5 no está disponible.

Con todos los bits a 0 el microcontrolador se encuentra en estado activo. En este modo, la CPU y las fuentes de reloj están activas, por lo tanto es el modo de mayor consumo. A cambio la respuesta es más rápida.

En el modo LPM0 y LPM1 se para la CPU como consecuencia de la desactivación del reloj MCLK. La diferencia entre ambos es que en el modo LPM0 el bloque FLL se desactiva si no se está usando el DCO y en el modo LPM1 el FLL se desactiva siempre.

En el modo LMP2 y LMP3 además de MCLK (y por ende la CPU) también se desactiva SMCLK. ACLK permanece activo. Se diferencian en que LPM2 mantiene parte del FLL activo lo que facilita una más rápida estabilización del DCO (y también algo más de consumo).

En el modo LPM4 la CPU y todos los relojes de desactivan.

Los modos LPM3.5 y LPM4.5 paran la CPU y todos los relojes, pero además el PMM desactiva la alimentación del core, lo que implica la perdida del contenido de los registros y la memoria RAM dinámica.

Código de ejemplo

Partimos del mismo código de ejemplo que ya utilizamos en el artículo sobre interrupciones. La única diferencia con aquel código es una sola línea dentro del bucle while:

__low_power_mode_3();

Esta línea hace que el microcontrolador entre en modo LPM3 (es fácil adivinar cómo se entra en, por ejemplo, LPM2 ¿no?), lo que implica que el reloj MCLK (por lo tanto también la CPU) y SMLK están parados. Sin embargo ACLK está activo, lo que permite que el sistema mantenga los sistemas periféricos en marcha y por lo tanto, aunque la CPU esté parada, en el momento en que se produzca una interrupción, la rutina de gestión la va a tratar. Cuando esto sucede, obviamente el reloj MCLK se pone en marcha y permite que se ejecute dicha rutina. Al terminar la rutina restaura desde la pila los valores del registro de estados SR, que recordemos, permiten gestionar los modos de bajo consumo. Así pues, tras la ejecución de la rutina de interrupción el microcontrolador vuelve al estado de bajo consumo en el que se encontraba antes de entrar, ya que se restaura el registro SR tal y como estaba antes de la interrupción.

#include <msp430.h>
int main(void)
{
  WDTCTL = WDTPW + WDTHOLD; // Detiene el watchdog
  P1DIR |= BIT0;            // P1.0 (LED) como salida digital
  P1REN |= BIT1;	    // Resistencia en P1.1 (pulsador derecho)
  P1OUT |= BIT1;	    // Modo pull-up
  P1IE |= BIT1;		    // habilita la interrupción de P1.1
  P1IES |= BIT1;	    // Interrupción por flanco de bajada
  P1IFG &= ~(BIT1);	    // baja flag de interrupción de P1.1
  // Activar interrupciones
  // también puede usarse: __enable_interrupt()
  __bis_SR_register(GIE);   
  // bucle infinito.
  while (1) {
    __low_power_mode_3(); // entramos en modo LPM3
    __no_operation();
  }
}
#pragma vector=PORT1_VECTOR
__interrupt
void P1_ISR(void) {
  if (P1IFG & BIT1) {	// comprobar fuente de la interrupción P1.1
    if (P1IN & BIT1) {	// Estado de P1.1: si está a 1 (no pulsado)
      P1OUT &= ~BIT0;   // Apaga LED
      P1IES |= BIT1;	// activación por flanco de bajada
    } else {            // y si no (pulsado),
      P1OUT |= BIT0;    // Enciende LED
      P1IES &= ~BIT1;	// activación por flanco de subida
    }
    P1IFG &= ~BIT1;	// puesta a cero del flag de interrupción P1.1
  }
}

Vamos a medir, polímetro en mano, qué efecto produce la línea que hemos añadido en el consumo del sistema. Podemos medir la corriente consumida usando el jumper de 3.3V de la placa launchpad (al quitar el jumper tenemos dos pines sobre los que medir).

Consumo en modo activo

Como se puede observar en la imagen, sin utilizar el modo de bajo consumo (modo activo) tenemos un consumo en stand by (sin tener en cuenta el consumo al pulsar el botón y encender el LED) de alrededor de 1mA. Ahora veamos el consumo en modo LPM3.

Modo bajo consumo LPM3

Tenemos 0,66mA de consumo en LPM3. Este consumo aun puede mejorarse, pero nos vale como ejemplo práctico del uso de los modos de bajo consumo del MSP430.

Comentarios

Entradas populares de este blog

Creando firmas de virus para ClamAV

ClamAv es un antivirus opensource y multiplataforma creado por Tomasz Kojm muy utilizado en los servidores de correo Linux. Este antivirus es desarrollado por la comunidad, y su utilidad práctica depende de que su base de datos de firmas sea lo suficientemente grande y actualizado. Para ello es necesario que voluntarios contribuyan activamente aportando firmas. El presente artículo pretende describir de manera sencilla cómo crear firmas de virus para ClamAV y contribuir con ellas a la comunidad.

Ingeniería inversa de un parche de Microsoft Windows

A estas alturas ya hemos asumido que la seguridad total en Internet es, cuanto menos, un mito. Ningún software está libre de vulnerabilidades, y por mucha auditoría, test de intrusión o pruebas de fuzzing que nos empeñemos en hacer, ninguna metodología puede demostrar sin lugar a dudas que un software es 100% seguro. Ante este panorama, hay dos tendencias mayoritarias a la hora de hacer públicas las vulnerabilidades. Por un lado, están los que piensan que cuando se descubre un fallo ha de hacerse público de forma inmediata. En este escenario, la publicación de una vulnerabilidad es el pistoletazo de salida para una carrera entre el desarrollador para sacar el parche y los "malos" para lograr explotarla. Esta política es conocida como full disclosure . Por otro lado, tenemos a los siguen una política responsible disclosure , que abogan por mantener la vulnerabilidad en secreto hasta la salida del parche por parte del desarrollador. Sin entrar en cuestiones filosóficas que no...

Manejo de grafos con NetworkX en Python

El aprendizaje computacional es un área de investigación que en los últimos años ha tenido un auge importante, sobre todo gracias al aprendizaje profundo (Deep Learning). Pero no todo son redes neuronales. Paralelamente a estas técnicas, más bien basadas en el aprendizaje de patrones, también hay un auge de otras técnicas, digamos, más basadas en el aprendizaje simbólico. Si echamos la vista algunos años atrás, podemos considerar que quizá, la promesa de la web semántica como gran base de conocimiento ha fracasado, pero no es tan así. Ha ido transmutándose y evolucionando hacia bases de conocimiento basadas en ontologías a partir de las cuales es posible obtener nuevo conocimiento. Es lo que llamamos razonamiento automático y empresas como Google ya lo utilizan para ofrecerte información adicional sobre tus búsquedas. Ellos lo llaman Grafos de Conocimiento o Knowledge Graphs . Gracias a estos grafos de conocimiento, Google puede ofrecerte información adicional sobre tu búsqueda, ad...