# MSP430

MSP430 es una familia de microcontroladores fabricados por Texas Instruments. Construido con una CPU de 16 bits, el MSP430 está diseñado para aplicaciones embebidas de bajo costo, sistemas inalámbricos y/o de ultra bajo consumo de energía. Esta arquitectura tiene semejanzas con la del procesador DEC PDP-11.
Este dispositivo tiene una gran variedad de configuraciones que se agrupan en familias, con velocidades máximas de procesamiento y capacidades de direccionamiento diferentes, y modelos con diferentes selecciones de entre los siguientes periféricos: diferentes bloques y capacidades de memoria, oscilador interno, temporizadores incluyendo un PWM, temporizador watchdog, USART, bus SPI, bus I²C, 10/12/14/16-bit conversores ADC, y circuitos de apagado y reinicio. Algunos periféricos opcionales no tan usuales incluyen comparadores (que se utilizan con el temporizador para funcionar como un ADC simple), amplificadores operacionales dentro del chip para el acondicionamiento de señales, conversores DAC de 12 bits, controlador de pantalla LCD, multiplicador hardware, y DMA para el manejo de datos entre zonas de memoria y/o los periféricos. A diferencia de las versiones anteriores con EPROM (PMS430E3xx) y ROM enmascarada (MSP430Cxxx), estos dispositivos son programables en sistema a través de JTAG o a través del bootstrap loader (BSL) usando RS-232.

## La CPU del MSP430

