En la actualidad, casi todo equipo electronico posee microcontroladores ARM (Advanced RISC Machine), como por ejenplo, computadores, celulares, electrodomesticos, equipos industriales de comunicación, medicina, industria automotiva, etc. Casi todas las empresas fabricantes de microcontroladores producen microcontroladores ARM, como por ejemplo, Intel, Texas Instruments, NXP, ST, Atmel, Freescale, Etc. Por estos motivos, es muy importante conocer y rogramar estos microcontroladores. En este articulo veremos que son faciles de programar y muy similares a los microcontroladores de 8 bits.

Microcontroladores de 8, 16, 32 bits son prácticamente iguales en lo que se refiere a su funcionamiento. Su principal diferencia está en la cantidad de información que manejan, pero la forma de ejecutar instrucciones es prácticamente similar.

 

Figura 1
Figura 1

 

La mayoría de fabricantes de microcontroladores, adoptaron los microcontroladores ARM como base para la fabricación de sus productos. Vea la Figura 1. La siguiente es una lista de algunos fabricantes que producen microcontroladores ARM o están licenciados para su uso:

3Comp

Actel

Alcatel

Analog Device

AppliedMicro

Atmel

Broadcom

Cirrus Logic

Cypress

Ember

Energy Micro

Freescale

Fujitsu

Holtek

Hyundai

HP

IBM

Infineon

Intel

Lapis

LG

Lucent

Marwell

Microsemi

Microsoft

Milandr

NEC

Nitendo

Nokia

Nordic Semiconductor

Nuvoton

NXP

NVidia

OKI Semiconductor

Qualcomm

Sansung

Sharp

Silicon Laboratories

Socle Technology

SONiX

Spansion

ST Microelectronics

Sony

Texas Instrumental

Toshiba

Triad Semiconductor

VLSI Technology

Yamaha

Winbond

WIZnet

Zilog

ZiiLABS

 

Los microcontroladores ARM son de 32 bits y por ese motivo en lo que sigue de este artículo nos referiremos a ellos como microcontroladores de 32 bits. Existen 3 clasificaciones de microcontroladores ARM:

Cortex-M (Microcontroller) Pueden ser usados en aplicaciones típicas de microcontroladores, como neveras, lavadoras, controles remotos, etc.

Cortex-R (Real Time) Pueden ser usados en reproductores MP3, controles de motores, robotica, etc.

Cortex-A (Application) Pueden ser usados con equipos que requieren sistemas operativos, celulares, tablets, computadores, etc.

 

MICROCONTROLADORES DE 8 Y 32 BITS.

 

Figura 2
Figura 2

 

La Figura 2 muestra la arquitectura básica para un micrcontrolador de 8 bits y la Figura 3 muestra la arquitectura básica de un microcontrolador ARM de 32 bits; Su principal diferencia radica en el ancho de sus buses. En un microcontrolador típico de 8 bits, el bus de datos es de 8 bits y el bus de direcciones de 16 bits. En el microcontrolador de 32 bits, tanto el bus de direcciones y de datos son de 32 bits. Mas, por lo demás sigue siendo igual, es decir, posee una CPU (Unidad Central de Proceso), memoria de programa, memoria RAM y puertos de entrada y salida. También, la forma de buscar instrucciones en la memoria de programa y ejecutarlas sigue siendo igual para el programador, aunque en los microcontroladores ARM a nivel de hardware, la búsqueda y ejecución de instrucciones ha sido optimizado.

Figura 3
Figura 3

 

En los procesadores ARM (Figura 3), podemos observar la presencia de un puente (Bridge) en los buses de datos y direcciones. Esto se hace por que los microcontroladres ARM procesan instrucciones a una gran velocidad y los periféricos necesitan de una velocidad más baja para funcionar. Así podemos notar que la memoria de programa y la memoria RAM están conectador directamente al procesador y los periféricos a través del puente.

La Figura 4 muestra las configuraciones comunes de memoria de programa para microcontroladores de 8 y 32 bits. En los microcontroladores de 8 bits, es normal encontrar memorias de programa del tamaño de 1K, 2K, 4K, 8K, 16K y 32 KBytes. En los microcontroladores de 32 bits es normal encontrar tamaños de memoria de programa de 128K, 256K y 512 Kbytes.

 

Figura 4
Figura 4

 

 

La Figura 5 muestra las configuraciones comunes de memoria de datos para microcontroladores de 8 y 32 bits. En los microcontroladores de 8 bits, es normal encontrar memorias de datos (RAM), del tamaño de 64, 128, 256 Bytes. En los microcontroladores de 32 bits es normal encontrar tamaños de memoria de datos de 8K, 16K 32K y 64 Kbytes.

 

  Figura 5
Figura 5

 

