STM32标准库的部署和FreeRTOS的移植(适用各类开发板)

这篇具有很好参考价值的文章主要介绍了STM32标准库的部署和FreeRTOS的移植(适用各类开发板)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、准备

1.下载源文件

FreeRTOS Real Time Kernel Files
下载V9.0.0下的FreeRTOSv9.0.0.zip
stm32 移植freertos,stm32,单片机,嵌入式硬件
下载完成解压后
stm32 移植freertos,stm32,单片机,嵌入式硬件

2. 文件内容

双击打开FreeRTOS文件夹,这就是FreeRTOS V9.0.0的源文件了
stm32 移植freertos,stm32,单片机,嵌入式硬件

2.1 include文件

在include文件夹中是一些头文件,这是需要移植到嵌入式平台的部分
stm32 移植freertos,stm32,单片机,嵌入式硬件

2.2 portable文件

这个文件夹下需要关注的是移植哪种编译环境的文件和管理内存的文件
在本次的学习中使用的是keil环境,“See-also-the-RVDS-directory”其主要参照是在RVDS文件夹中的ARM系列CM3
stm32 移植freertos,stm32,单片机,嵌入式硬件
stm32 移植freertos,stm32,单片机,嵌入式硬件

二、STM32工程部署

在keil中创建一个STM32的工程首先开始部署STM32的标准库环境。

1. 标准库

1.1 下载标准库

STM32F10x标准外设库
可以选择注册一个stm32的账号来下载该固件库
下载并解压后得到如下
stm32 移植freertos,stm32,单片机,嵌入式硬件

1.2 标准库简介

在上图中需要的标准库内容只在Libraries文件夹中,为了方便管理将该文件夹分类

内核文件

内核文件在Libraries\CMSIS\CM3\CoreSupport
stm32 移植freertos,stm32,单片机,嵌入式硬件
将这两个文件复制到刚刚创建的keil工程下的CORE文件夹(自己创建的文件夹)下
stm32 移植freertos,stm32,单片机,嵌入式硬件
并且内核文件只是一些对动作的具体描述,比如数据的压栈等等,但这并不能使单片机真正运行起来,还需要单片机的启动程序,这个启动程序也是内核的一部分
在Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm下选择合适的启动文件也放入到CORE中
stm32 移植freertos,stm32,单片机,嵌入式硬件
复制合适的启动文件
stm32 移植freertos,stm32,单片机,嵌入式硬件

库文件

Libraries\STM32F10x_StdPeriph_Driver
stm32 移植freertos,stm32,单片机,嵌入式硬件
在工程下新建一个STM32_Libraries文件夹将ku文件全部存入
stm32 移植freertos,stm32,单片机,嵌入式硬件

配置文件和中断函数文件

是在例程中,打开任意例程就可以找到这两个文件(外加一个头文件)
Project\STM32F10x_StdPeriph_Examples\ADC\ADC1_DMA
stm32 移植freertos,stm32,单片机,嵌入式硬件
stm32 移植freertos,stm32,单片机,嵌入式硬件

将他们复制到STM32_Config中
并且在Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x找到系统文件也一并存入STM32_Config中
stm32 移植freertos,stm32,单片机,嵌入式硬件

说明:system_stm32f10x.c .h是系统的初始化程序包括系统的基础时钟初始化

至此STM32的标准库部署基本完成 下面是对keil工程的设置和文件的添加了

2. keil设置

向keil中添加文件夹及添加文件,文件夹按照创建的文件夹名创建文件夹
stm32 移植freertos,stm32,单片机,嵌入式硬件
stm32 移植freertos,stm32,单片机,嵌入式硬件
stm32 移植freertos,stm32,单片机,嵌入式硬件
stm32 移植freertos,stm32,单片机,嵌入式硬件
最重要的是要在编译器中添加宏定义,要让编译器明确单片机容量类型STM32F10X_HD,USE_STDPERIPH_DRIVER
并且将头文件地址加入到头文件地址框中
stm32 移植freertos,stm32,单片机,嵌入式硬件

