基于STM32CubeMX创建FreeRTOS—以STM32F429为例

这篇具有很好参考价值的文章主要介绍了基于STM32CubeMX创建FreeRTOS—以STM32F429为例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. 实验任务

2. 使用STM32CubeMX创建基础工程

2.1 使用STM32CubeMX创建项目

2.2 创建新项目

2.3 时钟设置

2.4 时钟配置树

2.5 修改时钟基准,打开串行调试

2.6 配置串口

2.7 配置状态指示灯

2.8 FreeRTOS配置

2.9 配置工程输出项

3. 代码编辑

3.1 printf重映射

3.1.1 使用ARMCC 5编译器时的printf重映射方法

3.1.2 使用ARM 6编译器时的printf重映射方法

3.2 使用FreeRTOS任务编写代码

3.3 main函数中关于裸机和多任务代码一点说明

3.3  运行效果

4 多任务相关知识

4.1 任务基础知识

4.2 任务状态

4.3 任务优先级

4.4 任务实现


1. 实验任务

利用STM32CubeMX,创建MDK工程,STM32CubeMX移植FreeRTOS。

开发环境准备:

Win11、MDK5、STM32CubeMX、STM32F429IGT6开发板

STM32CubeMX v6.10

2. 使用STM32CubeMX创建基础工程

2.1 使用STM32CubeMX创建项目

基于STM32CubeMX创建FreeRTOS—以STM32F429为例,基于STM32CubeMX和HAL库学习嵌入式技术,stm32,单片机,嵌入式硬件,FreeRTOS

2.2 创建新项目

MCU型号选择STM32F429IGT6,开始项目。

基于STM32CubeMX创建FreeRTOS—以STM32F429为例,基于STM32CubeMX和HAL库学习嵌入式技术,stm32,单片机,嵌入式硬件,FreeRTOS

2.3 时钟设置

选择使用外部高速时钟,时钟源为外部晶振(25MHz),配置系统时钟,根据外部晶振频率,将系统时钟配置到180MHz。

基于STM32CubeMX创建FreeRTOS—以STM32F429为例,基于STM32CubeMX和HAL库学习嵌入式技术,stm32,单片机,嵌入式硬件,FreeRTOS

2.4 时钟配置树

基于STM32CubeMX创建FreeRTOS—以STM32F429为例,基于STM32CubeMX和HAL库学习嵌入式技术,stm32,单片机,嵌入式硬件,FreeRTOS

2.5 修改时钟基准,打开串行调试

  • FreeRTOS使用systick系统嘀嗒定时器当作心跳,此处须修改HAL库的时钟基准。
  • 由于FreeRTOS和HAL库不能同时使用SysTick定时器,将HAL库的定时器改成TIM4

基于STM32CubeMX创建FreeRTOS—以STM32F429为例,基于STM32CubeMX和HAL库学习嵌入式技术,stm32,单片机,嵌入式硬件,FreeRTOS

2.6 配置串口

采用异步通信方式,通讯参数此处为默认值。

基于STM32CubeMX创建FreeRTOS—以STM32F429为例,基于STM32CubeMX和HAL库学习嵌入式技术,stm32,单片机,嵌入式硬件,FreeRTOS

2.7 配置状态指示灯

基于STM32CubeMX创建FreeRTOS—以STM32F429为例,基于STM32CubeMX和HAL库学习嵌入式技术,stm32,单片机,嵌入式硬件,FreeRTOS

2.8 FreeRTOS配置

STM32CubeMX已经将FreeRTOS集成到工具中,并且将RTOS的接口封装为CMSIS-RTOS V1/V2,相较之于V1版本的CMSIS-RTOS API,V2版本的API的兼容性更高,为了将来的开发和移 植,建议开发者使用V2版本的API。

选择Middleware-FreeRTOS,Interface中选择CMSIS_V2。

基于STM32CubeMX创建FreeRTOS—以STM32F429为例,基于STM32CubeMX和HAL库学习嵌入式技术,stm32,单片机,嵌入式硬件,FreeRTOS

选择CMSIS V2接口后,还要进一步配置FreeRTOS的参数和功能。
FreeRTOS的参数包括时基频率、任务堆栈大小、是否使能互斥锁等等,需要开发者根据自己对FreeRTOS的了解以及项目开发的需求,来定制参数。此处使用默认参数不需要修改。
使用STM32CubeMX,可以手工添加任务、队列、信号量、互斥锁、定时器等等。为提高代码的可移植性和灵活性,建议大家不要严重依赖STM32CubeMX,尽量不使用STM32CubeMX来添加这些对象,而是手写代码来使用这些对象。

