自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(156)
  • 收藏
  • 关注

原创 小智项目架构分析

这里面的内容主要有以下几个文件,我们主要改的是最后一个esp_sparkbot_board.cc文件,里面是板子整个运行前所需要的初始化工作,初始化spi,i2c,按钮,屏幕,其他的可能会改的就是config.h,里面定义了硬件的引脚,以及屏幕的一些尺寸大小,主要与硬件相关的宏定义。这里面没什么好说的,就是拓展库,可以用可以不用,就是给你写好了一些灯带的控制函数,或者单独一盏灯的控制函数,可以实现一些基础的流水灯类似的操作,没必要。这就是github项目上拉下来的一些信息 没什么好看的,这跟项目代码无关。

2025-04-28 23:05:52 832

原创 零成本!用Android手机搭建MQTT服务器全攻略

(保存操作:Ctrl+O → 回车 → Ctrl+X)

2025-03-16 14:08:20 624

原创 小智聊天机器人开发手记:MQTT实战中的FreeRTOS栈溢出攻防战

在小智聊天机器人项目中,MQTT是“智能”的桥梁,FreeRTOS是“稳定”的基石。每一次栈溢出的解决,都是对嵌入式系统资源管理的深刻理解。“明明MQTT消息已经通了,为什么一添加智能家居控制就崩溃?” —— 这是我在开发小智聊天机器人项目时遇到的真实困境。作为项目核心功能之一,MQTT协议承载了机器人与智能家居设备的通信重任。然而,当我在ESP32中初始化。(图:ESP-IDF 5.4的FreeRTOS内核配置界面,暗藏栈溢出的解决方案)“iot设备千万条,栈不溢出第一条;(如下),让我找到了破局之路…

2025-03-13 15:26:58 600

原创 【全网抢先】小智开发实战:从灯控到云端MQTT联动的完整指南

开发环境:💻 ESP-IDF 5.4,WindowsESP-IDF安装教程:📚 参考公众号往期教程MQTT同款源码获取:🔑 公众号“代码随心敲”内回复:小智小智开源代码地址:🌐 https://github.com/wdmomoxx/xiaozhi-esp32在 目录下创建 文件,实现以下关键功能:1.2 设备注册流程 📋在开发板配置文件中添加设备实例注意:在 目录下有许多开发板,因为我使用的芯片型号类型为 ESP32 老款芯片,所以我在 这个目录下进行代码编写。在文件: 中添加设

2025-03-11 14:32:04 1427 2

原创 【C语言面试题】

那问题中的情况是当(millis() - _startTime)是负数的时候,也就是当millis() < _startTime的时候,这时候的结果会被转换成无符号的大数,所以这时候比较的时候,如果durationMs是一个正常的正数,比如1000,那么这个大数肯定比durationMs大,所以函数会返回true,即使实际上还没经过足够的时间。一、下面这个函数存在什么问题。

2025-03-06 17:47:54 100

原创 ESP8266烧录程序报错 ”连到系统上的设备没有发挥作用“

驱动版本降低到3.4,3.5左右即可,卸载驱动重新安装驱动,玩单片机的都知道ch340把。检查自己的ch340驱动版本,太高了不行要降下来才行。

2025-03-05 21:26:15 231

原创 【paho-mqtt】关于正点原子交叉编译mqttclient时报错的解决方法

Cmake地址:/usr/bin 【直接apt-get安装的】修改 CMakeLists.txt。操作系统:ubantu16.04。Cmake编译器:3.10.2。

2025-03-04 19:27:39 392

原创 【QT线程】子线程阻塞主线程的一次网络api请求案例

这是最近一次项目遇到的问题,原因是我觉得子线程里俩次请求间隔太短了,会引起服务器屏蔽我的api因此,我故作聪明加多了一个延时函数,欢迎各位鉴赏代码。

2025-03-02 22:30:35 463

原创 【QT界面设计】如何给自定义的widget类强制添加背景

在Weather构造函数中使用此方法即可非常好用!

2025-03-02 11:15:20 188

原创 【QT网络问题】关于QT在调用天气等类似api接口时报错

由于目前主流的get请求都是https所以导致会出现这个问题,直接改为http请求即可,在QT中强制使用http请求不要用https即可解决问题,相关代码如下。Openssl库不匹配或者未安装,可以通过qdebug版本打印当前所需要的的openssl库,自己去官网下载。

