jjzjj

RT-Thread Studio与CubeMX联合编程(超级详细)

zhuzhu、 2023-11-06 原文

RT-Thread Studio与CubeMX联合编程

本文章参考以下文章:

https://blog.csdn.net/qq_40824852/article/details/122596043
https://zhuanlan.zhihu.com/p/395106066
https://blog.csdn.net/m0_37697335/article/details/108890584

文章结构:

一、简介

经过上次对RT-Thread Studio的初步尝试,发现RT-Thread Studio中存在官方支持的CubeMx选项,本次将利用RT-Thread Studio与CubeMX进行联合编程。
由于目前RT-Thread Studio版本变化,在以往版本中与本文章使用版本不同可能会出现不一样的效果,建议升级RT-Thread Studio至最新或与本文保持一致。

 RT-Thread Studio版本:

CubeMx版本:

二、硬件环境

本次测试的硬件环境为自己设备的一块测试板,芯片为STM32G474VET6,采用24M有源晶振和32.7k的低频无源晶振,调试串口为LPUART1,波特率115200。

原理图:

实物3D:

三、安装环境

1.安装RT-Thread Studio。

2.安装CubeMX。

四、新建工程

  1. 启动RT-Thread Studio;
  2. 点击创建RT-Thread项目 ;
  3. 构建工程,并下载确保工程和硬件本身没有问题


如果没有遇到同类问题,跳过本步骤!!
软件编译本身没有问题,在使用ST-Link下载程序时,RT-Thread Studio控制台输出:

在debug configration中将reset mode由默认的“hardware reset”改为“system reset”


解决方法:
点击图标->打开调试配置->点击Download->更改复位模式为system reset->确定退出



再次构建并烧写程序。

  1. 打开终端查看现象


配置正确的串口和波特率,点击确定。

代码中的指令就是打印字符。

打开终端,开始是现象不正确,是由于原始的RT-Thread Studio的配置不正确,后续加入CubeMx代码后就正常了。

正常现象就是打印出Hello RT-Thread!

五、CubeMx配置

  1. 双击项目资源管理器中的CubeMxSetting,打开CubeMx。

  1. 进入CubeMx后配置烧写、时钟、串口。

配置烧写方式:

配置时钟输入:

配置时钟树:

串口配置:

  1. 进入Project Manager修改配置

修改输出工程方式:
修改生成文件的方式:

4. 保存配置。并生成代码,关闭CubeMX。

代码生成后回到RT-Thread Studio工程,提示stm32f4xx_hal_conf.h改为stm32f4xx_hal_conf_bak.h备份文件,是因为conf内存储着stm32的hal库配置信息,RT-Thread做了一个备份,不用管。

六、编译并做相关操作

  1. 配置完CubeMx后,点击构建,报错一大堆,别慌,好戏开始!!!
  2. 添加cubemx文件夹下的SConscript文件
    先检查cubemx文件夹下有没有SConscript文件,如果有就跳过创建环节,检查内容。

    选择cubemx文件,右键->新建->文件。

    输入文件名SConscript,点击完成。


SConscript文件中粘贴代码。

注意需要使用的c文件一定要包含在代码段中,否则就算c文件在该文件夹下也不会参与编译,从而导致编译报错!!
代码如下:

import os
#引入os模块
from building import *
#导入building的所有模块

cwd = GetCurrentDir()
#获取获取当前路径,并保存至变量cwd
src  = Glob('*.c')
#获取当前目录下的所有 C 文件,并保存至src变量

# add cubemx drivers
#由于RT-Thread工程中存在部分相同函数文件,所以对src重新赋值
#文件中的stm32g4xx_it.c 、 system_stm32g4xx.c不加入构建
#其余文件按相同格式填写到下述括号内
src = Split('''
Src/stm32g4xx_hal_msp.c
Src/main.c
Src/dma.c
Src/gpio.c
Src/usart.c
''')

#创建路径列表,并保存至path中
path = [cwd]
path += [cwd + '/Inc']
#这是 RT-Thread 基于 SCons 扩展的一个方法(函数)。
group = DefineGroup('cubemx', src, depend = [''], CPPPATH = path)

Return('group')
#这部分代码文章最后有解释
上述代码属于SCons 。SCons 是一套由 Python 语言编写的开源构建系统,类似于 GNU Make。
它采用不同于通常 Makefile 文件的方式,而是使用 SConstruct  SConscript 文件来替代。
这些文件也是 Python 脚本,能够使用标准的 Python 语法来编写。
所以在 SConstruct、SConscript 文件中可以调用 Python 标准库进行各类复杂的处理,而不局限于 Makefile 设定的规则。

