启明欣欣STM32开发板移植FreeRTOS

news2024/9/20 9:01:14

承接这篇文章,本篇讲述如何把FreeRTOS移植到启明欣欣STM32开发板里,比较简单,网上也有各种教程,本文也是参考其它文章,这里再记录一下。


一 搭建基础工程

启明欣欣STM32开发板上的MCU是STM32F407ZGT6,根据这个创建Keil工程,直接参照之前文章中那个点亮LED的工程也可以,工程创建出来保证可以读写GPIO就行了,这里不再赘述。

本人使用Keil 5.35,使用软件自带CMSIS 5.5.0,编译器版本使用版本5,
在这里插入图片描述


二 下载FreeRTOS

点击https://www.freertos.org/进入FreeRTOS官网,点击下载,
在这里插入图片描述
在新的页面里继续点击下载,如下图,当前最新版本是202212.00
在这里插入图片描述

下载下来之后解压如下,
在这里插入图片描述
内核代码位于FreeRTOS/Source,如下,
在这里插入图片描述


三 移植

在Keil工程目录下创建文件夹freertos_src,
在这里插入图片描述
然后把FreeRTOS的内核代码拷贝到freertos_src里,即FreeRTOS/Source/里的代码,如下图,
在这里插入图片描述
打开Keil工程,点击“Manage Project Items”按钮,
在这里插入图片描述
弹出的界面如下,在Groups栏下添加新的group — freertos_src
在这里插入图片描述
然后点击这个新的group,在Files栏下点击“Add Files…”
在这里插入图片描述
然后把以下点c文件添加进来,
在这里插入图片描述
接着把port.c添加进来,位于freertos_src/portable/RVDS/ARM_CM4F/
在这里插入图片描述
最后把heap_4.c添加进来,位于freertos_src/portable/MemMang/
在这里插入图片描述
此时工程如下,
在这里插入图片描述
然后点击OK,工程结构如下,
在这里插入图片描述
后面会遇到编译问题,参考这篇文章,可以解决,非常简单。

本文与这篇参考文章的区别是CMSIS的使用,本文使用Keil自带的,该文使用的是外部CMSIS库,都可以。相对来说,本文的更简洁一点,但要注意CMSIS的兼容性。使用外部CMSIS库可以让整个工程更加独立,其它Keil版本都可以编译。


四 测试

工程中的main.c如下,

#include "stm32f4xx.h" 
#include "stm32f4xx_hal_gpio.h"
#include "stm32f4xx_hal_rcc_ex.h"

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



void LED_Init()
{
    __HAL_RCC_GPIOE_CLK_ENABLE();
    __HAL_RCC_GPIOG_CLK_ENABLE();
    
    GPIO_InitTypeDef  GPIO_InitStructure;

    GPIO_InitStructure.Pin = GPIO_PIN_3 | GPIO_PIN_4;
    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStructure.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(GPIOE, &GPIO_InitStructure);

    GPIO_InitStructure.Pin = GPIO_PIN_9;
    HAL_GPIO_Init(GPIOG, &GPIO_InitStructure);

    HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3 | GPIO_PIN_4, GPIO_PIN_RESET); 
    HAL_GPIO_WritePin(GPIOG, GPIO_PIN_9, GPIO_PIN_RESET);
}

void task_blink_led0(void * arg)
{
    while(1)
    {
        HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_9);
        vTaskDelay(500); //延时500ms
    }
}

void task_blink_led2(void * arg)
{
    while(1)
    {
        HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_3);
        vTaskDelay(1000); //延时1000ms
    }
}

int main(void)
{
    LED_Init();
    
    TaskHandle_t StartTask_Handler;
    //创建开始任务
    xTaskCreate((TaskFunction_t )task_blink_led0,            //任务函数
                (const char*    )"task_blink_led0",          //任务名称
                (uint16_t       )128,        //任务堆栈大小
                (void*          )NULL,                  //传递给任务函数的参数
                (UBaseType_t    )1,       //任务优先级
                (TaskHandle_t*  )&StartTask_Handler);   //任务句柄  
    
	TaskHandle_t StartTask_Handler2;
    //创建开始任务
    xTaskCreate((TaskFunction_t )task_blink_led2,            //任务函数
                (const char*    )"task_blink_led2",          //任务名称
                (uint16_t       )128,        //任务堆栈大小
                (void*          )NULL,                  //传递给任务函数的参数
                (UBaseType_t    )1,       //任务优先级
                (TaskHandle_t*  )&StartTask_Handler2);   //任务句柄  							
								
	//开启任务调度                
    vTaskStartScheduler(); 

}

编译完成后下载到板子上,可以发现2个led以不同频率闪烁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/172686.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能电视机安装App

每年的12月18日是世界电视机日,电视机诞生于1925年,最初是电子机械式电视机;到了1933年,诞生CRT电视,即黑白电视,它只有黑色或白色,看任何物品都是黑色或者白色。又过了20年,1953年彩…

Java之collection集合、常见数据结构、List和泛型

目录集合概述总结Collection集合的体系特点总结Collection集合常用APICollection集合的遍历方式方式一:迭代器总结方式二:foreach/增强for循环方式三:lambda表达式Collection集合存储自定义类型的对象总结常见数据结构数据结构概述、栈、队列…

【C++初阶】C++基础(一)

C是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等。熟悉C语言之后,对C学习有一定的帮助,本文主要目标:1. 补充C语言语法的不足,以及C是如何对C语言设计不合理…

尚医通-首页显示-前端数据整合(二十六)

目录: (1)前台用户系统-首页显示-整合静态页面 (2)前台用户系统-首页显示-数据接口开发 (3)前端用户系统-首页显示-前端整合 (1)前台用户系统-首页显示-整合静态页面 …

