El TMS320C31 tiene, al igual que todos los DSPs de la familia TMS320C3x, ROM interna del tipo OTP (One Time Programmable). A diferencia que en el caso del TMS320C30 esta ROM interna ya viene programada de fábrica con un programa denominado boot-Loader[1]. El reset del TMS320C31, funcionando en modo microcomputador (arranque desde memoria ROM interna), provoca que la CPU del DSP lea la posición 000000h de la ROM interna. En dicha posición se encuentra la dirección de comienzo del programa denominado boot-loader ubicado, a su vez, en la ROM interna del DSP.
En la figura 2.24 se muestran los diagramas de flujo que describen el funcionamiento del programa boot-loader.
El programa boot-loader gestiona el trasvase de bloques de datos (código diseñado por el usuario) enviados desde otro sistema microprocesador y recibidos por el puerto serie de que dispone el TMS320C31 o ubicados en algún dispositivo externo de memoria (colocado en el mapa de memoria del DSP en una de las tres posiciones conocidas como BOOT1, BOOT2 ó BOOT3, véase figura 2.16, y normalmente de tipo EPROM) hacia otras posiciones del mapa de memoria del DSP ocupadas por dispositivos de almacenamiento RAM.
Figura 2.23. Diagrama
de flujo del programa Boot-loader (ubicado en ROM interna del TMS320C31).
El programa es
realmente sencillo. Consiste en un bucle que espera una señal, generada por el
usuario, que le indique que debe iniciar el trasvase de bloques de datos.
Mientras el programa se encuentre en el bucle de espera, la única tarea que
realiza el DSP es comprobar si el usuario ha generado alguna de las señales de
inicio de trasvase de bloques de datos. El usuario dispone de cuatro líneas de
entrada al DSP, a
, como señales para iniciar el trasvase de los bloques de
datos. Inicialmente estas señales se usan como líneas digitales de entrada al
programa y no como líneas de petición de interrupciones externas, y le sirven
al usuario para indicarle al boot-loader
hacia donde debe ir a buscar el código que va a cargar en memoria RAM ubicada
en el mapa de memoria del DSP. Cuando una de estas líneas es activada por el
usuario, el programa boot-loader
inicia la carga programada, bien desde memoria externa (desde una dirección de
tres posibles, BOOT1, BOOT2 ó BOOT3), bien mediante el puerto serie (el DSP estaría esperando
datos que otro sistema digital, que puede ser otro DSP, le envía empleando un
protocolo serie síncrono).
1. Carga desde Memoria Externa. El programa boot-loader accede a un dispositivo de memoria, normalmente de tipo EPROM, ubicado en BOOT1, BOOT2 ó BOOT3 en el mapa de memoria para realizar el trasvase de un bloque de datos (programa diseñado por el usuario) hacia otras posiciones del mapa de memoria del DSP. Antes de trasladar los bloques de código el programa boot-loader precisa que se le pasen una serie de parámetros de configuración o programación del tipo y modo de transferencia que debe realizar (cabecera del bloque de datos, primeros cuatro registros de 32 bits). La cabecera de un bloque de datos se muestra en la tabla 2-6. Estos valores de configuración son, el tipo de dispositivo de memoria al que se accede a recoger el bloque de datos (con un ancho de bus programable de 8, 16 ó 32bits), la palabra de control para la configuración del acceso a dichos periféricos de memoria a través del bus principal, el tamaño del bloque de datos que se desea transferir y, finalmente, la dirección de destino o de ubicación del bloque. Posteriormente aparece la primera instrucción del bloque de datos que se trasladará a otra zona del mapa de memoria del DSP.
En definitiva, primero se configura el modo y tipo de transferencia, luego se realiza la misma. Se pueden realizar transferencias de múltiples bloques de datos desde las zonas BOOTs hacia otras zonas en el mapa de memoria del DSP, figura 2.24. El boot-loader se termina añadiendo, al final del último bloque transferido, el código 00000000h que representa que el tamaño del siguiente bloque a transferir es 0 (no existe tal bloque en realidad). Obsérvese que, al menos, el primer bloque debe tener longitud mayor de cero para que tenga sentido invocar al programa boot-loader, si no fuese así el sistema arrancaría de forma impredecible.
Posición |
Descripción |
Valores válidos |
0 |
Tipo de memoria boot (8,
16 ó 32) |
0x8, 0x10, 0x20 |
1 |
Configuración accesos por
el bus principal |
|
2 |
Tamaño del bloque del
programa (blk) |
0 < Tamaño bloque <
224 |
3 |
Dirección de destino |
Cualquier dirección de 24
bits es válida |
4 |
Código de inicio del
programa |
Cualquier instrucción o
dato de 32 bits |
Tabla 2-6. Registros de configuración del programa boot-loader: Cabecera del bloque de código en memoria externa (BOOT1, BOOT2 ó BOOT3).
Posición |
Valor |
Descripción |
BOOTn+0 |
0x08 |
Memoria externa de ancho 1
byte, 0x8 |
BOOTn+1 |
0x00 |
|
BOOTn+2 |
0x00 |
|
BOOTn+3 |
0x00 |
|
BOOTn+4 |
0x58 |
Tipo de acceso: 0x1058 ·
SWW
= 11 ·
WCNT = 2 |
BOOTn+5 |
0x10 |
|
BOOTn+6 |
0x00 |
|
BOOTn+7 |
0x00 |
|
BOOTn+8 |
0xFF |
Tamaño bloque de código a
trasladar: 0x1FF |
BOOTn+9 |
0x01 |
|
BOOTn+10 |
0x00 |
|
BOOTn+11 |
0x00 |
|
BOOTn+12 |
0x00 |
Dirección de destino del
código: 0x809C00 |
BOOTn+13 |
0x9C |
|
BOOTn+14 |
0x80 |
|
BOOTn+15 |
0x00 |
Tabla 2-7. Cabecera del bloque de código en memoria externa (BOOT1, BOOT2 ó BOOT3) con tipo de memoria boot de un ancho de 1 byte (8 bits).
Posición |
Valor |
Descripción |
BOOTn+0 |
0x0010 |
Memoria externa de ancho 2
bytes, 0x10 |
BOOTn+1 |
0x0000 |
|
BOOTn+2 |
0x1058 |
Tipo de acceso: 0x1058 ·SWW = 11 ·WCNT = 2 |
BOOTn+3 |
0x0000 |
|
BOOTn+4 |
0x01FF |
Tamaño bloque de código a trasladar: 0x1FF |
BOOTn+5 |
0x0000 |
|
BOOTn+6 |
0x9C00 |
Dirección de destino del
código: 0x809C00 |
BOOTn+7 |
0x0080 |
Tabla 2-8. Cabecera del bloque de código en memoria externa (BOOT1, BOOT2 ó BOOT3) con tipo de memoria boot de un ancho de 2 bytes (16 bits).
Posición |
Valor |
Descripción |
BOOTn+0 |
0x00000020 |
Memoria externa de ancho 4
bytes |
BOOTn+1 |
0x00001058 |
Tipo de acceso: 0x1058 ·
SWW
= 11 ·
WCNT = 2 |
BOOTn+2 |
0x000001FF |
Tamaño bloque de código a
trasladar: 0x1FF |
BOOTn+3 |
0x00809C00 |
Dirección de destino del
código: 0x809C00 |
Tabla 2-9. Cabecera del bloque de código en memoria externa (BOOT1, BOOT2 ó BOOT3) con tipo de memoria boot de un ancho de 4 bytes (32 bits).
En las tres tablas anteriores, tablas 2-7, 2-8 y 2-9, se muestra la secuencia de acceso del programa boot-loader a cualquiera de las posiciones BOOT1, BOOT2 ó BOOT3 con memoria externa configurada con un ancho de 1, 2 ó 4 bytes.
2. Carga desde el puerto serie. El boot-loader configura automáticamente el puerto serie en modo de trasferencia de datos de ancho 32 bits y en modo de transferencia de bits fixed-burst (se verá cuando se estudie el periférico puerto serie síncrono del DSP). Como en el caso de la carga desde memoria externa se precisa de una cabecera para iniciar y programar la operación de carga. La cabecera, en este caso, sólo incluye el tamaño del bloque y la dirección de destino del bloque de datos.
Comentarios sobre el programa boot-loader:
·
Genera una pila de
1x32 bits (una word) que se encuentra
en la posición 809800h (dentro de la RAM interna, bloque 0). No puede aparecer
como destino de una instrucción esa dirección (cuando se traslade el control al
DSP, a saber que puede haber en esa posición).
·
Las banderas de las
interrupciones (registro IF) que se activen se ponen a 1, no las limpia el
programa boot-loader, de forma que
hay que comenzar limpiándolas antes de habilitar las interrupciones externas si
se desea hacer uso, en el programa del usuario (bloque de código trasladado por
el boot-loader), de las mismas y no
se desea que aparezca una interrupción espúrea.
·
En modo
microcomputador el TMS320C31 trae definidos, de fábrica, los vectores de
interrupciones y excepciones software (la ROM interna OTP la programó el
fabricante) para que apunten a direcciones fijas del bloque 1 de la RAM
interna. Si se desea usar alguna interrupción debe ubicarse, en la posición del
bloque 1 de RAM asignada por el fabricante, una instrucción de salto a las
correspondientes rutinas de servicio de las interrupciones, figura 2.25.
· El arranque efectivo se realiza desde la dirección de comienzo del primer bloque transferido, una vez efectuada la transferencia de los bloques de datos en el mapa de memoria del DSP.
Figura 2.24.
Redireccionamiento de los vectores de interrupción y de las excepciones
software en el TMS320C31 en modo microcomputador.