STM32F103移植freeRTOS(使用官方源码)

Posted SCCELE

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32F103移植freeRTOS(使用官方源码)相关的知识,希望对你有一定的参考价值。

目录

1.准备工作

2.新建文件夹及复制必要文件

3.添加c文件

4.配置运行环境

5.代码修改



1.准备工作

1.1、在这里下载源代码,现在移植用的版本是V9.0.0 。https://sourceforge.net/projects/freertos/files/FreeRTOS/

1.2、准备好STM32F10X的标准库。 https://pan.baidu.com/s/1vk78_EUILqjy0lQs4tDY9Q 提取码: jgsu

2.新建文件夹及复制必要文件

2.1、新建7个文件夹

.\\freeRTOS

.\\freeRTOS\\include

.\\freeRTOS\\port

.\\freeRTOS\\src

.\\Library

.\\Project

.\\User

2.2、把源码FreeRTOSv9.0.0\\FreeRTOS\\Source\\include中的文件全部复制到新建的include文件夹

2.3、把源码FreeRTOSv9.0.0\\FreeRTOS\\Source\\portable中MemMang文件夹复制到新建的port文件夹中

2.4、把源码portable\\RVDS中的ARM_CM3复制到port文件夹中

2.5、把源码FreeRTOSv9.0.0\\FreeRTOS\\Source文件夹中的*.c文件全部复制到新建的src文件夹中

2.6、把CMSIS和FWlib文件夹复制到新建Library文件夹中

2.7、User文件中新建一个main.c,然后复制标准库中的stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h文件到User文件夹中

2.8、把FreeRTOSv9.0.0\\FreeRTOS\\Demo\\CORTEX_STM32F103_Keil中FreeRTOSConfig.h复制到include文件夹中

3.添加c文件

3.1、打开Keil uVision5新建工程,Project-NEW uVision project,选中Project文件夹,输入工程名称,保存。

3.2、芯片选择STM32F103C8,确定,再确定。

3.3、打开管理工程项目,分别新建freeRTOS/port、freeRTOS/src、CMSIS、FWLIB、USER

3.4、freeRTOS/port中分别添加ARM_CM3\\port.c和MemMang\\heap_4.c两个文件

3.5、freeRTOS/src添加freeRTOS\\src文件夹下的所有c文件

3.6、CMSIS添加Library\\CMSIS\\startup\\startup_stm32f10x_md.s、Library\\CMSIS\\core_cm3.c、Library\\CMSIS\\system_stm32f10x.c三个文件

3.7、FWLIB添加Library\\FWlib\\src文件夹下所有的*.c文件

3.8、USER添加main.c、stm32f10x_it.c,如果这里有其他自己编写的代码,也可以放再这里。比如LED,KEY,USART相关代码

4.配置运行环境

4.1、在C/C++选项卡,Define输入:STM32F10X_MD,USE_STDPERIPH_DRIVER

4.2、在C/C++中,包含include路径:freeRTOS\\include、freeRTOS\\port\\ARM_CM3、Library\\CMSIS、Library\\FWlib\\inc、User

如果还有自己编写的其他头文件,也一起包含在里面。如LED,KEY,USART

4.3、使用MicroLIB库,

5.代码修改

5.1、在freeRTOS中,已经为用户实现了SVC_Handle()和PendSV_Handler()函数,需要注释掉,修改stm32f10x_it.c文件

*
//void SVC_Handler(void)
//
//
*
//void PendSV_Handler(void)
//
//
*
/*在c文件中添加如下代码*/
/*freeRTOS中的systick中断函数*/
extern void xPortSysTickHandler(void);
void SysTick_Handler(void)

  #if(INCLUDE_xTaskGetSchedulerState==1)
    if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)
  #endif
    xPortSysTickHandler();
  #if (INCLUDE_xTaskGetSchedulerState==1)		
  
  #endif

5.2、修改一下"FreeRTOSConfig.h",这里我使用软件定时器,需要打开对应宏定义,还要配置FreeRTOS与中断服务函数有关定义

/*FreeRTOS与中断服务函数的配置选项*/
#define xPortPendSVHandler 	PendSV_Handler
#define vPortSVCHandler 	SVC_Handler

