STM32基于HAL库RT-Thread Demo测试
STM32基于HAL库RT-Thread Demo测试
- 🎈源码地址:
https://github.com/RT-Thread/rt-thread/tree/master
- 📌基于STM32CUBEMX中间件安装《基于 CubeMX 移植 RT-Thread Nano》
- 📍环境搭建《使用 Env 创建 RT-Thread 项目工程》
- 🔖《Env 用户手册》
- ✨在STM32上使用推荐使用RT-Thread Nano版本。
-
🌿如果仅仅是想使用此系统框架,那么就不需要按照官方介绍的复杂配置,只需拷贝一个工程模板来使用即可。
-
📍ARM.Keil官网提供的
rt-thread
开发框架例程资源:https://www.keil.arm.com/boards/?q=&vendor=stmicroelectronics&core=Cortex-M3&sort_by=
-
或者是Keil中直接下载:
-
🌿按照官方的学习路线:先利用现成的工程案例
模拟运行
。可参考官方的教程《Keil 模拟器 STM32F103 上手指南》
- 🔖当然你如果手上有对应的STM32开发板,也是可以直接烧录和运行来的。测试方法和仿真模拟是一样的。
- 🔰Keil模拟器提供的例程资源可以直接编译、仿真或烧录测试的,(https://gitee.com/rtthread/docs-online/raw/master/rt-thread-version/rt-thread-standard/tutorial/quick-start/stm32f103-simulator/rtthread_simulator_v0.1.0.7z)在github下载的源码资源中的
bsp
中的例程需要用过Env工具,对需要使用的工程,要提前配置一下才能通过编译的。 - 🔖bsp源码例程如果没有经过配置,会报缺少
RT_CPUS_NR
宏定义,如果仅是拷贝模板,可以自己定义一下也可以解决报错问题。
🛠Env配置
- 🌿按照官方提供的ENv安装教程安装完成并设置好后,在项目文件夹内右键通过
ConEmu Here
打开,输入menuconfig
- 🌿
bsp
例程配置CPU核心数
-
🌿其他外设功能开启设置,按个人需求配置,不同型号的项目例程外设有差异,目前官方所提供的芯片例程,外设配置内容并不是很完善。当然可以按照官方给出的教程创建《STM32 系列 BSP 制作教程》
-
🌿配置好待测试的外设功能后,记得保存配置选项。
-
🌿已完成项目的配置工作,可以通过Keil直接打开工程进行编译,也可以使用ENv自带的编译工具链,运行
scons
命令即可使用默认的 ARM_GCC 工具链编译bsp
例程。
- 🔖Keil中编译和下载代码就不介绍了。
- 📝测试例程:(
rt-thread\bsp\stm32\stm32f103-blue-pill
)
/** Copyright (c) 2006-2021, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date Author Notes* 2019-03-08 obito0 first version*/#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>/* defined the LED0 pin: PC13 */
#define LED0_PIN GET_PIN(E, 5)
#define LED1_PIN GET_PIN(B, 5)
#define PWM_DEV_NAME "pwm2" /* PWM设备名称 */
#define PWM_DEV_CHANNEL1 1 /* PWM通道 */
#define PWM_DEV_CHANNEL2 1 /* PWM通道 */
struct rt_device_pwm* pwm_dev; /* PWM设备句柄 */
rt_uint32_t period, pulse;//TIM_HandleTypeDef htim2;
int main(void)
{period = 5000; /* 周期为5ms,单位为纳秒ns */pulse = 2000; /* PWM脉冲宽度值,单位为纳秒ns *//* 查找设备 */pwm_dev = (struct rt_device_pwm*)rt_device_find(PWM_DEV_NAME);/* 设置PWM周期和脉冲宽度 *///如果想通过串口命令来开启,就不需要启用下面的注释代码
// rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL1, period, pulse);
// rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL2, period, pulse);/* 使能设备 */
// rt_pwm_enable(pwm_dev, 1); //开启PWM输出通道:PA15
// rt_pwm_enable(pwm_dev, 2);//开启PWM输出通道:PB3/* 关闭设备通道 */
// rt_pwm_disable(pwm_dev, PWM_DEV_CHANNEL);/* set LED0 pin mode to output */rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);
// HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); //开启PWM输出通道:PA15
// HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2); //开启PWM输出通道:PB3while(1){rt_pin_write(LED0_PIN, PIN_LOW);rt_pin_write(LED1_PIN, PIN_HIGH);rt_thread_mdelay(500);rt_pin_write(LED0_PIN, PIN_HIGH);rt_pin_write(LED1_PIN, PIN_LOW);rt_thread_mdelay(500);}
}
- 🌿通过串口命令配置对应PWM通道输出:
[21:36:06.342] O-9[32m[I/I2C] I2C bus [i2c1] regi
[21:36:06.400] stered[0m
[21:36:06.400]
[21:36:06.400] \ | /
[21:36:06.400] - RT - Thread Operating System
[21:36:06.400] / | \ 5.1.0 build Oct 20 2023 20:37:06
[21:36:06.400] 2006 - 2022 Copyright by RT-Thread team
[21:36:06.400] msh >
[21:36:08.932] pwm probe pwm2[21:36:08.943] pwm probe pwm2
[21:36:08.943] probe pwm2 success
[21:36:08.943] msh >
[21:36:08.943] msh >
[21:36:31.093] pwm enable 2[21:36:31.104] pwm enable 2
[21:36:31.104] pwm2 channel 2 is enabled success
[21:36:31.104] msh >
[21:36:31.104] msh >
[21:36:38.840] pwm enable 1[21:36:38.851] pwm enable 1
[21:36:38.851] pwm2 channel 1 is enabled success
[21:36:38.851] msh >
[21:36:38.851] msh >
[21:37:26.475] pwm set 1 5000 2000[21:37:26.487] pwm set 1 5000 2000
[21:37:26.487] pwm info set on pwm2 at channel 1
[21:37:26.487] msh >
[21:37:26.487] msh >
[21:37:32.232] pwm set 2 5000 2000[21:37:32.243] pwm set 2 5000 2000
[21:37:32.243] pwm info set on pwm2 at channel 2
[21:37:32.243] msh >
[21:37:32.243] msh >
[21:37:52.630] pwm get 1[21:37:52.640] pwm get 1
[21:37:52.640] Info of device [pwm2] channel [1]:
[21:37:52.640] period : 5000
[21:37:52.647] pulse : 2000
[21:37:52.647] Duty cycle : 40%
[21:37:52.647] msh >
[21:37:52.647] msh >
[21:37:58.043] pwm get 2[21:37:58.053] pwm get 2
[21:37:58.053] Info of device [pwm2] channel [2]:
[21:37:58.053] period : 5000
[21:37:58.060] pulse : 2000
[21:37:58.060] Duty cycle : 40%
[21:37:58.060] msh >
[21:37:58.060] msh >
- 📚测试工程
链接:https://pan.baidu.com/s/1ujR9pf4UA7lqIidIk_BV9w
提取码:x014
相关文章:

STM32基于HAL库RT-Thread Demo测试
STM32基于HAL库RT-Thread Demo测试 🎈源码地址:https://github.com/RT-Thread/rt-thread/tree/master📌基于STM32CUBEMX中间件安装《基于 CubeMX 移植 RT-Thread Nano》📍环境搭建《使用 Env 创建 RT-Thread 项目工程》ǵ…...
萌新小白必做题(2)找素数
一.思路分析 先来看看素数的性质: 素数又称质数,是指除了1和本身外没有其它因数的自然数。素数有许多有趣的性质和应用,例如可以用于加密算法和数学证明等。比如2、3、5、7等都是素数,而4、6、8、9等则不是素数。素数的研究是数…...
《基于 Vue 组件库 的 Webpack5 配置》8.在生成打包文件之前清空 output(dist) 目录(两种方式)
方式一 如果 webpack 是 v5.20.0,直接使用属性 output.clean,配置如下: module.exports {//...output: {clean: true}, };方式二 如果使用较低版本,可以使用插件 clean-webpack-plugin: 先安装:npm…...

3、Kafka Broker
4.1 Kafka Broker 工作流程 4.1.1 Zookeeper 存储的 Kafka 信息 (1)启动 Zookeeper 客户端。 [hadoop102 zookeeper-3.5.7]$ bin/zkCli.sh(2)通过 ls 命令可以查看 kafka 相关信息。 [zk: localhost:2181(CONNECTED) 2] ls /kaf…...

数字孪生智慧建筑可视化系统,提高施工效率和建造质量
随着科技的不断进步和数字化的快速发展,数字孪生成为了建筑行业的一个重要的概念,被广泛应用于智能化建筑的开发与管理中。数字孪生是将现实世界的实体与数字世界的虚拟模型进行连接和同步,从而实现实时的数据交互和模拟仿真。数字孪生在建筑…...

SpringCloud: feign整合sentinel实现降级
一、加依赖: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache…...
List<LinkedHashMap<String, String>>类型的数据转换为Map<String, List<String>>类型数据
import java.util.*;public class Main {public static void main(String[] args) {// 示例数据:List<LinkedHashMap>List<LinkedHashMap<String, String>> keyParamList new ArrayList<>();LinkedHashMap<String, String> map1 ne…...

react 学习 —— 16、使用 ref 操作 DOM
什么时候使用 ref 操作 DOM? 有时你可能需要访问由 React 管理的 DOM 元素 —— 例如,让一个节点获得焦点、滚动到它或测量它的尺寸和位置。在 React 中没有内置的方法来做这些事情,所以你需要一个指向 DOM 节点的 ref 来实现。 怎么使用 r…...

Qt planeGame day10
Qt planeGame day10 Game基本框架 qt中没有现成的游戏框架可以用,我们需要自己搭框架首先创建一个QGame类作为框架,这个基本框架里面应该有如下功能:游戏初始化 void init(const QSize& siez,const QString& title);游戏反初始化(…...

贪吃蛇项目实践
游戏背景: 贪吃蛇是久负盛名的游戏,它也和俄罗斯⽅块,扫雷等游戏位列经典游戏的⾏列。 实现基本的功能: 贪吃蛇地图绘制 蛇吃⻝物的功能 (上、下、左、右⽅向键控制蛇的动作) 蛇撞墙死亡 蛇撞⾃⾝死亡 计…...

【C++】哈希应用——海量数据面试题
哈希应用——海量数据面试题 一、位图应用1、给定100亿个整数,设计算法找到只出现一次的整数?2、给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?(1)用一个位图…...

CUDA学习笔记(五)GPU架构
本篇博文转载于https://www.cnblogs.com/1024incn/tag/CUDA/,仅用于学习。 GPU架构 SM(Streaming Multiprocessors)是GPU架构中非常重要的部分,GPU硬件的并行性就是由SM决定的。 以Fermi架构为例,其包含以下主要组成…...

逻辑漏洞详解
原理: 没有固定的概念,一般都是不符合常识的情况。比如任意用户注册,短信炸弹,占用资源,交易支付、密码修改、密码找回、越权修改、越权查询、突破限制。 根据实际业务逻辑进行比对,购物的可以根据数量&a…...

MySQL——八、MySQL索引视图
MySQL 一、视图1、什么是视图2、为什么需要视图3、视图的作用和优点4、创建视图5、视图使用规则6、修改视图7、删除视图 二、索引1、什么是索引2、索引优缺点3、索引分类4、索引的设计原则5、创建索引5.1 创建表是创建索引5.2 create index5.3 ALTER TABLE 6、删除索引7、MySQL…...
力扣100097. 合法分组的最少组数(哈希+贪心)
题目描述: 给你一个长度为 n 下标从 0 开始的整数数组 nums 。 我们想将下标进行分组,使得 [0, n - 1] 内所有下标 i 都 恰好 被分到其中一组。 如果以下条件成立,我们说这个分组方案是合法的: 对于每个组 g ,同一…...

uniapp map地图实现marker聚合点,并点击marker触发事件
1.uniapp官方文档说明 2.关键代码片段 // 仅调用初始化,才会触发 on.("markerClusterCreate", (e) > {})this._mapContext.initMarkerCluster({enableDefaultStyle: false, // 是否使用默认样式zoomOnClick: true, // 点击聚合的点,是否…...

【Mysql】Mysql中的B+树索引(六)
概述 从上一章节我们了解到InnoDB 的数据页都是由7个部分组成,然后各个数据页之间可以组成一个双向链表 ,而每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表 ,每个数据页都会为存储在它里边儿的记录生成一个页目录 ÿ…...

【Dockerfile镜像实战】构建LNMP环境并运行Wordpress网站平台
这里写目录标题 一、项目背景和要求二、项目环境三、部署过程1)创建自定义网络2)部署NginxStep1 创建工作目录并上传相关软件包Step2 编写Dockerfile文件Step3 编写配置文件nginx.confStep4 创建nginx镜像Step5 运行容器 3)部署MysqlStep1 创…...

【工具】利用ffmpeg将网页中的.m3u8视频文件转化为.mp4格式
目录 0.环境 1.背景 2.前提 3.详细描述 1)在网站上找到你想下载的视频的.m3u8链接 2)打开命令行,用ffmpeg命令进行转化 3)过程&结果截图 0.环境 windows64 ffmpeg 1.背景 网页上有个.m3u8格式的视频文件,…...

Git简洁安装方式和使用方式【附安装包资源,Git基础操作,如拉取项目、上传代码、拉取代码】
文章目录 软件安装包安装步骤常用使用方式注意拉取项目上传代码或文件选择文件添加到本地Git存储库的缓存区将缓存区的更改提交到本地Git存储库,并设置提交信息将本地Git存储库的更新推送到远程Git仓库中上传示例拉取别人所上传的代码 常见问题上传代码失败…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...