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

Estoy usando un microcontrolador NXP (P89V51RD2) con flash integrado de 64kB. Quiero conectarlo con un decodificador de audio IC, probablemente VS1011 (si puedo obtener el IC). ¿Qué debo hacer para usar la ROM integrada para almacenar los archivos de audio, de modo que pueda transmitirlos en serie SBUFal decodificador?

Intenté incorporar un .amrarchivo de 8kB grabado desde mi móvil pero no tuvo éxito.

Usé este código:

xdata char mp3[]={
#incluir"uno.amr"
};

Vi esta pregunta pero la respuesta da proyectos prefabricados.

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

Si desea #incluir datos, primero deberá formatearlos como constantes que aceptará el compilador de C. Esto funciona para archivos de tamaño pequeño a mediano, pero no es razonable para archivos grandes. Además, es posible que no tenga suficiente almacenamiento en el chip para el archivo de interés.

Respuestas (3)

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 los bytes que componen el archivo de texto tienden a estar limitados al rango [32..126] con algunos otros como 9, 10, 13. Eso es porque este rango de números también se define para tener un significado textual de acuerdo con la tabla ASCII:

Tabla ASCII

Un .AMR (audio adaptativo de velocidad múltiple) es un archivo binario, lo que significa que los datos que contiene no representan texto y probablemente usa el rango completo de [0..255]. Si intentara abrir un archivo de este tipo en un editor de texto como el bloc de notas, parecería un galimatías total. Si desea echar un vistazo dentro de un archivo binario, es mejor usar un editor hexadecimal. Encontrará que su archivo se parece a esto:

Archivo binario

Sigue siendo un galimatías, pero al menos puede 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). Puede ver muchas letras aleatorias, signos de puntuación y caracteres divertidos que no aparecen en la tabla ASCII de arriba. Eso es básicamente lo que su compilador de C cree que está tratando de decir cuando #incluye el archivo .ARM.

En el panel central puedes ver los bytes representados como números hexadecimales. Esta es una forma más significativa de ver un archivo binario. Y así es aproximadamente como necesita que se vea su archivo .AMR antes de que su compilador de C lo entienda.

Si quisiera compilar ese archivo que se muestra en la imagen de arriba, mi compilador de C querría ver esto:

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

Entonces, lo que necesita es una herramienta que pueda convertir un archivo binario en el código C donde cada byte del archivo se escribe en hexadecimal.

Afortunadamente, otras personas se han topado con este problema antes y han escrito herramientas para hacerlo. Puede probar este que se llama bin2h , o incluso este, que también se llama bin2h .

Mira esto: http://www.deadnode.org/sw/bin2h/

Según el tamaño que tenga para el almacenamiento, es posible que desee indicarle al enlazador que coloque los datos resultantes en un almacenamiento específico. Si todo lo que tiene es algo de espacio flash, por lo general solo será suficiente para cantidades muy pequeñas de datos.

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

Hay varias opciones. El principal es tomar cada byte del archivo amr y convertirlo en una matriz C:

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

Usualmente escribo mi propio pequeño programa en C para esto. Esto es muy simple ya que todo lo que necesita hacer es iterar a través de los bytes en el archivo amr, luego usar fprintf escribirlo como una matriz.

Tenga en cuenta que arriba asumo 8 bits por valor, cambie según sea necesario. Otra cosa muy importante es que usé la palabra const. Debido a const, el compilador sabrá que amrArray no puede cambiar los datos y, por lo tanto, es probable que el enlazador los coloque en FLASH en lugar de en RAM, que generalmente es lo que desea. También puede ser más específico y cambiar el archivo del enlazador para colocarlo en una ubicación determinada, pero const generalmente funciona con los compiladores tal cual.

Tenga cuidado con los arreglos grandes que coloca en la RAM (no en la FLASH) porque su inicialización lleva tiempo y se puede activar un temporizador de vigilancia.