启明欣欣STM32开发板移植FreeRTOS

2023-05-16

承接这篇文章,本篇讲述如何把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,工程结构如下,
在这里插入图片描述
后面还要设置include路径和解决编译问题,参考这篇文章,可以解决,非常简单。

本文与这篇参考文章的区别是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以不同频率闪烁。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

启明欣欣STM32开发板移植FreeRTOS 的相关文章

  • python爬取全国五级行政区

    以前爬过国家统计局的四级行政区 xff08 http www stats gov cn tjsj tjbz tjyqhdmhcxhfdm 2017 xff09 xff0c 但是对于五级数据效果不是很好 偶然间发现这个网站 xff1a htt
  • ElasticSearch使用elasticsearchTemplate聚合查询

    这两天正好做个需求 xff0c 需要用到聚合查询 前几篇文章只是简单的提到过 xff0c 并没有真正的运用到实际产出中 xff0c 本篇结合实际代码 xff0c 专项学习ES的聚合查询 1 业务背景 有一张地址索引表 xff1a hisAd
  • Java字节码

    Java最黑科技的玩法就是字节码编程 xff0c 也就是动态修改或是动态生成 Java 字节码 使用字节码可以玩出很多高级的玩法 xff0c 最高级的还是在 Java 程序运行时进行字节码修改和代码注入 听起来是不是一些很黑客 xff0c
  • TCP/IP (一) accept建立连接

    七层网络协议 三次握手 四次分手 xff0c 这些大家都比较熟知 xff0c 这里主要是带着一些问题来思考整个TCP IP流程 1 三次握手的具体流程是怎么样的 xff1f 2 socket编程中int listen int fd int
  • http 的认证模式

    周海汉 2006 7 11 ablozhou 64 gmail com SIP类似Http协议 其认证模式也一样 Http协议 xff08 RFC 2616 xff09 规定可以采用Base模式和摘要模式 xff08 Digest sche
  • Java Agent

    在 Java 字节码 一文中有提到 xff0c 使用 Java Agent 操控字节码 xff0c 本文将讨论 Java Agent xff0c 这是普通 Java 开发人员的真正的黑魔法 Java Agent 能够通过执行字节码的直接修改
  • 通过gitlab远程统计git代码量

    git的代码量大多数都是根据命令行统计 xff0c 或者根据第三方插件统计 但是都不满足我的需求 xff0c 因为我们代码都由gitlab管理 xff0c 于是想到了通过gitlab暴露出来的接口获取数据 第一步 xff0c 生成私钥 登录
  • Qt第二十二章:将控件放到另一个控件的后面或前面

    话不多说 xff1a 看图
  • 缓存行填充与@sun.misc.Contended注解

    1 缓存模型 CPU和主内存之间有好几层缓存 xff0c 因为与cpu的速度相比 xff0c 访问主内存的速度是非常慢的 如果频繁对同一个数据做运算 xff0c 每次都从内存中加载 xff0c 运算完之后再写回到主内存中 xff0c 将会严
  • ThreadLocal那点事

    目录 1 ThreadLocal原理 2 ThreadLocal内存泄漏 3 ThreadLocal最佳实践 4 FastThreadLocal原理 5 FastThreadLocal最佳实践 6 ThreadLocal与FastThrea
  • 关于雪花算法的设计与思考

    2017年的时候项目组在开发一款大区游戏 xff0c 由于之前demo阶段的玩家id都是单服生成的 xff0c 只能保证单进程中的唯一 xff0c 而无法保证在分布式服务器端的唯一性 随着项目的开发进展 xff0c 需要设计能保证在分布式的
  • java反射之Method的invoke方法实现

    在框架中经常会会用到method invoke 方法 xff0c 用来执行某个的对象的目标方法 以前写代码用到反射时 xff0c 总是获取先获取Method xff0c 然后传入对应的Class实例对象执行方法 然而前段时间研究invoke
  • A*寻路算法之解决路径多拐点问题

    1 问题描述 最近公司正在开发的游戏涉及到了寻路算法 xff0c 然后我从网上找了一份A 算法代码 xff0c 整理了一下写了一个A 算法基础实现 然而 xff0c 在真正实用时A 寻路时 xff0c 却发现了几个问题 xff1a 基础实现
  • 代理模式与委托模式的异同点

    在 设计模式之禅 xff08 第二版 xff09 中 xff0c 作者说 代理模式也叫做委托模式 xff0c 显然是认为代理模式和委托模式是毫无差别的 然而在实际开发中 xff0c 我们通常可以很明确的知道一个模式究竟是代理模式还是委托模式
  • TCP/IP编程之select函数详解

    前述 xff1a linux下的I O复用模型目前很多都已经不用select函数了 xff0c 而是用epoll xff0c 但是为什么还需要了解select编程呢 xff0c 其实是从两个方面考虑的 xff1a 一是为了通过select去
  • 堆栈的详细解释

    一 在c中分为这几个存储区 1 栈 由编译器自动分配释放 2 堆 一般由程序员分配释放 xff0c 若程序员不释放 xff0c 程序结束时可能由OS回收 3 全局区 xff08 静态区 xff09 xff0c 全局变量和静态变量的存储是放在
  • Gmapping、hector、Cartographer三种激光SLAM算法简单对比

    文章目录 一 Gmapping是基于粒子滤波的算法 二 Hector SLAM三 Cartographer 一 Gmapping是基于粒子滤波的算法 缺点 xff1a 严重依赖里程计 xff0c 无法适应无人机及地面不平坦的区域 xff0c
  • TCP连接建立过程

    TCP连接建立过程 浏览器访问网站 xff0c 通过域名解析找到ip地址后会与服务器端建立连接 其中TCP xff08 Transmission Control Protocol xff0c 传输控制协议 xff09 是一种面向连接的 可靠
  • 海康威视错误代码文档大全【完整版】

    简介 本文收录了海康各大设备错误码 xff0c 按ctrl 43 f查询 xff1b 包含网络通讯库错误码 阵列错误码 安全激活相关错误码 智能设备错误码 RTSP通讯库错误码 软解码库错误码 转封装库错误码 语音对讲库错误码 Qos流控库
  • lighttpd http响应报文(Response)增加安全头Referrer-Policy和X-Permitted-Cross-Domain-Policies方法

    X Permitted Cross Domain Policies和Referrer Policy说明 X Permitted Cross Domain Policies X Permitted Cross Domain Policies

