- 博客(193)
- 收藏
- 关注
原创 RT-Thread Studio配置实现温湿度上传云平台
然后我们还看到有发布和订阅的主题,我们还是用阿里云物联网平台的产品支持的topic:根据自己的需求以及topic的权限,可以自定义topic,也可以直接使用系统支持的,我们这里就选择订阅。
2025-06-13 00:30:00
609
原创 RT-Thread Studio 配置使用详细教程
它说现在仅支持I2C,但是我们想要的是SPI接口的,不满足,所以就不添加软件包到工程,但是这个软件包依然有参考意义,看一下别人是如何实现RTT下的SSD1306驱动的,可以尝试移植,这时候我们就可以点击边上的“github”把源码clone下来参考。将我们需要的代码添加到rtt studio工程之后,为了能够编译通过,我们需要将cubemx settings生成的文件夹cubemx中的一些文件或者全部文件排除构建,比如main.c,一个工程不可能存在两个同名的.c源文件,还有新生的。
2025-06-13 00:15:00
1999
原创 RT_Thread——信号
信号的发送者、接收者都是线程:线程发信号给线程,尚不支持中断发信号给线程。线程中可以安装好几个信号,根据需求选择使能部分信号,则这部分信号才能传达给该线程。分别创建一个接收信号函数和一个发送信号函数,在虚拟机上执行观察接收执行情况。当需要某线程进行异常处理时,如果该线程安装了某信号,则使用。如果线程需要处理某一个信号,就需要现在线程中安装该信号。如果屏蔽该信号,就该信号不会传达给安装该信号的线程。可见接收成功后打印获得信号字符,并显示获得几次信号。使用信号时,需要先安装、屏蔽/使能、发送和等待。
2025-06-11 00:30:00
830
原创 RT_Thread——邮箱
使用消息队列可以传递各类大小的消息,它使用 memcpy 的方式写入消息、读出消息。如果我们只是传递很小的数据,比如一些数值,可以使用邮箱:它的效率更高。
2025-06-10 15:37:02
693
原创 RT_Thread——线程管理(下)
在 RT-Thread_03_delete_task 的实验里,我们提到空闲线程(Idle 线程)的作用:释放被删除的线程的内存。除了上述目的之外,为什么必须要有空闲线程?一个良好的程序,它的线程都是事件驱动的:平时大部分时间处于挂起状态。有可能我们自己创建的所有线程都无法执行,但是调度器必须能找到一个可以运行的线程:所以,要提供空闲线程。空闲线程优先级最低:它不能阻碍用户线程运行空闲线程要么处于就绪态,要么处于运行态,永远不会挂起空闲线程的优先级为最低,这意味着一旦某个用户的线程变为就绪态,那么。
2025-06-09 22:07:32
746
原创 RT_Thread——线程管理(上)
在 RT-Thread_04_task_priority 实验中,如果把线程 3 中的 rt_thread_delay 调用注释掉,那么线程 1、线程 2 根本没有执行的机会。但不同于裸机系统,RTOS 存在多个线程,每个线程是独立互不干扰的,因此需要为每个线程都分配独立的栈空间,这就是线程栈。它存放线程的一些信息,例如优先级、线程名称、线程状态等,也包含线程与线程之间连接用的链表结构,线程等待事件集合等。rt_thread 描述了一个线程执行的运行环境,也描述了这个线程所处的优先等级。
2025-06-09 22:07:19
1104
原创 RT_Thread——内存管理
内存的动态管理是 C 程序的知识范畴,并不属于 RT-Thread 的知识范畴,但是它跟 RT-Thread 关系是如此紧密,所以我们先了解它。使用内存的动态管理功能,简化了程序设计:不再需要小心翼翼地提前规划各类对象,简化API 函数的涉及,甚至可以减少内存的使用。当系统内存比较大,我们可以提前分配好若干大小的内存块,直接供给线程使用,可以一定程度的提高效率,但会浪费一些内存。小内存管理算法需要频繁的分配、释放内存,可能会影响系统效率。在嵌入式系统中,除了芯片内部的内存,可能还会外扩内存。
2025-05-21 23:32:01
885
原创 RT_Thread——快速入门
以RT-Thread 源码(V3.1.5)为例,它的目录如下:主要涉及3个目录:以理解、使用RT-Thread 为目标的话,最核心的文件只有5个:这些文件的作用列表如下:移植RT-Thread,包含CPU 部分移植和BSP 部分移植。CPU 部分移植就是移植libcpu 目录,主要涉及 和。比如: 和 ,这表示 Cortex-M3 架构在 RVDS 或Keil 工具上的移植文件如果RT-Thread 还没支持你使用的CPU,你才需要实现这两个文件。一般来说,对于大部分的CPU, RT-Thread都已经支持
2025-05-21 18:58:08
1397
原创 基于STM32的智能储物柜(手机APP / 蓝牙APP)
这里有两个版本,一个是触摸屏,另一个是0.96寸oled➕矩阵按键,他们除了这里有所区别,其他地方都是完全一模一样的,我们就以0.96寸oled➕矩阵按键版本的进行讲解。0.96寸oled➕矩阵按键实现触摸屏实现:基于STM32的智能物流柜二、硬件实现下载资源包,可以获得存放main函数以及系统文件和中断文件。存放硬件驱动文件。SYSTEM:存放系统初始化文件。CORE:存放内核驱动文件以及STM32启动文件。FWLIB:标准库移植文件。
2025-04-15 16:37:50
1326
原创 基于STM32的智能农业大棚(阿里云平台)
需要实物的可以私信博主或者在文章最下方添加好友。目录一、项目介绍和演示视频二、硬件需求准备三、硬件框图四、CubeMX配置1. 按键、蜂鸣器GPIO口配置2. ADC输入配置3. IIC——驱动OLED4. DHT11温湿度读取5. PWM配置——光照灯、水泵、风扇6. 串口——esp8266模块7. 定时器配置——按键消抖所需五、代码框架1. 菜单实现思路2. OLED驱动3. 按键消抖4. DHT11温湿度驱动5. 光照强度、土壤湿度ADC转换6. esp8266连接阿里云。
2025-04-15 16:34:39
1041
原创 基于STM32的火灾报警系统(手机APP / 蓝牙APP)
需要实物的可以私信博主或者在文章最下方添加好友。目录前言一、项目介绍和演示视频二、硬件实现1. 硬件资料2. 原理图和PCB三、软件实现1. 源码框架1.1 定义各种宏1.2 模块上电等待稳定1.3 模块初始化1.4 网络配置1.5 显示主界面1.6 进入循环1.7 处理信息1.8 网络参数更新2. 源码示例该项目实现内容如下:系统以STM32微控制器为核心,通过集成多种火灾探测传感器、通信模块和报警装置,构建了一个完整的火灾报警系统。
2025-04-15 16:25:03
745
原创 基于STM32的智能家居系统(单片机毕设)
需要实物的可以私信博主或者在文章最下方添加好友。目录目录前言一、项目介绍和演示视频二、硬件实现1. 材料材料2. 原理图和PCB三、软件实现1. 代码解析1.1 main函数1.4 初始化函数2. 机智云平台搭建以及代码移植2.1 APP制作2.2 给ESP8266模块烧录固件2.3 代码移植2.4 总结3. SNR8016VR_DEV智能语音模块3.1 智能公元平台3.2 创建产品3.3 配置语音模块3.4 生成SDK固件烧录。
2025-04-15 16:12:42
1064
原创 基于STM32的火灾报警系统(阿里云平台 / 机智云平台)
需要实物的可以私信博主或者在文章最下方添加好友。项目实物图:项目演示视频:基于STM32的火灾报警系统(阿里云平台)
2025-04-15 16:09:52
1125
原创 基于STM32的环境监测预警系统(单片机毕设)
需要实物的可以私信博主或者在文章最下方添加好友。基于STM32的家庭/室外环境监测系统(单片机毕设)主控为stm32f103c8t6。使用DHT11温湿度传感器和MQ-2烟雾传感器,读取并实时刷新在0.96寸OLED屏幕上,同时通过蓝牙模块HC-05使用串口通信将数据上传到上位机(自制蓝牙APP)。可手动控制蜂鸣器以及电机作为报警器和风扇;在自动预警模式下,监测到温度高出设定的阈值后打开风扇降温;当监测到烟雾浓度高出设定阈值后将关闭风扇防止火情蔓延,并开启蜂鸣器报警,上位机同步更新报警状态。
2025-04-15 16:05:21
1083
原创 单片机中的socket封装
在“at_socket_demo\rt-thread\components\net\at\at_socket\at_socket.h”中,有如下定义:这就是socket编程的常用接口。char *name;/* WIFI模块的名字 *//* 发送AT命令前需要先获得这个锁 *//* 发送AT命令后等待这个信号量(等待AT命令的回应) *//* 存放AT命令的回应数据 *//* AT命令回应数据的长度 *//* AT命令回应的数据有多少行 *//* AT命令的回应是OK还是ERR */
2025-03-06 15:45:01
733
1
原创 W800 模块AT命令体验
这使得:上图里“4.2”发送了“1234567890”十个字符,但是“5”那里只显示“123456789”九个字符。这使得:上图里“4.2”发送了“1234567890”十个字符,但是“5”那里只显示“123456789”九个字符。这使得:上图里“4.2”发送了“1234567890”十个字符,但是“5”那里只显示“123456789”九个字符。缺点就是勾选“发送新行”时发送的是2个字符:回车、换行,无法只发送回车符。缺点就是勾选“发送新行”时发送的是2个字符:回车、换行,无法只发送回车符。
2025-03-06 01:08:37
845
原创 基于STM32+FreeRTOS的四轴机械臂
该项目是基于FreeRTOS实时操作系统,主控为 STM32F103C8T6 开发板 ,机械臂为四轴分别被四个舵机控制。本项目实现了 3 种控制方法,分别为摇杆控制、示教器控制和串口蓝牙控制,采用8路ADC采集按键摇杆传感器和旋钮电位器的模拟量并由DMA搬运数据,可自制手机蓝牙APP或者直接使用官方手机蓝牙助手作为上位机,USART串口蓝牙实时收发信息,IIC驱动OLED屏幕实时显示机械臂移动张爪夹爪信息,人为控制抓取目标物。
2025-03-04 00:03:40
1321
原创 网络通信概述
所有的数据传输,都有三个要素:源、目的、长度。怎么表示源或者目的呢?请看下图:所以,在网络传输中需要使用“IP和端口”来表示源或目的。此函数用于创建一个套接字。domain是网络程序所在的主机采用的通讯协族(AF_UNIX 和AF_INET 等)。AF_UNIX只能够用于单一的Unix 系统进程间通信,而AF_INET 是针对Internet 的,因而可以允许远程通信使用。type是网络程序所采用的通讯协议(SOCK_STREAM,SOCK_DGRAM等)。
2025-03-04 00:03:17
661
原创 Ubuntu入门操作
Shell的意思是“外壳”,在Linux中它是一个程序,比如/bin/sh、/bin/bash等。它负责接收用户的输入,根据用户的输入找到其他程序并运行。比如我们输入“ls”并回车时,shell程序找到“ls”程序并运行,把结果打印出来。Shell有很多种实现,我们常用bash。
2025-02-08 12:56:12
2323
1
原创 异常与中断(下)
② 清除EXTI中断,如果不清除中断,当按下按键后松手会一直触发中断,而清除中断需要从根源开始,GPIO中没有相关寄存器,所以从EXTI开始清除。在这里主要做两件事:① 使能NVIC,让中断能够发送给CPU,而发送过来的中断为EXTI0,EXTI0对应异常向量表的第六项,将其设置为1即可;多个中断源汇聚到NVIC,NVIC的职责就是从多个中断源中取出优先级最高的中断,向CPU发出中断信号。多个中断源汇聚到NVIC,NVIC的职责就是从多个中断源中取出优先级最高的中断,向CPU发出中断信号。
2025-01-01 20:45:12
787
1
原创 异常与中断(中)
要想深入理解异常处理,需要写程序来验证。本节课程故意执行一条未定义的指令,让它触发异常。ARM Cortex-M3与Cortex-M4权威指南.pdfPM0056.pdf复制“E:\ARM\doc_and_source_for_mcu_mpu\STM32MF103\daima\relocate\01_uart_question”修改为“01_undefined”。
2025-01-01 20:44:55
899
原创 异常与中断(上)
编译程序时,我们会先设置好异常向量表,程序开始运行,当运行到CMP指令时发生中断,CPU终止BLEQ指令的运行,会先去处理中断(irq):CPU会切换进入irq模式(若发生异常则进入各类异常对应的模式),接着CPU去异常向量表中得到一条指令并去执行该指令(注意与M3/M4的区别:这里是指令,而M3/M4是函数地址),该指令会一条跳转指令,会跳转去执行某个函数,在函数中首先会保存现场,接着分辨中断源并去处理中断,最后是恢复现场。如果C函数要用到这些寄存器,就要把它们保存到栈里,在函数结束前在从栈中恢复它们。
2025-01-01 20:44:32
1053
原创 代码重定位详解
由图可见,g_char2指向ROM,且表现为只读,所以能被成功打印,而g_char1指向内存RAM,该区域是可读可写的,而我们对于内存未进行赋值,所以当访问到g_char1指向的地址时,就会打印乱码(该内存中的任意值)。为了研究该问题,我们写了一个string.c和string.h,里面是打印函数,我们将该文件包含进该工程中,查看g_char1和g_char2的地址。可以看见,我们在定义了g_char1和g_char2(定义为常量)后,分别打印时g_char1显示的是乱码,而g_char2显示正常。
2025-01-01 20:43:08
1022
原创 Keil中的gcc
C/C++源文件中,以“#”开头的命令被称为预处理命令,如包含命令“#include”、宏定义命令“#define”、条件编译命令“#if”、“#ifdef”等。预处理就是将要包含(include)的文件插入原文件中、将宏定义展开、根据条件编译命令选择要使用的代码,最后将这些东西输出到一个“.i”文件中等待进一步处理。链接就是将上步生成的OBJ文件和系统库的OBJ文件、库文件链接起来,最终生成了可以在特定平台运行的可执行文件。编译就是把C/C++代码(比如上述的“.i”文件)“翻译”成汇编代码。
2025-01-01 20:42:28
1648
原创 必备汇编编程知识
C为了方便人类方便使用,发明的高级语言,要转换为汇编。汇编为了解放人类的记忆,发明的“助记符”,不用去记各类机器码。最终要转换为机器码。机器码给CPU使用UART的全称是Universal Asynchronous Receiver and Transmitter,即异步发送和接收。打印调试信息;外接各种模块:GPS、蓝牙;串口因为结构简单、稳定可靠,广受欢迎。通过三根线即可,发送、接收、地线。TxD线把PC机要发送的信息发送给ARM开发板。最下面的地线统一参考地。
2025-01-01 20:42:16
698
原创 ARM架构
一开始,ARM公司发布两类指令集:① ARM指令集,这是32位的,每条指令占据32位,高效,但是太占空间② Thumb指令集,这是16位的,每条指令占据16位,节省空间要节省空间时用Thumb指令,要效率时用ARM指令。一个CPU既可以运行Thumb指令,也能运行ARM指令。怎么区分当前指令是Thumb还是ARM指令呢?程序状态寄存器中有一位,名为“T”,它等于1时表示当前运行的是Thumb指令。假设函数A是使用Thumb指令写的,函数B是使用ARM指令写的,怎么调用A/B?
2025-01-01 20:42:02
1084
原创 全场景——(十一)综合实现
文章目录一、产品框架1.1 硬件框架1.2 设计思路1.2.1 上位机如何定位到传感器1.2.2 上位机如何读写传感器1.2.3 中控如何读写传感器1.2.4 上位机如何发送映射关系、传输固件1.2.5 上位机界面1.3 软件框架二、改造libmodbus 实现文件传输2.1 分析Write File Record 功能2.2 实现Write File Record2.3 UART 驱动严重Bug2.4 实现文件传输三、读写任意传感器3.1 上机演示3.1.1 接线3.1.2 烧写程序3.1.3 使用3.2
2025-01-01 20:41:41
709
原创 全场景——(八)低成本 Modbus 传感器的实现
Modbus 传感器开发套件共有三个, 三个板子的使用的主控方案是 STM32F030芯片,硬件接口资源如下图所示:开关量模块温湿度变送器模块环境检测模块。
2024-12-02 23:00:00
1513
原创 全场景——(九)访问多个传感器及程序改进
现象:H5开发板的屏幕上显示三个传感器的按键和光敏、可调电阻阻值以及温湿度,同时打开modbus poll软件,连接H5后能控制相应传感器的对应寄存器,比如将开关量传感器的LED对应的寄存器写入1并设为on,则LED亮,并且三个传感器的数值会显示在modbus poll软件上。接上电源后三个传感器的LED1会闪烁,同时H5开发板的LCD上打印了三个传感器的相关数据:开关量传感器的按键状态、环境传感器的可调电阻以及光明电阻的值、温湿度传感器的温度以及湿度的值。上位机怎么去访问接在H5上的其他3个传感器?
2024-12-02 23:00:00
777
原创 全场景——(十)程序升级
本节源码为“E:\QuanCJ\create_firmware_info”。下载协议可以自己定义,根据使用流程定义如下:发出“1”字符给上位机先发出5个“0x5a”数据给下位机,用于同步再发送固件信息。//版本号//长度//加载地址//校验码(上位机发送校验码给下位机 下位机接收到bin文件后算出校验码 与上位机发来的进行对比)//文件名注意:为了方便在串口里操作,上位机发送uint32_t的整数时,先发送高字节(大字节序)。发出“2”字符给上位机。
2024-12-02 23:00:00
1597
原创 C语言基础复习
在C语言中,宏定义是一种预处理指令,用于将一个标识符(宏名)替换为指定的字符串。这个过程称为“宏展开”或“宏替换”。宏定义是通过使用#define 预处理命令来完成的。宏定义主要有以下作用:① 提升易读性:比如② 便于批量修改:比如# define 宏名 字符串其中,宏名是你给标识符起的名字,而字符串可以是常数、表达式、格式串等。在预处理阶段,对程序中所有出现的“宏名”,预处理器都会用宏定义中的字符串去替换,这称为“宏替换”或“宏展开”。
2024-11-04 15:40:15
1236
1
原创 嵌入式处理器详解
主芯片内部有ROM,ROM程序协助从非XIP设备启动。以SD卡启动为例。而CPU只能运行XIP设备中的程序ROM程序做什么?显然:ROM需要把SD卡上的程序读到内存里(片内RAM或是片外的DDR)ROM程序要做的事情:a. 初始化硬件初始化时钟,提高CPU、外设速度初始化内存:DDR需要初始化才能使用初始化其他硬件,比如看门狗、SD卡等b. 从外设把程序复制到内存b.1 支持那么多的启动方式,SD卡、SPI FLASH、USB DISK,怎么选择?
2024-09-20 11:58:28
1353
2
原创 全场景——(七)libmodbus 使用
在libmodbus开发库中,为了方便数据处理在 modbus.h 文件中定义了一系列数据处理宏。>>80xFF0xFF当然,可以参照 float 类型的处理方法,继续定义其他多字节类型的数据例如int32_t、uint32_t、 int64_t、uint64_t 以及 double 类型的读写函数。
2024-08-30 00:30:00
987
原创 全场景——(六)Moubus 功能码详解
以主设备(左边)为例,发送(Tx)数据中第一个字节01为设备地址,第二个字节01表示功能码,第三、四个字节00 00表示起始地址,第五、六个字节00 0A表示要读取多少个位寄存器,第七、八个字节BC 0D为校验码。需要特别注意的是,Modbus的保持寄存器和输入寄存器是以字 (Word) 为基本单位的(1Word=2Byte),所以如果读取保持寄存器地址为40001开始的一个16位 (bit) 的无符号数,那么返回2字节,并可以从40002开始读取下一个16位的无符号数。数据字段中为逻辑1的位对应ON;
2024-08-30 00:00:00
944
The C based gRPC (C++, Python, Ruby, Objective-C, PHP, C#).zip
2024-07-09
Scientific computing with Python..zip
2024-07-09
Bayesian Modeling and Probabilistic Programming in Python.zip
2024-07-09
GPU programming in Python..zip
2024-07-09
Minimal examples of data structures and algorithms in Python.zip
2024-07-09
The Python micro framework for building web applications..zip
2024-07-09
Cookiecutter template for a Python package..zip
2024-07-09
Sequence-to-Sequence Toolkit written in Python..zip
2024-07-09
Python library for processing Chinese text.zip
2024-07-09
Zipline, a Pythonic Algorithmic Trading Library.zip
2024-07-09
Simple Python style checker in one Python file.zip
2024-07-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人