建立双任务:

任务1:LED指示灯闪烁

任务2:串口打印输出

基于STM32CubeMX创建FreeRTOS—以STM32F429为例,基于STM32CubeMX和HAL库学习嵌入式技术,stm32,单片机,嵌入式硬件,FreeRTOS

提示:留意下串口中断的问题,由于FreeRTOS只允许5以上的中断级别,需要中断的话请设置大于等于5的值。

2.9 配置工程输出项

基于STM32CubeMX创建FreeRTOS—以STM32F429为例,基于STM32CubeMX和HAL库学习嵌入式技术,stm32,单片机,嵌入式硬件,FreeRTOS

基于STM32CubeMX创建FreeRTOS—以STM32F429为例,基于STM32CubeMX和HAL库学习嵌入式技术,stm32,单片机,嵌入式硬件,FreeRTOS

3. 代码编辑

3.1 printf重映射

3.1.1 使用ARMCC 5编译器时的printf重映射方法

printf函数重映射,可以直接使用printf在串口一中打印数据,定位到usart.c文件中。

/* USER CODE BEGIN 0 */
#include "stdio.h"
/* USER CODE END 0 */
/* USER CODE BEGIN 1 */
int fputc(int ch,FILE *f)
{
    HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,10);
    return(ch);
}
/* USER CODE END 1 */

注意:重写printf后运行代码前一定要勾选Use MicroLiB,否则项目烧录后无法执行。

基于STM32CubeMX创建FreeRTOS—以STM32F429为例,基于STM32CubeMX和HAL库学习嵌入式技术,stm32,单片机,嵌入式硬件,FreeRTOS

提示:Keil 5.37以后的版本,不再集成AC5编译器,安装与配置方法如下:

Keil MDK5.37以上版本自行添加AC5(ARMCC)编译器的方法_armcc下载-CSDN博客文章浏览阅读2.4w次,点赞89次,收藏204次。​【对安装AC5后,编译时提示找不到序列号的错误,文中有提示的解决方法】从MDK5.37开始,AC5(ARMCC)编译器不再默认安装,需要独立安装。路径、字符等安装问题,都可能引起AC5的编译错误。下面给出不用爬坑的方法。下面是安装步骤:下载AC5(ARMCC)编译器:1. 官方页面(可能下载不成功)2.网盘下载百度网盘:链接:https://pan.baidu.com/s/1ND3vKLzqxanWVP304txRtQ ,提取码:idvc..........................._armcc下载https://blog.csdn.net/qcmyqcmy/article/details/125814461 

3.1.2 使用ARM 6编译器时的printf重映射方法

下面两篇博文提供了同时使用AC5 和ARM Clang 6编译器的方法,使用此方法,你可以方便按需选择合适的编译器,代码不再报错。

方法1:阻塞方式

基础篇007. 串行通信(一)--阻塞方式发送接收_串口阻塞-CSDN博客文章浏览阅读1.7k次,点赞2次,收藏10次。在学习C语言时我们经常使用C语言标准函数库输入输出函数,比如printf、scanf、getchar等。为让开发板也支持这些函数需要把USART发送和接收函数添加到这些函数的内部函数内。在C语言HAL库中,fputc函数是printf函数内部的一个函数,功能是将字符ch写入到文件指针f所指向文件的当前写指针位置。fgetc函数与fputc函数非常相似,实现字符读取功能。在使用scanf函数时需要注意字符输入格式。文中引入可使用#if …… #elif …… #endif方式调试代码。_串口阻塞https://blog.csdn.net/qcmyqcmy/article/details/130674914

方法二、中断方式

基础篇007. 串行通信(二)--中断方式接收数据_串口设备通信0xffff-CSDN博客文章浏览阅读2.1k次。目录1. 实验任务2. 硬件原理3. 利用STM32CubeMX创建MDK工程3.1 STM32CubeMX工程创建3.2 配置调试方式3.3 配置时钟电路3.4 配置GPIO3.5 配置串口参数3.6 配置时钟3.7 项目配置4. 串行通信实验4.1 UART串口printf,scanf函数串口重定向4.2 开启中断4.3 中断回调函数4.4 main()函数修改5.调试与验证6.总结利用STM32CubeMX,创建MDK工程,使用中断方式,实现串口接收数据,然后在转发到串口。本实验是串行通信的第二部分,_串口设备通信0xffffhttps://blog.csdn.net/qcmyqcmy/article/details/130716056

3.2 使用FreeRTOS任务编写代码

