FreeRTOS系统移植——基于STM32F103

该文章参考了_杰杰_博主的文章,如有涉及侵权,将删除该文章。

基于STM32F1的系统移植

  • 基本步骤
  1. 移植source文件夹的.c文件、portable文件夹中的文件
  2. 在Keil5工程中添加文件
  3. 移动FreeRTOSConf.h文件
  4. 修改中断配置函数

1. 移植文件

​ 首先复制裸机开发的工程模板,并且在其目录下创建文件夹FreeRTOS。之后,打开源代码(FreeRTOS的Source文件夹),将以下文件移动至工程中的FreeRTOS文件夹中:

文件文件夹
croutine.cinclude
event_groups.cportable
list.c
queue.c
stream_buffer.c
tasks.c
timers.c

之后,打开FreeRTOS源码中的portable文件夹,需要移动Kiel、MemMang和RVS三个文件夹即可。

image-20240221115945491

移植成功后如下图所示:

image-20240221115903329

2 在工程中添加文件

  • FreeRTOS_CORE中的文件在FreeRTOS目录下;

  • FreeRTOS_PORTABLE

    • heap_4.c:portable -> MemMang
    • port.c:portable -> RVDS -> ARM_CM3
image-20240221120116650

3、移动FreeRTOSConf.h文件

​ 对于STM32F1而言,在"FreeRTOSv202212.01\FreeRTOS\Demo\CORTEX_STM32F103_Keil"目录下找到FreeRTOSConf.h文件,将其移动至FreeRTOS工程模板的include文件中。如图所示:
image-20240327201737287

4. 修改中断服务函数

  • 修改stm32f10x_it.c

​ SysTick中断服务函数是一个非常重要的函数,FreeRTOS所有跟时间相关的事情都在里面处理,SysTick就是FreeRTOS的一个心跳时钟,驱动着FreeRTOS的运行,就像人的心跳一样,假如没有心跳,我们就相当于“死了”,同样的,FreeRTOS没有了心跳,那么它就会卡死在某个地方,不能进行任务调度,不能运行任何的东西,因此我们需要实现一个FreeRTOS的心跳时钟,FreeRTOS帮我们实现了SysTick的启动的配置:在port.c文件中已经实现vPortSetupTimerInterrupt()函数,并且FreeRTOS通用的SysTick中断服务函数也实现了:在port.c文件中已经实现xPortSysTickHandler()函数,所以移植的时候只需要我们在stm32f10x_it.c文件中实现我们对应(STM32)平台上的SysTick_Handler()函数即可。FreeRTOS为开发者考虑得特别多,PendSV_Handler()与SVC_Handler()这两个很重要的函数都帮我们实现了,在在port.c文件中已经实现xPortPendSVHandler()与vPortSVCHandler()函数,防止我们自己实现不了,那么在stm32f10x_it.c中就需要我们注释掉PendSV_Handler()与SVC_Handler()这两个函数了。

stm32f10x_it.c修改后的代码如下图:
image-20240327203908967

  • 修改FreeRTOSConf.h文件

​ 与STM32F4不同,STM32F1的文件中并没有相关的宏来定义SysTick_Handler()、PendSV_Handler()与SVC_Handler()函数,故需要在FreeRTOSConf.h文件中添加以下宏定义:

/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
standard names. */
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler

FreeRTOSConf.h添加宏定义后如图所示:
image-20240327202844205
5. 执行

main.c文件代码如下:

#include "stm32f10x.h"                  // Device header
#include "LEDTest.h"
#include "FreeRTOS.h" 
#include "task.h" 

void led1_task(void* arg)
{
	LEDTest_ON();
    while(1)
    {
        LEDTest_Turn();
        vTaskDelay(1000);
    }
}

int main(void)
{
	LEDTest_Init();
	xTaskCreate(led1_task, "led1_task", 64, NULL, 3, NULL);
	vTaskStartScheduler();
	while(1)
	{
		
	}
}

LEDTest.c文件代码如下:

#include "stm32f10x.h"                  // Device header
#include "LEDTest.h"

#define LEDTEST_RCC		RCC_APB2Periph_GPIOC
#define LEDTEST_GPIO	GPIOC
#define LEDTEST_PIN		GPIO_Pin_13


