首页 > 其他分享 >STM32cubeMX配置FreeRTOS生成代码--完成一个简单测试(Led闪烁和向串口发送“hello!world”)

STM32cubeMX配置FreeRTOS生成代码--完成一个简单测试(Led闪烁和向串口发送“hello!world”)

时间:2024-11-28 13:00:08浏览次数:8  
标签:Led FreeRTOS CMSIS 配置 RTOS 任务 串口 GPIO

一、STM32cubeMX中相关配置

( 首先我用的STM32板子是STM32F103VBT6,板子不同,配置会略有不同,仅作参考!)

打开STM32cubeMX,新建工程,选择对应板子型号:
在这里插入图片描述

1.配置微控制器的时钟系统

在这里插入图片描述
High Speed Clock (HSE): 高速时钟源,这里选择的是“Crystal/Ceramic Resonator”,意味着使用外部晶体或陶瓷谐振器作为时钟源。

2.配置SYS

在这里插入图片描述
在STM32CubeMX中选择“Serial Wire”作为调试模式,意味着在生成的初始化代码中,将配置微控制器以使用SW模式进行调试。
其中,Timebase Source不能为SysTick,如果配置了SysTick,生成代码时会出现警告如下:
在这里插入图片描述
在FreeRTOS中使用时钟基准时,通常使用SysTick定时器作为系统时钟源(也称为Tick定时器),而不是使用其他硬件定时器。所以我们需要用其它定时器作为时间基准。

这个警告的意思是,如果你的系统中使用了RTOS,那么使用Systick作为时间基准可能不是最佳选择,因为它可能会与RTOS的调度器冲突。建议使用其他的定时器作为HAL的时间基准源,以避免潜在的问题。

3.配置时钟

在这里插入图片描述
上面只需设置两个地方就行,其它的STm32cubeMX会自动为你配置
1.
在这里插入图片描述
设置为12MHz,这要看我们的STM32板子上的外部晶振是多少,由于我的STM32上外部晶振是12MHz,所以设置为12。

在这里插入图片描述
这里就看自己需求了,我一般设置为72。

4.配置FreeRTOS

在左边的Middleware中
在这里插入图片描述
选择CMSIS_V1(该选项有Disable,CMSIS_V1和CMSIS_V2)
CMSIS(Cortex Microcontroller Software Interface Standard)是由ARM公司发布的一个标准,旨在为Cortex-M微控制器提供统一的软件接口。CMSIS-RTOS是CMSIS的一部分,它定义了RTOS接口的标准化规范,使得不同的RTOS实现(如RTX、FreeRTOS等)能够通过一致的API进行操作。
在这里插入图片描述
在这里插入图片描述
下面有FreeRTOS的Configuration的配置,作为小白默认就好
在这里插入图片描述
不过我们根据项目需要添加Task和Queue
在STM32CubeMX中配置FreeRTOS时,Task和Queue是两个重要的概念,它们是FreeRTOS中的核心元素,分别用于任务管理和任务间的通信
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们基于FreeRTOS完成两个任务来测试一下
1.Led闪烁
2.串口通信:向电脑发送“hello!world”

所以添加两个任务:
在这里插入图片描述

点击Add添加任务,会弹出如下配置,默认点击ok即可:
在这里插入图片描述
(其中,Entry Function是任务函数的名称)
我这里已经添加了两个任务myTask02和meTask03,这个defaultTask是STM32cubeMx为你生成的一个任务。

GPIO配置:
在这里插入图片描述
其中,对于STM32F103VBT6,需要将PB3设置为1,才能让Led灯亮
在这里插入图片描述
配置USART1:选择异步通信
在这里插入图片描述

5.生成文件

然后对工程文件命名,选择IDE为:MDK-ARM,J_Link版本为V5等等
在这里插入图片描述
最后,生成代码。

二、在Keil5中编写测试代码

打开生成的keil5文件,可以看到有文件结构如下:
在这里插入图片描述
第一件事是:先进行编译,看看是否编译成功。
如果编译失败,那么应该是STM32cubeMX配置出现了问题;如果编译成功就接着往下看:

在freertos.c文件中可以看到创建任务的初始化函数
在这里插入图片描述
里面创建了在cubeMX添加的任务:
在这里插入图片描述

而在freertos.c文件下面还有这些任务的定义,我们可以自己编写需要执行的功能代码:
在这里插入图片描述

所以为了实现一下功能,只需要在我创建的两个任务里分别实现就行
在这里插入图片描述

每隔一秒闪烁:

void StartTask03(void const * argument)
{
  /* USER CODE BEGIN StartTask03 */
  /* Infinite loop */
	
    while (1) {
        // 假设A_Pin连接了LED
        HAL_GPIO_WritePin(A_GPIO_Port, A_Pin, GPIO_PIN_SET);  // 点亮LED
        osDelay(1000);  // 延时1秒

        HAL_GPIO_WritePin(A_GPIO_Port, A_Pin, GPIO_PIN_RESET);  // 熄灭LED
        osDelay(1000);  // 延时1秒
    }
  /* USER CODE END StartTask03 */
}

每间隔一秒向串口发送“hello!world”