在freertos.c中的任务函数里面写相应的程序

添加头文件:

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "usart.h"
/* USER CODE END Includes */

MDK截图如下: 

基于STM32CubeMX创建FreeRTOS—以STM32F429为例,基于STM32CubeMX和HAL库学习嵌入式技术,stm32,单片机,嵌入式硬件,FreeRTOS

 添加数组:

/* USER CODE BEGIN Variables */
uint8_t USART1_BUF[] = "Hello FreeRTOS\r\n";
/* USER CODE END Variables */

MDK截图如下:  

基于STM32CubeMX创建FreeRTOS—以STM32F429为例,基于STM32CubeMX和HAL库学习嵌入式技术,stm32,单片机,嵌入式硬件,FreeRTOS

 添加任务一启动代码:

/* USER CODE BEGIN Header_StartTask01 */
/**
  * @brief  Function implementing the myTask01 thread.
  * @param  argument: Not used
  * @retval None
  */
/* USER CODE END Header_StartTask01 */
void StartTask01(void *argument)
{
  /* USER CODE BEGIN StartTask01 */
  /* Infinite loop */
  for(;;)
  {
    HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
    osDelay(1000);
  }
  /* USER CODE END StartTask01 */
}

MDK截图如下:  

基于STM32CubeMX创建FreeRTOS—以STM32F429为例,基于STM32CubeMX和HAL库学习嵌入式技术,stm32,单片机,嵌入式硬件,FreeRTOS

  添加任务二启动代码:

/* USER CODE BEGIN Header_StartTask02 */
/**
* @brief Function implementing the myTask02 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask02 */
void StartTask02(void *argument)
{
  /* USER CODE BEGIN StartTask02 */
  /* Infinite loop */
  for(;;)
  {
    printf("USART1: %s", USART1_BUF);
    osDelay(1000);
  }
  /* USER CODE END StartTask02 */
}

MDK截图如下:  

基于STM32CubeMX创建FreeRTOS—以STM32F429为例,基于STM32CubeMX和HAL库学习嵌入式技术,stm32,单片机,嵌入式硬件,FreeRTOS

3.3 main函数中关于裸机和多任务代码一点说明

main.c函数中,osKernelStart()是任务调度函数,通过它可以进入多任务操作系统。

注释该语句后,程序就可进入后面的while语句了,可作为裸机程序运行。

  /* Start scheduler */
  osKernelStart();

基于STM32CubeMX创建FreeRTOS—以STM32F429为例,基于STM32CubeMX和HAL库学习嵌入式技术,stm32,单片机,嵌入式硬件,FreeRTOS

3.3  运行效果

待补充...

4 多任务相关知识

4.1 任务基础知识

单片机裸机(未使用系统)运行时,一般都是在main函数中用循环来处理所有事件,循环调用相应的函数完成事件的处理。有时候也可以通过中断完成一些处理。相对多任务系统而言,这种就是单任务系统,也称作前后台系统,中断服务函数作为前台程序,大循环while(1)作为后台程序。

基于STM32CubeMX创建FreeRTOS—以STM32F429为例,基于STM32CubeMX和HAL库学习嵌入式技术,stm32,单片机,嵌入式硬件,FreeRTOS

多任务系统会把大问题划成很多的小问题,逐个将小问题解决掉,大问题也就会随之解决。这些小问题是并发处理的,并不是说同一时刻一起执行很多任务,而是由于每个任务执行的时间很短,看起来像同一时刻执行了很多任务。通过FreeRTOS里面的任务调度器完成任务的先后执行。在FreeRTOS中是一个抢占式的实时多任务系统,其任务调度器也是抢占式的。

基于STM32CubeMX创建FreeRTOS—以STM32F429为例,基于STM32CubeMX和HAL库学习嵌入式技术,stm32,单片机,嵌入式硬件,FreeRTOS

高优先级的任务可以打断低优先级任务的运行而取得CPU的使用权,这样就保证了那些紧急任务的运行。高优先级的任务执行完成以后重新把CPU的使用权归还给低优先级的任务,这个就是抢占式多任务系统的基本原理。

4.2 任务状态

FreeRTOS中的任务永远只有运行态、就绪态、阻塞态、挂起态。任务状态图切换如下:

基于STM32CubeMX创建FreeRTOS—以STM32F429为例,基于STM32CubeMX和HAL库学习嵌入式技术,stm32,单片机,嵌入式硬件,FreeRTOS

(1)运行态

