【FreeRTOS 快速入门】-- 1、STM32工程移植FreeRTOS

目录

一、新建STM32工程

为了示范完整的移植过程,我们从0开始,新建一个标准的STM32点灯工程。

(本篇以CubeMX作示范,CubeIDE操作近同,可作对比参考)

1、新建工程 

选择 芯片型号 新建工程

2、搜索芯片型号

输入芯片型号进行搜索 (注意:如果输入框为粉红色,可能是因为前面有空格,要删除)双击搜索结果中的目标芯片型号,即可进入配置。

3、配置Debug调试方式

新建工程时,养成习惯:先配置Debug选项(即调试模式);如果没有使能Debug:烧录一次程序后,将关闭调试引功能,无法再烧录(得解锁芯片);

4、选择 晶振源

HSE,外部高速时钟源,选择: Crystal/Ceramic Resonator

5、配置 时钟树

下图参数,通用STM32F407xx系列 ,(更换为你所用芯片的时钟树参数即可通过)。1、3两项,要填写实物晶振值,可以查看晶振上丝印, 也可以查看原理图。目前市面的F407系列开发板,常用晶振有8MHz、25MHz两种,修改下图1、2两处即可。        

6、配置 LED灯 引脚

这里,我们增加LED的引脚配置,将用于验证STM32工程配置的正确性。

每个开发板上,都会有LED灯,在调试程序时可以配合作为各种状态指示输出。

小编所用的STM32板子,查得LED原理图如下:

红灯使用PC5、蓝灯使用PB2低电平时通路

依据此图,我们对这两个引脚进行配置:

引脚 PC5,工作模式:GPIO_Output(推出模式),修改别名:LED_RED引脚 PB2,工作模式:GPIO_Output(推出模式),修改别名:LED_BLUE如果希望程序运行后默认为:熄灯,还可以配置:上拉,这样程序运行后电路就是断路状态。

7、工程选项

进入工程管理页面,设置4项:工程名称、存放目录、开发环境、堆栈大小。

目录、名称:重点:不能使用中文!否则无法正常生成。开发环境:选MDK-ARM,  即Keil工程。堆栈大小:都修改成0x1000(或者更大),以适配FreeRTOS、LVGL等移植。

提示:

CubeMX:生成后,工程文件夹,可以复制到其它中文路径下存放,也可以修改成中文的文件夹名称,以便管理。但工程的名称,不能修改!CubeIDE:生成后,工程文件夹,可以复制到其它英文路径下存放。路径、名称都不支持中文。

8、文件选项

这一页,打勾两个选择:

标记2处:只生成需要的库文件(可以有效减少代码体积)。标记3处:为各种外设生成独立c、h文件(不打勾时,外设的初始化代码会堆在main.c中)。

至此,已完成新建工程所需全部配置。

9、生成工程

生成后,弹窗:

小编的习惯:打开文件夹,再手动打开工程。


二、验证工程

这一部分,我们通过编写代码,使LED每500ms闪烁一次,以验证工程的配置是否完整。

1、设置 仿真器 参数

选择 CMSIS DAP打勾自动复位、运行

2、添加LED闪烁代码

很多新手不重视LED,觉得太简单太无聊了,没味道。

请认真看待LED的使用,它是大杀器般的存在。

如,规律地闪烁,可以帮助我们判断:系统时钟是否正常、程序有没有卡死等等。

双击打开main.c在while中的 /* USER CODE BEGIN 3 */ 下方,编写规律闪烁LED的代码,如下:

/** 1ms延时 **/
HAL_Delay(1 - 1);                                                  // 延时函数,参数:ms; 注意:CubeMX生成的HAL_Delay(), 函数内部为避免无效操作,会对传入参数+1,因此,如果只需要几ms延时建议传入参数时-1,如果需要大几百ms的非精准延时,那参数不-1也影响不大/** 每500ms闪烁一次蓝色LED **/
static uint16_t msLED = 0;
if (++msLED == 500)                                                // 每500ms执行一次
{msLED = 0;                                                     // 计数清0HAL_GPIO_TogglePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin);          // 规律地闪烁蓝色LED,方便外部观察系统是否正常运行
}

完成后,是这个样子的:

3、编译

新工程的第一次编译,时间会有点长,大约几十秒。

编译完成后,信息栏的输出,是这个样子:

重点:必须 0 Erros,才能生成烧录文件。

4、 烧录 

点击“烧录”,下方的烧录进度条,大约要跑10秒左右。

烧录完成后,芯片将会自动复位,运行里面的程序。

如果程序一切正常,这时,我们观察开发板:蓝色LED,将会每0.5秒反转闪烁一次。

至此,我们的STM32点灯工程,已通过验证,可以使用它,进行FreeRTOS的移植了 !


三、移植 FreeRTOS

以前,移植FreeRTOS的底层代码,是需要自己复制、增删、修改代码,很是麻烦,相当耗时。

而现在通过CubeMX、CubeIDE,只需简单地点击,就能自动生成已移植好FreeRTOS的工程。

1、回到图形化配置界面

如果已关闭了CubeMX,双击工程目录下的 ioc 文件再次打开。

2、修改HAL库的时基源

我们先理解两个时基源:FreeRTOS时基源、HAL库时基源。

首先是FreeRTOS的时基源,它将占用Systick定时器,每1ms产生1次计数,用作任务时基。

而CubeMX生成的HAL库代码,也需要一个时基源,也默认使用:SysTick。

HAL库的时基源,很多人以为只是被简单用于延时,如 HAL_Delay();

其实,它还用于HAL库代码中的超时监测等场景中,如:I2C通信的ACK等待超时。

