Чтение файла с флешки для STM32L476G-DISCO

Я новичок во встроенных системах и пытался портировать через программу преобразования MP3 на ARM-основе STM32L476G-DISCO Совет по развитию. Я также использую бесплатное программное обеспечение System Workbench на основе Eclipse. Я добился успеха настолько, что скомпилировал программу и выбросил ее на доску. Он даже работает вплоть до того момента, когда программа запрашивает ввод файла (.wav).

У меня вопрос, как мне реализовать часть обработки файлов? Ранее при запуске оригинального консольного приложения Windows я просто отправлял аргумент командной строки, как >C:\file.wav < C:\file.mp3,

Я думал начать с простого и просто вставить файл, но я не знаю, как вызвать его в своем коде. Я могу запрограммировать память вручную с помощью программного обеспечения для программирования, но, опять же, все, что я знаю, это адрес, где я записал данные. Если я перейду к своей программе с помощью отладчика, она сделает это "wave_open", но так как я не использую файл, я не совсем уверен, что я положил вместо f_open или f_read. Также я использую библиотеку HAL, которая генерируется STCubeMX в дополнение к STDIO.h

Вот фрагмент кода, который я использую:

/* 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;
    ....

1 ответ

Решение

Понял это, в Wave.c исходный исходный код выглядит, чтобы открыть дескриптор файла с типичным "fopen", но так как на платформе нет файловой системы, я смог обойти это, используя "fmemopen" в место fopen и просто указание fmemopen на мой буфер, в котором есть данные. Надеюсь, что это поможет кому-то еще, потому что потребовалось много времени, чтобы понять это.

Другие вопросы по тегам