2016-10-28 10 views
0

Ich bin neu bei Embedded-Systemen und habe versucht, über ein MP3-Konvertierungsprogramm auf eine ARM-basierte Entwicklungskarte STM32L476G-DISCO zu portieren. Ich verwende auch die kostenlose System Workbench-Software, die auf Eclipse basiert. Ich war erfolgreich bis zu dem Punkt, dass ich das Programm zusammengestellt und an die Tafel geflasht habe. Es läuft sogar bis zu dem Punkt, an dem das Programm nach der Dateieingabe fragt (.wav).Datei lesen aus Flash für STM32L476G-DISCO

Meine Frage ist, wie implementiere ich den Dateihandling Teil? Früher würde ich beim Ausführen der ursprünglichen Windows-Konsolenanwendung einfach ein Befehlszeilenargument wie >C:\file.wav < C:\file.mp3 senden.

Ich dachte, einfach zu starten und nur die Datei einzubetten, aber ich weiß nicht, wie ich es in meinem Code nennen soll. Ich kann den Speicher manuell über die Programmiersoftware programmieren, aber alles was ich weiß, ist die Adresse, wo ich die Daten geflasht habe. Wenn ich mein Programm mit dem Debugger durchtrete, wird es auf "wave_open" gesetzt, aber da ich keine Datei verwende, bin ich mir nicht ganz sicher, was ich an Stelle von f_open oder f_read gesetzt habe. Auch ich die HAL Bibliothek verwenden, die von STCubeMX zusätzlich zu STDIO.h

Hier ist ein Ausschnitt aus dem Code erzeugt wird, ich bin mit:

/* main.c */ # 
include "main.h"# 
include "stm32l4xx_hal.h" 

/* USER CODE BEGIN Includes */ 
# 
include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "layer3.h"# 
include "wave.h" 
    /* USER CODE END Includes */ 

/* Private variables --------------------------------------------------- 
QSPI_HandleTypeDef hqspi; 

SPI_HandleTypeDef hspi2; 

UART_HandleTypeDef huart2; 

/* USER CODE BEGIN PV */ 
/* Private variables --------------------------------------------------- 

/* Some global vars. */ 
char * infname, * outfname; 
FILE * infile, * outfile; 
int quiet = 0; 
int _verbose = 0; 
int stereo = STEREO; 
int force_mono = 0; 
/* USER CODE END PV */ 
/* Parse command line arguments */ 
static int parse_command(int argc, char ** argv, shine_config_t * config) { 
    int i = 0; 
    // if (argc - i != 2) return 0; 
    // infname = argv[i++]; 
    // outfname = argv[i]; 
    //infname = "pcm1644mE.wav"; 
    infname = 0x08020000; 
    outfname = "pcm1644mE.mp3"; 
    return 1; 
} 

int main(void) { 
    /* USER CODE BEGIN 1 */ 
    wave_t wave; 
    time_t start_time, end_time; 
    int16_t buffer[2 * SHINE_MAX_SAMPLES]; 
    shine_config_t config; 
    shine_t s; 
    int written; 
    unsigned char * data; 

    initialise_monitor_handles(); 

    uint8_t msg[100]; 

    time(& start_time); 

    /* Set the default MPEG encoding paramters - basically init the struct */ 
    set_defaults(& config); 

    if (!quiet) print_name(); 

    /* Open the input file and fill the config shine_wave_t header */ 
    if (!wave_open(infname, & wave, & config, quiet)) 
     error("Could not open WAVE file"); 

    infile = wave.file; 

    if (force_mono) 
     config.wave.channels = 1; 
    .... 

Antwort

1

Figured diesem aus, in Wave.c dem ursprünglichen Quellcode schaut, um ein Dateihandle mit dem typischen "fopen" zu öffnen, aber da auf der Plattform kein Dateisystem vorhanden ist, konnte ich das umgehen, indem ich "fmemopen" anstelle von fopen benutze und femopen nur auf meinen Puffer lege, der hat Daten drin. Hoffe, dass das einem anderen hilft, weil es lange gedauert hat, das herauszufinden.