1.开发板:STM32F103VET6 指南者
2.开发环境:Keil5
3.FreeRTOS版本: FreeRTOSv10.2.1
移植过程:
一、使用keil5新建一个固件库工程,建好后效果如下图所示:
其中,文件夹FWLIB中包含了工程所需要的固件库的.c文件。如下图所示:
假设该工程位于E:\STM32\New Project目录下。
二、移植FreeRTOS系统到新建的项目工程中
1.下载FreeRTOS软件包,下载地址为:https://sourceforge.net/projects/freertos/files/FreeRTOS/
下载后是一个.exe文件:
双击,并Extract它:
得到FreeRTOS的源码包。目录如下:
我们使用的FreeRTOS的文件全部都在第一个目录,即FreeRTOS目录下。进入该目录,目录结构如下:
2.在E:\STM32\New Project目录下新建一个文件夹,并命名为FreeRTOS,效果如下:
在FreeRTOS目录下,新建inc文件夹和src文件夹。
2.复制..\FreeRTOSv10.2.1\FreeRTOS\Source文件夹下的croutine.c 、list.c、queue.c、timer.c、tasks.c 和
..\FreeRTOSv10.2.1\FreeRTOS\Source\portable\RVDS\ARM_CM3中的port.c文件以及
..\FreeRTOSv10.2.1\FreeRTOS\Source\portable\MemMang中的heap_2.c文件到自建的E:\STM32\New Project\FreeRTOS\src目录下。
3.复制..\FreeRTOSv10.2.1\FreeRTOS\Source\include目录下的所有.h文件以及
. ..\FreeRTOSv10.2.1\FreeRTOS\Source\portable\RVDS\ARM_CM3下的portmacro.h文件以及
..\FreeRTOSv10.2.1\FreeRTOS\Demo\CORTEX_STM32F103_Keil下的FreeRTOSConfig.h文件
到自建的E:\STM32\New Project\FreeRTOS\inc目录下。
4.打开新建的工程文件(.uvprojx),下面使用图片说明:
5.打开启动文件startup_stm32f10x_hd.s ,调到第50行,在_heap_limit下添加:
IMPORT xPortPendSVHandler
IMPORT xPortSysTickHandler
IMPORT vPortSVCHandler
效果如下:
跳到076行,将DCD SVC_Handler 修改为 DCD vPortSVCHandler
跳到078行,将DCD PendSV_Handler 修改为 DCD xPortPendSVHandler
跳到079行,将DCD SysTick_Handler修改为 DCD xPortSysTickHandler
6.在main.c文件头部,#include 一下头文件:"FreeRTOS.h" "task.h" "queue.h"
至此,FreeRTOS在STM32F103上移植完毕。在main函数中创建任务并启动任务调度器后就可以运行了。例如:
/* LED灯每1秒闪烁一次 */
void vTaskLed_G( void * pvParameters )
{
while(1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_0); // ÁÁ
vTaskDelay(1000/portTICK_RATE_MS);
GPIO_SetBits(GPIOB,GPIO_Pin_0); // Ãð
vTaskDelay(1000/portTICK_RATE_MS);
}
}
int main(void)
{
LedGreen_Config(); //LED的GPIO初始化函数
xTaskCreate( vTaskLed_G, "Task Led_G", 512, NULL, 1, NULL ); //创建一个任务
vTaskStartScheduler(); //启动任务调度
while (1)
{
}
}
编译通过后下载到STM32F103VET6指南者开发板中,如果LED灯每秒闪烁一次,表示FreeRTOS移植成功。
参考:https://wenku.baidu.com/view/6a3d604f227916888586d73f.html
https://blog.csdn.net/jutun5887/article/details/80205325