char message[] = "hello! world";
void StartTask02(void const * argument)
{
  /* USER CODE BEGIN StartTask02 */
  /* Infinite loop */
  for(;;)
  {
		HAL_UART_Transmit(&huart1, (uint8_t*)message, strlen(message), 1000);
    osDelay(1000);
  }
  /* USER CODE END StartTask02 */
}

在main.c文件中可以看到,cubeMX已经自动为我们生成了FreeRTOS的初始化以及启动内核操作系统的代码:
在这里插入图片描述

可以看到osKernelStart()下面有一段注释.
意思是说,控制权已经交给了 FreeRTOS 调度器。在调度器开始运行后,程序应该进入任务执行状态,而不应该再返回到 main() 函数。

编译,下板进行验证即可。

三、验证功能在这里插入图片描述

在这里插入图片描述

标签:Led,FreeRTOS,CMSIS,配置,RTOS,任务,串口,GPIO
From: https://blog.csdn.net/k2024_1013/article/details/144090861

相关文章

  • STM32之串口232通讯
    STM32F407系列文章-RS232通讯(六)文章目录前言一、串口(UART)二、RS23-硬件特性三、RS232-程序实现1.函数rs232_init()2.函数USART_UX_IRQHandler()3.函数rs232_send_data()4.函数rs232_receive_data()5.函数rs232_receive_data()总结前言一般STM32F407芯片都会......
  • 26 基于STM32的智能门禁系统(指纹、蓝牙、刷卡、OLED、电机)
    目录一、主要功能二、硬件资源三、程序编程四、实现现象一、主要功能基于STM32单片机,六个按键,分别代表指纹、蓝牙、刷卡的正确进门与错误进门;比如第一个按键按下,表示指纹正确,OLED显示指纹正确,开门,第二个按键按下的话,则指纹错误,OLED显示指纹错误,请重试,第二个按键连......
  • FreeRTOS 内存管理
    文章目录`heap_x.c`文件及应用场景heap_1.c功能优点缺点应用场景示例配置heap_2.c功能优点缺点应用场景示例配置heap_3.c功能优点缺点应用场景示例配置heap_4.c功能优点缺点应用场景示例配置heap_5.c功能优点缺点应用场景示例配置heap_x.c文件及应用场景Free......
  • FreeRTOS学习记录(二)创建删除任务
    前言代码生成软件:STM32CubeMX集成开发环境:CLion开发板:robomasterA型开发板(STM32F427IGH6)手中的C型开发板被拿去干别的事情了,就找了个A型的开发板代替,在STM32CubeMX界面的配置除了选择STM32F427IGH6的开发板外,其他没有任何区别,包括在CLion的CMake文件中的配置也一模一样,参......
  • linux网络启动不成功 systemctl restart networkTob)for network,service failed beca
    一、执行重启网络服务systemctlrestartnetwork然后报错二、执行systemctlstatusnetwork.service查看network服务的运行状态发现是active(exited)退出状态三、使用journalctl-Xe查看systemctl执行命令错误的详细信息发现网卡eth2的配置有问题,无法激活将eth2......
  • 启动容器报WARNING: IPv4 forwarding is disabled. Networking will not work.
    我运行容器dockerrun--namemy-nginx-d-p8080:80nginx:latest报这个错误WARNING:IPv4forwardingisdisabled.Networkingwillnotwork.查询发现是因为Ipv4转发功能被禁用了IP转发是指在一个路由器上允许数据包从一个接口转发到另一个接口的能力。在Docker中,......
  • MacOS安装录播姬BililiveRecorder解决zsh:killed问题
    MacOS下安装mikufans录播姬BililiveRecorder遇到的问题安装1、下载官方位置:Mikufans录播姬MacOS选BililiveRecorder-CLI-osx-arm64.zip2、选好位置解压好运行下面的命令没有执行权限,可以使用chmod命令添加执行权限第二条执行时没问题就直接输出版本号,如果有问题提示zsh:k......
  • 《解读 freeRTOS queue.c 源码:探寻任务间高效通信的核心机制》(建议收藏)
    摘要:文章介绍了FreeRTOS中的队列机制,包括队列的基本概念、创建与初始化方式、数据操作(发送、接收、查看等)、状态查询与管理、在互斥量与信号量中的应用以及队列集的相关操作建议:作者在这里建议,结合queue.c源码来看效果会更好一下FreeRTOS队列:任务间通信与同步的高效利器......
  • 51单片机入门:LED灯控制(01)
    第一篇博客,博客园注册很久却一直没有好好利用,今天把以前的文章都删掉,就当开个好头吧。希望在以后的时间中,自己能够认真、努力、珍惜时间。零基础入门51单片机单片机(MicrocontrollerUnit,MCU)是一种集成电路芯片,它将计算机的CPU、存储器(RAM和ROM)、输入/输出接口(I/O)等集成在一个芯......
  • 成为点灯大师的日志一——STM32之按键控制LED
    1、接线图展示注:图片来源江科大,此处3口也要接一个LED注:OLED用于检测说明按键按下2、原理说明利用按键按下过程检测到的电平变化来判断按键是否按下,通过改变Num的值来改变LED的状态利用Num的变化来实现LED多模式转换。3、代码实现Key.h#ifndef__KEY_H#define__KE......