随机推荐

  • ROS使用ARUCO识别二维码获取位置信息做定位使用

    使用ARUCO识别二维码获取位置信息 1 安装软件 cd catkin ws src git clone b kinetic devel https github com pal robotics aruco ros cd catkin m
  • Keil 编译时无法找到头文件解决

    Keil 编译时无法找到头文件解决方法 1 背景 Keil 编译的时候无法找到头文件 xff0c 搜了下相关问题及解决方法 xff0c 有介绍说是因为文件夹中有数字 xff0c 无法搜到头文件 xff0c 进行了更改 xff0c 还是找不到
  • 学习open62541 --- [71] Alarm and Condition

    本文讲述Alarm and Condition的用法 xff0c 主要以源码里提供的例子为基础进行讲解和演示 xff0c 即tutorial server alarms conditions c xff0c 该例子写的有点乱 xff0c 本
  • 学习open62541 ---[68] 使用Wireshark观察通信消息

    Wireshark是强大的网络协议分析工具 xff0c 而open62541也是基于socket的 xff0c 所以也可以用其来观察OPCUA通信消息 一 安装Wireshark 去https www wireshark org 去下载并安
  • UART、IIC、SPI、CAN通信的区别与应用

    文章目录 1 通信的基本知识1 1 数据通信的种类1 1 1 串行通信1 1 2 并行通信1 1 3 总结 1 2 数据通信的传输方向1 2 1 单工1 2 2 半双工1 2 3 全双工1 2 4 总结 1 3 数据通信的方式1 3 1 同
  • 学习open62541 --- [69] Client监测多个变量值

    有读者问Client如何监测多个变量值 xff0c 这篇文章给了提示 xff0c 但是没给例子 xff0c 本文给出详细例子 xff0c 使用的open62541版本是1 3 3 xff0c 运行环境debian10 5 一 准备Serve
  • 学习CANopen --- [6] 自定义对象字典

    在前面几篇文章中 xff0c 我们运行例子时都需要一个eds文件 xff0c 比较麻烦 xff0c 本文讲述如何在代码中自定义对象字典 xff0c 只添加自己需要的OD项 如果是作为master来使用 xff0c 还是比较方便的 自定义对象
  • 学习CANopen --- [7] 使用块(Block)下载

    对于一次传输超过4字节的情形 xff0c SDO可以使用Segment传输或者Block传输 xff0c Segment传输在第6篇文章中已经介绍 xff0c 本文讲解Block传输中的下载情况 一 与Segment传输的比较 相比于Seg
  • 学习open62541 --- [70] 深入理解变量监测

    本文深入探讨一下变量监测的用法和原理 一 累积传输 先前写的关于变量监测的文章 xff0c 都是设置一个采样时间 xff0c 然后有变化了就通知一下 xff0c 有时我们希望变化累积一段时间再一起传给client xff0c 这时如何设置呢
  • 学习CANopen --- [8] 多主机同时运行时的问题

    本文记录一下实际使用CANopen时开启多个主机遇到的问题 一 问题描述 本人在嵌入式设备上用Python CANopen库写一个SDO xff0c 由于数据比较多 xff0c 就使用了Segment download xff0c 大概需要
  • 学习CANopen --- [9] CAN总线的状态检查

    本文讲述如何判断CAN总线是否存在以及是否bus off xff0c 以vcan0进行讲解 xff0c vcan0是虚拟的CAN接口 xff0c 可以把它看做一个软件CAN适配器 xff08 区别于硬件CAN适配器 xff0c 如PeakC
  • 学习CANopen --- [10] 汽车外接OBD模块原理

    在某宝上搜索汽车OBD xff0c 可以发现很多卖OBD模块的 xff0c 通过接入OBD模块可以增加车子本身没有的功能 xff0c 如锁车升窗 xff0c 行车自动落锁和后视镜折叠等 xff0c 那么其实现原理是什么呢 xff1f 使用时
  • 学习open62541 --- [72] client删除subscription时的warning

    本文记录一个问题的理解过程 xff0c 试验条件 xff1a 使用open62541运行server使用asyncua运行clientclient会向server添加subscription xff0c 然后在断开连接前删除subscrip
  • 启明欣欣STM32开发板闪烁LED实验

    最近在咸鱼上买了一块启明欣欣的STM32板子 xff0c 准备在上面测试open62541和CANopen xff0c 到货后如下图 xff0c 找商家要了资料 xff0c 然后运行一个LED灯的实验来简单测试下板子 xff0c 本文记录一
  • Python fpdf2生成表格

    fpdf2库可以用来生成pdf文档 xff0c 该库是从fpdf库fork来的 xff0c 老库自2018年就不再更新维护了 xff0c fpdf2对用户更友好 xff0c api也更方便使用 一 fpdf2介绍 其网址是https pyf
  • Android动态分析工具-Inspeckage

    1 Inspeckage简介 Inspeckage是一个用来动态分析安卓app的xposed模块 Inspeckage对动态分析很多常用的功能进行了汇总并且内建一个webserver 整个分析操作可以在友好的界面环境中进行 2 下载地址 I
  • 行为树 --- [7] BehaviorTree.CPP 4.x版本的编译及使用

    根据BehaviorTree CPP的官方介绍 xff0c 3 x版本已经不再维护了 xff0c 建议使用4 x版本 xff0c 4 x版本和3 x版本的区别可以看这里 https www behaviortree dev migratio
  • OPC UA性能评估

    本文是对这篇论文的总结 xff0c 该文章从性能和资源使用方面比较了工业4 0的4个主要协议 xff1a OPC UA xff0c DDS xff0c ROS和MQTT 这4个协议都是基于以太网 xff08 Ethernet based x
  • 学习open62541 --- [73] 数据源造成无法监测变量的问题解决

    本人最近遇到一个问题 xff1a 给一个变量添加数据源后 xff0c 使用监测项去监测变量变化 xff0c 如果采样时间为0 xff0c 会发现无法监测到变量的变化 本文讲述这种情况的发生原因以及解决办法 一 Server例子 首先准备se
  • 启明欣欣STM32开发板移植FreeRTOS

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