最近从源地工作室购买了一块ESP32S3开发板(源地的便宜啊),如下图。

使用过ESP32模组的同学肯定见过下面的menuconfig菜单配置窗口用于配置Flash的相关参数
上图是ESP32模组中Flash的配置选项(SPI模式、时钟频率、Flash大小)。
其中关于SPI mode的描述,请参考《理解ESP32 Flash烧写的DOUT/DIO/QOUT/QIO配置》
关于如何准确获取自己手上的ESP32模组的flash大小,请参考《查看ESP32模组中Flash颗粒以及芯片信息》
那么如果我们使用的ESP32S3模组关于Flash的配置是怎样的呢? 
上图就是ESP32S3模组关于Flash的配置选项,其中多了一个Enable Octal Flash配置项(八线SPI)。
上图是关于PSRAM的配置,相比ESP32模组的PSRAM硬件配置多了一些额外的选项。
我手头的ESP32S3开发板使用的是N8R8(8M Flash 8M PSRAM)
本篇的目的就是指导大家如何配置Flashe和PSRAM。
ESP-IDF V5.0(Master)
1、首先我们先确认一下自己的模组的Flash大小
esptool.py -p 你的串口名称 flash_id

上图中看到Flash的厂商ID是0x20,设备ID是0x4017。
通过《查看ESP32模组中Flash颗粒以及芯片信息》这篇博文介绍的方法我们可以知道Flash型号为XM25QH64C。
https://www.xmcwh.com/uploads/442/XM25QH64C.pdf
https://www.xmcwh.com/uploads/442/XM25QH64C.pdf

根据芯片手册我们知道这款Flash是四线Flash,支持DIO/DOUT/QIO/QOUT/QPI这几种模式(不清楚的请看上面的链接)。
从乐鑫官方文档我们也可以知道模组的信息

从上图可以知道ESP32S3N8R8模组是8线PSRAM。
2、ESP-IDF中关于Flash和PSRAM的设置说明

第一项设置是否是八线SPI Flash,一般情况下都是4线的(可以具体看芯片手册或者通过flash_id的方式来确定)
第二项配置Flash通信模式(即DIO/DOUT/QIO/QOUT)
第三项配置Flash的采样模式,STR(Single Data Rate)或者DDR(Double Data Rate)
第四项配置Flash的读写时钟频率
第五项配置Flash大小

以上是关于Flash的配置。

第一项配置PSRAM是否是八线还是四线
第二项配置PSRAM的时钟频率

以上是关于PSRAM的配置。
3、注意点
4、针对F4N8的配置(4线Flash 8线PSRAM)
| Group | Flash mode | Group | PSRAM mode |
|---|---|---|---|
| A | 120 MHz SDR | A | N.A. |
| B | 80 MHz SDR | B | 80MHz DDR |
| C | 40 MHz SDR | C | 40MHz DDR |
| C | 20 MHz SDR | C | |
| D | D | disable |
Flash模式A可以配合PSRAM模式A/D工作;Flash模式B/C可以配合PSRAM模式B/C/D工作。
建议Flash设置为80MHz SDR,PSRAM设置为80MH DDR加快执行速度。
好了,以上就是关于Flash和PSRAM的相关配置。
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
我有一个应用程序可以读取文件的内容并为其编制索引。我将它们存储在磁盘本身中,但现在我使用的是AmazonS3,因此以下方法不再适用。事情是这样的:defperform(docId)@document=Document.find(docId)if@document.file?#Youshould'tcreateanewversion@document.versionlessdo|doc|@document.file_content=Cloudoc::Extractor.new.extract(@document.file.file)@document.saveendendend@docu