4 votos

¿Cómo puedo almacenar archivos de audio en la ROM del uC para transmitirlo en serie a un chip decodificador?

Estoy usando un microcontrolador NXP (P89V51RD2) con flash incorporada de 64kB. Quiero interconectarlo con un IC decodificador de audio, probablemente VS1011 (si puedo conseguir el IC). ¿Qué debo hacer para usar la ROM incorporada para almacenar los archivos de audio, para poder transmitirlos en serie usando SBUF al decodificador?

Intenté incorporar un archivo .amr de 8kB grabado desde mi teléfono móvil pero fue sin éxito.

Usé este código:

xdata char mp3\[\]={
#include"one.amr"
};

Vi esta pregunta pero la respuesta proporciona proyectos preconstruidos.

Además, tengo problemas para conseguir cualquier IC de la serie VS10xx, por lo que cualquier IC alternativo que proporcione la misma funcionalidad es bienvenido.

25voto

Scott Puntos 138

El archivo AMR no se puede vincular directamente al proyecto. El compilador/enlazador no tiene idea de qué hacer con esos bytes que le has pedido que incluya.

Hay varias opciones. La principal es tomar cada byte del archivo AMR y convertirlo en una matriz de C:

const uint8_t amrArray[] = { val1, val2, ....}

Normalmente escribo mi propio programa pequeño en C para esto. Es muy simple ya que todo lo que necesitas hacer es iterar a través de los bytes en el archivo AMR, y luego usando fprintf escribirlo como una matriz.

Ten en cuenta que arriba asumo 8 bits por valor, cambia según sea necesario. Otra cosa muy importante es que utilicé la palabra const. Debido a const, el compilador va a saber que amrArray no puede cambiar los datos y por lo tanto el enlazador probablemente lo colocará en FLASH en lugar de RAM, que es generalmente lo que quieres. También puedes ser más específico y cambiar el archivo de enlace para colocarlo en una ubicación específica, pero const generalmente funciona con los compiladores tal cual.

Ten cuidado con las matrices grandes que colocas en RAM (no en FLASH) porque su inicialización requiere tiempo y puede activar un temporizador del watchdog.

2voto

Armandas Puntos 552

Todos los archivos son simplemente secuencias de números. Cada byte en un archivo representa un número en el rango [0..255]. Un archivo de texto es una secuencia de números, pero los valores de bytes que componen el archivo tienden a estar limitados al rango [32..126] con algunos otros como el 9, 10, 13. Eso es porque este rango de números también tiene un significado textual según la tabla ASCII:

Tabla ASCII

Un .AMR (Adaptive Multi-Rate audio) es un archivo binario, lo que significa que los datos que contiene no representan texto y probablemente use el rango completo de [0..255]. Si intentaras abrir un archivo así en un editor de texto como el bloc de notas, se vería total y absolutamente incomprensible. Si deseas ver el contenido de un archivo binario, es mejor usar un editor hexadecimal. Verás que tu archivo se verá algo así:

Archivo Binario

Es, de nuevo, incomprensible, pero al menos puedes ver los datos representados de varias maneras. En el extremo derecho, se muestra cómo se vería el archivo si se abriera en un editor de texto muy bueno. (En el Bloc de notas probablemente se vería peor que esto). Puedes ver muchas letras aleatorias, signos de puntuación y caracteres extraños que no aparecen en la tabla ASCII anterior. Básicamente, eso es lo que tu compilador de C piensa que estás tratando de decir cuando realizas el #incluye del archivo .ARM.

En el panel central puedes ver los bytes representados como números hexadecimales en su lugar. Esta es una manera más significativa de ver un archivo binario. Y más o menos así es como necesita verse tu archivo .AMR antes de que tu compilador de C lo entienda.

Si quisiera compilar ese archivo mostrado en la imagen anterior, mi compilador de C querría ver esto:

xdata char mp3[]={
  0x1D, 0x50, 0xAA, 0x37, 0xD5, 0x80, 0x9B,  .......  
};

Así que lo que necesitas es una herramienta que pueda convertir un archivo binario en el código C donde cada byte del archivo esté escrito en hexadecimal.

Afortunadamente, otras personas han tenido este problema antes y han escrito herramientas para solucionarlo. Podrías probar esta que se llama bin2h, o incluso esta otra, que también se llama bin2h.

0voto

afx Puntos 221

Revísalo aquí: http://www.deadnode.org/sw/bin2h/

Dependiendo del tamaño que tengas para el almacenamiento, es posible que desees indicar al enlazador que coloque los datos resultantes en un almacenamiento específico. Si todo lo que tienes es un espacio de flash, esto generalmente solo será suficiente para cantidades muy pequeñas de datos.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X