La CPU usa una arquitectura von Neumann, con direccionamiento simple para las instrucciones y los datos. La memoria se direcciona por bloque de 1 byte, y los pares de byte se combinan en forma endianness para hacer palabras de 16 bits.
El procesador contiene 16 registros de 16 bits. R0 es el contador de programa, R1 es el puntero de pila, R2 es el registro de estado, y R3 es un registro especial denominado generador constante, que provee acceso a 6 valores constantes utilizados comúnmente, sin requerir el uso de un operando adicional. Los registros desde el R4 hasta el R15 son para uso general.
El conjunto de instrucciones disponible es muy simple; hay 27 instrucciones agrupadas en tres familias. La mayoría de las instrucciones son de 8 bit (byte) y 16 bit (palabra), dependiendo del valor de un bit llamado B/W, este bit es 1 para instrucciones de 8 bits y 0 para las de 16 bits. Las operaciones de byte sobre la memoria afectan solo al byte direccionado, mientras que las operaciones de byte sobre los registros al byte más significativo.
Conjunto de instrucciones del MSP430 :
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Instrucción |
| 0 | 0 | 0 | 1 | 0 | 0 | opcode | opcode | opcode | B/W | As | As | register | register | register | register | Single-operand arithmetic |
| 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | B/W | As | As | register | register | register | register | RRC Rotate right through carry |
| 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | As | As | register | register | register | register | SWPB Swap bytes |
| 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | B/W | As | As | register | register | register | register | RRA Rotate right arithmetic |
| 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | As | As | register | register | register | register | SXT Sign extend byte to word |
| 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | B/W | As | As | register | register | register | register | PUSH Push value onto stack |
| 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | As | As | register | register | register | register | CALL Subroutine call; push PC and move source to PC |
| 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | RETI Return from interrupt; pop SR then pop PC |
| 0 | 0 | 1 | condition | condition | condition | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | Conditional jump; PC = PC + 2×offset |
| 0 | 0 | 1 | 0 | 0 | 0 | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | JNE/JNZ Jump if not equal/zero |
| 0 | 0 | 1 | 0 | 0 | 1 | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | JEQ/JZ Jump if equal/zero |
| 0 | 0 | 1 | 0 | 1 | 0 | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | JNC/JLO Jump if no carry/lower |
| 0 | 0 | 1 | 0 | 1 | 1 | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | JC/JHS Jump if carry/higher or same |
| 0 | 0 | 1 | 1 | 0 | 0 | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | JN Jump if negative |
| 0 | 0 | 1 | 1 | 0 | 1 | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | JGE Jump if greater or equal |
| 0 | 0 | 1 | 1 | 1 | 0 | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | JL Jump if less |
| 0 | 0 | 1 | 1 | 1 | 1 | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | 10-bit signed offset | JMP Jump (unconditionally) |
| opcode | opcode | opcode | opcode | source | source | source | source | Ad | B/W | As | As | destination | destination | destination | destination | Two-operand arithmetic |
| 0 | 1 | 0 | 0 | source | source | source | source | Ad | B/W | As | As | destination | destination | destination | destination | MOV Move source to destination |
| 0 | 1 | 0 | 1 | source | source | source | source | Ad | B/W | As | As | destination | destination | destination | destination | ADD Add source to destination |
| 0 | 1 | 1 | 0 | source | source | source | source | Ad | B/W | As | As | destination | destination | destination | destination | ADDC Add source and carry to destination |
| 0 | 1 | 1 | 1 | source | source | source | source | Ad | B/W | As | As | destination | destination | destination | destination | SUBC Subtract source from destination (with carry) |
| 1 | 0 | 0 | 0 | source | source | source | source | Ad | B/W | As | As | destination | destination | destination | destination | SUB Subtract source from destination |
| 1 | 0 | 0 | 1 | source | source | source | source | Ad | B/W | As | As | destination | destination | destination | destination | CMP Compare (pretend to subtract) source from destination |
| 1 | 0 | 1 | 0 | source | source | source | source | Ad | B/W | As | As | destination | destination | destination | destination | DADD Decimal add source to destination (with carry) |
| 1 | 0 | 1 | 1 | source | source | source | source | Ad | B/W | As | As | destination | destination | destination | destination | BIT Test bits of source AND destination |
| 1 | 1 | 0 | 0 | source | source | source | source | Ad | B/W | As | As | destination | destination | destination | destination | BIC Bit clear (dest &= ~src) |
| 1 | 1 | 0 | 1 | source | source | source | source | Ad | B/W | As | As | destination | destination | destination | destination | BIS Bit set (logical OR) |
| 1 | 1 | 1 | 0 | source | source | source | source | Ad | B/W | As | As | destination | destination | destination | destination | XOR Exclusive or source with destination |
| 1 | 1 | 1 | 1 | source | source | source | source | Ad | B/W | As | As | destination | destination | destination | destination | AND Logical AND source with destination (dest &= src) |
NdT: "Palabra de extensión" es la traducción de "Extension Word"
Las instrucciones están formadas por 16 bits, seguidas de hasta dos palabras de extensión de 16 bits. Hay cuatro modos de direccionamiento, especificados por el bit 2 como campo. Algunas versiones especiales pueden ser construidas usando R0, y otros modos aparte del acceso directo al registro usando R2 (el registro de estado) y R3 (el generador constante) son interpretados de manera especial.
Los modos de direccionamiento indexado añaden una palabra de extensión de 16 bits a la instrucción.
Modos de direccionamiento del MSP430 :
| As | Register | Syntax | Description |
| 00 | n | Rn | Register direct. The operand is the contents of Rn. |
| 01 | n | x(Rn) | Indexed. The operand is in memory at address Rn+x. |
| 10 | n | @Rn | Register indirect. The operand is in memory at the address held in Rn. |
| 11 | n | @Rn+ | Indirect autoincrement. As above, then the register is incremented by 1 or 2. |
| Addressing modes using R0 (PC) ||||
| 01 | 0 (PC) | LABEL | Symbolic. x(PC) The operand is in memory at address PC+x. |
| 11 | 0 (PC) | #x | Immediate. @PC+ The operand is the next word in the instruction stream. |
| Addressing modes using R2 (SP) and R3 (CG), special-case decoding ||||
| 01 | 2 (SR) | &LABEL | Absolute. The operand is in memory at address x. |
| 10 | 2 (SR) | #4 | Constant. The operand is the constant 4. |
| 11 | 2 (SR) | #8 | Constant. The operand is the constant 8. |
| 00 | 3 (CG) | #0 | Constant. The operand is the constant 0. |
| 01 | 3 (CG) | #1 | Constant. The operand is the constant 1. There is no index word. |
| 10 | 3 (CG) | #2 | Constant. The operand is the constant 2. |
| 11 | 3 (CG) | #-1 | Constant. The operand is the constant -1. |
Las instrucciones generalmente consumen un ciclo (de reloj) por palabra adquirida o almacenada, por lo que la duración de las instrucciones va desde 1 ciclo para instrucciones de registro a registro a 6 ciclos para una instrucción con los dos operandos indexados.
Las operaciones de transferencia (Moves) al registro del contador de programa (PC) son posibles y conllevan saltos en el flujo continuo del programa. Los retornos de una subrutina por ejemplo, se implementan así: MOV @SP+, PC. En instrucciones con dos operandos, solo hay un bit "Ad" para especificar el modo de direccionamiento del destino, por lo que solo los modos 00 (directamente a registro) y 01 (indexado) están permitidos. Si tanto el origen como el destino son indexados, la palabra de extensión del origen va primero.
Cuando R0 (PC) o (R1) SP son unsados con el modo de acceso de autoincremeto, siempre son incrementados en dos. Otros registros (desde R4 a R15) son incrementados en el tamaño del operador, 1 o 2 bytes.
El registro de estado ('SR') contiene cuatro bits de estado aritmético, una activado global de las interrupciones, y 4 bits que desabilitan varios relojes para entrar en los modo de bajo consumo. Cuando se atiende una interrupción, el procesador almacena el registro de estado en la pila y limpia los bits de bajo consumo. Si el vector de interrupción no modifica el registro de estado almacenado, al volver de la interrupción, rehabilitara el modo de bajo consumo que estuviese habilitado previamente.

