FreeRTOS移植STM32F103:保姆级教程

0. 前言

硬件平台:

  • STM32F103ZET6

移植流程:

  1. 构建STM32运行环境
  2. 下载FreeRTOS源码
  3. 根据芯片型号选择对应的内核文件
  4. Keil配置项目
  5. 创建任务
  6. 运行

1. 构建STM32运行环境

搭建运行环境基本流程:

  1. 创建Keil项目
  2. 创建对应目录
  3. 复制stm32f103启动文件
  4. 创建main.c文件
  5. 创建串口驱动文件
  6. Keil配置项目结构
  7. 编写main.c与驱动代码

1.1 使用Keil创建项目

1.1.1 打开Keil创建新项目

创建一个项目文件夹用于存放项目(base_project):最上方Project->New … Project -> 输入项目名 -> 保存项目 -> 选择芯片 -> 保存

创建项目:
在这里插入图片描述

选择芯片:
![[Pasted image 20250101103319.png]]

1.2 创建目录

使用Keil创建好项目文件后,在目录中创建start、user、driver、freertos文件夹

  • start:用于存放stm32的启动文件
  • user:存放用户代码
  • driver:存放驱动文件
  • freertos:存放FreeRTOS的移植文件

![[Pasted image 20250101103359.png]]

1.3 复制stm32f103启动文件到start中

通过ST官网下载stm32f103的标准库文件,将以下6个文件拷贝到start文件夹中,这里主要讲FreeRTOS移植,就不一一讲解,可以私信作者获取项目结构源码。

![[Pasted image 20250101103418.png]]

1.4 创建main.c文件

在user文件夹中创建main.c文件,作为程序入口文件。

![[Pasted image 20250101103431.png]]

1.5 创建串口的驱动文件Driver_Usart

在driver文件夹中创建usart文件夹,在usart文件夹中创建Driver_Usart.c与Driver_Usart.h文件。用于调试代码时串口的输出打印。

![[Pasted image 20250101103451.png]]

1.6 打开Keil配置文件

流程步骤:

  1. 选择配置项目目录
  2. 添加文件夹
  3. 对应文件夹添加文件
  4. 配置头文件路径

1.6.1 选择配置项目目录

![[Pasted image 20250101103521.png]]

1.6.2 创建对应文件

![[Pasted image 20250101103654.png]]

![[Pasted image 20250101103730.png]]

1.6.3 添加对应文件

将对应的文件添加进对应的文件夹。
![[Pasted image 20250101103805.png]]

这里以usart的驱动文件为例,将Driver_Usart.c文件添加到对应的Driver/Usart中即可。
![[Pasted image 20250101103837.png]]

对应的main.c添加进文件夹。
![[Pasted image 20250101103934.png]]

添加启动文件,将所有的启动文件添加到Start文件夹中:
![[Pasted image 20250101104023.png]]

![[Pasted image 20250101104041.png]]

配置目录效果:
![[Pasted image 20250101104104.png]]

1.6.4 配置头文件路径

![[Pasted image 20250101104639.png]]

![[Pasted image 20250101104705.png]]

选择对应的头文件路径:
![[Pasted image 20250101104801.png]]

保存路径:
![[Pasted image 20250101104826.png]]

选择调试工具:
![[Pasted image 20250101104914.png]]

![[Pasted image 20250101104947.png]]

1.7 编写main.c与驱动代码

使用VSCode打开base_project文件夹,进行代码编写。

现在VSCode进行插件安装:

  • C/C++
  • Keil Assistant

![[Pasted image 20250101105151.png]]

![[Pasted image 20250101105207.png]]

main.c

#include "Driver_Usart.h"

int main()
{
   
	/* 初始化窗口 */
	USART_Init();


	printf("Hello World!\n");

	while (1)
	{
   
		
	}
	

	return 0;
}

Driver_Usart.h

#ifndef __DRIVER_USART_H
#define __DRIVER_USART_H

#include "stm32f10x.h"
#include "stdio.h"

// 初始化
void USART_Init(void);

#endif

Driver_Usart.c

#include "Driver_Usart.h"

void USART_Init(void)
{
   
    // 1. 配置时钟
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
    RCC->APB2ENR |= RCC_APB2ENR_USART1EN;

    // 2. GPIO引脚配置
    // 2.1 PA9 设为复用推挽输出 MODE: 11, CNF: 10
    GPIOA->CRH |= GPI
### 嵌入式开发中的FreeRTOS教程、资源与示例 #### FreeRTOS简介及其重要性 FreeRTOS是一款专为微控制器设计的轻量实时操作系统(RTOS),具备开源特性,支持多种硬件平台。由于其灵活性和易用性,在嵌入式领域得到广泛应用。对于希望提升产品性能和服务质量的设计者来说,理解并应用FreeRTOS至关重要[^3]。 #### 针对特定芯片的移植指南——AT32f403a实例 针对不同型号的MCU, 如AT32f403a, 已有专门优化过的FreeRTOS移植方案可供借鉴。这些资料不仅包含了详细的安装指导和技术文档,还通过实际案例展示了如何创建多个并发执行的任务来验证系统的稳定性和可靠性[^1]。 ```c // 创建两个简单的LED闪烁任务作为演示 void vTaskBlink(void *pvParameters){ while(1){ HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); vTaskDelay(pdMS_TO_TICKS(500)); } } int main(){ // 初始化外设... xTaskCreate(vTaskBlink,"BLINK",configMINIMAL_STACK_SIZE,NULL,tskIDLE_PRIORITY+1,&taskHandle); // 启动调度器 vTaskStartScheduler(); } ``` 此代码片段展示了一个基本的任务定义方式,适用于大多数基于ARM Cortex-M系列MCU的应用场景。这里`vTaskBlink()`函数代表一个无限循环内的操作,即每隔半秒切换一次指定GPIO引脚的状态;而在`main()`函数里,则调用了`xTaskCreate()`API 来注册这个新任务给FreeRTOS内核管理,并最终启动整个系统进入多线程模式运行。 #### 使用Rust语言进行嵌入式编程的新趋势 除了传统的C/C++之外,现在也有越来越多的人尝试采用更高层次抽象的语言来进行低别的控制工作。比如有人分享了有关于STM32F103平台上运用Rust完成一系列实验的经验报告,这表明即使是在资源受限环境下也能享受到现代编程范式的便利之处[^2]。 #### 学习路径建议 对于初学者而言,《FreeRTOS保姆教程》是一份不可多得的学习材料,它深入浅出地讲解了从基础概念到高特性的方方面面,特别是围绕着像STM32这样的热门单片机展开的具体实现细节[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值