![](https://img-blog.csdnimg.cn/20190927151026427.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
嵌入式软件
文章平均质量分 69
分享嵌入式软件相关经验
弱冠少年
记录细节
展开
-
音频傅里叶变换(基于开源kissffs)
傅里叶变换是一种数学变换,用于将信号从时间域(或空间域)转换到频率域。这种变换揭示了信号的频率成分,是信号处理和系统分析中非常重要的工具。以下是傅里叶变换的一些基本概念:汉明窗(Hamming Window)是一种常用的窗函数,主要用于信号处理领域,特别是在傅里叶分析中。它是由理查德·汉明(Richard Hamming)提出的,因此得名汉明窗。汉明窗的目的是减少信号在进行离散傅里叶变换(DFT)时的频谱泄露现象。频谱泄露是由于信号在时间上被截断而产生的,它会导致频谱分析中的误差。使用窗函数可以对信号的边缘原创 2024-06-24 15:12:14 · 297 阅读 · 0 评论 -
编译器优化入门(基于ESP32)
这是编译器的"无优化"级别。在这个级别上,编译器不会进行任何优化,以最快的速度生成代码。这意味着编译器将直接按照源代码的字面意义生成机器代码,不考虑运行时的性能。这个优化级别专注于生成更小的可执行文件。它尝试通过各种优化手段减少程序的体积,同时也会考虑程序的运行效率。这个优化级别是为调试而设计的,它尝试在不显著影响程序性能的情况下,生成更容易调试的代码。这是编译器的"中等"优化级别。它启用了大多数不涉及显著增加编译时间的优化选项。ESP-IDF 支持多种编译器,但默认情况下,它使用的是乐鑫官方提供的。原创 2024-06-17 18:39:33 · 178 阅读 · 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 · 431 阅读 · 0 评论 -
LCD屏入门(基于ESP32、I80屏)
主要参考资料:B站【乐鑫全球开发者大会】DevCon23 #17 |HMI 智能屏解决方案。原创 2024-05-29 02:48:39 · 338 阅读 · 0 评论 -
CI/CD(基于ESP-IDF)
CI(Continuous Integration,持续集成)/CD(Continuous Delivery,持续交付/Continuous Deployment,持续部署)属于DevOps的概念,指将传统开发过程中的代码构建、测试、部署以及基础设施配置等一系列流程的人工干预转变为自动化。使用CI/CD,代码经由开发人员更改后,可进行自动化测试并完成交付和部署。恰当的CI/CD管道可使计算机停机时间最小化,从而更快发布代码。原创 2024-05-29 16:08:48 · 787 阅读 · 0 评论 -
LVGL入门(基于ESP32-IDF)
主要参考资料:B站up主 工科男孙老师《花了4天时间学习LVGL,学习笔记分享给你~》B站up主 菜大毛QAQ《lvgl8学习笔记》系列B站【乐鑫全球开发者大会】DevCon23 #17 |HMI 智能屏解决方案。原创 2023-10-11 18:48:31 · 583 阅读 · 0 评论 -
WAV编码入门
WAVE文件是计算机领域最常用的数字化声音文件格式之一,它是微软专门为Windows系统定义的波形文件格式(Waveform Audio),由于其扩展名为"*.wav"。最基本的WAVE文件是PCM(脉冲编码调制)格式的,这种文件直接存储采样的声音数据没有经过任何的压缩,是声卡直接支持的数据格式,要让声卡正确播放其它被压缩的声音数据,就应该先把压缩的数据解压缩成PCM格式,然后再让声卡来播放。原创 2024-05-20 23:10:47 · 271 阅读 · 0 评论 -
MP3解码入门(基于libhelix)
这个函数用于初始化MP3解码器,创建一个解码器实例,并返回一个句柄(HMP3Decoder),该句柄在后续的解码过程中被用来引用这个解码器实例。此函数用于释放先前通过MP3InitDecoder创建的MP3解码器实例。它接受解码器句柄作为参数,并释放与之关联的所有资源。这个函数是MP3解码的核心,它将MP3编码的数据(inbuf)解码成PCM格式的音频(outbuf)。inbuf是一个指向输入缓冲区的指针的指针,解码器会更新这个指针以指向未处理的输入数据。原创 2024-05-15 22:16:43 · 738 阅读 · 0 评论 -
音频重采样算法
网络上的音频采样率多种多样,而播放设备通常会使用固定的采样率播放。通过重采算法,可以将任意的采样率音频都转换为你所需要的频率。原创 2024-05-15 20:56:27 · 396 阅读 · 0 评论 -
内存优化(基于ESP32)
操作系统分配给进程的内存空间中包含五种段:数据段、代码段、堆、栈。栈:存放程序中的临时的局部变量和函数的参数值。堆:存放进程运行中被动态分配的内存,其大小不固定。数据段:存放程序中的静态变量和已初始化且不为零的全局变量。代码段:存放可执行文件的操作指令,代码段是只读的,不可进行写操作。这部分的区域在运行前已知其大小。上图是ESP32内部存储器的布局,SRAM分为3个存储块SRAM0,SRAM1和SRAM2。(还有RTC快速和慢速存储器)按照功能,SRAM可以分为两种:虽然理论上,SRAM1可以用于转载 2024-05-09 16:18:40 · 784 阅读 · 0 评论 -
CoreDump核心转储(基于ESP-IDF)
ESP-IDF提供了特殊的脚本espcoredump.py,以帮助用户检索和分析核心转储。此工具为堆芯转储分析提供了两个命令:info_corefile : 打印崩溃任务的寄存器、调用堆栈、系统中可用任务的列表、内存区域和存储在核心转储(TCB和堆栈)中的内存内容dbg_corefile : 创建核心转储ELF文件,并使用该文件运行GDB调试会话。用户可以手动检查内存、变量和任务状态。请注意,由于并非所有内存都保存在核心转储中,因此只有在堆栈上分配的变量的值才有意义。原创 2023-11-30 22:47:43 · 418 阅读 · 0 评论 -
指向函数的指针
typedef 在 C 语言中用于为类型创建别名,它使得程序员能够用新的名称来表示已有的类型,从而提高代码的可读性和可维护性。指向函数的指针是C语言中一个强大的特性,它允许你创建可以指向不同函数的变量。在这个例子中,FuncPtr 是一个可以指向接受两个 int 参数并返回 int 的函数的指针。在这个例子中,uint 变成了 unsigned int 的别名。这里,IntPtr 成为了指向 int 的指针的别名。我们可以按照函数的模样构建一个指向函数的指针。原创 2024-05-05 18:24:16 · 484 阅读 · 0 评论 -
SPI Flash and External SPI RAM(基于ESP32)
找到ESP32-S3的系统框图,可以看到ESP32支持QSPI的Flash和QSPI/OSPI的PSRAM。原创 2024-04-24 02:02:49 · 906 阅读 · 0 评论 -
Arduino库制作
本文目标旨在介绍如何创建一个完整的Arduino库,让你可以通过Arduino IDE中的库管理工具下载自己写的库。Arduino库的根文件夹名称必须以基本字母(A-Z或a-z)或数字(0-9)开头,可以使用基本字母、数字、下划线(_)、点(.)和破折号(-)。文件夹名最大长度为63个字符。原创 2024-04-18 14:22:47 · 694 阅读 · 1 评论 -
ESP32系统监测(基于ESP-IDF)
查询系统剩余堆、最小堆大小的 API 位于 esp_system 组件中。剩余堆大小过小,会导致 malloc 申请内存失败,当剩余堆不够时,很多网络操作均会失败,这是由于网路操作内部涉及很多 malloc 操作。(1)查询系统剩余堆大小,返回值为 Byte(2)查询系统最小堆大小,返回值为 Byte示例:查询线程剩余栈大小方法一由于ESP32 IDF采用FreeRTOS,因此查询线程所使用的栈大小空间,可通过FreeRTOS API实现,函数原型如下:返回值为线程栈使用的高水位线,所谓高水位原创 2024-04-11 00:36:23 · 753 阅读 · 0 评论 -
OTA入门(基于ESP32)
OTA:Over-the-Air Technology,即空中下载技术。OTA升级:通过OTA方式实现固件或软件的升级。只要是通过无线通信方式实现升级的,都可以叫OTA升级,比如网络/蓝牙。通过有线方式进行升级,叫本地升级,比如通过UART,USB或者SPI通信接口来升级设备固件。原创 2024-03-26 00:17:44 · 943 阅读 · 0 评论 -
NVS入门(基于ESP-IDF)
怎么理解NVS(非易失性存储库)?其实可以把它与我们的电脑磁盘做类比。进一步拆解NVS,我们在分区表中可以看到NVS只有24K的空间,每个NVS有很多的4096B的Page,每个Page又是由32B的Entry组成。这个Entry就是一个最小单位,即使你只存int8一个字节,也要消耗一个Entry。一个Entry里会包括15B的key和value,以及CRC验证,因此NVS适合存储int类,而不是string或者Blob二进制。原创 2024-01-15 12:49:50 · 726 阅读 · 0 评论 -
错误处理(基于ESP-IDF)
上面有说,比如错误码就是ESP-IDF里的esp_err_t类型,使用 if 判断可以打印出来。当然,错误码看起来不直观,ESP-IDF还提供了API可以转换为具体的错误消息,它在esp_err.c中有定义。原创 2024-01-15 01:00:28 · 410 阅读 · 0 评论 -
Eclipse下安装GDB
Eclipse是一款开发软件。GDB是一个调试软件,但是GDB通常是运行在linux下的,无法直接在windows下运行,因此我们需要一个工具MinGw。MinGw 全称 Minimalist GNU for Windows,可以理解它是运行在windows上的一个虚拟机,我们安装MinGW过程中会默认安装GDB。原创 2024-01-04 17:54:22 · 745 阅读 · 0 评论 -
C++入门(基于ESP-IDF)
主要参考资料:B站Up主孤独的二进制《ESP32上的面向对象》原创 2023-12-11 02:44:43 · 811 阅读 · 0 评论 -
HTTPClient的POST方法(基于ESP32、Arduino库)
begin(string url)函数需要填写URL,一开始理解不深,填成了host+服务器的文件地址,把"type=text&query=%E7%8E%B0%E5%9C%A8%E5%87%A0%E7%82%B9&validate=f4bde2a342c7c75aa276f78b26cfbd8a&uuid=chated17be5d-0240-c9ba-2b2e-7eb98588cf34"留给了POST函数的参数payload,果然返不回,报错500。...原创 2022-08-26 20:20:31 · 1441 阅读 · 1 评论 -
Ubuntu PATH添加(永久有效)
Question使用export PATH命令,或者修改/etc/profile文件只能在当前命令框下有效,重开一个窗口就不能用了。Solutions切换到当前用户目录下:cd ~/使用VI打开当前用户的.bashrc:vi .bashrc在文件末尾加入如下命令PATH=$PATH:$HOME/esp/xtensa-esp32-elf/bin使用source命令使刚才的更改发生作用source .bashrc...转载 2020-10-06 14:37:17 · 1910 阅读 · 0 评论 -
Ubuntu命令行出现/bin/sh: xtensa-esp32-elf-gcc: not found WARNING: Failed to find Xtensa toolchain问题分析与解决
工具链:用于编译 ESP32 应用程序转载 2020-10-05 20:00:37 · 4833 阅读 · 0 评论 -
连接阿里云MQTT服务器(基于ESP8266、Arduino库)
Arduino开发esp8266连接阿里云起因参考步骤踩坑待更移植esp32起因想用手机客户端小程序/APP显示esp8266上传的数据或者控制8266,虽然市面上有blinker这样成熟的开发方式,但是为了更了解底层开发,选择从协议到云平台都走一通(虽然是用的arduino)参考完全参考@单片机菜鸟哥 的这个章节(有步骤有例程)https://blog.csdn.net/dpjcn1990/article/details/104544175步骤1.阿里云平台创建产品、设备、Topic等2.e原创 2021-10-02 19:44:46 · 1148 阅读 · 0 评论 -
Kconfig自定义用户菜单(基于ESP-IDF)
根据官方说法:简单说,我们调用idf.py menuconfig就是为了生成sdkconfig.h文件参与编译。一些常见的文件:sdkconfig.defaults:该文件可以手动或自动创建,且永远不会被构建系统更改。sdkconfig.ci :该文件是 CI(持续集成)测试框架的一部分,在正常构建过程中会被忽略。以上功能就是基于Kconfig,而众所周知,ESP-IDF是基于Python开发环境的,所以它是调用了一个叫esp-idf-kconfig的Python包。原创 2023-11-28 00:00:17 · 655 阅读 · 0 评论 -
STM32开发环境搭建
在debug中选择烧录器,我选择的J-link,再点击Settings。在右侧端口能自动弹出芯片信息,说明配置成功,检测到芯片了。选择Options for Target。再切换到system view进行配置。根据需求对需要的引脚进行选择。配置完成最后生成代码!原创 2023-11-16 17:56:57 · 32 阅读 · 0 评论 -
TP4054锂电池充放电电路(排错经过)
之前画的一个TP4054锂电池充放电管理电路,今天发现有点异常,一个是TP4054烫手,另一是LED红亮一瞬间就熄灭。原创 2023-09-18 17:01:14 · 1087 阅读 · 1 评论 -
ES7210使用TDM模式(基于ESP32-BOX、ESP-IDF)
目录0.概述1.硬件连接2.驱动配置2.1 ESP-BOX主机I2S配置2.2 ES7210从机寄存器配置3.应用层0.概述es7210有两个手册,一个是datasheet,一个是user guide. 比较难啃,很多单词缩写直接扔上来,只能靠着上下文勉强猜一猜……1.硬件连接在datasheet中,官方给出了参考设计,其中IIC负责配置,IIS负责音频传输。这里的IIS是接了两根数据线SDOUT1和SDOUT2,MIC0、MIC1从SDOUT1输出,MIC2、MIC3从SDOUT2输出。如果要原创 2023-08-25 16:29:36 · 2133 阅读 · 4 评论 -
INA226使用(基于STM32)
在STM32 HAL 库里对配置寄存器 和 校准寄存器配置。最后通过读取上面的不同的寄存器,获得需要数据。INA226采取的是IIC的连接方式。这是尝试过的一些配置。原创 2023-08-19 14:03:53 · 1207 阅读 · 0 评论