2025-03-02 10:56:26 408

原创 【Deepseek】根文件系统挂载在/dev/sda1下,如何对其扩容

首先,需要在虚拟机管理工具中扩展虚拟磁盘的大小。虚拟机磁盘扩展后,需要在操作系统中调整分区大小。

2025-02-27 22:45:13 397

原创 【QT问题】Ubantu环境下解决已经下载好的qt怎么添加或卸载其他组件

这里随便提一下,如果此时勾选左下角的Unistall only并next,则是完全卸载qt。我这里随便填的账号,如果是正确的下面next就能够点击。如果QT版本的资源有以下四个路径建议都添加,没有就算。以ubantu平台为例需要添加以下内容。

2025-02-27 19:41:29 467

原创 汇编指令——ARM Cortex-M指令分析

这条指令用于确保在执行到该指令时,处理器中的指令流水线中的指令按顺序执行。这条指令用于确保在执行到该指令时,所有对内存的数据访问操作都已经完成,并且对这些访问所做的修改对后续的访问可见。是 ARM 汇编语言中的一条指令,代表 “OR with immediate”,用于将一个寄存器的值与一个立即数进行按位或运算,并将结果存储回目标寄存器中。指令会保在执行到该指令时,之前的指令已经对后续指令的影响生效,并且后续的指令按顺序执行。是 ARM 汇编语言中的一个指令,用于加载寄存器中的数据。

2024-06-07 22:32:04 2379

原创 C语言中typedef的四种用法(附带详细解析!!)

其中,枚举类型名 表示定义的枚举类型的名称,枚举常量1、枚举常量2 等表示枚举类型中的常量。每个枚举常量都有一个整数值,它们的默认值从 0 开始,依次递增 1。

2024-06-07 22:31:38 12337

原创 嵌入式Linux学习——Makefile语法函数

的所返回的每个字符串会以空格分隔,最后当整个循环结束时,;所返回的每个字符串所组成的整个字符串(以空格分隔)将会是foreach函数的返回值。因为这个函数是用来做循环用的,Makefile中的foreach函数几乎是仿照于Unix标准Shell (/bin/sh)中的for语句,或是C-Shell(/bin/csh)中的foreach语句而构建的。如果中也包含“%”,那么,中的这个“%”将是中的那个“%”所代表的字串。

2024-06-05 21:30:08 280

原创 嵌入式Linux学习——链接脚本

链接脚本描述了要链接的文件,以及链接顺序、链接首地址。上面语句中我们是通过“-Ttext”来指定链接地址是 0X87800000 的,这样的话所有的文件都会链接到以 0X87800000 为起始地址的区域。但是有时候我们很多文件需要链接到指定的区域,或者叫做段里面,比如在 Linux 里面初始化函数就会放到 init 段里面。因此我们需要能够自定义一些段,这些段的起始地址我们可以自由指定,同样的我们也可以指定一个文件或者函数应该存放到哪个段里面去。

2024-06-05 21:29:46 1127

原创 嵌入式Linux学习——Makefile语法

GCC 编译器的编译流程是:预处理、编译、汇编和链接。预处理就是展开所有的头文件、替换程序中的宏、解析条件编译并添加到文件中。编译是将经过预编译处理的代码编译成汇编代码,也就是我们常说的程序编译。汇编就是将汇编语言文件编译成二进制目标文件。链接就是将汇编出来的多个二进制目标文件链接在一起,形成最终的可执行文件,链接的时候还会涉及到静态库和动态库等问题。通过在终端执行 gcc 命令来完成 C 文件的编译,如果我们的工程只有一两个 C 文件还好,需要输入的命令不多,当文件有几十、上百甚至上万个的时候用终端输入

2024-06-04 10:31:45 1271

原创 FreeRtos进阶——FreeRtos内部链表逻辑分析

xLIIST_ITEM 是一个普通链表项,与迷你链表项不同,它多了两个元素,一个元素pwOwner用来指示该链表项被包含在哪个TCB中,即哪个任务所拥有。xLIST是一个链表,链表的作用主要是用来查看链表项的使用信息的,在链表中我们可以通过pxIndex查看当前指针在哪个链表项的位置,通过uxNumberOfItems查看链表中有多少链表项。当我们要在链表中添加一个新的链表项时,如果是根据执行的先后顺序,我们会在当前执行链表项的前一位进行添加操作,以确保的最后来最后执行。

