# FRDM-KL25Z

La FRDM-KL25Z és una plataforma de desenvolupament per a la familia de porcesadors Kinetis L Series KL1x y KL2x basat en el procesador ARM Cortex M0 de 32 bits. Aquesta plataforma és distribuïda per Freescale, i és una gran alternativa a Arduino a causa de la seva senzilla programació i el seu baix cost.
La FRDM-KL25Z té unes grans prestacions per a poder fer projectes d'instrumentació, robotica o pràcticament qualsevol prototip a dissenyar degut a: la seva amplia memòria flash y SRAM, la alta freqüència d'operació, el gran nombre de pins, entre els quals hi ha varis protocolos de comunicació, al acceleròmetre integrat, un LED a disposició, etc.
A més a més, es pot fer servir amb el entorn de programació CodeWarrior de Freescale o amb el compilador en línia MBED que utilitza un sistema fàcil i ràpid amb moltes llibreries per facilitar la programació.

## Característiques
### Característiques principals

Les característiques de la FRDM-KL25Z són les següents:
* 32 Bits ARM Cortex M0+ Core.
* 128KB de flash.
* 16KB de SRAM.
* Freqüència de operació fins a 48 Mhz.
* 2xSPI, 2xI2C, 3xUART, 6xPWM, 6xADC, DAC, GPIO.
* USB OTG d'alta velocitat.
* OpenSDA USB program and debug interface.
* LED RGB PWM per a l'usuari.
* Touch slider capacitiu.
* Acelerometre de 3 eixos digital integrat.
* Voltatge d'operació: 1.71V - 3.6V.
* Voltatge d'entrada: 4.3V - 9V.
* Botó de reset.
* Ports d'expansio per a IN/OUT.

## Cortex M0

El cortex M0 és un microcontrolador RISC amb una arquitectura Von Neumann, és a dir, consta de un sol bus per a les dades i les instruccions. Aquest microcontrolador utilitza un conjunt de instrccions anomenades THUMB el qual esta compost majoritàriament per instruccions de 16 bits, encara que existeixen algunes funcions que utilitzen instruccions de 32 bits. En general, el còrtex M0 té un conjunt de 56 instruccions base, i per això poden tenir més d'una forma.
El ARM Córtex M0+ consta de 2 nivells de pipeline, 16 registres de 32 bits, el NVIC y un multiplicador de 32 bits que varia segons el fabricant. En de la FRDM-KL25Z compta amb un multiplicador de un sol cicle.
El Córtex M0 compta amb el següent:
* 32 interrupcions amb 4 nivell de prioritat cadascuna
* 1 NMI (Nonmaskable Interrupt)
* Mapa de memoria definit per a la portabilitat del software, és a dir, el espai de memoria és lineal
* Systick Timer per a l'ús de RTOS
* Instrucció SVC per a l'ús de RTOS
* Excepción Fault Handling per a detectar errors en el sistema
* Suport de format de memoria little endian y big endian

## Cortex M0+
### Introducció del Cortex M0+

El Cortex-M0+ es un superset optimitzat del Cortex-M0. El Cortex-M0+ té una compatibilitat de instruccions complerta amb el Cortex-M0 permetent fer servir les mateixes eines de compilació i debugging. El pipeline del Cortex-M0+ té 2 etapes (una menys que el Cortex M0) el que permet un estalvi major de energia. A més a més, existeix una opció silicon que és afegir el Micro Trace Buffer (MTB) que dona una traça simple de instruccions. En el Cortex-M0+ poden ser afegides algunes característiques del Cortex-M3 i Cortex-M4, com per exemple la unitat de protecció de memoria (MPU).
Les característiques claus del Cortex-M0+ són:
* Arquitectura ARMv6-M
* 2 etapes de pipeline
* Set d'instruccions: (lel mateix que el Cortex-M0)
** Thumb-1 (most), missing CBZ, CBNZ, IT.
** Thumb-2 (some), only BL, DMB, DSB, ISB, MRS, MSR.
** Hardware de multiplilcació d'integers de 32-bits amb resultat de 32 bits
* De 1 a 32 interrupcions, més NMI
Les silicon options són les següents:
* Velocitat del hardware de multiplicació d'integers: de 1 cicle o de 32 cicles
* 8 regions de MPU (el mateix que el Cortex-M3 i el Cortex-M4)
* Vector table relocation (el mateix que el Cortex-M3 i el Cortex-M4)
* Únic cicle del port I/O (únic pel Cortex-M0+)
* Micro Trace Buffer (MTB) (únic pel Cortex-M0+)

