STM32F103C8T6标准库移植FreeRTOS(标准库3.5 3.6 FreeRTOS 2022LTS 2024LTS均适用)
官网下载FreeRTOS™ - FreeRTOS™
自动适应本地(无需魔法,且下载速度与github一致或稍快)


下载带LTS(长期支持,功能稳定)的两个
下载后文件夹操作方式
FreeRTOS/FreeRTOS_Kernel/Source:复制所有.c 粘贴至新工程创建FreeRTOS/Source
FreeRTOS/FreeRTOS_Kernel/portable/RVDS(与Keil5一致)/ARM_CM3: port.c和portmacro.h粘贴至新工程创建FreeRTOS/portable/ARM_CM3
FreeRTOS/FreeRTOS_Kernel/include:复制所有文件 粘贴至新工程创建FreeRTOS/Source
FreeRTOS\FreeRTOS\Demo\CORTEX_STM32F103_Keil:复制FreeRTOSConfig.h 粘贴至工程User(main.c所在文件夹)
├── include/
├── CMakeLists.txt
├── FreeRTOS.h
├── StackMacros.h
├── atomic.h
├── croutine.h
├── deprecated_definitions.h
├── event_groups.h
├── list.h
├── message_buffer.h
├── mpu_prototypes.h
├── mpu_syscall_numbers.h
├── mpu_wrappers.h
├── newlib-freertos.h
├── picolibc-freertos.h
├── portable.h
├── projdefs.h
├── queue.h
├── semphr.h
├── stack_macros.h
├── stdint.readme
├── stream_buffer.h
├── task.h
└── timers.h
├── portable/
├── ARM_CM3/
├── port.c
└── portmacro.h
└── heap_4.c
└── source/
├── croutine.c
├── event_groups.c
├── list.c
├── queue.c
├── stream_buffer.c
├── tasks.c
└── timers.c
stm32f10x_it.c 注释这三段函数(阅读该博主的博客更改:Freertos-CSDN博客)

/在FreeRTOSConfig.h中添加如下宏定义,让FreeRTOS接手系统
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler
main.c demo (可以自己编写)
#include "stm32f10x.h" // 设备头文件
#include "LED.h"
#include "FreeRTOS.h"
#include "task.h"
#include "OLED.H"
// 任务优先级
#define START_TASK_PRIO 1
#define LED1_TASK_PRIO 2
// 任务堆栈大小
#define START_STK_SIZE 128
#define LED1_STK_SIZE 50
// 任务句柄
TaskHandle_t StartTask_Handler;
TaskHandle_t LED1Task_Handler;
// 任务函数声明
void start_task(void *pvParameters);
void led1_task(void *pvParameters);
void LED_Init(void)
{
/*开启时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //开启GPIOC的时钟
/*GPIO初始化*/
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure); //将PA13引脚初始化为推挽输出
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
}
int main()
{
// 初始化LED
LED_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();
}
// 开始任务函数
void start_task(void *pvParameters)
{
// 进入临界区,禁止中断
taskENTER_CRITICAL();
// 创建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();
}
// LED1任务函数
void led1_task(void *pvParameters)
{
while (1)
{
// 点亮LED
GPIO_SetBits(GPIOC, GPIO_Pin_13);
// 任务延迟1000个时钟节拍
vTaskDelay(1000);
// 熄灭LED
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
// 任务延迟1000个时钟节拍
vTaskDelay(1000);
}
}
板载LED闪烁表示运行成功
「智能机器人开发者大赛」官方平台,致力于为开发者和参赛选手提供赛事技术指导、行业标准解读及团队实战案例解析;聚焦智能机器人开发全栈技术闭环,助力开发者攻克技术瓶颈,促进软硬件集成、场景应用及商业化落地的深度研讨。 加入智能机器人开发者社区iRobot Developer,与全球极客并肩突破技术边界,定义机器人开发的未来范式!
更多推荐



所有评论(0)