21.2-工程中添加FreeRTOS(掌握) 用STM32CubeMX添加FreeRTOS

这个是全网最详细的STM32项目教学视频。
第一篇在这里:
视频在这里

STM32智能小车V3-STM32入门教程-openmv与STM32循迹小车-stm32f103c8t6-电赛 嵌入式学习 PID控制算法 编码器电机 跟随


**V3:HAL库开发、手把手教学下面功能:PID速度控制、PID循迹、PID跟随、遥控、避障、PID角度控制、openmv视觉控制、电磁循迹、FreeRTOS、K210视觉智能车(更新中)、K230视觉智能车(更新中)、MSPM0G3507视觉智能车(更新中)**

21.2-工程中添加FreeRTOS(掌握)

用STM32CubeMX添加FreeRTOS

在编写加入FreeRTOS操作系统之前最好应该先测试一下,裸机对应的程序是否正常执行,比如我们更改的19-5代码的裸机程序的功能是否都正常,小车能否能供正常执行,那六个模式,能够正常执行那六个模式后,再继续编写增加FreeRTOS的程序。

让文件MyCode_V3.3.0处于一个相对简单短的路径且没有中文的路径。

我们使用19-5的工程

复制一些19-5(因为20章电磁循迹使用GPIO和经典的红外循迹使用的一样,所以我们不修改20章节代码)的文件改名为21-2_LED_FreeRTOS

双击LED.ioc,STM32CubeMX就会打开配置文件
在这里插入图片描述

更改时钟

在这里插入图片描述
System Core 中选择 SYS ,对 Timebase Source 进行设置,选择 TIM3 作为HAL库的时基(除了 SysTick和其他已经使用的定时器 外都可以)

为什么这里Timebase Source (HAL库时基源)不能再选择SysTick(滴答定时器),因为我们要使用FreeRTOS而 FreeRTOS需要一个时钟基准用于任务和时间管理,这个FreeRTOS的时钟基准默认使用了SysTick(滴答定时器), 所以我们避免冲突给Timebase Source (HAL库时基源)选择一个非SysTick定时器。

选择V1

选择FreeRTOS中的CMSIS_V1接口
在这里插入图片描述
Middleware 中选择 FREERTOS 设置,并选择 CMSIS_V1 接口版本

CMSIS是一种接口标准,目的是屏蔽软硬件差异以提高软件的兼容性。RTOS v1使得软件能够在不同的实时操作系统下运行(屏蔽不同RTOS提供的API的差别),而RTOS v2则是拓展了RTOS v1,兼容更多的CPU架构和实时操作系统。因此我们在使用时可以根据实际情况选择,如果学习过程中使用STM32F1、F4等单片机时没必要选择RTOS v2,更高的兼容性背后时更加冗余的代码,理解起来比较困难。

这里有一个中断的错误提示我们看一下

点击NVIC->查看提示

Preemption priorities have been set to 5 according to FREERTOS parameter LIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY.

根据FREERTOS参数LIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY设置抢占优先级为5。

这个LIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 是系统可管理的最高优先级如果设置为5,则优先级数值为0,1,2,3,4的中断是不受FreeRTOS管理的,不可被屏蔽,也不能调用FreeRTOS中的API接口函数,而中断优先级在5-15的中断受系统FreeRTOS管理,可以被屏蔽。

这个值默认是5
在这里插入图片描述
这是是提示我们有中断优先级高于系统可管理的最高优先级了,CubeMX 自动限制 一般中断的抢占优先级不得高于 5

所以我们先把之前设置的KEY按键相关外部中断优先级提高,设置为5

然后点击OK
在这里插入图片描述
这是提示的两个错误的中断优先级
在这里插入图片描述
把这两个都设置为5
在这里插入图片描述
这样的话需要测试一下按键里面还是否可以写HAL延时函数,因为我们后面章节会把按键写到任务中所以这里不在测试中断中的功能。

添加任务

新建一个任务,这里新增一个用于LED闪烁的任务。

系统默认会有一个默认任务-defaultTask,这个默认任务是可以更改或者删除的。这里我们先留着。

下面我们新增一个LED任务。
在这里插入图片描述

编写任务函数

这个任务的函数里面点灯。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
点击关闭
在这里插入图片描述
点击这个后就是keil 打开代码

在这里插入图片描述
然后我们点击编译下。