保存文件,右键空白处更新软件包。

  1. 再次构建工程

    没有出现错误,如果出现错误,则大概率是函数重复定义导致,比如multiple definition of main

    则找到cubemx文件夹下的main函数,给他增加弱定义__weak,再次构建则不会报错。

七、在RT-Thread中调用CubeMx生成的函数

  1. 检查时钟配置,打开drv_clk.c,发现RT-Thread Studio已经自动将CubeMx的时钟配置更新到RT-Thread工程中。
  2. 如果没有正常的更新过来,需要将cubemx中main.c中的void SystemClock_Config(void)函数代码复制到drv_clk.c中的void system_clock_config(int target_freq_mhz)函数中。
  3. 调用HAL库的串口发送函数
    将cubemx中main.c中头文件和相关函数复制到applications-main.c-main函数中。
    调用HAL_UART_Transmit函数,所有操作与keil5的实现方式一致。

    代码片段:
#include <rtthread.h>

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

#include "main.h"
#include "dma.h"
#include "usart.h"
#include "gpio.h"

int main(void)
{
    HAL_Init();
    MX_GPIO_Init();
    MX_DMA_Init();
    MX_LPUART1_UART_Init();

//    打印时钟信息
    LOG_D("System Clock information");
    LOG_D("SYSCLK_Frequency = %d", HAL_RCC_GetSysClockFreq());
    LOG_D("HCLK_Frequency   = %d", HAL_RCC_GetHCLKFreq());
    LOG_D("PCLK1_Frequency  = %d", HAL_RCC_GetPCLK1Freq());
    LOG_D("PCLK2_Frequency  = %d", HAL_RCC_GetPCLK2Freq());
    
    HAL_UART_Transmit(&hlpuart1, (uint8_t*)"zhuzhu\r\n", 8, 10);
    
    int count = 1;

    while (count++)
    {
//        LOG_D("Hello RT-Thread!");


        rt_thread_mdelay(1000);
    }

    return RT_EOK;
}

八、输出现象

下载程序,点击终端查看输出现象:

时钟与CubeMx配置的时钟树一致、
串口打印字符一致、
能执行FinSH指令,
说明代码和工程配置正确,能实现RT-Thread Studio与CubeMX联合编程,可以通过RT-Thread调用hal库函数。

工程文件链接:

https://download.csdn.net/download/qq_40824852/81893468

九、SCons详细介绍

SCons 内置函数
如果想要将自己的一些源代码加入到 SCons 编译环境中,一般可以创建或修改已有 SConscript 文件。SConscript 文件可以控制源码文件的加入,并且可以指定文件的 Group(与 MDK/IAR 等 IDE 中的 Group 的概念类似)。

SCons 提供了很多内置函数可以帮助我们快速添加源码程序,利用这些函数,再配合一些简单的 Python 语句我们就能随心所欲向项目中添加或者删除源码。下面将简单介绍一些常用函数。

GetCurrentDir()
获取当前路径。

Glob(’*.c’)
获取当前目录下的所有 C 文件。修改参数的值为其他后缀就可以匹配当前目录下的所有某类型的文件。

GetDepend(macro)
该函数定义在 tools 目录下的脚本文件中,它会从 rtconfig.h 文件读取配置信息,其参数为 rtconfig.h 中的宏名。如果 rtconfig.h 打开了某个宏,则这个方法(函数)返回真,否则返回假。

Split(str)
将字符串 str 分割成一个列表 list。

DefineGroup(name, src, depend,**parameters)
这是 RT-Thread 基于 SCons 扩展的一个方法(函数)。DefineGroup 用于定义一个组件。组件可以是一个目录(下的文件或子目录),也是后续一些 IDE 工程文件中的一个 Group 或文件夹。

DefineGroup() 函数的参数描述:

parameters 可加入的参数:


SConscript(dirs,variant_dir,duplicate)
读取新的 SConscript 文件,SConscript() 函数的参数描述如下所示:

十、 RT-Thread的内置FinSH指令集合

