STM32F103 移植 FreeRTOS系统

1.开发板:STM32F103VET6 指南者

2.开发环境:Keil5

3.FreeRTOS版本: FreeRTOSv10.2.1

移植过程:

一、使用keil5新建一个固件库工程,建好后效果如下图所示:

STM32F103 移植 FreeRTOS系统

其中,文件夹FWLIB中包含了工程所需要的固件库的.c文件。如下图所示:

STM32F103 移植 FreeRTOS系统

假设该工程位于E:\STM32\New Project目录下。

二、移植FreeRTOS系统到新建的项目工程中

1.下载FreeRTOS软件包,下载地址为:https://sourceforge.net/projects/freertos/files/FreeRTOS/

  下载后是一个.exe文件:STM32F103 移植 FreeRTOS系统

双击,并Extract它:

STM32F103 移植 FreeRTOS系统

  得到FreeRTOS的源码包。目录如下:

STM32F103 移植 FreeRTOS系统

  我们使用的FreeRTOS的文件全部都在第一个目录,即FreeRTOS目录下。进入该目录,目录结构如下:

STM32F103 移植 FreeRTOS系统

2.在E:\STM32\New Project目录下新建一个文件夹,并命名为FreeRTOS,效果如下:

STM32F103 移植 FreeRTOS系统

  在FreeRTOS目录下,新建inc文件夹和src文件夹。

2.复制..\FreeRTOSv10.2.1\FreeRTOS\Source文件夹下的croutine.clist.cqueue.ctimer.ctasks.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),下面使用图片说明:
  STM32F103 移植 FreeRTOS系统

STM32F103 移植 FreeRTOS系统

5.打开启动文件startup_stm32f10x_hd.s ,调到第50行,在_heap_limit下添加:

                                IMPORT xPortPendSVHandler      
                                IMPORT xPortSysTickHandler  
                                IMPORT vPortSVCHandler  

  效果如下:

STM32F103 移植 FreeRTOS系统

  跳到076行,将DCD  SVC_Handler 修改为 DCD     vPortSVCHandler    

  跳到078行,将DCD PendSV_Handler 修改为 DCD     xPortPendSVHandler  

  跳到079行,将DCD SysTick_Handler修改为 DCD     xPortSysTickHandler

STM32F103 移植 FreeRTOS系统

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.****.net/jutun5887/article/details/80205325