编译一下,有些错误需要我们解决一下
在这里插入图片描述
查看第一个错误,双击 发现是
在这里插入图片描述
编译后发现还有一个错误,错误说的是:HAL_TIM_PeriodElapsedCallback 函数被重复定义,在 main.c 和其他文件(例如 stm32f1xx_it.c)中都定义了
在这里插入图片描述
为了解决这个问题,我们全局搜索(ctrl+f)一下函数HAL_TIM_PeriodElapsedCallback
在这里插入图片描述
我们发现两个文件都定义了,HAL_TIM_PeriodElapsedCallback函数,其中main.c 是我们在增加FreeRTOS后,又STM32Cubemx生成的的部分。所以我们保留man.c里面的函数,将stm32f1xx_it.c中的函数移到main.c 中

在这里插入图片描述
实现如下 将代码放到BEGIN和END中
在这里插入图片描述
然后注释掉stm32f1xx_it中的函数
在这里插入图片描述
这部分注释 掉
在这里插入图片描述
增加相关定时和注释掉之前的声明如下
在这里插入图片描述

short Encode1Count = 0;//电机1编码器计数值 short的类型
short Encode2Count = 0;//电机2编码器计数值 short的类型
float Motor1Speed = 0.00;//电机1速度 转/s
float Motor2Speed = 0.00;//电机2速度 转/s
uint16_t TimerCount = 0;//中断计数变量

然后编译一下,没有错误了
在这里插入图片描述
然后我们再任务里面增加反转LED对应引脚的代码
在这里插入图片描述

	HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);//切换LED GPIO状态osDelay(300);

编译烧录到板子可以观察到核心板小灯闪烁。

如果使用DAP下载设置如下(具体的下载接线和设置见第二章内容)
在这里插入图片描述
如果芯片和连接正常会出现

在这里插入图片描述

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

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

相关文章

gitee——报错修改本地密码

有时候当我们向远端push本地的仓库时会有一些报错的行为。 如下: 这是因为我们在gitee修改了密码时,本地还没有更新提交,总是报错 解决修改密码报错 如下: 1.在本地点击搜索栏找到控制面板 步骤如下

联想Y7000+RTX4060+i7+Ubuntu22.04运行DeepSeek开源多模态大模型Janus-Pro-1B+本地部署

直接上手搓了: conda create -n myenv python3.10 -ygit clone https://github.com/deepseek-ai/Janus.gitcd Januspip install -e .pip install webencodings beautifulsoup4 tinycss2pip install -e .[gradio]pip install pexpect>4.3python demo/app_januspr…

批量卸载fnm中已经安装的所有版本