2024-06-03 16:51:41 284

原创 FreeRtos进阶——各种堆的实现方式

"堆"就是一块或者多块内存,我们可以从中申请一小块内存来使用,使用完毕后可以释放这一小块内存。

2024-06-03 16:51:21 1269

原创 FreeRtos进阶——通用链表的实现方式

在此链表中,node结构体被放在了最前面,因此当我们用node结构体存储不同类型(dog或者person)结构体信息时,node 结构体位置就是dog或者person结构体的位置。在想要使用dog或者person时,只需要使用强制类型转换的方法即可。与前面俩种方法类似,如果直接在contianer存储person或者dog的结构体地址,那么就不需要再去计算或者反推对应结构体的地址了。在此链表中,node结构体的位置在最后面,因此我们需要根据person或者dog结构体的大小反推出他们的指针起始位置。

2024-06-01 21:17:33 385

原创 FreeRtos进阶——中断的内部逻辑

在系统滴答定时器中断服务函数中调用API函数xPortSysTickHandler(),xPortSysTickHandler()函数中通过向中断和状态寄存器的bit28写入1来启动PendSV中断,具体PendSV中断服务函数是 PendSV_Handler,并且任务切换的具体任务是在PendSV中断服务函数中完成的。而在中断api中,会先记录更高优先级的任务,在中断里的任务处理完成后,在中断末尾对任务进行切换。注意:即使最低优先级的中断 也比最高优先级的任务 优先级要高。

2024-05-31 21:19:25 684

原创 FreeRtos进阶——软件定时器内部逻辑

在创建定时器任务后,在每一次SysTick中断中,会将定时器时钟到的任务写入定时器任务队列。在prvTimerTask任务(守护任务)中会不断的读取最新一个定时器任务队列,并且调用其回调函数,守护任务的优先级基本上就是最高的。prvTimerTask()函数是FreeRTOS中的一个定时器任务函数,它的主要作用是实现定时器的管理和调度。具体来说,它会不断地从定时器列表中获取下一个到期的定时器,并进行处理,包括执行定时器回调函数、删除定时器等操作。

2024-05-31 20:18:49 701

原创 FreeRtos进阶——任务通知内部逻辑

在任务通知中,无需再次创建对应的任务通知变量,因为任务通知的所需要的变量就存储在任务TCB中,可以很方便的设置通知状态,以及通知值。对于任务通知而言,和消息队列的操作逻辑非常相似,都是通过关中断设置的方式实现,但是不需要依赖队列。因为任务通知,是对指定的任务TCB直接进行通知,单个对单个,如果任务通知值来不及接收,下个任务通知值就来了,可以设置发出任务通知的一方避免数据被覆盖直到被通知任务状态被修改。

2024-05-30 20:47:02 235

原创 FreeRtos进阶——事件组内部逻辑

例如在使用等待事件函数时,第一个参数代表事件组,第二个代表等待的时间,第三个代表对应的事件位发生后退出时是否清除标志位,第四个代表是否需要等待所有事件发生,第五个参数代表愿意等待的时间。在中断中,我们通过对应中断事件组设置函数,其实是无法直接设置事件组的,中断中做的操作仅仅只是将需要设置的事件组写入一个定时器任务的就绪队列,无法直接设置事件组的对应的位。在内部函数中,我们会发现要想实现互斥访问数据对事件组的位进行操作时,首先需要关闭调度器,而不是关中断,因为在中断中无法对位进行操作。

2024-05-30 20:33:25 386

原创 FreeRtos进阶——队列的特殊用途

信号量与互斥量都一样,都是特殊的队列。但是只有互斥量实现了优先级继承机制。信号量与互斥量与队列一样,在操作增加或者减少时,必须先关中断在进行操作!

2024-05-28 21:14:11 470

原创 FreeRtos进阶——消息队列的操作逻辑

在我们进行读写数据时采用环形缓冲区类似循环指针,会有俩个指针,一个是读指针用于指示当前队列存在的最早消息,一个是写指针用于指示当前可以写的队列的位置。这俩种情况都需要进入俩个等待队列,一个是等待读队列,一个是等待写队列。当写操作完成后,会唤醒等待读队列的任务,提示当前列表有数据了。在不同的任务之间,如果我们需要互相之间通信,使用全局变量进行通信,是一种不安全的通信的方式。为保证线程的安全,在FreeRtos使用消息队列进行读写时,如果要实现互斥访问,我们都会采取关中断的操作。

