
嵌入式软件
文章平均质量分 74
分享嵌入式软件相关经验
弱冠少年
记录细节
展开
-
低功耗蓝牙BLE入门
GAP 层的全称为通用访问规范 (Generic Access Profile, GAP),定义了低功耗蓝牙设备之间的连接行为以及设备在连接中所扮演的角色。空闲 (Idle)此时设备无角色,处于就绪状态 (Standby)设备发现 (Device Discovery)广播者 (Advertiser)扫描者 (Scanner)连接发起者 (Initiator)连接 (Connection)外围设备 (Peripheral)中央设备 (Central)原创 2025-04-24 16:37:52 · 950 阅读 · 0 评论 -
Wi-Fi配网入门(基于ESP-IDF)
Wi-Fi配网组件提供控制 Wi-Fi 配网服务的 API,可以通过 SoftAP 或低功耗蓝牙建立 协议通信 安全会话,接收和配置 Wi-Fi 凭证。原创 2025-04-24 15:43:23 · 635 阅读 · 0 评论 -
ESP-TLS入门
TLS (Transport Layer Security) 服务器验证是确保客户端与正确服务器建立安全连接的关键过程。原创 2025-04-24 13:28:24 · 257 阅读 · 0 评论 -
Opus编解码协议入门
Opus是一种开源免费的音频编解码器,支持音乐和语音,具有低延时、带内FEC、DTX、PLC等特点,默认22.5ms延时,非常适用网络实时传输。官网:https://www.opus-codec.org。Opus协议收录于RFC6716,使用SILK和CELT两种编码。Opus在语音app应用很广泛,包括VoIP、视频会议、语音聊天、音乐直播演唱会等。即支持低码率语音,也支持高音质音乐。码率支持从6kb/s到510kb/s;采样率支持从8kHz到48kHz;可变帧长从2.5ms到60ms;转载 2024-12-15 14:05:22 · 494 阅读 · 0 评论 -
软件开发生命周期(基于ESP-IDF)
软件开发生命周期(Software Development Life Cycle, SDLC)是软件从概念到正式交付和维护的一系列阶段。需求收集与分析(Requirements Gathering and Analysis)确定用户需求和软件需求。根据需求创建软件架构、界面设计和系统设计。编写代码来实现设计阶段定义的软件功能。验证软件是否满足需求并且没有缺陷。包括单元测试、集成测试、系统测试和验收测试。通常在开发环境中进行,由开发者或一小群信任的测试者进行,以发现和修复基本问题。原创 2024-07-03 16:15:06 · 659 阅读 · 0 评论 -
Wi-Fi AP模式入门(基于ESP-IDF)
主要参考资料:Wi-Fi 库: https://docs.espressif.com/projects/esp-idf/zh_CN/v4.4/esp32s3/api-reference/network/esp_wifi.htmlESP-NETIF: https://docs.espressif.com/projects/esp-idf/zh_CN/v4.4/esp32s3/api-reference/network/esp_netif.htmlWi-Fi 初始化 APvoid wifi_init原创 2024-11-06 01:36:19 · 351 阅读 · 0 评论 -
Wi-Fi安全性入门(基于ESP-IDF-v4.4)
Wi-Fi 网络中,非 AP 设备使用如信标、探测、(解)身份验证和(断)关联等管理帧,扫描并连接到 AP。不同于数据帧,管理帧在传输时不会加密。由此,攻击者可以利用窃听和数据包注入,在适当时机发送伪造的(解)身份验证或(断)关联管理帧,发起拒绝服务 (DoS) 和中间人攻击等攻击。PMF 通过加密单播管理帧以及为广播管理帧提供完整性检查,来应对上述解身份验证、解关联和鲁棒管理帧等攻击。此外,PMF 还提供了安全关联 (SA) 拆除机制,防止伪造的关联或验证帧使已连接的客户端断开连接。station 和 A原创 2024-10-19 18:19:17 · 1322 阅读 · 0 评论 -
看门狗(基于ESP-IDF)
中断看门狗定时器 (IWDT)任务看门狗定时器 (TWDT)中断看门狗负责确保 ISR(中断服务程序)不被长时间阻塞,TWDT 负责检测任务长时间运行而不让步的情况。原创 2024-10-19 15:43:35 · 318 阅读 · 0 评论 -
Unity测试入门(基于ESP-IDF)
ESP-IDF 提供以下方法测试软件。一种是基于目标的测试,该测试使用运行在 esp32 上的中央单元测试应用程序。这些测试使用的是基于 Unity的单元测试框架。通过把测试用例放在组件的 test 子目录,可以将其集成到 ESP-IDF 组件中。本文档主要介绍这种基于目标的测试方法。另一种是基于 Linux 主机的单元测试,其中所有硬件行为都通过 Mock 组件进行模拟。此测试方法目前仍在开发中,暂且只有一小部分ESP-IDF 组件支持 Mock,具体请参考 基于 Linux 主机的单元测试。原创 2024-10-11 11:58:31 · 1543 阅读 · 0 评论 -
C语言进阶(基于ESP-IDF)
GNU C对C语言标准作了扩展,允许在一个表达式里内嵌语句,允许在表达式内部使用局部变量、for循环和goto跳转语句。这种类型的表达式,我们称为语句表达式。语句表达式的格式如下。({表达式1;表达式2;表达式3})语句表达式最外面使用小括号()括起来,里面一对大括号{}包起来的是代码块,代码块里允许内嵌各种语句。语句的格式可以是一般表达式,也可以是循环、跳转语句。和一般表达式一样,语句表达式也有自己的值。语句表达式的值为内嵌语句中最后一个表达式的值。我们举个例子,使用语句表达式求值。原创 2024-10-09 22:14:36 · 1494 阅读 · 0 评论 -
图片格式入门
像素图(pixel image)又称位图(bitmap image)、栅格图(raster image)或点阵图。照片就是像素图。像素图是由像素点的网格组成。每个像素(pixel)是一个具有特定颜色和灰度的小方块。像素图具有分辨率的概念。分辨率通常用dpi(dots per inch)表达。像素图的特点如下:矢量图(Vector graphics)使用直线和曲线描述图形和线条,构造组成图形的元素,包括点、线、多边形、圆弧等。矢量文件中的图形元素称为对象。每个对象都是一个自成一体的实体,它具有颜色、形状、轮廓原创 2024-10-07 16:30:24 · 572 阅读 · 0 评论 -
esp32-camera入门(基于ESP-IDF)
2.相机初始化 并 配置图像传感器二、传输camera 到 lcd 显示可以看到 camera 示例 里对应的代码如下:这部分就是经过封装的 API 调用。先调用 esp_camera_fb_get 获取 camera 拍摄的数据,然后通过 lcd_set_index 设置 lcd 的起始和结束地址。之后将 camera 拍摄到的数据通过 lcd_write_data 来让 lcd 显示出来,最后使用 esp_camera_fb_return 释放 camera 使用的 buffer 来方便后续重复原创 2024-10-07 14:49:58 · 2048 阅读 · 2 评论 -
platformio.ini工程配置文件入门
ini是一个配置文件,它可以设置开发环境,与他人共享代码和配置,并利用声明性方法进行开发。platformio.ini文件可以配置多个平台和体系结构,而不必担心不同的工具链或为每个平台和体系结构构建系统。原创 2024-10-07 12:28:17 · 847 阅读 · 0 评论 -
LCD屏入门(基于ESP-IDF、SPI屏)
MCU常用的驱动接口在下面,大致可以划分为串口屏和并口屏。串口屏相较于并行屏优势是占用IO少,相应地数据传输带宽也低。原创 2024-10-06 22:28:52 · 1733 阅读 · 0 评论 -
ESP-IDF不同版本自由切换(基于Windows)
这一步是将ESP-IDF 工具添加至 PATH 环境变量,但是有些情况运行的话会看到一个诊断信息,这时需要先到Python虚拟环境下运行activate.bat激活Python在运行export.bat命令。可以看到,在Windows下运行install.bat、export.bat命令 与 官方离线/在线安装完再打开CMD效果是一样的。因此,对于使用脚本的开发者,切换ESP-IDF版本只需要激活相应的Python虚拟环境 和 运行export.bat即可。set =:该命令用于设置环境变量的值。原创 2023-10-03 22:56:30 · 2147 阅读 · 1 评论 -
WebRTC入门
早期的音频采集、处理和传输技术,主要依赖于 Websocket 这种通信方式。但这在实际使用中,有时会遇到一些问题,比如在网络环境复杂的情况下,可能会导致对话出现卡顿,或者在传输过程中丢失一些关键信息,这可能会造成对话内容的误解。另外,探索基于多模态大模型的智能场景感知和识别类应用场景,Websocket 也无法承接视频传输的扩展能力。而豆包大模型,如今已经向 ChatGPT 对齐,传输已经采用了 RTC 技术。结合 RTC 实时音视频服务,可为应用提供更加自然和高效的交互体验。原创 2024-09-30 11:30:03 · 1186 阅读 · 0 评论 -
轻量级 Web 服务器入门(基于ESP-IDF)
HTTP Server 组件提供了在 ESP32 上运行轻量级 Web 服务器的功能。原创 2024-09-19 16:16:49 · 1294 阅读 · 0 评论 -
事件循环event loop入门(基于ESP-IDF)
事件循环库允许 ESP32 执行异步编程,这意味着它可以在等待一个操作(如网络请求或文件读写)完成的同时,继续执行其他任务。在资源受限的嵌入式设备上,传统的多线程或多进程并发模型可能会消耗大量内存和处理能力。事件循环库通过单线程的协程提供了一种轻量级的并发机制,减少了资源消耗。原创 2024-09-18 14:01:16 · 752 阅读 · 0 评论 -
eFuse入门(基于ESP32)
eFuse 是一种微型的一次性可编程保险丝,可以通过“烧录”(即编程)将数据存储到 ESP32 中。EFUSE_BLK0 完全用于系统用途;EFUSE_BLK1 用于 flash 加密密钥。如果不使用 flash 加密功能,此块也可以用于用户参数;EFUSE_BLK2 用于安全启动密钥。如果不使用安全启动功能,此块也可以用于用户参数;EFUSE_BLK3 可以部分保留,以存储自定义 MAC 地址,或者完全用于用户参数。请注意,一些位已经用于 ESP-IDF。原创 2024-09-10 16:19:55 · 1541 阅读 · 0 评论 -
乐鑫安全制造全流程
制造安全可以分为两个方面:每台设备独一无二 和 安全。原创 2024-09-05 13:28:41 · 491 阅读 · 0 评论 -
JSON入门(基于ESP-IDF)
JSON (JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。原创 2024-08-29 13:08:30 · 882 阅读 · 0 评论 -
MQTT入门(基于ESP-IDF)
MQTT(Message Queuing Telemetry Transport, 消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为远程连接设备提过实时可靠的消息服务,作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。原创 2024-08-27 10:28:31 · 1154 阅读 · 0 评论 -
Cmakelist.txt入门(基于ESP-IDF)
idf.py 已经封装了 CMake 命令,因此我们仅需要配置好Cmakelist.txt文件,而在Cmakelist.txt中开发者只需要管理好component就可以.下面两句话是总结项目Cmakelist.txt用于新增额外的components目录组件Cmakelist.txt用于构建一个完整的componetscomponents相关命令1.set()命令用于将普通、缓存或环境变量设置为定值.如set(EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/example原创 2023-10-05 15:36:06 · 914 阅读 · 0 评论 -
中断入门(基于ESP-IDF)
在《Unix传奇》中有这样一句话,用户态的进程/线程是三等公民、root线程是二等公民、硬件中断是一等公民。在操作系统中,"用户态"和"内核态"是两种不同的执行级别或模式。进程和线程是用户态下的执行实体,而硬件中断处理则通常在内核态进行。这里的“三等公民”、“二等公民”和“一等公民”是形象地描述它们在资源访问权限和优先级上的不同。原创 2024-07-22 13:07:05 · 637 阅读 · 0 评论 -
Websocket入门(基于Python3)
WebSocket 是一种在单个 TCP 连接上进行 全双工 通信的协议,它可以让客户端和服务器之间进行实时的双向通信。WebSocket 使用一个长连接,在客户端和服务器之间保持持久的连接,从而可以实时地发送和接收数据。转载 2024-07-08 18:21:59 · 161 阅读 · 0 评论 -
语音唤醒入门(基于ESP-skainet)
乐鑫提供了经过训练的 WakeNet 和 MultiNet 模型,使用模型前需先将其加载至你的项目,目前 ESP-SR 支持以下模型加载方式:配置方法:运行 idf.py menuconfig 进入 ESP Speech RecognitionAFE声学前端算法 + 使用模型乐鑫 AI 自主研发了一套乐鑫 AFE 算法框架,可基于ESP32-S3 系列芯片进行声学前端处理。原创 2024-06-30 18:08:56 · 1695 阅读 · 0 评论 -
音频傅里叶变换(基于开源kissffs)
傅里叶变换是一种数学变换,用于将信号从时间域(或空间域)转换到频率域。这种变换揭示了信号的频率成分,是信号处理和系统分析中非常重要的工具。以下是傅里叶变换的一些基本概念:汉明窗(Hamming Window)是一种常用的窗函数,主要用于信号处理领域,特别是在傅里叶分析中。它是由理查德·汉明(Richard Hamming)提出的,因此得名汉明窗。汉明窗的目的是减少信号在进行离散傅里叶变换(DFT)时的频谱泄露现象。频谱泄露是由于信号在时间上被截断而产生的,它会导致频谱分析中的误差。使用窗函数可以对信号的边缘原创 2024-06-24 15:12:14 · 660 阅读 · 1 评论 -
编译器优化入门(基于ESP32)
这是编译器的"无优化"级别。在这个级别上,编译器不会进行任何优化,以最快的速度生成代码。这意味着编译器将直接按照源代码的字面意义生成机器代码,不考虑运行时的性能。这个优化级别专注于生成更小的可执行文件。它尝试通过各种优化手段减少程序的体积,同时也会考虑程序的运行效率。这个优化级别是为调试而设计的,它尝试在不显著影响程序性能的情况下,生成更容易调试的代码。这是编译器的"中等"优化级别。它启用了大多数不涉及显著增加编译时间的优化选项。ESP-IDF 支持多种编译器,但默认情况下,它使用的是乐鑫官方提供的。原创 2024-06-17 18:39:33 · 950 阅读 · 0 评论 -
LVGL刷屏优化(基于ESP32)
下面是一张图像文件/图像C array从读取到显示的整个底层路径,有了一个路径,我们就可以依次对每个环节进行优化。从上图中可以看到,选择RAM还是PSRAM是两条不同的通道。(当然,RAM后可以接CPU,但是有DMA干嘛不用。另外DMA是只有RAM可以使用,在heap_caps_malloc()中设置MALLOC_CAP_DMA)。ESP32中RAM的问题就是容量太小,留给data用的只有320K,对于大屏会有明显刷屏感。PSRAM可以通过分配大内存,以空间换时间。但是对于大屏,第一张图的加载速度会较慢原创 2024-06-16 13:34:42 · 3597 阅读 · 0 评论 -
LCD屏入门(基于ESP-IDF、I80屏)
主要参考资料:B站【乐鑫全球开发者大会】DevCon23 #17 |HMI 智能屏解决方案。原创 2024-05-29 02:48:39 · 1346 阅读 · 0 评论 -
CI/CD(基于ESP-IDF)
CI(Continuous Integration,持续集成)/CD(Continuous Delivery,持续交付/Continuous Deployment,持续部署)属于DevOps的概念,指将传统开发过程中的代码构建、测试、部署以及基础设施配置等一系列流程的人工干预转变为自动化。使用CI/CD,代码经由开发人员更改后,可进行自动化测试并完成交付和部署。恰当的CI/CD管道可使计算机停机时间最小化,从而更快发布代码。原创 2024-05-29 16:08:48 · 911 阅读 · 0 评论 -
LVGL入门(基于ESP-IDF)
主要参考资料:B站up主 工科男孙老师《花了4天时间学习LVGL,学习笔记分享给你~》B站up主 菜大毛QAQ《lvgl8学习笔记》系列B站【乐鑫全球开发者大会】DevCon23 #17 |HMI 智能屏解决方案。原创 2023-10-11 18:48:31 · 1843 阅读 · 0 评论 -
WAV编码入门
WAVE文件是计算机领域最常用的数字化声音文件格式之一,它是微软专门为Windows系统定义的波形文件格式(Waveform Audio),由于其扩展名为"*.wav"。最基本的WAVE文件是PCM(脉冲编码调制)格式的,这种文件直接存储采样的声音数据没有经过任何的压缩,是声卡直接支持的数据格式,要让声卡正确播放其它被压缩的声音数据,就应该先把压缩的数据解压缩成PCM格式,然后再让声卡来播放。原创 2024-05-20 23:10:47 · 417 阅读 · 0 评论 -
MP3解码入门(基于libhelix)
这个函数用于初始化MP3解码器,创建一个解码器实例,并返回一个句柄(HMP3Decoder),该句柄在后续的解码过程中被用来引用这个解码器实例。此函数用于释放先前通过MP3InitDecoder创建的MP3解码器实例。它接受解码器句柄作为参数,并释放与之关联的所有资源。这个函数是MP3解码的核心,它将MP3编码的数据(inbuf)解码成PCM格式的音频(outbuf)。inbuf是一个指向输入缓冲区的指针的指针,解码器会更新这个指针以指向未处理的输入数据。原创 2024-05-15 22:16:43 · 2193 阅读 · 0 评论 -
音频重采样算法
网络上的音频采样率多种多样,而播放设备通常会使用固定的采样率播放。通过重采算法,可以将任意的采样率音频都转换为你所需要的频率。原创 2024-05-15 20:56:27 · 735 阅读 · 0 评论 -
内存优化(基于ESP32)
操作系统分配给进程的内存空间中包含五种段:数据段、代码段、堆、栈。栈:存放程序中的临时的局部变量和函数的参数值。堆:存放进程运行中被动态分配的内存,其大小不固定。数据段:存放程序中的静态变量和已初始化且不为零的全局变量。代码段:存放可执行文件的操作指令,代码段是只读的,不可进行写操作。这部分的区域在运行前已知其大小。上图是ESP32内部存储器的布局,SRAM分为3个存储块SRAM0,SRAM1和SRAM2。(还有RTC快速和慢速存储器)按照功能,SRAM可以分为两种:虽然理论上,SRAM1可以用于转载 2024-05-09 16:18:40 · 2023 阅读 · 0 评论 -
CoreDump核心转储(基于ESP-IDF)
ESP-IDF提供了特殊的脚本espcoredump.py,以帮助用户检索和分析核心转储。此工具为堆芯转储分析提供了两个命令:info_corefile : 打印崩溃任务的寄存器、调用堆栈、系统中可用任务的列表、内存区域和存储在核心转储(TCB和堆栈)中的内存内容dbg_corefile : 创建核心转储ELF文件,并使用该文件运行GDB调试会话。用户可以手动检查内存、变量和任务状态。请注意,由于并非所有内存都保存在核心转储中,因此只有在堆栈上分配的变量的值才有意义。原创 2023-11-30 22:47:43 · 714 阅读 · 1 评论 -
指向函数的指针 与 回调函数
typedef 在 C 语言中用于为类型创建别名,它使得程序员能够用新的名称来表示已有的类型,从而提高代码的可读性和可维护性。指向函数的指针是C语言中一个强大的特性,它允许你创建可以指向不同函数的变量。在这个例子中,FuncPtr 是一个可以指向接受两个 int 参数并返回 int 的函数的指针。在这个例子中,uint 变成了 unsigned int 的别名。这里,IntPtr 成为了指向 int 的指针的别名。我们可以按照函数的模样构建一个指向函数的指针。原创 2024-05-05 18:24:16 · 533 阅读 · 0 评论 -
SPI Flash and External SPI RAM(基于ESP-IDF)
找到ESP32-S3的系统框图,可以看到ESP32支持QSPI的Flash和QSPI/OSPI的PSRAM。原创 2024-04-24 02:02:49 · 1767 阅读 · 0 评论 -
Arduino库制作
本文目标旨在介绍如何创建一个完整的Arduino库,让你可以通过Arduino IDE中的库管理工具下载自己写的库。Arduino库的根文件夹名称必须以基本字母(A-Z或a-z)或数字(0-9)开头,可以使用基本字母、数字、下划线(_)、点(.)和破折号(-)。文件夹名最大长度为63个字符。原创 2024-04-18 14:22:47 · 1046 阅读 · 1 评论