## Mapa de direcciones del MSP430

La disposición general de las direcciones del MSP430 es:

### 0x0000–0x0007

    Registros para funciones especiales del procesador(Registro para el control de interrupciones)

### 0x0008–0x00FF

    Periféricos de 8-bit. Se debe acceder a estos utilizando 8 bits para lectura-escritura.

### 0x0100–0x01FF

    Periféricos de 16-bit. Se debe acceder a estos utilizando 16 bits para lectura-escritura.

### 0x0200–0x09FF

    Hasta 2048 bytes de Memoria RAM.

### 0x0C00–0x0FFF

    1024 bytes de bootstrap loader ROM (para las versiones que incluyen flash ROM).

### 0x1000-0x1100

    256 bytes de data flash ROM (para las versiones que incluyen flash ROM).

### 0x1100–0x38FF

    Extensión de RAM para modelos de más de 2048 bytes de RAM. (0x1100–0x18FF es una copia de 0x0200–0x09FF)

### 0x1100–0xFFFF

    Hasta 60 kilobytes de ROM de programa. el inicio de modelos con ROM más pequeña comienzan en direcciones superiores. Los últimos 16 o 32 bytes son para el vector de interrupción.
Algunos modelos incluyen más the 2048 bytes de RAM; en ese caso la RAM comienza en 0x1100 los primeros 2048 bytes (0x1100–0x18FF) son llevados al intervalo 0x0200–0x09FF para cuestiones de compatibilidad. además, algunos modelos recientes unen las reglas para periféricos de 8 y 16 bits, permitiendo el uso de periféricos de 16-bit en el rango de direcciones de periféricos de 8 bits.
Existe una nueva versión extendida de esta arquitectura (llamada MSP430X) que permite el uso de un espacio de direcciones de 20 bit. Esto permite iniciar la ROM en la dirección 0x10000.

## Familias del MSP430

Existen cuatro familias principales del procesador MSP430. En orden de desarrollo, fueron: La familia '3xx, la familia '1xx, la familia '4xx, y la familia '2xx. Los dígitos después de la letra de familia, identifican el modelo (generalmente un número mayor representa un modelo más potente), el tercer dígito indica la cantidad de memoria integrada, y el cuarto (si es que existe), identifica una variante mínima del modelo.

### MSP430x1xx

    Es la familia básica sin pantalla LCD integrada. Son normalmente más pequeños que el de la familia '3xx.

### MSP430F2xx

    Es similar a la familia '1xx, pero opera con aún menor consumo, soporta velocidades de operación de hasta 16 MHz (las otras familias están limitadas a 8 MHz), y son más precisas (± 2 %) en la sincronía del reloj, lo que los hace más fáciles de operar sin un cristal externo.

### MSP430x3xx

    Es la familia más antigua de esta serie de microcontroladores. Fue diseñada para instrumentos portátiles con pantalla LCD integrada. Incluye un oscilador (frequency-locked loop) que puede sincronizarlo automáticamente con cristales de baja velocidad (32 kHz). Esta familia no soporta memorias EEPROM, solamente ROM y EPROM. Familias posteriores proveyeron solamente soporte flash y ROM.

### MSP430x4xx

    Esta familia es muy similar a la '3xx, también incluye un controlador LCD, pero es mejor y más capaz, y viene en versiones de máscara o flash ROM.

## Periféricos

Los periféricos del MSP430 generalmente son fáciles de utilizar, con direcciones compatibles para la mayoría de los modelos, y no únicamente con registros de solo escritura. Se detalla algunos periféricos como son los puertos, pero incluye otros como ADC, timer, memorias, etc. Pueden encontrar más detalles de los periféricos en TI_MSP430.