2024-05-28 21:01:26 462

原创 FreeRtos进阶——关于任务的深入探究

在我们创建任务中,会有几个比较神奇的参数,例如函数名称,以及栈大小。在我们创建任务时,也相应的要为每一个任务创建栈。这里面的栈除了用于任务数组开辟的空间外,还可以用于保存现场,例如有SP,LP,PC以及R0等寄存器用于保存当前栈顶,返回地址,当前指令。当有多个任务都想运行时,这时候就要依靠各种链表来实现任务的调度。每个任务在被创建时,要使用prvAddNewTaskToReadyList()根据其优先级被分配到不同的就绪列表中。在有多个任务创建时,最先执行的任务永远是优先级最高,且最晚被创建的任务。

2024-05-27 22:56:53 303

原创 FreeRtos进阶——栈保存现场的几种场景

在我们的CPU中有着很重要的一个模块——寄存器(R0-R15),其中R13,R14,R15的别称分别为SP栈顶指针、LR返回地址、PC当前指令地址。Code是指ROM即存储代码的地方,在底层讲是存储汇编指令的地方,当程序运行时,PC就从这里一条条取出指令执行。在函数调用时,传参会用到R0,R1,R2时,这些寄存器就不用保存,因为这些寄存器被用来传参了,仅需要保存一些用到的寄存器。硬件中断时,硬件会自动保存(R0,R1,R2)这些寄存器到栈中,仅需要保存一些用到的寄存器。

2024-05-27 22:22:58 689

原创 STM32之HAL开发——ADC入门介绍

模数转换,即Analog-to-Digital Converter,常称ADC,是指将连续变量的模拟信号转换为离散的数字信号的器件,比如将模温度感器产生的电信号转为控制芯片能处理的数字信号0101,这样ADC就建立了模拟世界的传感器和数字世界的信号处理与数据转换的联系。

2024-04-28 16:38:58 1255

原创 STM32之HAL开发——电容按键

现在最主要的任务就是测量充电时间。这样先测量得到无触摸时的充电时间作为比较基准,然后再定时循环测量充电时间与无触摸时的充电时间作比较,如果超过一定的阈值就认为是有手指触摸。在电路板未上电时,可以认为电容 Cx 是没有电荷的,在上电时,在电阻作用下,电容 Cx 就会有一个充电过程,直到电容充满,即 Vc 电压值为 3.3V,这个充电过程的时间长短受到电阻 R 阻值和电容 Cx 容值的直接影响。之前的分析是在电路板上电时会有充电过程,现在我们要求在程序运行中循环检测按键,所以必须可以控制充电过程的生成。

2024-04-28 16:38:47 1095

原创 嵌入式Linux学习——Linux常用命令(下)

注意:“tar – czvf”与“ tar czvf”是一样的效果,所以说,后面统一取消“ -”。例 1: tar 打包、 gzip 压缩。在一般模式下,可以执行以下命令。

2024-04-27 10:52:32 1065

原创 嵌入式Linux学习——Linux常用命令(上)

Shell 的意思是“外壳”,在 Linux 中它是一个程序,比如/bin/sh、/bin/bash 等。它负责接收用户的输入,根据用户的输入找到其他程序并运行。比如我们输入“ ls”并回车时, shell 程序找到“ ls”程序并运行,把结果打印出来。Shell 有很多种实现,我们常用 bash。

2024-04-27 10:18:15 1140

原创 PID算法学习

在过程控制中,按偏差的比例(P)、积分(I)和微分(D)进行控制的PID控制器(亦称PID调节器)是应用最为广泛的一种自动控制器。它具有原理简单,易于实现,适用面广,控制参数相互独立,参数的选定比较简单等优点;而且在理论上可以证明,对于过程控制的典型对象──“一阶滞后+纯滞后”与“二阶滞后+纯滞后”的控制对象,PID控制器是一种最优控制。

2024-04-26 22:30:48 1681

原创 嵌入式Linux学习——Ubantu初体验

