技术标签: stm32 CubeMX RT-Thread 嵌入式硬件 单片机
本文章参考以下文章:
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。
如果没有遇到同类问题,跳过本步骤!!
软件编译本身没有问题,在使用ST-Link下载程序时,RT-Thread Studio控制台输出:
在debug configration中将reset mode由默认的“hardware reset”改为“system reset”
解决方法:
点击图标->打开调试配置->点击Download->更改复位模式为system reset->确定退出
再次构建并烧写程序。
配置正确的串口和波特率,点击确定。
代码中的指令就是打印字符。
打开终端,开始是现象不正确,是由于原始的RT-Thread Studio的配置不正确,后续加入CubeMx代码后就正常了。
正常现象就是打印出Hello RT-Thread!
CubeMxSetting
,打开CubeMx。配置烧写方式:
配置时钟输入:
配置时钟树:
串口配置:
修改输出工程方式:
修改生成文件的方式:
4. 保存配置。并生成代码,关闭CubeMX。
代码生成后回到RT-Thread Studio工程,提示stm32f4xx_hal_conf.h改为stm32f4xx_hal_conf_bak.h备份文件,是因为conf内存储着stm32的hal库配置信息,RT-Thread做了一个备份,不用管。
SConscript
文件SConscript
文件,如果有就跳过创建环节,检查内容。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 设定的规则。
保存文件,右键空白处更新软件包。
multiple definition of main
。__weak
,再次构建则不会报错。drv_clk.c
,发现RT-Thread Studio已经自动将CubeMx的时钟配置更新到RT-Thread工程中。void SystemClock_Config(void)
函数代码复制到drv_clk.c
中的void system_clock_config(int target_freq_mhz)
函数中。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 编译环境中,一般可以创建或修改已有 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 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
看到这里就说明已经没有了。
文章浏览阅读3.8w次,点赞32次,收藏163次。误差修正模型(Error Correction Model, ECM)协整(cointegration)反映的是序列中变量之间的长期均衡关系,用网上的一个例子来描述协整就是一个醉汉牵着一只狗,他们之间的距离虽然会时远时近,但是由于绳子的存在,当达到绳子的长度时,他们的距离又会拉近,这样他们之间就存在着协整关系。通过协整建立的模型是静态模型,而误差修正模型的使用就是为了建立短期的动态模型来弥补长期..._ecm模型
文章浏览阅读1.7k次。using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace mapReduce{ public static class helper { public static Dictionary MapReduce( _c# mapreduce
文章浏览阅读419次。测试环境:RDBMS 11.2.0.4步骤:1 停掉备库的MRP2 在备库上添加standby logfile,大小100M (standby_file_management='manual';注意下这个参数)3 在备库上删除standby logfile,删除掉50M的4 在主库添加redo,大小为100M5 在主库删除redo ,大小为50M6 备库添加redo,大小为100M7 备库删除redo ,大小为50M8 主库添加standby ,大小为100M9 主库删除stand._dataguard 调整redo日志大小
文章浏览阅读4.5w次,点赞12次,收藏48次。TXT是纯文本文件,常用的几种函数有load函数,importdata函数,dlmread函数,textread函数。科学计数法如1.03乘10的8次方,可简写为“1.03e+08”的形式1:examp0204.txt中只包含没有文字说明,且每行数据个数相同,只是有多种数据分隔符,此数据同样可以使用数据导入向导。9.5550 2.7027, 8.6014; 5.615..._matlab读取txt中的科学计数
文章浏览阅读340次。题目背景约瑟夫是一个无聊的人!!!题目描述n个人(n<=100)围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈,……依次类推,直到所有的人都出圈,请输出依次出圈人的编号.输入输出格式输入格式: n m 输出格式: 出圈的编号 输入输出样例输入样例#1: 复制10 3输出样例#1: ..._8个人站成一圈,从第1个人开始报数,报到5的人出圈,第6个人再从1开始报。依次类
文章浏览阅读5.6k次,点赞5次,收藏43次。年历使用js代码制作网页年历生成<!doctype html><html> <head> <meta charset="utf-8"> <title>年历</title> <script> var year = parseInt(prompt('输入年份:','2019')); document.write(calendar(year)); _javascript年历
文章浏览阅读129次。DA5449使用双缓冲的3线串行接口,与SPI、QSPI、MICROWIRE和大多数DSP接口标准兼容。此外,串行数据输出(SDO)引脚允许在使用多个封装时进行菊花链连接。数据读取功能允许用户通过SDO引脚读取DAC寄存器的内容。在上电时,内部移位寄存器和锁存器被填充为0,DAC输出为零量程.
文章浏览阅读2k次,点赞2次,收藏18次。DPYTHON_DEFAULT_EXECUTABLE=/home/tai/archiconda3/envs/yolo5/bin/python3.6m #这个决定安装在哪个python上。OPENCV_EXTRA_MODULES_PATH=/home/tai/open/opencv_contrib-4.5.3/modules #这个是opencv_contrib文件。记得搜索自己cv2.cpython-36m-aarch64-linux-gnu.so to cv2.so文件。..._opencv cuda jetdon nano
文章浏览阅读564次。在分布式系统中,session共享有很多解决方案,其中使用redis缓存是最常用的方案之一1.想要在springboot用到spring session共享功能,首先需要在springboot项目中添加相关依赖2.在application.yml添加配置属性这里为了方便,用同一个项目不同代码编译两次,代码如下@RestControllerpublic class Tes..._spring4集成redissession了吗
文章浏览阅读5.4k次,点赞3次,收藏13次。JavaMail API详解cleverpig 发表于 2006-01-01 14:34:28作者:cleverpig 来源:Matrix摘要:JavaMail API是读取、撰写、发送电子信息的可选包。我们可用它来建立如Eudora、Foxmail、MS Outlook Express一般的邮件用户代理程序(Mail User Age..._有关javamail api的描述以下( )正确
文章浏览阅读883次。百度天工笔记参考资料:初识百度天工百度产品文档简介百度天工是融合了百度ABC(AI、Big Data、Cloud)的“一站式、全托管”智能物联网平台。 从端到云,从数据采集、传输、计算、存储、展现到分析,天工提供了全面的基础产品和服务。赋能物联网应用开发商和生态合作伙伴从”连接”、”理解”到”唤醒“的各项关键能力,从而轻松构建各类智能物联网应用,促进行业变革。连接:互联互通,让..._端口1884是什么服务
文章浏览阅读3k次。题目大意Ena和Mizuki正在玩一个游戏。他们面前有n个项目,编号从1到n。第i个项目的价值是.Ena和Mizuki轮流操作,而Ena先操作。在一次移动中,玩家选择一个尚未被拿走的物品并将其带走。当所有物品都被拿走时,游戏结束。任何一方的目标都是使他们拿走的物品的价值之和最大。鉴于双方都以最佳方式行动,有多少个可能的游戏过程?由于这个数字可能太大,你应该输出998244353的模数。如果存在某个整数i(1≤i≤n),使第i次移动中拿走的物品的指数不同,则认为两个过程不同。输入描述._2021 济南站icpc optimal strategy