Introduction: Setting Up FreeRTOS From Scratch on STM32F407 Discovery Kit
Choosing FreeRTOS as a Real-Time Operating System for your embedded project is a great choice. The FreeRTOS is truly free and provides many simple and effective RTOS features. But setting up freeRTOS from scratch might be difficult or I can say a bit confusing as it requires some customization such as adding Microcontroller specific files, setting header file paths, etc. In this Instructable, I will guide you on how to set up FreeRTOS on your STM32F407 Discovery kit in detail using Kiel uVision IDE.
Attachments
Supplies
- You can find more about FreeRTOS in freertos.org
- FreeRTOS download guide RTOS Source Code Download Instructions
- Complete details on STM32F407 Discovery Kit Getting started with STM32F407 Discovery KIt
- Github Repository FreeRTOS on STM32F407 Discovery Kit
Step 1: Open Keil UVision IDE
Open Keil uVision IDE. Click on a project the select New uVision Project...Then select your working directory and give your preferred project name.
Step 2: Select the Device
Once you have given name to the project, in the next step you need to add device. Here we are adding STM32F407VG Micronconroller from STMicroelectronics. Select the STM32F407VG, then Click OK.
Step 3: Manage Run-Time Environment
The next step is to select the library/driver component in the Manage Run-Time Environment Tab. Here select all components as shown in the above picture. Once you check all appropriate field Click Resolve then Click OK.
Step 4: Copy FreeRTOS Into Your Project Folder
Now you need to Copy the entire FreeRTOS folder into your project folder.
Step 5: Add FreeRTOS Files to Project
Once you have copied the FreeRTOS folder inside your project folder, you have to add all the necessary FreeRTOS files to your Project.
- In Keil, Select Target1, right-click then select Add new group. Rename this group as FreeRTOS.
- Now Click on the FreeRTOS group, right-click the select Add Existing files to Group "FreeRTOS..."
- Add all the FreeRTOS files as shown in the above picture.
The path to finding these files in FreeRTOS folder are :
- Files: croutine, event_groups, list, queue, stream_buffer, tasks and timers. Path: (....\FreeRTOSv10.2.1\FreeRTOS\Source)
- Files:heap_4(There are 4 memory management files add anyone). Path: (....\FreeRTOSv10.2.1\FreeRTOS\Source\portable\MemMang)
- Files: port.c (This is an MCU specific file). Path: (...\FreeRTOSv10.2.1\FreeRTOS\Source\portable\RVDS\ARM_CM4F)
Note : FreeRTOS version may change. Just use the latest version available.
Step 6: Configure the Path of the FreeRTOS Header Files
Once you have added the FreeRTOS source files, you need to tell the compiler where respective header files are located. Hence we need to configure the compiler option.
Right Click on Target1--> Option for Target "Target1.." --> C/C++--> Include path. Make sure you include these paths :
- Include folder in FreeRTOS ( ...\FreeRTOSv10.2.1\FreeRTOS\Source\include)
- RVDS directory (...\FreeRTOSv10.2.1\FreeRTOS\Source\portable\RVDS\ARM_CM4F)
Note: If you have any header files, make sure you include the path of these header files as explained above.
Step 7: Add "FreeRTOSConfig.h" File to Project
The FreeRTOS has one important header file called FreeRTOSConfig.h. This file contains the application-specific(in our case-specific to Cortex M4F MCU) customization. For simplicity, I have copied our MCU specific FreeRTOSConfig.h file in the RVDS directory. And also in step 6, we have already added the RVDS path. If you're adding it yourself then You have to add this file in your project and also make sure you include the path of this file as explained in step 6.
Incase if you want to add FreeRTOSConfig.h file by your self in your preferred directory, I have included this file below.
For more information Click here FreeRTOSConfig.h
Attachments
Step 8: Add the "main.c" File With the Basic Template
- Now Create a New User group( I have renamed it to "User application").
- Add a new C-file to this Group( I have added a file called main.c).
- This is the file where the main() function exists. I have included all the minimum required functions and headers into this file so that the project successfully compiles.
You can find the main.c file with basic template below.
Step 9: Connect Your STM32F407 Discovery Kit to Your PC/Laptop
Step 10: Select ST-Link Debugger in Compiler Configuration
Right Click on Target1, then click on Option for Target "Target1..", then navigate to Debug Tab andSelect ST-Link-Debugger as shown in the above picture
Step 11: Configure ST-Link Debugger
After selecting the ST-Link Debugger in step 10, click on Settings then select Trace and check all the fields as shown in the above picture.
Step 12: Build and Upload the Code
After completing all the steps build the project and make sure there are no errors in the code. After successful compilation, upload the code to your Discovery Kit.
Step 13: Goto to Debug Window and Open Serial Monitor
After uploading go to debug window-->view-->Serial Windows-->Debug(printf) Viewer as shown in the above picture.
Step 14: Run the Code to See the Ouput on Debug Printf Window
The Final step is to run the code as shown in the picture to see the output in the printf window. Here in main.c I have implemented 2 simple tasks called task1 and task2. Both the task have the same priority and they just print the name of the task. Due to the same priorities you can see both of them running and printing the name.
7 Comments
2 years ago
Hello, excellent article has served me too much. I have some doubts about how to configure the clock using FreeRTOS, I would like to know what clock source is being used within this project and if it is the case how to edit it.
2 years ago
Thank you so much for this! I don't know why but trying to learn FreeRTOS is making me pull my non-existence hair out. I don't mean it's hard, it's getting the basic examples working that's been the problem.
3 years ago
Sharath_N25, Thanks for such a nice document about the FreeRTOS starting on STM32. I follows your steps and have the project successfully built. However, I cannot see the running output (with printf) on the debugger viewer. The debugger viewer window is empty.
I think step13 indicates to redirect the output to debugger viewer, but I don't know why it does not work in my case?
I tried to setup breakpoints and I can step into the code and see the running procedures.
I am using a STM32F4VE board as below and the processor is STM32407VET6. Not sure if it is because of different on the hardware?
Reply 3 years ago
Hi baojason, Try printing some text using printf() without RTOS. There should some documentation on how to do this for your board. First figure out that then implement the same with RTOS.
Note : on Step 3 please make sure you check mark "STDOUT --> ITM" which actually enables you to print on debug window..
Question 3 years ago on Step 12
Hi, after following all the steps when I try to build the compiler returns that the build failed with 91 errors and 200+ warnings. However when building directly from your projet everything compiles. The two projects seem identical but the IDE apparently doesn't see it that way. I'm using FreeRTOS v10.3.1 and the STM32f4.
EDIT : So after looking into it, what caused all those issues was that the newer versions of the Keil IDE default to ARM compiler 6. After changing it to the ARM Compiler 5 in "Options for Target 'Target 1' " / Target / ARM Compiler, the project built with 0 error and 0 warning.
Question 3 years ago on Step 1
In attempting to Compile FreeRTOS for STM32F407VGT6 Receive a number or compiler errors.
From Port.h and PortMacro.h: Port.h from ..portable/RVDS/ARM_CM4F
error __ASM expecting ( and not {
Am I using the wrong compiler.
Thanks in anticipation
Ken Garner
Answer 3 years ago
Hi Ken, I am not sure what is the problem, Please follow all the steps given in the Instructables and verify, Definitely you can compile FreeRTOS successfully. The error say expecting "(" , please check the error messages in detail(if it's pointing to a specific line of the file?) try fixing it.