它定义了文件系统中目录、文件分类存放的原则、定义了系统运行所需的最小文件、目录的集合,并列举了不遵循这些原则的例外情况及其原因。Windows中的每一个分区都对应着一个盘符,盘符下可以存放目录与文件,而在Ubantu中没有盘符的概念,只有目录结构。实际上不同的目录可能挂载在不同的分区之下,如果想要查看当前目录位于磁盘的哪个分区,可以通过以下命令查询。比如“rw-r–r–”表示:文件的所有者对该文件有读权限、写权限,但是没有执行权限;第一个字符表示“文件类型”,它是目录、文件或链接文件等。

2024-04-26 22:30:34 505

原创 STM32之HAL开发——FSMC控制带控制器LCD(8080时序)

ILI9341的8080通讯接口时序可以由STM32使用普通I/O接口进行模拟,但这样效率太低,STM32提供了一种特别的控制方法——使用FSMC接口实现8080时序。由于FSMC外设可以用于控制扩展的外部存储器,而MCU对液晶屏的操作实际上就是把显示数据写入到显存中,与控制存储器非常类似,且8080接口的通讯时序完全可以使用FSMC外设产生,因而非常适合使用FSMC控制液晶屏。图 1 FSMC结构图。

2024-04-23 16:23:15 2277

原创 STM32之HAL开发——FSMC液晶显示实验

在这个时序结构体配置中,由于我们要使用异步NOR FLASH的方式模拟8080时序,所以选择FSMC为模式B,在该模式下配置FSMC的控制时序结构体中,实际上只有地址建立时间AddressSetupTime(即ADDSET的值)以及数据建立时间DataSetupTime(即DATAST的值)成员的配置值是有效的,其它异步NOR FLASH没使用到的成员值全配置为0即可。因此,当FSMC_A0地址线为1时,实际上内部地址的第1位为1,FSMC_A1地址线为1时,实际上内部地址的第2位为1。

2024-04-23 16:23:05 1160

原创 STM32之HAL开发——ILI9341液晶控制器

本液晶屏内部包含有一个液晶控制芯片ILI9341,它的内部结构非常复杂,如下图。该芯片最主核心部分是位于中间的GRAM(Graphics RAM),它就是显存。GRAM中每个存储单元都对应着液晶面板的一个像素点。它 右侧的各种模块共同作用把GRAM存储单元的数据转化成液晶面板的控制信号,使像素点呈 现特定的颜色,而像素点组合起来则成为一幅完整的图像。框图的左上角为ILI9341的主要控制信号线和配置引脚,根据其不同状态设置可以使芯片工作在不同的模式,如每个像素点的位数是6、16还是18位;

2024-04-22 11:31:34 2761

原创 STM32之HAL开发——FSMC—扩展外部SRAM

在读写时序中,有几个比较重要的时间参数,在使用STM32 控制的时候需要参考,它们的介绍见下表。

2024-04-22 10:47:24 1333

原创 STM32之HAL开发—— SRAM控制原理

静态随机存取存储器(Static Random-Access Memory,SRAM)是随机存取存储器的一种。所谓的“静态”,是指这种存储器只要保持通电,里面储存的数据就可以恒常保持。相对之下,动态随机存取存储器(DRAM)里面所储存的数据就需要周期性地更新。然而,当电力供应停止时,SRAM储存的数据还是会消失(被称为volatile memory),这与在断电后还能储存资料的ROM或闪存是不同的。

2024-04-20 16:50:42 1072

原创 STM32之HAL开发——FSMC(灵活静态存储控制器)

STM32F1系列芯片使用FSMC外设来管理扩展的存储器,FSMC是Flexible Static Memory Controller的缩写,译为灵活的静态存储控制器。它可以用于驱动包括SRAM、NOR FLASH以及NAND FLSAH类型的存储器,不能驱动如SDRAM这种动态的存储器而在STM32F429系列的控制器中,它具有FMC外设,支持控制SDRAM存储器。

2024-04-20 16:32:28 1503

NWATCH驱动程序I2C OLED STM32F103

由于我看网络上很多人藏着掖着,别人开源的东西到你这就积分收费了,我对这种行为感到恶心,而且很多版本都是SPI版本的,我手上没有六针屏幕,只有四针屏幕,我自己改成了I2C驱动以便兼容,现在无偿分享给大家。

2024-03-14

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除