Módulo 0.2

Anatomía de un microcontrolador

CPU, memoria y periféricos: los bloques fundamentales

Santi Scagliusi, PhD

Comenzar arrow_downward
developer_board
CPU
ARM Cortex-M4
save
Flash
1 MB de código
memory
RAM
256 KB de datos
settings_input_component
Periféricos
GPIO, UART, BLE...

¿Qué hay dentro del chip?

Un microcontrolador integra todo lo necesario para ejecutar programas en un solo chip.

developer_board
CPU
ARM Cortex-M4 @ 64MHz
save
Flash
1 MB
memory
RAM
256 KB
settings_input_component
Periféricos
I/O
hub

Sistema en un chip (SoC)

Todo integrado: procesador, memoria y periféricos en un solo encapsulado.

route

Bus de sistema

Conecta CPU, memoria y periféricos. Todos comparten el mismo espacio de direcciones.

pin_drop

Memory-mapped I/O

Los periféricos se acceden como posiciones de memoria. Escribir en una dirección puede encender un LED.

bolt

Bajo consumo

Diseñado para funciónar con baterías. Modos de bajo consumo integrados.

La CPU: ARM Cortex-M4

El procesador ejecuta las instrucciones de tu programa, una a una.

developer_board Componentes internos

Registros (R0-R15)
R0-R12
SP (R13)
LR (R14)
PC (R15)

16 registros de 32 bits para operaciones rápidas

Unidad Aritmético-Logica (ALU)
ADD SUB MUL AND OR ...
calculate Unidad de coma flotante (FPU)

El Cortex-M4 incluye FPU opcional. El nRF52840 la tiene activada para cálculos con decimales.

cycle Ciclo Fetch-Decode-Execute

1

Fetch (Buscar)

La CPU lee la siguiente instrucción desde la memoria Flash usando el Program Counter (PC).

PC = 0x00000100
2

Decode (Decodificar)

La CPU interpreta que operación debe realizar y que operandos necesita.

ADD R0, R1, R2
3

Execute (Ejecutar)

La ALU realiza la operación y guarda el resultado. El PC avanza a la siguiente instrucción.

R0 = R1 + R2
speed

A 64 MHz, el nRF52840 ejecuta hasta 64 millones de ciclos por segundo

Cada instrucción simple toma 1-3 ciclos

Memoria Flash

Donde vive tu código. No se borra al quitar la alimentación.

save

No volátil

Los datos permanecen incluso sin alimentación. Tu programa sigue ahítras un reset.

bolt

Lectura rápida

La CPU puede ejecutar código directamente desde Flash (XIP - Execute In Place).

schedule

Escritura lenta

Escribir en Flash es lento (~ms) y requiere borrar sectores completos primero. No uses Flash como RAM.

warning

Vida limitada

~10,000 ciclos de escritura por sector. Suficiente para actualizaciones, no para logs constantes.

Organización de la Flash (1 MB)

MBR
4 KB
SoftDevice (BLE)
~152 KB
Tu aplicación
~800 KB
Datos
~44 KB
Direcciones: 0x00000000 - 0x000FFFFF

Memoria RAM

Donde viven las variables, la pila y los datos temporales durante la ejecución.

Organización de la RAM (256 KB)

arrow_downward
arrow_upward
Stack (Pila)

Variables locales, retornos de función

Crece hacia abajo
Espacio libre
Heap (Montón)

Memoria dinámica (malloc)

Crece hacia arriba
.bss

Variables globales sin inicializar

Inicializado a 0
.data

Variables globales inicializadas

Copiado de Flash
Direcciones: 0x20000000 - 0x2003FFFF
bolt

Acceso rápido

Lectura y escritura en un solo ciclo de reloj. Ideal para variables que cambian frecuentemente.

power_off

Volátil

Todo se pierde al quitar la alimentación. Tras un reset, la RAM contiene valores aleatorios.

data_usage

Recurso escaso

256 KB parece poco, pero es suficiente si gestionas bien la memoria. Evita buffers innecesarios.

// Variables en diferentes secciones
int global_init = 42; // .data
int global_zero; // .bss

void función() {
  int local = 10; // Stack
  int *ptr = malloc(4); // Heap
}

Periféricos

Hardware especializado que conecta el microcontrolador con el mundo exterior.

toggle_on

GPIO

Entrada/Salida digital

Pines configurables como entrada o salida. Controla LEDs, lee botones, genera señales digitales.