void LEDTest_Init(void)
{
	RCC_APB2PeriphClockCmd(LEDTEST_RCC, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = LEDTEST_PIN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(LEDTEST_GPIO, &GPIO_InitStructure);
	
	GPIO_SetBits(LEDTEST_GPIO, LEDTEST_PIN);
}

void LEDTest_ON(void)
{
	GPIO_ResetBits(LEDTEST_GPIO, LEDTEST_PIN);
}

void LEDTest_OFF(void)
{
	GPIO_SetBits(LEDTEST_GPIO, LEDTEST_PIN);
}

void LEDTest_Turn(void)
{
	if (GPIO_ReadOutputDataBit(LEDTEST_GPIO, LEDTEST_PIN) == 0)
	{
		GPIO_SetBits(LEDTEST_GPIO, LEDTEST_PIN);
	}
	else
	{
		GPIO_ResetBits(LEDTEST_GPIO, LEDTEST_PIN);
	}
}

LEDTest.h文件代码如下:

#ifndef __LEDTEST_H
#define __LEDTEST_H

void LEDTest_Init(void);
void LEDTest_ON(void);
void LEDTest_OFF(void);
void LEDTest_Turn(void);


#endif

运行,STM32F1开始闪烁。至此,STM32F1的系统移植已经完成!
7cb8f82a04396bc60ba7ed4bc8eb81e

  • 18
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我可以回答这个问题。首先,您需要下载FreeRTOS和freemodbus的源代码,然后根据STM32F103的硬件特性进行适当的修改和配置。最后,将修改后的代码编译并烧录到STM32F103上即可。具体的步骤可以参考相关的开发文档和教程。 ### 回答2: 要将FreeRTOS freemodbus移植STM32F103上,首先需要了解STM32F103的硬件特性和FreeRTOS、freemodbus的工作原理。然后按照以下步骤进行移植: 1. 首先,将STM32F103的开发环境搭建好,包括安装相关的开发工具和驱动程序。 2. 从FreeRTOS官方网站下载最新版本的FreeRTOS源代码,并解压缩到工程目录下。 3. 从freemodbus官方网站下载最新版本的freemodbus源代码,并解压缩到工程目录下。 4. 打开STM32F103的开发环境,创建一个新的工程。 5. 将FreeRTOS的源代码添加到工程中,包括核心代码、任务调度器、内存管理等。 6. 根据STM32F103的硬件特性,配置相关的寄存器和引脚,确保与FreeRTOS的功能相匹配。 7. 将freemodbus的源代码添加到工程中,包括主站、从站和串口通信等模块。 8. 通过配置文件或修改源代码,设置freemodbus的参数,如波特率、数据位、停止位等。 9. 在工程中创建一个新的任务,用于处理freemodbus的通信逻辑。 10. 编译并下载程序到STM32F103。 11. 运行程序,通过串口或其他方式检测和验证freemodbus的通信功能。 12. 根据实际需求,对移植后的FreeRTOS freemodbus进行优化和调试。 以上是将FreeRTOS freemodbus移植STM32F103的大致步骤,具体的实施过程需要根据具体的环境和需求进行调整。在移植过程中可能会遇到一些问题和挑战,需要仔细阅读相关文档和参考资料,并进行适当的学习和研究。 ### 回答3: 要将FreeRTOS freemodbus移植STM32F103上,需要按照以下步骤进行操作: 1. 首先,需要确保你熟悉STM32F103的操作和编程。了解该微控制器的寄存器和外设配置,以及相应的开发工具和环境设置。熟悉使用STM32CubeMX来进行初始化和配置。 2. 下载FreeRTOS和freemodbus库的最新版本。可以从官方网站下载并解压这两个库。 3. 在STM32CubeMX中,创建一个新的项目,并选择适合你的STM32F103型号的芯片。 4. 在配置时,确保使能FreeRTOS和freemodbus库。这些库应该是预编译好的二进制文件,所以不需要进行额外的编译工作。 5. 在配置文件中,设置FreeRTOS的任务和堆栈大小,根据你的需求进行适当的调整。还要根据freemodbus库的要求,配置相应的寄存器和外设。 6. 在生成代码后,你将得到一个基本的FreeRTOS和freemodbus库的项目框架。在这个框架中,你可以添加自定义任务和功能,以满足你的应用需求。例如,你可以添加具体的modbus从站和主站的实现。 7. 通过FreeRTOS的任务和队列机制,你可以实现多任务并发和通信。在这个框架中,你可以创建多个modbus任务,以处理不同的modbus请求。 8. 配置UART或其他串行通信外设来与modbus通信。这取决于你的具体需求和硬件配置。 9. 最后,编译和下载固件到STM32F103上,然后运行你的应用程序。确保程序正常工作并能够实现预期的功能。 总结起来,移植FreeRTOS freemodbus库到STM32F103的过程需要熟悉STM32F103的编程和操作,配置合适的开发环境和工具,同时充分理解和使用FreeRTOS和freemodbus库的功能和特性。通过合理的任务分配和通信机制,你可以实现一个高效可靠的modbus通信应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值