/*启用软件定时器相关宏定义*/
#define configUSE_TIMERS	                   1 
#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-1)        
#define configTIMER_QUEUE_LENGTH		       10                               
#define configTIMER_TASK_STACK_DEPTH	       (configMINIMAL_STACK_SIZE*2)

5.3、最后就是添加外设初始化代码,主函数里面添加任务代码。main.c代码如下

#include "FreeRTOS.h"
#include "task.h"
#include "bsp_led.h"
#include "bsp_usart.h"
#include "bsp_key.h"
#include "queue.h"
#include "semphr.h"
#include "event_groups.h"
#include "timers.h"


/*Function definition*/
static void BSP_Init(void);

static void Send_Task(void* pvParameters);
static void Callback_LEDTOGGLE(void* pvParameters);

static void AppTaskCreate(void);


/*Task Handle*/
static TaskHandle_t AppTaskCreate_Handle=NULL;
static TaskHandle_t Send_Task_Handle=NULL;       //PRO:3


/*Timer handle*/
static TimerHandle_t Timer1=NULL;

static void Callback_LEDTOGGLE(void* pvParameters)

  LED1_TOGGLE;
  printf("TickValue=%d\\n",(TickType_t)xTaskGetTickCount());



int main(void)
  
  BaseType_t xReturn =pdPASS;
  
  BSP_Init();
  
  printf("FreeRTOS creates tasks dynamically!\\r\\n");
  
  xReturn=xTaskCreate((TaskFunction_t)AppTaskCreate,\\
                      (const char *)"APPTASKCREATE",\\
                      (uint16_t)512,(void*)NULL,(UBaseType_t)1,\\
                      (TaskHandle_t*)&AppTaskCreate_Handle);
  if(pdPASS==xReturn)
    vTaskStartScheduler();
  else
    return -1;
  while(1);



/*Hardware initialization*/
static void BSP_Init(void)

  /*Use this priority grouping uniformly, never group again
  * 4 bits for pre-emption priority
  */
  
  /*led initialization*/
  LED_GPIO_Config();
  
  /*Serial port initialization*/
  USART_Config();
  
  /*Key initialization*/
  Key_GPIO_Config();


/***********
 *@Function name:SEND_Task
 *@description:SEND_Task body
 *@Parameter:None
 *@return:None
*************/
static void Send_Task(void* pvParameters)


  while(1)
    
    vTaskDelay(100);         //只是为了演示任务切换
  


static void AppTaskCreate(void)

  BaseType_t xReturn=pdPASS;
  taskENTER_CRITICAL();

  /* Create Timer1 Handle*/
  Timer1=xTimerCreate((const char*)"1sec-toggle",(TickType_t)pdMS_TO_TICKS(1000),\\
                     (UBaseType_t)pdTRUE,(void*)1,(TimerCallbackFunction_t)Callback_LEDTOGGLE);
  if(NULL!=Timer1)
    printf("Timer1 created successfully.\\r\\n");
  xTimerStart(Timer1,0);

  /*SEND task*/
  xReturn=xTaskCreate((TaskFunction_t)Send_Task,\\
                      (const char*)"SEND_TASK",\\
                      (uint16_t)512,(void*)NULL,(UBaseType_t)3,\\
                      (TaskHandle_t)&Send_Task_Handle);
  if(pdPASS==xReturn)
    printf("\\r\\nCreate Send_Task success!\\r\\n");
  
  vTaskDelete(AppTaskCreate_Handle);
  taskEXIT_CRITICAL();


/*********************************************END OF FILE**********************/

GitHub项目地址:https://github.com/yesp-chow/freeRTOS_F103

以上是关于STM32F103移植freeRTOS(使用官方源码)的主要内容,如果未能解决你的问题,请参考以下文章

STM32F103移植FreeRTOS-CLI

stm32F103c8 keil移植FreeRTOS时内存不够

stm32F103c8 keil移植FreeRTOS时内存不够

OLED程序在stm32f103上的移植

嵌入式从STM32F103ZET6移植到STM32F103RCT6的流程

uC/OS-II在STM32F103上的移植