STM32F407ZGT6移植freeRTOS
平台:VScode
RTOS版本:freertos-code-r2837-tags-V10.4.1
硬件:STM32F407ZGT6
这是在原有文件上移植 创建一个目录用来放rtos
复制一下内容
进入portable文件 这里我只保留了这两个因为是在vscode 上移植所以不需要keil那个文件 保留以下即可 看个人需求 和环境
因为用的是f407的芯片所以我把其他的都删了 只保留4F
GCC也是相同的
保留这两个即可 看个人 理论只保留ARM_CM4F 即可 我没试过就多留了一个
然后进入人家Demo工程里 找到相关芯片的Demo例程
这个文件最主要的是这个FreeRTOSConfig.h main文件可以完全用自己的
把这个文件移到创建的freertos目录中去即可
还有一个文件在 freertos-code-r2837-tags-V10.4.1\freertos-code-r2837-tags-V10.4.1\FreeRTOS\Source\portable目录下的MemMang里面 看个人需求 我这里用
heap_4.c也是最常用的内存管理方式
也是复制到创建的freertos目录中去即可
自此完成一半了
然后在vscode 创建文件夹添加文件即可 这里创建了两个文件夹 方便添加一下文件 方便管理
.h文件路径
../../freertos
../../freertos/include
../../freertos/portable/RVDS/ARM_CM4F
修改FreeRTOSConfig.h中的内容 主要修改后面有注释的
把原来在这个地方的替换成下面这个
#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
// #ifdef __ICCARM__
#include <stdint.h>
extern uint32_t SystemCoreClock;
#endif
然后在 stm32f4xx_it.c里面把这几个注释了 不然会和rtos冲突
// void SysTick_Handler(void)
// {
// }
/ void SVC_Handler(void)
// {
// }
// void PendSV_Handler(void)
// {
// }
// void SysTick_Handler(void)
// {
// }
- system_stm32f4xx.c 文件,将 371 行的 25 改为 8,这是PLL倍频系数。PLL倍频计算公式:PLL_VCO = HSE_VALUE * PLL_N / PLL_M / PLL_P = 8000000 * 336 * 8 / 2 = 168MHz。
stm32f4xx.h
system_stm32f4xx.c
在自己的main.c文件中条件 头文件和相关即可测试
#include "drv_led.h"
#include "drv_systick.h"
#include "drv_usart.h"
#include "drv_beep.h"
#include "drv_rcc.h"
#include "stdio.h"
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "semphr.h"
#include "timers.h"
void vTask1(void *pvParameters) {
while (1) {
// 任务1的行为
GPIO_ResetBits(GPIOF, GPIO_Pin_10);
SYSTICKs_DelayNms(550);
GPIO_SetBits(GPIOF, GPIO_Pin_10);
SYSTICKs_DelayNms(50);
}
}
void vTask2(void *pvParameters) {
while (1) {
// 任务2的行为
GPIO_ResetBits(GPIOF, GPIO_Pin_9);
SYSTICKs_DelayNms(1000);
GPIO_SetBits(GPIOF, GPIO_Pin_9);
SYSTICKs_DelayNms(500);
}
}
int main(void)
{
RCC_DeInit();
RCC_config();
SYSTICKs_Config(168);
USART1_Config();
LED_Config();
// 创建任务1
xTaskCreate(vTask1, "Task1", 120, NULL, 1, NULL);
// 创建任务2
xTaskCreate(vTask2, "Task2", 120, NULL, 1, NULL);
// 启动调度器
vTaskStartScheduler();
while(1)
{
}
}
相关的根据自己的文件自己测试能不能就行
如果port.c报错的话选一下支持浮点运算即可 如果芯片本身就不支持的话 把port 文件换成M版本的