Don’t you want sometimes to have object files such as images to display and an audio sound data to play, do you? you need to convert it from binary to ARM object file. All the time, it didn’t work for me at all and I was scratching my head!
There is not so many articles of how to do it out in the internet and most of them didn’t help for me. I think there should be a more effective and smart methods than mine, but in this article I can show you my way of how to convert a binary data into an object file for ARM cortex-M, and take it in your project.
- 1 What I want to do
- 2 Workflow
- 3 Summary of Important things
- 4 Generate sound audio data
- 5 Convert it to ARM binary format
- 6 Summary
What I want to do
I want to have a binary data like an audio sound data in my project, and finally I want to output the sound on I2S interface as PCM data to external devices.
The sound should be a sine wave since it is easy to see if it is surely output on I2S interface.
This time, I will first show you how to make an sine wave and will convert it into ARM object file to be linked in your project.
Also, I will show you how to access it externally and take it in my project.
- To generate a sine wave as demo (using Audacity of free tool)
- To convert the sine wave binary data into ARM object file to be linked and built in my project
- To have it in a project.
Summary of Important things
- You can use Free software Audacity to generate a sine wave, and it is so easy to use.
- Audio file format is required as PCM.
- The generated sound binary data needs to be converted into ARM object file.
- To convert it, you can use objcopy utility tool available as GNU.
- You need to change the section of the converted object file.
- In C source code, you can declare it as an array and access to the first address.
Well, let’s get into it.
Generate sound audio data
We will make first a sound audio data, but if you have it already, you can skip this section.
You can use Audacity which is a free software and I am using it always.
Audio sound can be recorded by just clicking a button, but this times shows a way of making a sine wave for my purpose that I want to output on I2S.
You can download Audacity here. ↓
Start up Audacity
I am sorry about the Japanese Menu as my PC is Japanese environment…
Right after starting up the Audacity at first time, there is no track, so you need to make a track and generate audio sound.
Add a track
You may go to Tool bar menu, Track-Add-Stereo track. Sorry, but this article was originally written in Japanese. So, the application I use is also Japanese version. You can find where it is to supposed to click.
Separate stereo track
Before generating sine wave, it is better to separate the stereo track. This way allows you to add different frequencies on each channel, left and right ch.
Click a button▼of “Audio Track”, and then click the button of ” Split Stereo track ”
Now you have the split track as below ↓
Generate Tone (Sine wave)
Now you are generating a sine wave from here. Go tool bar menu Generator, click “Generator” to select “Tone…”, then.
The frequency can be set any frequency you like, but this time it is now set to 440Hz. The rest should be default for now.
This way gives you two identical tone on both of the tracks. Now you need to click anywhere on the right channel and select the channel, once again you need to click Generator and tone to generate different frequency sine wave, e,g, 900Hz.
Configuration of sampling frequency
You set the sampling frequency to 44.1kHz, by clicking left-lower corner sampling box.
Merge the stereo track
You may want to merge the tracks making stereo track.
Click a button▼of “Audio Track”, and click create stereo track.
Click a button▼of “Audio Track”, and click “Format” and click “24bit PCM format” is selected.
I always select a raw data type in the header format option, since the header info is added to the file. The file name and file extension can be left as is.
The file extension will be stored and changed to “.raw”.
And, click OK and finish.
Convert it to ARM binary format
ARM binary format is 32bit little-endian. You need to convert the audio sound image to the ARM format as well.
In order to do that, you can use an utility tool available from open source software, which is objcopy. If you already installed MCUXpresso IDE, it comes with objcopy. You can find it in the folder of MCUXpresso as below picture.
Objcopy can convert a binary in to a variety of formats.
WAV file ⇄ bin
ELF32 ⇄ bin
objectcopy -I binary -B arm -O elf32-littlearm foo.bin foo.o
|-I binary：||–input-target You need to specify what type of format (bdfname) as input file. This time it is set to binary.|
|-B arm：||Binary architecture is specified. This time it is set to arm|
|-O elf32-littlearm :||You need to specify what type of format (bdfname) as output file. For ARM Cortex-M, elf32-littlearm can be set.|
Check the content of the generated objet file
Let’s check and see the contents of the file. ..
You can do readelf to show the header and the section info.
readelf foo.o -h -S
To show the info of header and section.
You can find that .rodata start address is _binary_sine_wave_raw_start and you can access the first address of the array.
Now you can write in C source like this to access to the object file.
extern char _binary_sine_wave_raw_start;
extern char _binary_sine_wave_raw_size;
const char *sine-wave = _binary_sine_wave_raw_start;
size_t sine-wave_size = _binary_sine_wave_raw_size;
It is important that you can access the object file by pointing to the first address of the array.
In order to generate a sine wave, Audacity is handy application. I very often use this application when I create a sound source data for evaluation.
In the case of converting the binary image into linkable object file, GNU free software of objcopy can be used and it is bundled with NXP MCUXpresso IDE.
After conversion, you can access it by means of pointer access to the first address of the array.