Вставить файл во флеш-память платформы STM32 ARM

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

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

Плата поставляется с 128 Мбит флэш-памяти, использующей QSPI для связи, а также внутреннюю флэш-память. Нужна ли мне файловая система для чтения / записи файла в мою программу? Я думал начать с простого и просто встроить файл, но я не знаю, как это назвать в моем коде. Я могу запрограммировать память вручную с помощью программного обеспечения для программирования, но, опять же, все, что я знаю, - это адрес, по которому я записал данные.


person sam    schedule 26.10.2016    source источник
comment
Мне непонятно. Ваше приложение должно всегда воспроизводить один и тот же файл или вы должны время от времени отправлять разные файлы? Достаточно ли свободного места на вашей встроенной платформе для хранения файла для воспроизведения?   -  person LPs    schedule 26.10.2016
comment
В конце концов, я отправлял ему каждый раз другой файл, но для начала я хотел бы просто прочитать тот же файл и преобразовать его. Плата имеет 1 МБ внутренней флэш-памяти, из которых только 80 КБ используются кодом приложения. Сам файл .mp3 имеет размер 148 КБ.   -  person sam    schedule 26.10.2016
comment
Итак, как описывает ответ @Clifford, вы можете рассматривать его как большой массив байтов и связывать файл wav с кодом вашего приложения. Для будущего использования вы зарезервируете место (например, используя сценарий liker) на флэш-памяти, где вы будете хранить байты файла wav для преобразования и воспроизведения.   -  person LPs    schedule 26.10.2016
comment
Я неправильно понял ваш вопрос - хотя вы просто хотели воспроизвести файл WAV. Кодирование MP3 нетривиально и требует значительного времени даже на настольном компьютере. Я бы предположил, что преобразование на STM32 требует многого и почти бессмысленно. Если у вас уже есть файл WAV, какой цели служит MP3? - чтобы использовать его, вам также понадобится декодер, тогда как WAV - это обычный несжатый PCM, и его можно воспроизводить напрямую. Если вы хотите, чтобы MP2 экономил место, вам, вероятно, следует использовать настольный ПК для кодирования, а затем встроить этот файл.   -  person Clifford    schedule 26.10.2016


Ответы (1)


Если вы записали данные во внутреннюю флеш-память, все, что вам нужно, это ее адрес - это больше не «файл», его можно рассматривать так, как если бы вы считали данные из файла в это место. Вместо того, чтобы отдельно программировать данные из вашего приложения, вы могли бы написать инструмент генерации кода, который считывает их на хосте разработки и преобразует их в массив данных кода C следующим образом:

static const uint8_t wav_file[] = { '\x00, `\x55` ... 
                                    ...
                                    ... } ;

который вы затем компилируете и связываете с кодом своего приложения.

Это позволит компоновщику найти ваши данные и избежать проблем, связанных с кодом приложения и данными, которые могут посягать друг на друга. Кроме того, он дает игрушечным данным символический начальный адрес и размер, который можно определить с помощью sizeof(wav_file).

Однако вы не можете использовать этот метод, если данные хранятся во внешней флэш-памяти, поскольку она не отображается в памяти. В этом случае данные необходимо будет прочитать в ОЗУ для обработки.

Если ваша аудиотека ожидает файл, а вы не хотите его изменять, то да, вам нужна файловая система. Файловая система, вероятно, является самым простым и безопасным средством управления внешней флеш-памятью.

person Clifford    schedule 26.10.2016
comment
Если мой файл объявлен так: /* Some global vars. */ char *infname, *outfname; FILE *infile, *outfile;, а позже называется так ...: int main(void) { wave_t wave; int written; unsigned char *data; time(&start_time); /* 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; ..., как мне указать, что файл должен только читать в том месте, куда я его записал (0x08020000)? - person sam; 26.10.2016
comment
@sam Решение зависит от платформы, от компилятора и компоновщика. Вы должны опубликовать новый вопрос с подробностями - person LPs; 26.10.2016
comment
@sam: комментарии не подходят для размещения дополнительных вопросов или разъяснений, особенно в том числе кода. Обновите свой вопрос или опубликуйте новый вопрос. Вам нужно вообще не использовать wave_open() или какой-либо API ввода-вывода файлов. Вам не нужно открывать файл, потому что файла нет - данные wav уже есть в виде полного массива данных. Это может помочь, если вы укажете, какую библиотеку wav вы используете - опять же, обновив вопрос, а не в комментарии, - person Clifford; 26.10.2016
comment
QSPI STM32L476 может использоваться в режиме отображения памяти. Это означает, что внешняя память будет видна на карте памяти. - person Guillaume Michel; 31.10.2016
comment
@GuillaumeMichel: Спасибо, мы живем учиться! Это полезно знать для будущего проекта. Ни один из моих текущих проектов STM32 не поддерживает QSPI. - person Clifford; 31.10.2016