2.1 为什么要添加STM32F10X_HD,USE_STDPERIPH_DRIVER宏定义

2.1.1 USE_STDPERIPH_DRIVER

在main函数中需要在开头包含stm32f10x.h这个文件
stm32 移植freertos,stm32,单片机,嵌入式硬件
在该文件中搜索USE_STDPERIPH_DRIVER宏,可以发现这个宏是决定是否要包含stm32f10x_conf.h这个头文件的一个标识
stm32 移植freertos,stm32,单片机,嵌入式硬件
而打开stm32f10x_conf.h这个文件可以发现,在这个文件里面包含了所有的标准库的头文件,这也是为什么在main.c中只引入了一个stm32f10x.h文件的原因
stm32 移植freertos,stm32,单片机,嵌入式硬件

2.1.1 STM32F10X_HD

同理也在stm32f10x.h这个文件中搜索STM32F10X_HD宏,可以看到有对中断的描述,也有对内核链接外设的描述
stm32 移植freertos,stm32,单片机,嵌入式硬件
stm32 移植freertos,stm32,单片机,嵌入式硬件

三、移植FreeRTOS到工程

1. 复制文件

在工程下新建一个文件夹叫FreeRTOS
将FreeRTOS的源文件FreeRTOSv9.0.0\FreeRTOS\Source下的内容复制到FreeRTOS中
stm32 移植freertos,stm32,单片机,嵌入式硬件
打开portable文件夹删除我们不需要的内容
stm32 移植freertos,stm32,单片机,嵌入式硬件
打开FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil文件
stm32 移植freertos,stm32,单片机,嵌入式硬件
将这个文件复制到工程文件夹中的FreeRTOS/include文件夹下
stm32 移植freertos,stm32,单片机,嵌入式硬件

2. 在keil工程中添加FreeRTOS内容

在keil中新建两个文件夹FreeRTOS_CORE和FreeRTOS_PORT,并在这两个文件夹下添加文件
stm32 移植freertos,stm32,单片机,嵌入式硬件
stm32 移植freertos,stm32,单片机,嵌入式硬件
接下来将头文件地址加入到keil的头文件寻址框中
stm32 移植freertos,stm32,单片机,嵌入式硬件

3. 修改FreeRTOSConfig.h文件

在FreeRTOSConfig.h中添加如下内容
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler
#define vPortSVCHandler SVC_Handler
stm32 移植freertos,stm32,单片机,嵌入式硬件

4. 修改stm32f10x_it.c文件

将以下三个函数注释
stm32 移植freertos,stm32,单片机,嵌入式硬件
至此FreeRTOS的移植和STM32标准库的部署基本完工文章来源地址https://www.toymoban.com/news/detail-720401.html

四、编写程序

#include "stm32f10x.h"
#include "FreeRTOS.h"
#include "task.h"

//任务优先级
#define START_TASK_PRIO		1
//任务堆栈大小	
#define START_STK_SIZE 		128  
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);

//任务优先级
#define LED0_TASK_PRIO		2
//任务堆栈大小	
#define LED0_STK_SIZE 		50  
//任务句柄
TaskHandle_t LED0Task_Handler;
//任务函数
void led0_task(void *pvParameters);