代码随想录第七天(541、剑指05)

文章目录541. 反转字符串 II发现了三个基础知识的问题看答案改进剑指 Offer 05. 替换空格答案方法1答案方法2知识点一、二、三、总结541. 反转字符串 II 发现了三个基础知识的问题 第一个 这个题目发现了一个非常大的问题,有点不知道自己的Java基础到底有多少窟窿…

C++ 20 新特性 ranges 精讲

C 20 新特性 ranges 精讲 C20 中的 ranges 库使得使用 STL 更加舒适和强大。ranges 库中的算法是惰性的,可以直接在容器上工作,并且可以很容易地组合。简而言之,ranges 库的舒适性和强大性都源于它的函数思想。 在深入细节之前,…

程序员的7个被动收入途径——我如何每月赚 5万

每个人都想过时间和财富自由的生活,世界上有70亿人,但只有不到18000人能做到这一点,大多数人一生都在为钱工作。 研究表明,全世界65.8万富人至少有三种收入来源,而且都是被动收入。换句话说,大多数富人知道…

Create Realtime-chat app

Tech:React,Node.js,Socket.io,MongoDB styled-component ​​​​​​​ 目录 Base setup Register funcitonality Login funcitonality set Avatar/profile picture Chat container setup useEffect basic hook ChatHeader ChatInput ChatMessage Set socket an…

I.MX6ULL裸机开发笔记2:镜像文件

目录 一、boot ROM程序 二、镜像文件五要素 三、芯片手册 四、芯片手册数据解读 1、空偏移 2、IVT表 3、DCD表 一、boot ROM程序 选择内部启动方式,启动boot ROM程序 初始化时钟,外部DDR3从外部存储介质加载代码 boot ROM程序是芯片厂…

十五天学会Autodesk Inventor,看完这一系列就够了(十一),放样和螺旋扫掠(绘弹簧)

众所周知,Autocad是一款用于二维绘图、详细绘制、设计文档和基本三维设计,现已经成为国际上广为流行的绘图工具。Autodesk Inventor软件也是美国AutoDesk公司推出的三维可视化实体模拟软件。因为很多人都熟悉Autocad,所以再学习Inventor&…

Redis缓存数据 | 黑马点评

目录 一、什么是缓存 二、添加Redis缓存操作 三、缓存更新策略 缓存的更新策略 ​编辑 业务场景 主动更新策略 案例 四、缓存穿透 1、是什么 2、解决方案 (1)缓存空对象 (2)布隆过滤器 (3)其…

【春节安全保障有我们】安全狗春节放假值班通知

兔年纳福 辛勤拼搏了一年 终于迎来了福兔吉祥年 众人沉浸于准备过年的氛围中 却有些人为春节期间的网络安全担忧 因为春节也是不法分子们 伺机而动、“搞事情”的“好时机” 2023 NEW YEAR 不得不防的安全风险 1、主机安全遭受威胁 (云)主机系统…

Rust语言基础

安装 Rust 官网:https://www.rust-lang.org/Linux or Mac: curl https://rustup.rs -sSf | sh Windows: 按官网指示操作 Windows Subsystem for Linux: curl --proto ‘https’ --tlsv1.2 -sSf https://sh.rustup.rs | sh 查看是否安装成功 rustc --version 更…

【openEuler】x2openEuler工具使用

文章目录一、关于x2openEuler二、工具准备三、前期准备1、安装CentOS72、下载x2openEuler3、安装x2openEuler4、执行bash5、访问上述网站6、安装x2openEuler-client(1)在CentOS-7.6Evetything1上找到x2openEuler-client(2)把x2ope…

Android Studio 支持手机投屏电脑

有时当我们在线上做技术分享或者功能演示时,希望共享连接中的手机屏幕,此时我们会求助 ApowerMirror,LetsView,Vysor,Scrcpy 等工具。如果你是一个 Android Developer,那么现在你有了更好的选择。 Android…

蓝桥杯--快排+队列+尺取法

😃这只松鼠如约而至 - 许嵩 - 单曲 - 网易云音乐 😃你买菜吗玫瑰 - 要不要买菜 - 单曲 - 网易云音乐 😃一起玩吧这世界那么多人(电影《我要我们在一起》主题曲) - 莫文蔚 - 单曲 - 网易云音乐 前言 这是我在CSD…

一文讲透单点登录架构思想(SSO)

目录什么是单点登录?非单点登录架构单点登录架构什么是CAS单点登录SSO演进1.同域2.同父域3.跨域CASCAS术语CAS场景单点登录优缺点优点缺点什么是单点登录? 单点登录(SingleSignOn,SSO),就是通过用户的一次性鉴别登录。当用户在身份…

【数据结构与算法理论知识点】 4、树和二叉树

4、树和二叉树 逻辑结构 4.1、树的定义和基本术语 树是n个结点的有限集 树的其他表示方式 基本术语 根——即根结点(没有前驱) 叶子——即终端结点(没有后继) 森林——指m棵不相交的树的集合(例如删除根节点A后的…

Apache Solr 9.1-(二)集群模式运行

Apache Solr 9.1-(二)集群模式运行 Solr是一个基于Apache Lucene的搜索服务器,Apache Lucene是开源的、基于Java的信息检索库,Solr能为用户提供无论在任何时候都可以根据用户的查询请求返回结果,它被设计为一个强大的文…

synchronized锁升级

假如 synchronized 是「王」身边的「大总管」,那么 Thread 就像是他后宫的王妃。「王」每日只能选择一个王妃陪伴,王妃们会想方设法争宠获得陪伴权,大总管需要通过一定的手段让王「翻牌」一个「王妃」与王相伴。 今日听「码哥」胡言乱语解开…