直接上代码 fnm list | awk -F NR>1 {print line} {line$2} | xargs -n 1 -I {} fnm uninstall {}原理 fnm list 列出 fnm 中所有已经安装的 node 版本 awk -F NR>1 {print line} {line$2} 以空格分隔-F {line$2},取从左到右第 2 段(v22.11…

(done) MIT6.S081 2023 学习笔记 (Day6: LAB5 COW Fork)

网页:https://pdos.csail.mit.edu/6.S081/2023/labs/cow.html 任务1:Implement copy-on-write fork(hard) (完成) 现实中的问题如下: xv6中的fork()系统调用会将父进程的用户空间内存全部复制到子进程中。如果父进程很大,复制过程…

如何将xps文件转换为txt文件?xps转为pdf,pdf转为txt,提取pdf表格并转为txt

文章目录 xps转txt方法一方法二 pdf转txt整页转txt提取pdf表格,并转为txt 总结另外参考XPS文件转换为TXT文件XPS文件转换为PDF文件PDF文件转换为TXT文件提取PDF表格并转为TXT示例代码(部分) 本文测试代码已上传,路径如下&#xff…

C++,STL,【目录篇】

文章目录 一、简介二、内容提纲第一部分:STL 概述第二部分:STL 容器第三部分:STL 迭代器第四部分:STL 算法第五部分:STL 函数对象第六部分:STL 高级主题第七部分:STL 实战应用 三、写作风格四、…

[STM32 - 野火] - - - 固件库学习笔记 - - -十三.高级定时器

一、高级定时器简介 高级定时器的简介在前面一章已经介绍过,可以点击下面链接了解,在这里进行一些补充。 [STM32 - 野火] - - - 固件库学习笔记 - - -十二.基本定时器 1.1 功能简介 1、高级定时器可以向上/向下/两边计数,还独有一个重复计…

Mybatis是如何进行分页的?

大家好,我是锋哥。今天分享关于【Mybatis是如何进行分页的?】面试题。希望对大家有帮助; Mybatis是如何进行分页的? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MyBatis 实现分页的方式有很多种,最常见…

四.3 Redis 五大数据类型/结构的详细说明/详细使用( hash 哈希表数据类型详解和使用)

四.3 Redis 五大数据类型/结构的详细说明/详细使用( hash 哈希表数据类型详解和使用) 文章目录 四.3 Redis 五大数据类型/结构的详细说明/详细使用( hash 哈希表数据类型详解和使用)2.hash 哈希表常用指令(详细讲解说明)2.1 hset …

编译dpdk19.08.2中example时一系列报错解决

dpdk19.08编译过程全解 dpdk 介绍问题描述编译过程执行Step 1报错一解决方式 报错二解决方式 继续执行Step 248的时候报错 49没有修改成功输入60退出 使用过程执行make报错一解决方式 继续make报错二解决方式 继续make执行生成文件helloworld报错三解决方式 执行make 完成参考链…

openeuler 22.03 lts sp4 使用 cri-o 和 静态 pod 的方式部署 k8s-v1.32.0 高可用集群

前情提要 整篇文章会非常的长…可以选择性阅读,另外,这篇文章是自己学习使用的,用于生产,还请三思和斟酌 静态 pod 的部署方式和二进制部署的方式是差不多的,区别在于 master 组件的管理方式是 kubectl 还是 systemctl有 kubeadm 工具,为什么还要用静态 pod 的方式部署?…

渗透测试之WAF规则触发绕过规则之规则库绕过方式

目录 Waf触发规则的绕过 特殊字符替换空格 实例 特殊字符拼接绕过waf Mysql 内置得方法 注释包含关键字 实例 Waf触发规则的绕过 特殊字符替换空格 用一些特殊字符代替空格,比如在mysql中%0a是换行,可以代替空格 这个方法也可以部分绕过最新版本的…

C# dataGridView1获取选中行的名字

在视觉项目中编写的框架需要能够选择产品或复制产品等方便后续换型,视觉调试仅需调试相机图像、调试视觉相关参数、标定,再试跑调试优化参数。 C# dataGridView1 鼠标点击某一行能够计算出是那一行 使用CellMouseClick事件 首先,在Form的构造…

Ubuntu介绍、与centos的区别、基于VMware安装Ubuntu Server 22.04、配置远程连接、安装jdk+Tomcat

目录 ?编辑 一、Ubuntu22.04介绍 二、Ubuntu与Centos的区别 三、基于VMware安装Ubuntu Server 22.04 下载 VMware安装 1.创建新的虚拟机 2.选择类型配置 3.虚拟机硬件兼容性 4.安装客户机操作系统 5.选择客户机操作系统 6.命名虚拟机 7.处理器配置 8.虚拟机内存…

Linux基础指令

基本文件操作 补充: “cd -” 可以前往刚才所在目录 “ls 文件路径” 列举指定路径的文件 “ls -a”列出隐藏文件 “ls -l”可以缩写为“ll” 周边概念 读取操作 “cat 文件名”阅读文本文件内容,可以使用Tab键补全文件…

【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(三)

目录 1 -> 生命周期 1.1 -> 应用生命周期 1.2 -> 页面生命周期 2 -> 资源限定与访问 2.1 -> 资源限定词 2.2 -> 资源限定词的命名要求 2.3 -> 限定词与设备状态的匹配规则 2.4 -> 引用JS模块内resources资源 3 -> 多语言支持 3.1 -> 定…

【JavaWeb06】Tomcat基础入门:架构理解与基本配置指南

文章目录 🌍一. WEB 开发❄️1. 介绍 ❄️2. BS 与 CS 开发介绍 ❄️3. JavaWeb 服务软件 🌍二. Tomcat❄️1. Tomcat 下载和安装 ❄️2. Tomcat 启动 ❄️3. Tomcat 启动故障排除 ❄️4. Tomcat 服务中部署 WEB 应用 ❄️5. 浏览器访问 Web 服务过程详…

C语言练习(29)

13个人围成一圈&#xff0c;从第1个人开始顺序报号1、2、3。凡报到“3”者退出圈子&#xff0c;找出最后留在圈子中的人原来的序号。本题要求用链表实现。 #include <stdio.h> #include <stdlib.h>// 定义链表节点结构体 typedef struct Node {int num;struct Nod…

简要介绍C语言和c++的共有变量,以及c++特有的变量

在C语言和C中&#xff0c;变量是用来存储数据的内存位置&#xff0c;它们的使用方式和特性在两种语言中既有相似之处&#xff0c;也有不同之处。以下分别介绍C语言和C的共有变量以及C特有的变量。 C语言和C的共有变量 C语言和C都支持以下类型的变量&#xff0c;它们在语法和基…

【UE插件】Sphinx关键词语音识别

视频教程&#xff1a; Unreal Engine - Speech Recognition - Free Pluginhttps://www.youtube.com/watch?vKBcXNnSdWog&t622s 官方教程&#xff1a; Sphinx: Speech Recognition Plugin | Unreal Engine Community Wikihttps://unrealcommunity.wiki/speech-recognition…