La Figura 6 muestra datos comunes en hexadecimal para microcontroladores de 8 bits y la Figura 7 para microcontroladores de 32 bits. En microcontroladores de 8 bits, es común que estos datos oscilen entre 0x00 y 0XFF o entre 0x0000 y 0xFFFF. En microcontroladores de 32 bits, es común que estos datos oscilen entre 0x00000000 y 0XFFFFFFFF. Es una cuestión de magnitudes y de adaptarse al formato hexadecimal de 32 bits que consta de 4 bytes (0x FF FF FF FF).

 

Figura 6
Figura 6

 

 

Figura 7
Figura 7

 

La Figura 8 muestra datos de números enteros comunes para microcontroladores de 8 bits y la Figura 9 para microcontroladores de 32 bits. En microcontroladores de 8 bits, es común que estos datos oscilen entre 0 y 255 o 0 y 65.535. En microcontroladores de 32 bits, es común que estos datos oscilen entre 0 y 4.294.967.295. Aquí también es una cuestión de magnitudes y de adaptarse al formato decimal de 32 bits que consta de 4 bytes.

 

Figura 8
Figura 8

 

 

Figura 9
Figura 9

 

La Figura 10 muestra registros de configuración de entradas salidas para microcontroladores de 8 bits y la Figura 11 para microcontroladores de 32 bits. En microcontroladores de 8 bits estos registros son de 8 bits, mientras que en los microcontroladores de 32 bits, son de 32 bits. Aquí también es una cuestión de adaptarse a visualizar y leer los registros de 32 bits, en otras palabras practicar.

 

Figura 10
Figura 10

 

 

Figura 11
Figura 11

 

 

LA CPU.

La Figura 12 muestra la configuración básica de la CPU para microcontroladores de 8 bits, donde es común tener un acumulador, uno o varios registros auxiliares, un registro de indexación que normalmente se usa para direccionar datos en forma indirecta, un registro que apunte a la pila (Stack Pointer), usado principalmente para almacenar las direcciones de retorno cuando se llaman a subrutinas, un registro contador de programa (PC) y un registro de Estado.

 

Figura 12
Figura 12

 

La Figura 13 muestra la configuración básica de la CPU para microcontroladores de 32 bits, normalmente formada por 16 registros de 32 bits, nombrados de r0 hasta r15 y registros para el estado del programa en ejecución. Los registros r0 hasta r13 son usados para propósito general, pudiendo ser acumuladores, registro para indexación o direccionamiento indirecto, datos. El r13 es usado para apuntar a la pila (Stack Pointer). El registro r14 (Link Register) es usado para almacenar la dirección de retorno cuando se llaman a subrutinas. El registro r15 (Counter Program) es usado como contador de programa. También posee registro de estado.

 

Figura 13
Figura 13

 

 

MEMORIA.

En microcontroladores de 8 bits, las memorias son más fáciles de manejar por causa de su magnitud pequeña. En microcontroladores de 32 bits la memoria esta mapeada en un espacio de 32 bits, es decir de 0x00000000 hasta 0XFFFFFFFF. En la Figura 14 podemos ver un mapa de memoria de 32 bits, dividido en 8 regiones de 0.5 GBytes (512 MBytes). Los Microntroladores ARM usan esta división para ubicar las diferentes memorias y periféricos del microcontrolador. Así, queda fácil ubicar las regiones donde están ubicadas las memorias.

 


 

 

En la Figura 15 podemos observar un mapa de memoria para un microcontrolador de 32 bits ARM Cortex-M3, donde la parte más baja del mapa de memoria es usado para el código (Code), le sigue la memoria RAM interna, los periféricos, la memoria RAM externa, dispositivos externos, buses de periféricos y un área para uso del fabricante. Aquí también se trata de práctica para visualizar y entender el mapa de memoria de los microcontroladores de 32 bits.

 

 

 

 


 

 

 

ARQUITECTURA.

La Figura 16 muestra el diagrama en bloque de una configuración básica de un microcontrolador de 8 bits. En el diagrama podemos notar, la CPU, la memoria de programa, la memoria RAM o de datos, los periféricos o entradas y salidas. Los perifericos más comunes en un microcontrolador de 8 bits son: las GPIO (General Proposite Input Output) o entradas/salidas de propósito general, las interrupciones, los timer, el watchdog, ADC o conversores analógico para digital.

 

Figura 16
Figura 16

 

 

La Figura 17 muestra el diagrama en bloque de una configuración básica de un microcontrolador de 32 bits. También posee: la CPU, memoria de programa y de datos, periféricos o entradas/salidas. Podemos notar que tiene GPIO, Interrupciones, timers, watchdog, ADC o conversores analógico para digital, , DAC o conversores digital para analógico, interfaces I2C, SPI, UART, USB, CAN, Ethernet.

 

 

Figura 17
Figura 17

 

 

En la Figura 17 podemos notar la existencia de 2 buses llamados:

AHB o Bus Avanzado del Alto desempeño (Advanced High-performance Bus)

APB o Bus Avanzado de Perifericos (Advanced Peripheral Bus)