//任务优先级
#define LED1_TASK_PRIO		3
//任务堆栈大小	
#define LED1_STK_SIZE 		50  
//任务句柄
TaskHandle_t LED1Task_Handler;
//任务函数
void led1_task(void *pvParameters);


 
 void GPIO_INIT()
 {
	 
		GPIO_InitTypeDef  GPIO_InitStructure;
 	
		 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);	 //使能PB,PE端口时钟
			
		 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;				 //LED0-->PB.5 端口配置
		 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
		 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
		 GPIO_Init(GPIOB, &GPIO_InitStructure);					 //根据设定参数初始化GPIOB.5
		 GPIO_SetBits(GPIOB,GPIO_Pin_5);						 //PB.5 输出高

		 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;	    		 //LED1-->PE.5 端口配置, 推挽输出
		 GPIO_Init(GPIOE, &GPIO_InitStructure);	  				 //推挽输出 ,IO口速度为50MHz
		 GPIO_SetBits(GPIOE,GPIO_Pin_5); 						 //PE.5 输出高 
 }
 
 void start_task(void *pvParameters)
{
	 taskENTER_CRITICAL();           //进入临界区
    //创建LED0任务
    xTaskCreate((TaskFunction_t )led0_task,     	
                (const char*    )"led0_task",   	
                (uint16_t       )LED0_STK_SIZE, 
                (void*          )NULL,				
                (UBaseType_t    )LED0_TASK_PRIO,	
                (TaskHandle_t*  )&LED0Task_Handler); 
    //创建LED1任务
    xTaskCreate((TaskFunction_t )led1_task,     
                (const char*    )"led1_task",   
                (uint16_t       )LED1_STK_SIZE, 
                (void*          )NULL,
                (UBaseType_t    )LED1_TASK_PRIO,
                (TaskHandle_t*  )&LED1Task_Handler);         
    vTaskDelete(StartTask_Handler); //删除开始任务
    taskEXIT_CRITICAL();            //退出临界区
}
//LED0 任务函数
void led0_task(void *pvParameters)
{
 while(1)
 {
	  GPIO_SetBits(GPIOE,GPIO_Pin_5);
	  vTaskDelay(500);
	  GPIO_ResetBits(GPIOB,GPIO_Pin_5);
	  vTaskDelay(500);
 }
}
//LED1 任务函数
void led1_task(void *pvParameters)
{
	while(1)
	{
 		GPIO_ResetBits(GPIOE,GPIO_Pin_5);
		vTaskDelay(300);
		GPIO_SetBits(GPIOB,GPIO_Pin_5);	
		vTaskDelay(300);
	}
}
 int main(void)
 {	
	 
	 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组 4 
	 GPIO_INIT();
	 
	 //创建开始任务
    xTaskCreate((TaskFunction_t )start_task,            //任务函数
                (const char*    )"start_task",          //任务名称
                (uint16_t       )START_STK_SIZE,        //任务堆栈大小
                (void*          )NULL,                  //传递给任务函数的参数
                (UBaseType_t    )START_TASK_PRIO,       //任务优先级
                (TaskHandle_t*  )&StartTask_Handler);   //任务句柄              
    vTaskStartScheduler();          //开启任务调度
		 	  
}

