STM32L476G-DISCO从闪存中读取文件

Reading file from flash for STM32L476G-DISCO

我是嵌入式系统的新手,一直在尝试将 MP3 转换程序移植到基于 ARM 的 STM32L476G-DISCO 开发板上。我还使用基于 Eclipse 的免费 System Workbench 软件。我已经成功地编译了程序并将其闪存到电路板上。它甚至一直运行到程序要求输入文件 (.wav)。

我的问题是如何实现文件处理部分?以前当 运行 原始 windows 控制台应用程序时,我只会发送一个命令行参数,如 >C:\file.wav < C:\file.mp3.

我想从简单的开始,只是嵌入文件,但我不知道如何在我的代码中调用它。我可以通过编程软件手动对内存进行编程,但同样,我所知道的只是闪存数据所在的地址。如果我使用调试器单步执行我的程序,它会变成“wave_open”,但由于我没有使用文件,所以我不太确定用什么代替 f_open 或 f_read。除了 STDIO.h

之外,我还使用 STCubeMX 生成的 HAL 库

这是我正在使用的代码片段:

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

想通了,在 Wave.c 中,原始源代码看起来是用典型的 "fopen" 打开一个文件句柄,但由于平台上没有适当的文件系统,我能够通过使用 "fmemopen" 代替 fopen 并将 fmemopen 指向我的包含数据的缓冲区来解决这个问题。希望对其他人有所帮助,因为花了很长时间才弄明白。