Como comentado anteriormente, son usados 2 buses por causa de la velocidad de trabajo de los periféricos, que son mucho más lentas que la frecuencia de operación de la CPU y las memorias. Por ejemplo mientras la CPU y memorias pueden estar trabajando a una frecuencia de 72 MHz, los periféricos pueden trabajar a 36 MHz. En algunos microcontroladores ARM, el bus APB es dividido en 2 buses (APB1 y APB2). Esto se hace porque algunos periféricos son más lentos que otros.

Una de las propiedades de los microcontroladore ARM, es que para cada periférico es necesario habilitar su pulso de clock y su voltaje para que puedan trabajar. Por defecto todos los periféricos están sin voltaje para que el consumo de corriente del microcontrolador sea lo más bajo posible. La Figura 18 muestra como el clock del sistema es habilitado para cada periférico por una compuerta AND. Sin esta habilitación, las operaciones de lectura y escrita que se hagan sobre el periférico no tienen ningún efecto.

Ahora ya estamos en capacidad de entender un diagrama de un microcontrolador ARM. La Figura 19 muestra el diagrama en bloques de un microcontrolador ARM Cortex-M3, específicamente el STM32F103xx el cual es fabricado por ST. Podemos observar que la frecuencia máxima de bus AHB es de 72MHz. Los buses APB1 y APB2 pueden trabajar a diferentes frecuencias.

 

Figura 18
Figura 18

 

 

Figura 19
Figura 19

 

El bus APB1 puede funcionar a una frecuencia entre 24 a 36 MHz y están conectados los siguientes periféricos:

TIM2

TIM3

TIM4

USART2

USART3

SPI2

I2C1

I2C2

CAN

USB

SRAM

WDG

 

El bus APB2 puede funcionar a una frecuencia entre 48 y 72 MHz y están conectados los siguientes periféricos:

WAKEUP

GPIOA

GPIOB

GPIOC

GPIOD

GPIOE

TIM1

SPI1

USART1

ADC1

ADC2

Temperature Sensor.

 

La Figura 20 muestra el diagrama esquemático del microcontrolador STM32F103C8T6. Podemos observar la relación entre los periféricos y los pines.

 


 

 

 

PROGRAMA EXEMPLO.

Es hora de entender cómo podemos programar el microcontrolador. La mayoría de fabricantes de microcontroladores ARM, entregan al usuario funciones listas para utilizar por los periféricos (librerías). En muchos microcontroladores de 8 bits, era necesario crear estas funciones.

En microcontroladores de 8 bits para escribir en un puerto es típico una línea de código como:

P0 = contador;

Para leer un puerto es típico una línea de código como:

temperatura = P2;

 

En los microcontroladores de 32 bits esto se hace por medio de funciones que el propio fabricante entrega para que sean usadas por el programador. Por ejemplo para escribir en un puerto se usa:

GPIO_WriteBit(GPIOA, GPIO_Pin_6, 1);

La línea anterior de código escribirá un 1 lógico (nivel alto) en el pin 6 del puerto A.

 

Para leer un puerto en un microcontrolador de 32 bits podemos usar una línea de código como la siguiente:

pulsador = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0);

 

La anterior línea de código lee el pin 0 del puerto B. Como podemos percibir es fácil usar estas funciones para leer o escribir en los puertos. Dependiendo del fabricante del microcontrolador el nombre de estas funciones puede variar, pero normalmente son muy similares.

El siguiente es un programa ejemplo simple para encender y apagar un LED, de forma intermitente:

int main()

{

Init_IO();

 

while(1)

{

GPIO_WriteBit(GPIOA, GPIO_Pin_6, 1);

delay_stm(1000);

GPIO_WriteBit(GPIOA, GPIO_Pin_6, 0);

delay_stm(1000);

}

}

La función Init_IO() se encarga de habilitar y configurar el puerto A y sus respectivos clocks. La función delay_stm(1000), retarda el microcontrolador en 1 segundo. Esta función recibe un parámetro en milisegundos. 1000 = 1 segundo.

El siguiente es un programa ejemplo, para encender y apagar el LED, desde que el pulsador P1 conectado al Pin 0 del puerto B este presionado.

int main()

{

Init_IO();

 

while(1)

{

If ( GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0 )

{

GPIO_WriteBit(GPIOA, GPIO_Pin_6, 1);

delay_stm(1000);

GPIO_WriteBit(GPIOA, GPIO_Pin_6, 0);

delay_stm(1000);

}

}

}

Para editar código para microcontroladores ARM existen muchas herramientas como por ejemplo KEIL, IAR, etc. La Figura 21 muestra el entorno de desarrollo del compilador KEIL.

 


 

 

Analizando un poco lo visto hasta aquí, programar un microcontrolador de 8 bits y uno de 32 bits, prácticamente es igual. La diferencia radica en la magnitud de los datos, su velocidad de procesamiento que es mucho mayor, su mayor numero de periféricos. En próximos artículos, vamos a programar los periféricos y hacer proyectos útiles para iniciarnos en la programación de los microcontroladores ARM de una manera sencilla y de fácil comprensión.

 

 

Buscador de Datasheets



N° de Componente