Cancellare un microcontrollore LPC23XX
Introduzione
Lo sviluppo di un progetto su microcontrollore prevede, solitamente, l'utilizzo dell'interfaccia JTAG; tramite questa, infatti, è possibile avviare una sessione di test completa, dalla cancellazione della memoria flash, alla scrittura del nuovo codice sorgente, per passare poi al debug in circuit.
A volte, però, capita che proprio a causa di un nuovo progetto le impostazioni di avvio del microcontrollore possano renderlo sordo ai comandi del JTAG, tanto da rendere impossibile anche la cancellazione della memoria flash. Questo può accadere, per esempio, quando il PLL viene programmato con valori critici, che non permettono poi l'aggancio del sincronismo tra PC con software di controllo JTAG ed il micro stesso.
In questo documento verrà spiegata una procedura per aggirare il problema, ricorrendo alla programmazione ISP (In-System Programming). La procedura è stata provata su piattaforma Linux (Ubuntu 9.10) con gestore di JTAG openOCD 2.0, interfaccia JTAGTiny di Amontec e scheda di sviluppo LPC-2378-STK di Olimex.
ISP (In-System Programming)
La programmazione ISP permette, mediante un collegamento seriale, di accedere al micro per alcune operazioni fondamentali, utilizzando il firmware di bootloader residente nella memoria ROM del micro (quindi in una zona che non può essere modificata dallo sviluppatore). Al reset il micro verifica il livello logico di un determinato pin (di solito EINT0) per riconoscere una richiesta di avvio del bootloader: nel caso in cui il livello sia basso viene avviato il codice di bootloader al posto del programma utente. In questo modo possiamo anticipare l'esecuzione del codice che non ci permette il collegamento con il micro per poterlo poi cancellare, ripristinando così la situazione di micro nuovo.
Nel caso del dispositivo LPC23XX la procedura di boot è riportata nella figura seguente, tratta dallo User Manual reperibile sul sito del produttore NXP.
Predisposizione hardware
Predisponiamo la scheda Olimex LPC-23678-STK chiudendo i jumper ISP_E e RST_E, poi colleghiamo al connettore RS232_0 il cavo RS232-USB che interfaccia la scheda con il PC. Il circuito relativo alla scheda Olimex è riportato nella figura seguente; è da notare che il segnale DTR (pin 4 RS232) agisce sul Reset del micro, mentre il segnale RTS (pin 7 RS232) agisce sul pin EINT0 per l'attivazione della modalità ISP. Entrambe le linee sono attive alte.

Ovviamente il JTAG rimane inutilizzato, così come il relativo software di gestione (nel nostro caso openOCD). E' importante ricordare di impostare prima il livello logico basso sul pin EINT0 (RTS alto) e poi alimentare la scheda per attivare la procedura di power-on reset. Alternativamente è possibile agire sulla linea DTR per attivare il ciclo di Reset (DTR alto->basso).
Uso del software
Il software necessario per la sessione ISP è un qualsiasi terminale per porta seriale; nella nostra prova abbiamo utilizzato il programma gtkTerm, dal repository ufficiale di Ubuntu. L'impostazione dei parametri del programma è riportata nella figura seguente, con i valori: 115200, 8, N, 1.

Dopo aver collegato la scheda impostiamo RTS alto eseguendo poi un ciclo di Reset con DTR alto->basso (menù Control Signals di gtkTerm). Il primo comando che dobbiamo digitare è il carattere ? a cui il micro risponderà con la scritta Synchronized. Scriviamo anche noi Synchronized ed il micro risponderà con OK; dopo digitiamo il valore del quarzo presente sulla scheda in kHz (nel nostro caso 12000) ed il micro confermerà con OK. A questo punto possiamo cominciare la sequenza per la cancellazione della flash. Prima dobbiamo dare il comando di sblocco con la stringa U 23130; poi predisponiamo i settori di memoria con il comando P 0 26 ed infine eseguiamo la cancellazione degli stessi settori con E 0 26. Ad ogni nostro comando (se andato a buon fine) il micro risponde con il codice 0. Per ulteriore controllo possiamo eseguire il comando I 0 26 per la verifica dei settori bianchi; è da notare che la verifica sul primo settore dà sempre errore poiché i primi 64 byte sono rimappati al blocco di boot della flash; quindi la risposta del micro sarà del tipo 8 0 XXXXXXXXXX. Nella figura seguente è riprodotto l'andamento della procedura appena esposta.
Da questo momento la flash del micro è completamente cancellata. Nota bene: questa procedura presuppone che il CRP (Code Read Protection) non sia stato mai attivato al livello 3; questa operazione infatti disabilita l'accesso tramite JTAG e tramite ISP se un programma ritenuto valido (checksum corretta) è presente nel settore 0. Il CRP3 rende, di fatto, inaccessibile la flash del chip.