当前位置: 首页 > article >正文

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.kler.cn/a/525564.html

相关文章:

  • Java实现.env文件读取敏感数据
  • 使用Edu邮箱申请一年免费的.me域名
  • .Net / C# 繁体中文 与 简体中文 互相转换, 支持地方特色词汇
  • 16届蓝桥杯寒假刷题营】第2期DAY5IOI赛
  • 文件上传2
  • 海外问卷调查渠道查如何设置:最佳实践+示例
  • H3CNE-31-BFD
  • WEB集群6-10天
  • 深入解析 C++17 中的 std::not_fn
  • 数据结构--差分数组(含题目)<基础入门>
  • 2025创业思路和方向有哪些?
  • 最新版仿天涯论坛系统源码带后台
  • 30组成字符串ku的最大次数-青训营刷题
  • 将点云转换为 3D 网格:Python 指南
  • 分享几个好用的Edge扩展插件
  • 自制一个入门STM32 四足机器人具体开发顺序
  • Pwn 入门核心工具和命令大全
  • 简要介绍C语言与c++共有的数学函数
  • Versal - 基础3(AXI NoC 专题+仿真+QoS)
  • Leetcode Unique Path II
  • 【华为OD-E卷 - VLAN资源池 100分(python、java、c++、js、c)】
  • 【Elasticsearch】 Compound Queries
  • 三天急速通关JavaWeb基础知识:Day 1 后端基础知识
  • 你好!这是我自己的CSDN博客!
  • 【B站保姆级视频教程:Jetson配置YOLOv11环境(二)SSH连接的三种方式】
  • 伪装难掩锋芒:新一代奥迪 RS5 Sportback 路测图首曝