RT-Thread shell commands:
clear            - clear the terminal screen
version          - show RT-Thread version information
list_thread      - list thread
list_sem         - list semaphore in system
list_event       - list event in system
list_mutex       - list mutex in system
list_mailbox     - list mail box in system
list_msgqueue    - list message queue in system
list_mempool     - list memory pool in system
list_timer       - list timer in system
list_device      - list device in system
help             - RT-Thread shell help.
ps               - List threads in the system.
free             - Show the memory usage in the system.
reboot           - Reboot System

看到这里就说明已经没有了。

有关RT-Thread Studio与CubeMX联合编程(超级详细)的更多相关文章

  1. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  2. 网络编程套接字 - 2

    网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识

  3. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  4. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  5. ruby - 如何以编程方式删除实例上的 "singleton information"以使其编码(marshal)? - 2

    我创建了一个由于“在运行时执行的单例元类定义”而无法编码的对象(这段代码的描述是否正确?)。这是通过以下代码执行的:#defineclassXthatmyusesingletonclassmetaprogrammingfeatures#throughcallofmethod:break_marshalling!classXdefbreak_marshalling!meta_class=class我该怎么做才能使对象编码正确?是否可以从对象instance_of_x的classX中“移除”单例组件?我真的需要一个建议,因为我们的一些对象需要通过Marshal.dump序列化机制进行缓存。

  6. Ruby 元编程问题 - 2

    我正在查看Ruby日志记录库Logging.logger方法并从sourceatgithub提出问题与这段代码有关:logger=::Logging::Logger.new(name)logger.add_appendersappenderlogger.additive=falseclass我知道类 最佳答案 这实际上删除了方法(当它实际被执行时)。这是确保close不会被调用两次的保障措施。看起来好像有嵌套的“class 关于Ruby元编程问题,我们在StackOverflow上找到一

  7. ruby - Paperclip:以编程方式分配图像并设置其名称 - 2

    使用Paperclip,我想从这样的URL抓取图像:require'open-uri'user.photo=open(url)问题是我最后得到一个像“open-uri20110915-4852-1o7k5uw”这样的文件名。有什么方法可以更改user.photo上的文件名?作为一个额外的变化,Paperclip将我的文件存储在S3上,所以如果我可以在初始分配中设置我想要的文件名就更好了,这样图像就会上传到正确的S3key。像这样:user.photo=open(url),:filename=>URI.parse(url).path 最佳答案

  8. ruby - 如何以编程方式检查证书是否已被吊销? - 2

    我正在开发一个xcode自动构建系统。在执行一些预构建验证时,我想检查指定的证书文件是否已被撤销。我了解securityverify-cert验证其他证书属性但不验证吊销。我如何检查撤销?我正在用Ruby编写构建系统,但我对任何语言的想法都持开放态度。我阅读了这个答案(Openssl-Howtocheckifacertificateisrevokedornot),但指向底部的链接(DoesOpenSSLautomaticallyhandleCRLs(CertificateRevocationLists)now?)进入的Material对我的目的来说有点过于复杂(用户上传已撤销的证书是一

  9. ruby - 如何保持我不常用的编程语言技能 - 2

    关闭。这个问题是off-topic.它目前不接受答案。想改进这个问题吗?Updatethequestion所以它是on-topic用于堆栈溢出。关闭11年前。Improvethisquestion我不经常使用ruby​​-通常它加起来相当于每两个月或更长时间编写一次脚本。我的大部分编程都是使用C++进行的,这与ruby​​有很大不同。由于我与ruby​​之间的差距如此之大,我总是忘记语言的基本方面(比如解析文本文件和其他简单的东西)。我想每天练习一些基本的东西,我想知道是否有一些我可以订阅的网站,并且会向我发送当天的Ruby问题或类似的东西。有人知道这样的站点/Internet服务吗?

  10. ruby - 如何以编程方式将 mp3 转换为 itunes 可播放的 aac/m4a 文件? - 2

    我一直在寻找一种以编程方式或通过命令行将mp3转换为aac的方法,但没有成功。理想情况下,我有一段代码可以从我的Rails应用程序中调用,将mp3转换为aac。我安装了ffmpeg和libfaac,并能够使用以下命令创建aac文件:ffmpeg-itest.mp3-acodeclibfaac-ab163840dest.aac当我将输出文件的名称更改为dest.m4a时,它无法在iTunes中播放。谢谢! 最佳答案 FFmpeg提供AAC编码功能(如果您已编译它们)。如果您使用的是Windows,则可以从here获取完整的二进制文件。

随机推荐