当一个任务正在运行时,那么就说这个任务处于运行态,处于运行态的任务就是当前正在使用处理器的任务。如果使用的是单核处理器的话那么不管在任何时刻永远都只有一个任务处于运行态。

(2)就绪态

处于就绪态的任务是那些已经准备就绪(这些任务没有被阻塞或者挂起),可以运行的任务,但是处于就绪态的任务还没有运行,因为有一个同优先级或者更高优先级的任务正在运行!

(3)阻塞态

如果一个任务当前正在等待某个外部事件的话就说它处于阻塞态,比如说如果某个任务调用了函数vTaskDelay0的话就会进入阻塞态,直到延时周期完成。任务在等待队列、信号量、事件组、通知或互斥信号量的时候也会进入阻塞态。任务进入阻塞态会有一个超时时间,当超过这个超时时间任务就会退出阻塞态,即使所等待的事件还没有来临!

(4)挂起态

像阻塞态一样,任务进入挂起态以后也不能被调度器调用进入运行态,但是进入挂起态的任务没有超时时间。任务进入和退出挂起态通过调用函数vTaskSuspend()和xTaskResume()。

4.3 任务优先级

每个任务都可以分配一个从0~(configMAX_PRIORITIES-1)的优先级,configMAX_PRIORITIES在文件FreeRTOSConfig.h中有定义。如果所使用的硬件平台支持类似计算前导零这样的指令(可以通过该指令选择下一个要运行的任务,Cortex-M处理器是支持该指令的),并且宏configUSE_PORT_OPTIMISED_TASK_SELECTION也设置为了1,那么宏configMAX_PRIORITIES不能超过32!也就是优先级不能超过32级。其他情况下宏configMAX_PRIORITIES可以为任意值,但是考虑到RAM的消耗,宏configMAX_PRIORITIES最好设置为一个满足应用的最小值。

优先级数字越低表示任务优先级越低,0的优先级最低,configMAX_PRIORITIES-1的优先级最高。空闲任务的优先级最低,为0。

FreeRTOS调度器确保处于就绪态或运行态的高优先级的任务获取处理器使用权,换句话说就是处于就绪态的最高优先级的任务才会运行。当宏configUSE_TIME_SLICING定义为1的时候多个任务可以共用一个优先级,数量不限。默认情况下宏configUSE_TIME_SLICING在文件FreeRTOS.h中已经定义为1。此时处于就绪态的优先级相同的任务就会使用时间片轮转调度器获取运行时间。

4.4 任务实现

在使用FreeRTOS的过程中,需要使用xTaskCreat()或者xTaskCreatStatic()来创建任务,这两个函数的第一个参数为pxTaskCode,就是任务函数本体。任务函数就是完成本任务工作的函数。FreeRTOS官方给出的任务函数模板为:

void vATaskFunction(void *pvParameters){        (1)
    for(;;){                                    (2)
       --任务应用程序--                          (3)
       vTaskDelay();                            (4)
}
    VTaskDelete(NULL);                          (5)
}

(1)、任务函数本质也是函数,所以肯定有任务名什么的,不过这里要注意:任务函数的返回类型一定要为void类型,也就是无返回值,而且任务的参数也是void指针类型的!任务函数名可以根据实际情况定义。

(2)、任务的具体执行过程是一个大循环,for(;;)就代表一个循环,作用和while(1)一样,笔者习惯用while(1)。

(3)、循环里面就是真正的任务代码了,此任务具体要干的活就在这里实现!

(4)、FreeRTOS的延时函数,此处不一定要用延时函数,其他只要能让FreeRTOS发生任务切换的API函数都可以,比如请求信号量、队列等,甚至直接调用任务调度器。只不过最常用的就是FreeRTOS的延时函数。

(5)、任务函数一般不允许跳出循环,如果一定要跳出循环的话在跳出循环以后一定要调用函数vTaskDelete(NULL)删除此任务!FreeRTOS的任务函数和UCOS的任务函数模式基本相同的,不止FreeRTOS,其他RTOS的任务函数基本也是这种方式的。文章来源地址https://www.toymoban.com/news/detail-814022.html

