
ESP32
文章平均质量分 92
折途想要敲代码
这个作者很懒,什么都没留下…
展开
-
使用ESP-IDF来驱动INMP441全向麦克风
它和I2C是什么关系?这个可以参考ADC来理解,我们的ADC也是有左对齐和右对齐的,假设我们的数据是12位的,而传输数据是按照16bit传输的,这时候12bit填不满16bit,我们就需要选择是将数据左对齐还是右对齐了。然后我们要注意的是,我们要读取的数据长度得是3的倍数,因为INMP441的数据是24bit的,所以我们需要按照顺序把三个byte拼接起来,由于数据类型没有24bit的,所以我们只能使用32bit的数据类型。原创 2025-02-23 20:35:54 · 2531 阅读 · 3 评论 -
开源自己设计的ESP32-C3-WROOM核心板
首先BOOT引脚我们知道,默认是上拉的,而EN引脚实际上就是RESET复位引脚,默认也是上拉的,我们一般会接一个按钮,按下之后会拉低EN的电平,芯片停止工作,按下后松开NE恢复高电平,芯片重新启动。如果我们需要ESP32C3WROOM支持USB下载的话,我们还需要把USB的D+和D-接到模组的D+和D-,这款核心板我是接上了,所以理论上是可以用USB下载的,但是我没试过,因为我用的VSCode不支持给ESP32用USB下载。这里引脚要对应上,RXD要接到CH340的TXD,TXD要接到CH340的RXD。原创 2024-12-06 10:02:11 · 1846 阅读 · 0 评论 -
【ESP-IDF】讲解SPP蓝牙串口官方Demo并按需修改
我们留意一下我框出来的事件,也就是连接和断开连接的这俩事件,这应该是比较值得做文章的两个事件,我们再额外留意一下我用绿框框出的变量is_connected,通过这个变量的值我们可以知道此时是否有连接上蓝牙,比如说后续我们有数据要通过蓝牙发送到手机上的时候,如果我们没有连接上,那么就不能发送。这个函数接收三个参数,第一个是事件类型,第二个是GATT的接口类型,具体什么意思我也不太清楚,最后一个是参数,这个参数的类型是一个枚举类型,枚举里包含很多种结构体类型,在遇到不同的事件类型的时候可以使用不同的结构体。原创 2024-11-22 12:34:56 · 2042 阅读 · 2 评论 -
【ESP-IDF FreeRTOS】流缓冲区
虽然数据的大小没有限制了,但是如果两个数据同时(不会真的同时,而是时间非常接近)塞进了流缓冲区,我们就很难从一堆数据中区分成两个数据了(同一个数据不会被拆开,假设一个数据是“aaa”,另一个数据是“bbb”,那么“同时”被塞进流缓冲区之后,流缓冲区中的数据会是“aaabbb”或者是“bbbaaa”,而不会是“ababab”之类的)。这边有个小问题我没找到原因,那就是流缓冲区设置了5个字节才能接收,但是第一次接收的时候只接收了一个,修改了接收字节的设置之后,第一次接收也还是只接收一个。原创 2024-09-15 17:58:42 · 629 阅读 · 0 评论 -
【ESP-IDF FreeRTOS】事件组
参数俩,一个是事件组句柄,另一个是我们要给事件组置1的位,比如说我要给位一置1,那么传的参数是0x01(0000 0001b),位二就是0x02(0000 0010b),并且可以同时给多个位置1,可以直接传0xFF(1111 1111),把低八位全部置1。编程指南的解释有点绕(反正一开始我误解了,也可能是翻译的问题),我以为返回值是解除阻塞之后的事件组的值,因此只需要判断返回值中我们等待的位是否被置0即可(这是错误的!创建完之后我们的操作基本就俩,设置事件组的位,等待获取事件组的位。原创 2024-09-13 10:31:12 · 973 阅读 · 0 评论 -
【ESP-IDF FreeRTOS】软件定时器
官方是说定时器的ID可以在定时器的回调函数里区分具体是哪个定时器,因为多个定时器可以共用同一个回调函数。除了ESP-IDF中的软硬件定时器,我们还可以使用FreeRTOS中的软件定时器,它是基于Tick的定时器。上面俩可以用来调试,也可以用于区分使用同一个回调函数的不同的定时器,因为定时器的回调函数的参数只有一个定时器句柄,通过定时器句柄可以使用上面俩函数获取到定时器的信息。示例很简单,就是开俩定时器,一个周期的,一个一次性的,周期定时器打印一段话,一次性定时器关闭周期定时器。原创 2024-09-13 10:30:50 · 550 阅读 · 0 评论 -
【ESP-IDF FreeRTOS】信号量
那我们想象一个场景,我们创建了很多优先级不一样的任务,优先级高的任务更容易拿到时间片,也就更容易执行,如果高优先级任务和低优先级任务共用一个核心资源,并且我们使用二进制信号量来控制,当低优先级任务使用核心资源的时候,将信号量减一,高优先级任务想要使用这个核心资源的时候就只能等着,但是由于低优先级任务执行的概率比较低,因此尽管高优先级的优先级比较高,但还是得不到执行,这就导致了“饥饿”现象。在应用层上我们有个规定,那就是谁上锁谁开锁,而不能任务A上锁,然后让任务B开锁,这也是互斥锁和信号量的差别。原创 2024-08-31 09:03:03 · 1271 阅读 · 0 评论 -
【ESP-IDF FreeRTOS】队列管理
因为队列是有容量的,如果队列满,那么数据是塞不进去的,因此有个等待时间,如果等待时间内队列被取了数据,也就是有位置空出来了,那还是可以成功塞东西进去的,如果超过了等待时间还是无法塞,那么调用失败,返回pdFALSE(等价于False,反之成功是pdTRUE)在中断里也是一样的,因为中断函数中不能执行太多的内容,那么我可以让中断函数就执行一个操作,那就是往队列里塞东西,然后再其他地方不断地尝试从队列中取数据,若是从队列里取出东西了,那么表示中断触发过了,就可以在中断函数之外执行中断处理的逻辑了。原创 2024-08-31 09:02:16 · 1468 阅读 · 0 评论 -
【ESP-IDF FreeRTOS】任务管理
首先我们通过ESP-IDF FreeRTOS可以创建多个任务,正常情况下任务是“并行”的(看起来是并行的,实际上是通过分割时间片来轮流运行,因为太快了所以在我们看来就是并行的),但严格说来,在一个时间点上,CPU只能执行一个任务(多核除外,多核是每个核都可以执行一个任务),那么正在执行的任务就处在运行状态,而其他没执行的,在等待执行的任务就处在就绪状态。且这个函数的返回值是任务的句柄,而我们动态分配的函数的任务句柄是通过最后一个传出参数给我们的,也就是说静态分配比动态分配要多出两个参数。原创 2024-08-22 16:54:42 · 1449 阅读 · 0 评论 -
【ESP-IDF FreeRTOS】概括介绍&API命名规则&延时函数
举个例子吧,比如说我第一个参数给它传入8点,第二个参数给它传入俩小时,那么不管我在几点的时候调用它,我都会延时到8+2 = 10点,如果我八点调用,那么就是延时俩小时,如果我九点调用,那么我还是延时到10点,也就是延时一小时。我们一般买的开发板是ESP32型号的(没错,有个型号就叫ESP32,所以我在上一段强调了一下ESP32的这种说法,大家根据语境自行判断ESP32是指特定型号还是泛指这类芯片),基本是支持双核的,但还是有个版本是单核的。最终我们可以看到,它的值就是我们一开始设置的值。原创 2024-08-22 16:54:36 · 1684 阅读 · 0 评论 -
【ESP-IDF】看门狗定时器
不过这不意味着我们只能使用任务看门狗,因为中断看门狗是默认就开启的,这也是为什么我们不能在中断里执行太久,否则就会重启的原因。,它其实不叫外部晶振看门狗定时器,编程指南里是叫它XTAL32K看门狗定时器的,因为它使用的时钟源是32K的外部晶振,所以我觉得这么叫比较好理解才这么叫的)。看门狗定时器的中断执行函数就是给我们的程序重启,因此我们需要在它中断之前把计数器的值清零(喂狗),否则就会不断重启。任务看门狗定时器是基于定时器组0的看门狗定时构建的,而中断看门狗定时器用的是定时器组1里的。原创 2024-08-06 14:56:06 · 1499 阅读 · 1 评论 -
【ESP-IDF】ESP32获取真随机数
我翻了好几个型号的ESP32的编程指南,都有相关的函数,应该是大部分型号都有,具体有没有还需要对照一下自己手上的ESP32型号。另外产生真随机数的条件就是有噪声作为随机数发生器的随机数种子,因此我们再调用上面函数获取随机数之前还需要保证有随机数种子。我们可以从从随机数发生器的寄存器 RNG_DATA_REG 中读取随机数,每个读到的 32 位随机数都是真随机数。我们一开始就看了随机数发生器的寄存器,它就是32位,那么我们是怎么获取到除了32位之外位数的随机数呢?那么ESP32是怎么做到真随机数的呢?原创 2024-08-06 14:55:05 · 1380 阅读 · 0 评论 -
【快速上手ESP32(ESP-IDF)】ADC数模转换(含单次转换和连续转换以及校准)
这篇为重置版。因为准备录制视频了,然后回过头看看之前讲ADC的文章发现有不少错误的地方(但是代码是可以用的),而且讲的也不全面,因此决定写下这个重置版。这边提供三种使用ADC的方法,第一种是老方法,我就直接把之前的文章给复制过来并进行部分修正。看过的小伙伴可以跳过,直接看单次转换模式和连续转换模式。原创 2024-07-29 08:04:40 · 4691 阅读 · 1 评论 -
如何在ESP-IDF中使用C++
简单来说,如果是C调用C++的函数,那么这个函数的声明和定义都需要用extern "C"来链接一下,而如果是C++调用C的函数,则只需要用extern "C"声明。ESP-IDF是支持C++的,虽然默认是C语言,我们平时用的也是C语言,文档里提供的API也是C语言的,但是实际上我们是可以使用C++来编写的。毕竟C++基本上是可以兼容C语言的,所以我们在C++里使用C语言的API是没有问题的。如果我们需要C和C++混用,那么就会出现C调用C++函数或者是C++调用C函数。可以正常使用C++的语法以及STL。原创 2024-07-29 08:04:07 · 1920 阅读 · 0 评论 -
【硬件模块】SGP30气体传感器
这是SGP30官方文档里开头的介绍,简单来说就是SGP30是一个数字多像素气体传感器,然后具有长期稳定性和低漂移。这些我们都不用管,我们只需要知道SGP30是通过I2C来通信的,并且可以采集的数据有CO2和TVOC的含量。TVOC是“Total Volatile Organic Compounds”,意思是总挥发性有机化合物。可以来看一下它的参数。TVOC的输出范围是0~60000ppb,而CO2的范围是400~60000ppm。一开始没注意范围,我看CO2一直都在400以上还以为出了啥问题。原创 2024-07-03 10:48:34 · 6907 阅读 · 3 评论 -
【硬件模块】SSD1306 OLED屏幕(含GD32&ESP32驱动代码)
最近在写GD32的文章,之前STM32有OLED屏幕来展示数据,ESP32可以直接打印到电脑屏幕上,GD32的话手上就没有办法了。虽然是可以直接把STM32的OLED屏幕的驱动代码改改移植到GD32上面,不过想了想干脆写一个文章来说说如何驱动,也当是锻炼一下看文档的能力了。没错,SSD1306也是只有英文文档,找网站直接翻译中文的效果不太好,不过我还是把译文结合原文再看看江科大的STM32的OLED驱动代码给啃了啃,因此这很考验我的耐心。原创 2024-06-14 19:39:35 · 5008 阅读 · 1 评论 -
【快速上手ESP32(基于ESP-IDF&VSCode)】11-MQTT
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)是一种基于发布/订阅模式的轻量级通讯协议,构建于TCP/IP协议之上。它最初由IBM在1999年发布,主要用于在硬件性能受限和网络状况不佳的情况下,为远程设备提供可靠的消息传输服务。MQTT协议简单易用、可靠性高、延迟低,因此广泛应用于物联网(IoT)、机器人、智能城市管理、农业物联网以及能源监测与管理等领域。MQTT协议由三个主要部分组成:客户端、服务器和主题。原创 2024-04-26 17:23:20 · 5122 阅读 · 0 评论 -
【快速上手ESP32(基于ESP-IDF&VSCode)】10-事件循环&&WiFi
本来这篇文章是只写WiFi的,但是写的时候才发现离不开事件循环,因此再多添一点内容在WiFi前面。事件循环简单来说就是一个(循)环,我们可以在这个环上绑上一些事件,我们也可以监听这个环,当环上发生了事件,那么监听了对应事件的的处理函数就会执行,可以参考FreeRTOS的事件组。原创 2024-04-26 17:19:44 · 2031 阅读 · 1 评论 -
【快速上手ESP32(基于ESP-IDF&VSCode)】09-Flash存储
关于ESP32中的Flash,我们需要再回顾一下命名规则。我用的是立创开发板设计的板子,芯片型号是ESP32S3R8N8,因此可以知道我这块板子有8MB的Flash,大家可以参照着命名规则看看自己有多大的Flash容量。原创 2024-04-22 19:15:34 · 2368 阅读 · 0 评论 -
【快速上手ESP32(基于ESP-IDF&VSCode)】08-SPI
SPI,全称Serial Peripheral Interface,即串行外设接口,是一种同步串行接口技术。它最初由Motorola公司推出,并在其MC68HCXX系列处理器上首次定义。SPI接口主要应用在EEPROM、FLASH、实时时钟、AD转换器,以及数字信号处理器和数字信号解码器之间。在应用场景方面,SPI协议被广泛应用于工业自动化、通信、航空航天等领域。在嵌入式系统中,SPI主要用于连接各种外设,如存储器、传感器、显示器等。原创 2024-04-22 19:15:06 · 2198 阅读 · 0 评论 -
【快速上手ESP32(基于ESP-IDF&VSCode)】07-I2C(附BH1750实战代码)
I2C,全称Inter-Integrated Circuit,是一种用于在集成电路之间进行短距离数据传输的通信协议。它最初由Philips(现在的NXP半导体)公司于1980年代初开发,现已成为广泛应用于电子设备之间通信的标准。I2C协议简单、灵活且广泛支持,常被用于连接传感器、存储器、显示屏和其他外设到微控制器、微处理器或其他集成电路上。其数据传输遵循一定的帧格式,每8位传输完成后,第九位是应答位。在硬件层面,I2C采用多主从架构,每个设备都有唯一的地址,一个主设备理论上可以连接多达127个从设备。原创 2024-04-20 10:52:59 · 2652 阅读 · 0 评论 -
【快速上手ESP32(基于ESP-IDF&VSCode)】特别篇——一文速通FreeRTOS
这边插一篇介绍FreeRTOS的文章,因为我在写后续快速上手ESP32系列的文章的时候发现FreeRTOS是越不过去的坎,因此这边补充一下。原创 2024-04-20 10:52:26 · 3610 阅读 · 0 评论 -
【快速上手ESP32(基于ESP-IDF&VSCode)】06-ADC模数转换
我们照例是请文心一言来介绍一下ADC。ADC具有多重含义,以下为你详细介绍其中两种主要的含义:首先,ADC在电子游戏领域中,特别是在MOBA类游戏中,指的是Attack Damage Carry或Attack Damage Core,即普通攻击持续输出核心。它代表那些以普通攻击为主要输出方式,能造成持续伤害输出的角色。在《刀塔》这样的游戏中,ADC通常指的是那些以物理攻击为主要输出方式的核心英雄。原创 2024-04-16 11:35:38 · 1445 阅读 · 0 评论 -
【快速上手ESP32(基于ESP-IDF&VSCode)】05-UART串口通信
UART,即通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),是一种异步收发传输器,是电脑硬件的一部分,它将要传输的资料在串行通信与并行通信之间加以转换。作为把并行输入信号转成串行输出信号的芯片,UART通常被集成于其他通讯接口的连接上。UART用于异步通信,异步通信以一个字符为传输单位,通信中两个字符之间的时间间隔是不固定的,然而在同一个字符中的两个相邻位之间的时间间隔是固定的。因此,异步通信的特点就是:字符间异步,字符内部各位同步。原创 2024-04-10 16:01:51 · 3381 阅读 · 0 评论 -
【快速上手ESP32(基于ESP-IDF&VSCode)】04-PWM
PWM,即脉冲宽度调制(Pulse Width Modulation),是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而达到控制开关稳压电源输出的目的。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术,广泛应用于测量,通信,功率控制与变换等许多领域。PWM的一个优点是从处理器到被控系统信号都是数字形式的,无需进行数模转换。让信号保持为数字形式可将噪声影响降到最小。原创 2024-04-10 16:01:13 · 2845 阅读 · 0 评论 -
【快速上手ESP32(基于ESP-IDF&VSCode)】03-定时器
通用定时器是 ESP32 定时器组外设的驱动程序。ESP32 硬件定时器分辨率高,具有灵活的报警功能。定时器内部计数器达到特定目标数值的行为被称为定时器报警。定时器报警时将调用用户注册的不同定时器回调函数。在ESP32-S3中,一共有两个定时器组,每个定时器组中各有两个通用定时器以及一个看门狗定时器。每个通用定时器都有16位预分频器和54位可自动重新加载向上/向下计数器。通用定时器通常在以下场景中使用:如同挂钟一般自由运行,随时随地获取高分辨率时间戳;生成周期性警报,定期触发事件;原创 2024-04-05 14:10:43 · 3816 阅读 · 2 评论 -
【快速上手ESP32(基于ESP-IDF&VSCode)】02-GPIO外部中断
ESP32的中断矩阵是一个关键组件,它负责将外部中断源单独映射到每个CPU的外部中断上。在ESP32的实际应用中,中断矩阵的作用不可忽视。它使得CPU能够高效地处理来自各种外设的中断信号,从而实现对系统资源的有效利用和响应速度的提升。通过合理地配置中断矩阵,开发人员可以优化系统的性能,提高系统的稳定性和可靠性。以上描述来自文心一言。简单来说就是ESP32通过中断矩阵,在外部中断这块很强。每个CPU可以有32个中断,而ESP32是双核的,因此理论上可以处理64个中断。原创 2024-04-05 14:10:17 · 2014 阅读 · 1 评论 -
【快速上手ESP32(基于ESP-IDF&VSCode)】01-环境配置&GPIO口&延时函数(先点个灯)
立创开发板之前出了个ESP32S3R8N8的开发板,当时嫖了个优惠券,九块九拿下了。现在不仅是35.9一个,而且还没货。如果真的想要的小伙伴可以自己去打板焊一个,人家开源了(目测难度较大,反正我是焊不上去的)。立创·ESP32S3R8N8开发板 - 嘉立创EDA开源硬件平台立创·ESP32S3R8N8开发板 - 嘉立创EDA开源硬件平台,开源广场汇集了多种类型的电路设计工程,快速实现资源共享!前阵子在忙别的事,然后这块板子一直在吃灰,最近没啥事就拿了起来。跟着人家立创官方的文档学一学。原创 2024-03-29 21:58:49 · 2447 阅读 · 0 评论