这个是全网最详细的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下载设置如下(具体的下载接线和设置见第二章内容)
如果芯片和连接正常会出现