如果上述两者都同时使用SysTick作时基源,潜在一定风险,在生成代码时,会弹窗警告!

所以,为了避免发生冲突,我们需要修改HAL库所用的时基源,使用其它闲置的TIM。

如:TIM7等。

3、使能FreeRTOS  

上图中,在选择: CMSIS_V2后,就能使能FreeRTOS,其它参数,默认即可,不作修改。

(后续可以按项目需要进行修改,再生成更新后的配置。)

来到这一步,已完成了FreeRTOS的移植。

......是不是相当的意外,只是打了一个勾,就移植好了,就这么简单!!

4、默认生成的OS任务

(这个小节,原本想示范如何新建一个任务,但为了各篇章的独立,还是把这事独立一篇吧。)

在使能FreeRTOS后,会自动生成一个默认的任务:defaultTasK。

在选项页 "Tasks and Queues" ,可以查看这个任务的参数配置。

具体如下图所示:

这里,也不作任何修改,直接使用默认参数。

5、再次生成工程

(待更新。。。)

6、为任务编写执行代码

(待更新。。。)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win10 远程桌面无法连接,解决Win10远程桌面无法连接问题的方法

Windows 10操作系统中,远程桌面是一项非常实用的功能,它允许用户从另一台设备远程访问和控制另一台计算机。然而,有时候用户可能会遇到Win10远程桌面无法连接的问题。本文将探讨可能导致这个问题的原因,并提供相应的解决方案。 确…

7-38 数列求和-加强版

题目链接&#xff1a;7-38 数列求和-加强版 一. 题目 1. 题目 2. 输入输出样例 3. 限制 二、代码 1. 代码实现 #include <stdio.h> #include <string.h> #include <malloc.h>void addTerm(char *sum, int A, int N);int main() {int A, N;char *sum;// 读…

C++音视频开发面试题

下面是音视频开发面试题精选&#xff1a; 1、纹理抗锯齿有哪些算法&#xff1f;各有哪些利弊&#xff1f;2、使用 OpenGL PBO 为什么能提高效率&#xff1f;3、iOS 如何使用分段转码&#xff0c;如何设置分片大小&#xff1f;4、VideoToolbox 中是不是不存在平面格式&#xff…

前端css中径向渐变(radial-gradient)的使用

前端css中径向渐变的使用 一、前言二、主要内容说明&#xff08;一&#xff09;、径向渐变的形状1.椭圆形渐变&#xff08;ellipse&#xff09;&#xff0c;源码12.源码1运行效果3.圆形渐变&#xff08;circle&#xff09;&#xff0c;源码24.源码2运行效果 &#xff08;二&…

vue3+ts--实际开发之--table表格打印或者保存

vue3实现指定区域打印&#xff08;导出&#xff09;功能-主要是解决分页内容分割问题 一、 问题页面效果二、 Print.js相关属性 和使用1. 介绍2. 安装引入3. PrintJS参数配置表 三 、解决关于分页文字或者表格被分割问题&#xff0c;解决后如下&#xff1a;1. 设置一个自定义ta…

Linux 第二十四章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

浴室家具360度VR三维沉浸式展示提升品牌价值-深圳华锐视点

随着家居用品市场的持续升温&#xff0c;消费者对家居产品的需求日益旺盛&#xff0c;企业商家也迎来了前所未有的购买热潮。在这个充满机遇与挑战的时代&#xff0c;如何打破传统展示方式的局限&#xff0c;以更直观、更生动的方式呈现家居产品&#xff0c;成为企业提升竞争力…

笑铺日记:一年多赚10W,客户越买越上瘾的新手段

听说过二八原则吗&#xff1f; 一家店80%的利润&#xff0c;是20%的核心客户贡献的。 维护好这20%的客人&#xff0c;更容易换来真金白银噢~ 这20%的客户怎么找&#xff1f; 当然是从你家会员里找&#xff01; 笑铺日记手把手教你&#xff01; 首先&#xff0c;给每个消费…

域名系统(DNS)、DNS 服务器和 IP 地址概念解释

​  域名系统、DNS服务器和IP地址是构成互联网基础设施的重要部分。它们共同协作&#xff0c;使得人们能够方便地使用各种网络服务&#xff0c;而无需去记住复杂的数字地址。那么&#xff0c;域名系统、DNS 服务器和 IP 地址又该如何理解?本文主要讲讲关于这几个名词的概念解…

容器化管理SpringBoot项目:在用jar包制作镜像的时候遇到的错误记录

在容器化管理SpringBoot项目&#xff0c;进行到“用jar包制作镜像”一步时&#xff0c;遇到的error真的是一环接着一环&#xff0c;这里就记录一下&#xff0c;一套流程下来遇到的error&#xff0c;以及一些我的解决方法&#xff1a; ERROR: "docker buildx build" r…

Linux网络部分——部署YUM仓库及NFS共享服务

目录 一、yum仓库服务 1. 软件仓库的提供方式 2.如何构建并使用ftp软件仓库&#xff08;与本地yum源方法一致&#xff09; 3.如何搭建使用yum在线源&#xff1f; 4.yum软件包下载如何保存&#xff1f; 二、NFS共享存储服务 1.存储类型 2.提供共享存储的组合 3.NFS网络…

【MATLAB源码-第52期】基于matlab的4用户DS-CDMA误码率仿真,对比不同信道以及不同扩频码。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 DS-CDMA (Direct Sequence Code Division Multiple Access) 是一种多址接入技术&#xff0c;其基本思想是使用伪随机码序列来调制发送信号。DS-CDMA的特点是所有用户在同一频率上同时发送和接收信息&#xff0c;但每个用户使…