到了这里,关于STM32标准库的部署和FreeRTOS的移植(适用各类开发板)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 手动移植FreeRTOS到STM32

            前言:这只是一篇FreeRTOS入门的文章,用于自己忘记的时候回看复习。本文是采用CubeMX生成的STM32F407的基础工程后来进行移植的。 一、FreeRTOS简介 1.什么是实时操作系统         实时操作系统(Real-time operating system, RTOS),又称即时操作系统,它会按照排序运行、

    2024年02月21日
    浏览(35)
  • STM32FreeRTOS操作系统移植

    移植好的FreeRTOS模板: 链接:https://pan.baidu.com/s/1_87VQAWXUl4jTqSCZ0MFjw?pwd=dw52  提取码:dw52 1.在工程中新建FreeRTOS文件夹 2.把源码source里面的文件全部粘贴进FreeRTOS文件夹中  3.在portable文件中只保留一下文件,其余删除  4.新建如下两个文件夹  5.在FreeRTOS_CODE目录下添加以下文件

    2024年02月08日
    浏览(46)
  • STM32移植FreeRTOS操作系统

    一、FreeRTOS源码下载 (1)移植钱得准备前菜对吧,我们先来去官网瞄一瞄 网址:FreeRTOS - Market leading RTOS (Real Time Operating System) for embedded systems with Internet of Things extensions 第一步:点击下载FreeRTOS 第二步:选择版本下载(我选择稳定版本) 注:我们下载的稳定版本不包含DEMO例

    2024年01月17日
    浏览(41)
  • stm32移植freertos报错keil

    *** Using Compiler \\\'V5.06 update 7 (build 960)\\\', folder: \\\'d:Keil_v5ARMARMCCBin\\\' compiling main.c... .USERFreeRTOSConfig.h(79): error:  #130: expected a \\\"{\\\"       extern uint32_t SystemCoreClock; .FreeRTOSportableportmacro.h(210): warning:  #12-D: parsing restarts here after previous syntax error   { .FreeRTOSportableportmacro.h(215): error:

    2024年02月10日
    浏览(43)
  • KEIL环境stm32移植FreeRTOS

    准备工作:keil软件,一份点灯代码,FreeRTOS源码。 1.FreeRTOS源码下载 直接在官网下载    FreeRTOS - Free RTOS Source Code Downloads, the official FreeRTOS zip file release download 2.解压资源 打开FreeRTOS文件夹 会用到的是Demo文件夹和Source文件夹。 Demo文件夹里面就是 FreeRTOS的相关例程,里面有各

    2024年02月03日
    浏览(40)
  • STM32F407 移植 FreeRTOS

    本实验是基于正点原子 STM32F407ZG 探索者开发板完成的,所以需要一个STM32F407ZG 探索者开发板 用于移植的基础工程(下面会讲) FreeRTOS源码(下面会讲) 本实验所有用到的代码:基于正点原子STM32F407的FreeRTOS移植工程.zip 1.1 移植前准备 1.1.1 基础工程 由于后续需要用到 LED、

    2024年02月08日
    浏览(70)
  • STM32 CubeMX LwIP + freertOS 移植

    开发板: 官方 STM32F746  MCU型号:STM32F746NGH 网卡型号:LAN8742A  原理图如下 先用裸机测试LAN8742A的网卡驱动 使用CubeMX创建工程 系统时钟和时基定时器如下 无系统LWIP协议栈设置,静态IP地址,关闭DHCP 生产代码,下载进开发板。开发板网口与电脑网口通过网线直连,设置电脑本

    2024年01月16日
    浏览(87)
  • FreeRTOS移植STM32超详细(以STM32F103ZE为例)

    我刚学FreeROTS时想移植到STM32,找了网上很多资料,但大多都不是很完整,于是我把我自己的移植过程分享出来,供大家参考。 我们以STM32F103ZE,正点原子的跑马灯实验为例, 准备工作: 跑马灯实验工程 FreeRTOS文件源码(可在官方下载)     第一步  移植文件到工程 首先在工

    2024年02月08日
    浏览(36)
  • 【学习日记】【FreeRTOS】FreeRTOS 移植到 STM32F103C8

    本文基于野火 FreeRTOS 教程,内容是关于 FreeRTOS 官方代码的移植的注意事项,并将野火例程中 STM32F103RC 代码移植到 STM32F103C8。 两个下载链接: 官 网 代码托管 Source:内核源码,我们需要的主要内容 根目录:这里的 C 文件都是由 C 语言编写的,所以在各种单片机上是通用的

    2024年02月11日
    浏览(45)
  • STM32G431RBT6移植FreeRTOS

    引言: 本文专门为参加了蓝桥杯嵌入式赛道的同学准备, 大家可能会有这样一个问题, 比完赛之后, 对于像继续使用STM32G431RBT6学习FreeRTOS的, 发现网上的教程使用的板子基本上都是F1和F4的, 其实呢, 随便移植一下就能在我们自己的板子上面运行FreeTROS了。如果大家有AR

    2024年04月23日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包