### Puertos de entrada-salida (E/S) de propósito general

Tal y como suele ser habitual en microcontroladores, las mayoría de los pines pueden tener varias posibles funcionalidades, asignándose a funciones de periféricos o a pines de entrada/salida ('E/S') de propósito general. Estos pines de entrada/salida se agrupan en grupos de 8 denominados puertos, que se controlan como un bloque que se puede configurar mediante un conjunto de registros de 8 bits.
La familia MSP430 define hasta 11 puertos E/S aunque no todos los modelos cuentan con todos ellos. Los siguientes son algunos de los registros de los pines (distinto a periférico).

#### PxIN

    Puerto x de entrada. Este es un registro de solo lectura, y refleja el estado actual del pin.

#### PxOUT

    Puerto x de salida. Los valores escritos en este registro de lectura/escritura son extraídos a los pines correspondientes cuando están configurados como salida.

#### PxDIR

    Puerto x de dirección de datos. Los bits escritos con un 1 configuran los pines de salida correspondientes. Los bits escritos con 0 configuran los pines para entradas.

#### PxSEL

    Puerto x de selección de función. Los bits escritos con 1 configuran los pines correspondientes para ser utilizados por el periférico especializado. Los bits escritos con 0 configuran los pines para uso de propósito general de E/S. El puerto 0 (solamente los modelos '3xx) no se multiplexa con otros periféricos y no tienen un registro P0SEL.

#### PxREN

    Puerto x para habilitar resistencia (solamente los modelos '2xx). Los bits en este registro habilitan resistencias en pull-up o pull-down en los correspondientes pines siempre que estén configurados como entradas. El tipo de pull se establece con el bit escrito en el registro PxOUT.

#### PxIES

    Puerto x para seleccionar el flanco de interrupción (puertos 0-2 solamente). Selecciona el flanco que causará el bit PxIFG a ser establecido. Cuando el bit de entrada cambia desde la coincidencia con el estado PxIES hacia cuando cambia (es decir cuando un bit en PxIES XOR PxIN cambia desde 0 a 1), el bit correspondiente PxIFG se establece.

#### PxIFG

    Puerto x de bandera de interrupción (puertos 0-2 solamente). Se establece siempre que el pin correspondiente hace que el estado cambie a pedido de PxIES. Puede borrarse solo por software. (Puede también establecerse por software.)

#### PxIE

    Puerto x de habilitación de interrupción (puertos 0-2 solamente). Cuando este bit y el bit correspondiente PxIFG se establecen, se genera una interrupción.
Algunos pines tiene propósitos especiales cuando están como entradas o salidas. (Por ejemplo, los pines de temporizador pueden configurarse para capturar entradas o salidas PWM.) En este caso, el bit PxDIR controla cual de las dos funciones realiza el pin cuando el bit PxSEL se establece. Si hay una sola función especial, entonces generalmente se ignora a PxDIR.
El registro PxIN siempre puede ser leído si se establece el bit PxSEL, pero la generación de interrupción queda deshabilitada. Sise borra PxSEL, las entradas de funciones especiales se congela y se desconecta del pin externo. También, configurando un pin para salida de propósito general no deshabilita la generación de interrupciones.
Mapa de direcciones de los registros de propósito general de E/S :
| | | PxIN | PxOUT | PxDIR | PxSEL | PxIES | PxIE | PxIFG |
| P0 | 0x10 | 0x11 | 0x12 | | 0x13 | 0x14 | 0x15 | |
| P1 | 0x20 | 0x21 | 0x22 | 0x23 | 0x24 | 0x25 | 0x26 | 0x27 |
| P2 | 0x28 | 0x29 | 0x2a | 0x2b | 0x2c | 0x2d | 0x2e | 0x2f |
| P3 | 0x18 | 0x19 | 0x1a | 0x1b | | | | 0x10 |
| P4 | 0x1c | 0x1d | 0x1e | 0x1f | | | | 0x11 |
| P5 | 0x30 | 0x31 | 0x32 | 0x33 | | | | 0x12 |
| P6 | 0x34 | 0x35 | 0x36 | 0x37 | | | | 0x13 |
| P7 | 0x38 | 0x3a | 0x3c | 0x3e | | | | |
| P8 | 0x39 | 0x3b | 0x3d | 0x3f | | | | |
| P9 | 0x08 | 0x0a | 0x0c | 0x0e | | | | |
| P10 | 0x09 | 0x0b | 0x0d | 0x0f | | | | |
Los puertos P7 y P8 se pueden acceder usando cargas y almacenamientos de 16-bit; cuando se usa de esta forma, la combinación se conoce como PA. De forma similar, P9 y P10 pueden combinarse en 16-bit mediante PB.

### Multiplicador por hardware

Algunos modelos de MSP430 incluyen un periférico de multiplicación por hardware mapeados por memoria el cual realiza operaciones de multiplicación-acumulación de 16×16+32→33-bits.
En forma inusual para el MSP430, este periférico incluye un registro implícito de 2-bit de solo lectura, el cual lo hace efectivamente imposible para cambio de contexto.
Los 8 registros usados son:
| Dirección | Nombre | Función |
| 0x130 | MPY | Operando 1 para multiplicación sin signo |
| 0x132 | MPYS | Operando 1 para multiplicación con signo |
| 0x134 | MAC | Operando 1 para multiplicación-acumulación sin signo |
| 0x136 | MACS | Operando 1 para multiplicación-acumulación con signo |
| 0x138 | OP2 | Segundo operando para operación de multiplicación |
| 0x13a | ResLo | Palabra menos significativa para el resultado de la multiplicación |
| 0x13c | ResHi | Palabra más significativa para el resultado de la multiplicación |
| 0x13e | SumExt | Transporte de la multiplicación-acumulación |

## Herramientas de desarrollo

Texas Instruments provee herramientas de desarrollo de software que pueden ser descargadas gratuitamente. El toolchain provisto por TI en la edición Kickstart del compilador C/C++ IAR, el cual está limitado a 4K de código C/C++ en el compilador y depurador (programas en lenguaje ensamblador de cualquier tamaño pueden ser desarrollados y depurados con este toolchain gratuito). TI además provee una versión de Eclipse llamada "Code Composer Essentials", para la cual la versión "Kickstart" puede ser descargada gratuitamente. La comunidad del código abierto produce un software de desarrollo "toolset" gratuitamente disponible (MSPGCC) basado en el GNU toolset, aunque el tamaño de tal código y su rapidez no son tan óptimas como los resultados obtenidos por el compilador comercial. Además varios "toolset" comerciales de desarrollo, los cuales incluyen editor, compilador, "linker", ensamblador, depurador y en casos singulares asistentes de código, están disponibles. VisSim, un lenguaje de diagrama de bloques para desarrollo basado en modelos, puede generar eficiente código-C de punto fijo directamente desde el diagrama. Para un uso inteligente de funciones "inline interrupt", VisSim genera programas de control muy eficientes que pueden acceder a I2C, ADC, PWM etc, en un control de ciclo y usan menos de 1 K flash y 128 bytes RAM.

## Plataformas de desarrollo

La familia MSP430 destaca por la disponibilidad de plataformas de desarrollo de bajo coste. TI ha desarrollado dispositivos con formato de llave USB, el eZ430-F2013, que contiene un MSP430F2013 con algunos pines de entrada y salida accesibles y hardware para funcionamiento, un sistema de programación y supervisión del procesador y un CD con software de desarrollo. Esta herramienta es muy útil para estudiantes y aficionados a la electrónica así como profesionales para el inicio de pequeños proyectos o aplicaciones.
Existen plataformas de desarrollo que trabajan en GNU/Linux o en otros sistemas abiertos, pero no existe soporte directo de TI en estos entornos y las herramientas para la programación de los nuevos procesadores tardan en aparecer al depender del trabajo de voluntarios.
Se encuentra la herramienta MSP430G Launchpad, en la cual se pueden trabajar 8 conversores análogo-digitales de 10 bits tipo SAR, viene equipada con dos módulos de comunicación seriales, en donde se incluyen el hardware del SPI, I2C, UART, IrDa, dos módulos timer. Con una memoria flash con capacidad de hasta 16 kB.

## Interfaz de depuración

Al igual que otros fabricantes de microcontroladores, TI ha desarrollado una interfaz de depuración con dos hilos que está reemplazando el anterior sistema 'JTAG' usado para esa función. La herramienta 'eZ430 Development Tool' contiene un sistema USB 'Flash Emulation Tool' ("FET") para la programación y simulación de esto microcontroladores usando este nuevo sistema simplificado denominado por TI "Spy-Bi-Wire". En la actualidad solamente se encuentra disponible en los modelos MSP430F20xx, MSP430F22x2 y MSP430F22x2.