到了这里,关于基于STM32CubeMX创建FreeRTOS—以STM32F429为例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • GD32F470 移植STM32F429工程 Keil调试笔记

    keil版本:5.25 安装 GigaDevice.GD32F4xx_DFP.3.0.4.pack Keil.STM32F4xx_DFP.2.15.0.pack 1、原项目为STM32F429 工程,切换到GD32F470 只需在 Options for Target\\\"“对话框的Device菜单中选中“GD32F470II”,重新编译即可,一般不会有编译错误。 2、将项目工程在切换回STM32F429,在 Options for Target”\\\"对话框的D

    2024年02月09日
    浏览(50)
  • STM32F103xx / STM32F429VET6最小系统原理图

    STM32F429VET6核心板原理图 2023.12.09修改内容:打板后由于更换学习方向并未进行测试,所给原理图仅供参考,给出PDF下载链接,未设置积分和会员下载:https://download.csdn.net/download/m0_51294753/88611702。 一、前言 先前使用过的是STM32F1系列,只使用和绘制过STM32F103C8T6和STM32F103ZET6的板

    2023年04月24日
    浏览(43)
  • 【STM32F429】HAL库的PWM中断,精确控制脉冲数,控制步进电机

    这两天在调步进电机,希望是使得步进电机每次都达到期望的高度。在查了一天的资料,发现大部分上传的资料都是使用CubeMX生成的,可复制性很高,但未免有失可读性,故上传我的心得经验。 本来原子哥的例程里有整合度很高的,已经封装好的精确控制步进电机前进距离的

    2024年02月08日
    浏览(53)
  • RT-Thread STM32F429 armfly-v6开发板BSP说明

    本文档为 RT-Thread 开发团队为 STM32F429 armfly-v6 开发板提供的 BSP (板级支持包) 说明。 主要内容如下: 开发板资源介绍 BSP 快速上手 进阶使用方法 通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。在进阶使用指南章节,将会介绍更多高级功能,帮

    2024年01月18日
    浏览(56)
  • 搭建STM32F407的Freertos系统(基于STM32CubeMX)

           本人长期开发Linux、Windows上应用软件,一直以来MCU开发有所接触,但较少(最近项目需要,小公司么,都得会,被逼的),好在有STM32CubeMX这样工具,貌似就是我想要的工具。         本次demo目标立下:         1. 搭建或移植FreeRTOS到STM32上,毕竟对于长期在Linux环境

    2024年02月10日
    浏览(64)
  • STM32F429 Discovery开发板应用:实现SPI-SD Card文件写入(搭载FatFS文件系统)

    MCU:STM32F429ZIT6 开发环境:STM32CubeMX+MDK5   外购了一个SPI接口的SD Card模块,想要实现SD卡存储数据的功能。 首先需要打开STM32CubeMX工具。输入开发板MCU对应型号,找到开发板对应封装的MCU型号,双击打开(图中第三)。   此时,双击完后会关闭此界面,然后打开一个新界面。

    2024年02月08日
    浏览(58)
  • 【STM32】使用CubeMX快速创建FreeRTOS的基础工程,基于正点原子

    【STM32】HAL库 新建MDK工程 【STM32】HAL库 串口轮询发送 【STM32】HAL库 LED闪烁、流水灯 【STM32】HAL库 定时器中断 【STM32】HAL库 外部中断 使用STM32F103C8T6开发板,用STM32CubeMX配置FreeRTOS,可以适配正点原子FreeRTOS所有实验的基础工程 HAL的时基不能选择系统定时器 PA0和PA1输出模式,

    2024年02月19日
    浏览(52)
  • FreeRTOS移植STM32超详细(以STM32F103ZE为例)

    我刚学FreeROTS时想移植到STM32,找了网上很多资料,但大多都不是很完整,于是我把我自己的移植过程分享出来,供大家参考。 我们以STM32F103ZE,正点原子的跑马灯实验为例, 准备工作: 跑马灯实验工程 FreeRTOS文件源码(可在官方下载)     第一步  移植文件到工程 首先在工

    2024年02月08日
    浏览(36)
  • STM32 CubeMX (Freertos任务:创建、删除、挂起、恢复)

    学习使用Freertos第一步 FreeRTOS 任务管理,您需要掌握以下几个关键函数: 1. xTaskCreate() :用于创建一个任务,需要指定任务函数、任务名称、任务栈大小和优先级等参数。 2. vTaskDelete() :用于删除一个任务,可以由任务自身或其他任务调用。 3. vTaskDelay() :用于使当前任务进

    2024年02月12日
    浏览(40)
  • STM32 CubeMX (第一步Freertos任务管理:创建、删除、挂起、恢复)

    学习使用Freertos第一步 FreeRTOS 任务管理,您需要掌握以下几个关键函数: 1. xTaskCreate() :用于创建一个任务,需要指定任务函数、任务名称、任务栈大小和优先级等参数。 2. vTaskDelete() :用于删除一个任务,可以由任务自身或其他任务调用。 3. vTaskDelay() :用于使当前任务进

    2024年02月12日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包