48 pines disponibles
swap_horiz

UART

Comunicación serie

Puerto serie para debug y comunicación. Conecta con ordenadores o módulos externos.

Hasta 1 Mbps
sync_alt

SPI

Bus sincrono rápido

Comunicación de alta velocidad con sensores, pantallas y memorias externas.

Hasta 32 MHz
cable

I2C / TWI

Bus de 2 hilos

Conecta múltiples dispositivos con solo 2 cables. Ideal para sensores y EEPROMs.

Hasta 400 kHz
show_chart

ADC / SAADC

Conversor analógico

Convierte señales analógicas a digitales. Lee sensores de temperatura, luz, etc.

12 bits, 8 canales
timer

Timers

Temporizadores

Generan interrupciones periódicas, PWM para control de motores y LEDs.

5 timers de 32 bits

Radio BLE 2.4 GHz

Lo que hace especial al nRF52840 de Nordic Semiconductor.

bluetooth

Transceptor multiprotocolo

El periférico estrella del nRF52840. Transceptor Bluetooth Low Energy de bajo consumo con soporte para BLE 5.0, Thread, Zigbee y protocolos propietarios.

info
Nota: El radio BLE es el motivo principal por el que elegimos Nordic para IoT y wearables. Veremos cómo usarlo en detalle en la Parte 2 del curso.

Mapa de memoria del nRF52840

Todo en un microcontrolador tiene una dirección. Haz clic en cada región para explorar.

Espacio de direcciones (32 bits)

4 GB teoricos
save
Flash 1 MB
0x00000000 - 0x000FFFFF

Memoria no volátil donde se almacena el código del programa. La CPU ejecuta instrucciones directamente desde aquí.

// Leer instrucción desde Flash
uint32_t *code = (uint32_t*)0x00001000;
// La CPU hace esto automaticamente
block
Reservado 0x00100000 - 0x1FFFFFFF
memory
RAM 256 KB
0x20000000 - 0x2003FFFF

Memoria volátil de acceso rápido. Aquí viven las variables, la pila y el heap durante la ejecución.

// Escribir variable en RAM
volátile uint32_t *var = (uint32_t*)0x20000100;
*var = 0xDEADBEEF;
block
Reservado 0x20040000 - 0x3FFFFFFF
settings_input_component
Periféricos Memory-mapped I/O
0x40000000 - 0x5FFFFFFF

Los periféricos se controlan escribiendo y leyendo de direcciones específicas. Cada periférico tiene su rango reservado.

// Encender LED en P0.13
#define GPIO_BASE 0x50000000
#define GPIO_OUTSET (*((uint32_t*)(GPIO_BASE + 0x508)))
GPIO_OUTSET = (1 << 13);
settings
Sistema (Cortex-M4) CPU internals
0xE0000000 - 0xFFFFFFFF

Registros del nucleo Cortex-M4: NVIC (interrupciones), SysTick (timer), Debug, etc.

// Configurar SysTick timer
#define SYST_CSR (*((uint32_t*)0xE000E010))
SYST_CSR = 0x07; // Enable + interrupt

Memory-Mapped I/O

En ARM, todos los periféricos se acceden como si fueran memoria. No hay instrucciones especiales de I/O.

Ventajas
  • check Mismo conjunto de instrucciones
  • check Punteros funciónan igual
  • check Facil de entender
Cuidado

Usar volátile siempre al acceder a periféricos. El compilador no debe optimizar estos accesos.

Referencia rápida
Flash 0x00000000
RAM 0x20000000
Periféricos 0x40000000
Sistema 0xE0000000
check_circle

Lo que aprendiste hoy

developer_board

CPU

ARM Cortex-M4 con registros, ALU y ciclo fetch-decode-execute a 64 MHz.

save

Flash

1 MB no volátil para código. Lectura rápida, escritura lenta.

memory

RAM

256 KB volátil para variables, pila y heap. Acceso rápido.

map

Memory Map

Todo tiene una dirección: Flash, RAM y periféricos en el mismo espacio.

lightbulb

"En un microcontrolador, escribir en una dirección puede encender un LED"

Memory-mapped I/O: la clave para entender el hardware embedded.

Siguiente: Herramientas de desarrollo

Ahora que conoces la arquitectura del nRF52840, vamos a configurar el entorno de desarrollo: nRF Connect SDK, VS Code y las herramientas de compilacion.

Continuar al Módulo 0.3 arrow_forward