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

4

Estoy usando un microcontrolador NXP (P89V51RD2) con un 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 a bordo para almacenar los archivos de audio, de modo que pueda transmitirlos en serie utilizando SBUF al decodificador?

Intenté incorporar un archivo .amr de 8kB grabado desde mi móvil, pero no tuve éxito.

Utilicé este código:

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

Vi esta pregunta pero la respuesta da pre -proyectos construidos.

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

    
pregunta VedVals

3 respuestas

2

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 limitarse al rango [32..126] con algunos otros como 9, 10, 13. Esto se debe a que este rango de números también se define para tener un significado textual de acuerdo con la tabla ASCII:

Un .AMR (audio adaptativo de múltiples velocidades) es un archivo binario, lo que significa que los datos que contiene no representa texto, y probablemente utiliza el rango completo de [0..255]. Si intentara abrir un archivo de este tipo en un editor de texto como el bloc de notas, se vería como una tontería total. Si desea ver dentro de un archivo binario, es mejor usar un editor Hex. Encontrarás que tu archivo se parece a esto:

Siguesiendounatontería,peroalmenospuedesverlosdatosrepresentadosdevariasmaneras.Enelextremoderecho,escómoseveráelarchivosiseabreenuneditordetextomuybueno.(EnelBlocdenotasprobablementeseveríapeorqueesto).Puedesvermuchasletrasaleatorias,signosdepuntuaciónydivertidosquenoaparecenenlatablaASCIIdearriba.EsoesbásicamenteloquesucompiladordeCcreequeestátratandodedecircuando#incluyeelarchivo.ARM.

Enelpanelcentralpuedesverlosbytesrepresentadoscomonúmeroshexadecimales.Estaesunamaneramássignificativadeverunarchivobinario.Yestoesaproximadamentecómonecesitaqueseveasuarchivo.AMRantesdequesucompiladordeClocomprenda.

Siquisieracompilarelarchivoquesemuestraenlaimagendearriba,micompiladordeCquerríaveresto:

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

Entonces,loquenecesitaesunaherramientaquepuedaconvertirunarchivobinarioenelcódigoC,dondecadabytedelarchivoseescribeenhexadecimal.

Afortunadamente,otraspersonassehanencontradoconesteproblemaanteriormenteyhanescritoherramientasparahacerlo.Puedeprobarestequesellama bin2h , o incluso este, que también se llama bin2h .

    
respondido por el Rocketmagnet
0

Echa un vistazo a esto: enlace

Dependiendo del tamaño que tenga para el almacenamiento, es posible que desee decirle al vinculador que ponga los datos resultantes en un almacenamiento específico. Si todo lo que tienes es un poco de espacio flash, esto solo será suficiente para cantidades muy pequeñas de datos.

    
respondido por el Tom L.
0

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 C:

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

Por lo general escribo mi propio pequeño programa de C para esto. Esto es muy simple, ya que todo lo que necesita hacer es recorrer los bytes en el archivo amr y luego usar fprintf escribirlo como una matriz.

Note que arriba asumo 8 bits por valor, cambio según sea necesario. Otra cosa muy importante es que utilicé la palabra const. Debido a la constante, el compilador sabrá que amrArray no puede cambiar los datos, por lo que es probable que el vinculador lo coloque en FLASH en lugar de RAM, que es lo que normalmente desea. También puede ser más específico y cambiar el archivo del vinculador para ubicarlo en una determinada ubicación, pero por lo general, la compilación funciona como es.

Tenga cuidado con las matrices grandes que coloca en la RAM (no con FLASH) porque su inicialización lleva tiempo y puede dispararse un temporizador de vigilancia.

    
respondido por el Gustavo Litovsky

Lea otras preguntas en las etiquetas