### Registres del Córtex M0+

El Córtex M0+ conté 16 registres de 32 bits i alguns registres especials:
* R0-R12: Registres d'ús general. Aquests estan dividits en registres alts (del 0 al 7) i baixos (8 al 12).
* R13- Stack Pointer: Aquest registre es seleccionat mitjançant el bit 1 del registre de Control:
** 0: Main Stack Pointer (MSP): És el stack pointer després del reset i és utilitzat durant les ISR
** 1: Process Stack Pointer (PSP): Aquest és utilitzat en el mode thread
* R14-Link Register: Emmagatzema un valor de retorn per a les rutines, funcions e ISRs
* R15-PC: Conté la direcció actual del programa, al fer el reset aquest registre es carrega amb 0x00000004.

### Modes d'usuari del porcessador

El processador té 7 modes bàsics d'operació:
* Mode usuari: És el mode on s'executen la majoria de les tasques (sense privilegis especials)
* FIQ: Quan s'activa una interrupció de prioritat alta
* IRQ; Quan s'activa una interrupció de prioritat baixa
** Supervisor: Quan s'activa el reset o una interrupció Software
** Abort: Per a gestionar violacions d'accés a memoria
** Indefinit: Per a gestionar instruccions indefinides
** System: Mode privilegiat. En algunes versions en aquest mode s'utilitzen els mateixos registres que en el mode usuari

## Avantatges i Desavantatges
### Avantatges

* Baix cost
* Procesador ARM Cortex M0+
* Fàcil de programar
* La FRDM-KL25Z esta estandarditzada i, per tant, té un gran suport en la xarxa
* Bons entorns de programació
* Flexibilitat per a poder fer un gran nombre de projectes
* Molta documentació
* Gran nombre de pins
* Possibilitat de programar a baix nivell

### Desavantatges

* IDE offline (code warrior) és car
* Baix rendiment per a prototips grans

## Arduino UNO vs FRDM-KL25Z

| | Processador | Voltatge d'entrada | Voltatge d'operació | Velocitat CPU | Analògics I/O | PWM | SRAM | Flash | USB | UART | LED |
| FRDM-KL25Z | ATmega328P | 7-12 V | 5 V | 16 MHZ | 6 inputs / 0 outputs | 6 | 2 KB | 32 KB | Estàndard | 1 | NO |
| Arduino UNO | ARM Cortex M0+ | 4.3V - 9V | 1.71V - 3.6V | 48 Mhz | 6 inputs / 0 outputs | 6 | 16 KB | 128 KB | MicroUSB | 3 | SÍ |

## Còdi d'exemple

A continuació es mostren diferents exemples de codi en les plataformes de Mbed i de CodeWarrior:

### Code Warrior
#### Led Tricolor
#### PWM
## Repositoris i exemples de codi

Exemple LED
Exemple ADC
Exemple DAC
Repositori de còdi

## Web d'interès

NXP Oficial web
FRDM-KL25Z Development-tools
Mbed Developer
Mbed Platforms
Mbed SerialPC

## Referències

* ↑ «Exemple de LED».
* ↑ «ADC Exemple».
* ↑ «Exemple DAC».
* ↑ «Repositori de còdi».
* ↑ «nxp oficial».
* ↑ development-tools/freedom-development-boards/freedom-development-platform-for-kinetis-kl14-kl15-kl24-kl25-mcus:FRDM-KL25Z
* ↑ «Mbed developer» (en anglès).
* ↑ «Mbed Plataforms» (en anglès).
* ↑ «Mbed SerialPC» (en anglès).