单片机开发---ESP32-S3模块上手

news2024/11/22 15:34:45

背景介绍

想起来之前做的半成品单片机游戏机,又想继续做一个,不过之前那个单片机驱动屏幕速率太低,已经无法改进了。所以这次斥巨资购买了一款顶配的ESP32S开发板,做个简单的游戏机,没问题。
在这里插入图片描述
完整介绍链接
这花花绿绿的介绍,看着让人甚是喜欢呢。
在这里插入图片描述

开发环境搭建

参考乐鑫官网的方式,我选择了windows开发环境
Windows 平台工具链的标准设置

安装完成会有两个图标,按照推荐选择了cmd方式
在这里插入图片描述
双击运行

在这里插入图片描述
随便选择一个工作目录,将范例的代码拷贝过来,就可以进行编译烧录了。

Hello World

必须先用hello world热热身
在这里插入图片描述

  1. 拷贝工程
    范例工程都在esp-idf\examples\下面
E:\esp32_new_tools>xcopy /e /i E:\esp32_new_tools\Espressif\frameworks\esp-idf-v4.4.3\examples\get-started\hello_world hello_world
E:\esp32_new_tools\Espressif\frameworks\esp-idf-v4.4.3\examples\get-started\hello_world\CMakeLists.txt
E:\esp32_new_tools\Espressif\frameworks\esp-idf-v4.4.3\examples\get-started\hello_world\example_test.py
E:\esp32_new_tools\Espressif\frameworks\esp-idf-v4.4.3\examples\get-started\hello_world\Makefile
E:\esp32_new_tools\Espressif\frameworks\esp-idf-v4.4.3\examples\get-started\hello_world\README.md
E:\esp32_new_tools\Espressif\frameworks\esp-idf-v4.4.3\examples\get-started\hello_world\sdkconfig.ci
E:\esp32_new_tools\Espressif\frameworks\esp-idf-v4.4.3\examples\get-started\hello_world\main\CMakeLists.txt
E:\esp32_new_tools\Espressif\frameworks\esp-idf-v4.4.3\examples\get-started\hello_world\main\component.mk
E:\esp32_new_tools\Espressif\frameworks\esp-idf-v4.4.3\examples\get-started\hello_world\main\hello_world_main.c
复制了 8 个文件

E:\esp32_new_tools>
  1. 配置工程

选择开发目标,目前支持’esp32’, ‘esp32s2’, ‘esp32c3’, ‘esp32s3’, ‘linux’, ‘esp32h2’.

idf.py set-target esp32s3

配置参数

idf.py menuconfig

查看开发板手册得知flash和内存类型
在这里插入图片描述
配置方法如下
flash大小
我买的是16MB flash
Serial flasher config —>
在这里插入图片描述
片外ram
Component config —> ESP32S3-Specific —>选中支持片外ram
在这里插入图片描述
再进入SPI ram config
选择mode,切换为Octal模式
在这里插入图片描述
最后返回上一级,顺带改一下工作频率
在这里插入图片描述
谁还嫌运行的快呢
在这里插入图片描述

  1. 编译
idf.py build
  1. 烧写与监测串口

烧写

idf.py -p COM6 flash

监视串口

idf.py -p COM6 monitor

烧写后监视串口

idf.py -p COM6 flash monitor

启动之后会看到Flash与内存大小
在这里插入图片描述
在这里插入图片描述

hello world只不过是一个延迟重启的程序。
在这里插入图片描述
需要换一个
在这里插入图片描述

驱动OLED

买了一个SPI的TFT屏幕,还没到货,所以先驱动一个SPI的Oled屏幕。屏幕引脚说明
在这里插入图片描述

核心的中间层代码如下

#define LCD_HOST    SPI2_HOST

#define PIN_NUM_MISO SPI2_IOMUX_PIN_NUM_MISO
#define PIN_NUM_MOSI SPI2_IOMUX_PIN_NUM_MOSI
#define PIN_NUM_CLK  SPI2_IOMUX_PIN_NUM_CLK
#define PIN_NUM_CS   SPI2_IOMUX_PIN_NUM_CS

#define PIN_NUM_DC   9
#define PIN_NUM_RST  4
#define PIN_NUM_BCKL 5

spi_device_handle_t spi;


void OLED_Write_SPI_Command(unsigned char SPI_Command)
	
{
    esp_err_t ret;
    spi_transaction_t t;
    memset(&t, 0, sizeof(t));       //Zero out the transaction
    t.length=8;                     //Command is 8 bits
    t.tx_buffer=&SPI_Command;       //The data is the cmd itself
    t.user=(void*)0;                //D/C needs to be set to 0
    ret=spi_device_polling_transmit(spi, &t);  //Transmit!
    assert(ret==ESP_OK);            //Should have had no issues.
}
 
void OLED_Write_SPI_Data(unsigned char SPI_Data)
{
    esp_err_t ret;
    spi_transaction_t t;

    memset(&t, 0, sizeof(t));       		//Zero out the transaction
    t.length=8;                 			//Len is in bytes, transaction length is in bits.
    t.tx_buffer=&SPI_Data;          		//Data
    t.user=(void*)1;                		//D/C needs to be set to 1
    ret=spi_device_polling_transmit(spi, &t);  //Transmit!
    assert(ret==ESP_OK);            		//Should have had no issues.
}

//This function is called (in irq context!) just before a transmission starts. It will
//set the D/C line to the value indicated in the user field.
void lcd_spi_pre_transfer_callback(spi_transaction_t *t)
{
    int dc=(int)t->user;
    gpio_set_level(PIN_NUM_DC, dc);
}

void OLED_SPI_init()
{
	esp_err_t ret;
	spi_bus_config_t buscfg={
	.miso_io_num=PIN_NUM_MISO,
	.mosi_io_num=PIN_NUM_MOSI,
	.sclk_io_num=PIN_NUM_CLK,
	.quadwp_io_num=-1,
	.quadhd_io_num=-1,
	//.max_transfer_sz=PARALLEL_LINES*128*2+8
	};
	
	spi_device_interface_config_t devcfg=
	{
		.clock_speed_hz=10*1000*1000,			//Clock out at 10 MHz
		.mode=0,								//SPI mode 0
		.spics_io_num=PIN_NUM_CS,				//CS pin
		.queue_size=7,							//We want to be able to queue 7 transactions at a time
		.pre_cb=lcd_spi_pre_transfer_callback,	//Specify pre-transfer callback to handle D/C line
	};

	
    //Initialize non-SPI GPIOs
    gpio_set_direction(PIN_NUM_DC, GPIO_MODE_OUTPUT);
    gpio_set_direction(PIN_NUM_RST, GPIO_MODE_OUTPUT);
    gpio_set_direction(PIN_NUM_BCKL, GPIO_MODE_OUTPUT);

	//Reset the display
    gpio_set_level(PIN_NUM_RST, 0);
    vTaskDelay(100 / portTICK_RATE_MS);
    gpio_set_level(PIN_NUM_RST, 1);
    vTaskDelay(100 / portTICK_RATE_MS);
	
	//Initialize the SPI bus
	ret=spi_bus_initialize(LCD_HOST, &buscfg, SPI_DMA_CH_AUTO);
	ESP_ERROR_CHECK(ret);

	//Attach the LCD to the SPI bus
	ret=spi_bus_add_device(LCD_HOST, &devcfg, &spi);
	ESP_ERROR_CHECK(ret);
}

注意SPI Oled使用前需要复位操作。

    gpio_set_level(PIN_NUM_RST, 0);
    vTaskDelay(100 / portTICK_RATE_MS);
    gpio_set_level(PIN_NUM_RST, 1);
    vTaskDelay(100 / portTICK_RATE_MS);

主函数

void oled_setup()
{
	OLED_Init();
	OLED_ColorTurn(0);//0正常显示 1反色显示
	OLED_DisplayTurn(0);//0正常显示 1翻转180度显示


	OLED_DrawBMP(0,0,128,64,BMP1); //显示图片
	vTaskDelay(1000 / portTICK_PERIOD_MS); //延时1秒 delay函数的单位为ms
	OLED_Clear();//清除界面

	OLED_ShowString(0,0,"PGG",16);

	OLED_ShowChinese(0,4,7,16);
	OLED_ShowChinese(20,4,8,16);

	OLED_ShowChinese(0,6,9,16);
	OLED_ShowChinese(20,6,10,16);
}


void oled_loop()
{
	int i = 0;
	for (;;) 
	{
		char show[8]={0};
		
        sprintf(show, "%d%%",i);
		OLED_ShowString(50,4,show,16);
		
        sprintf(show, "%d",i);
		OLED_ShowString(50,6,show,16);
		
        vTaskDelay(2000 / portTICK_PERIOD_MS);
		i++;
    }

}

显示了一下之前做血氧仪的内容,包括汉字和字符
在这里插入图片描述

完整工程 ,适用于ESP-IDF 4.4版本,复制一个helloworld程序,覆盖main路径下的内容即可。
下载完整工程

在这里插入图片描述
这套代码用在其他平台,也只需改三个函数适配,很简单。
在这里插入图片描述

注意事项

在带有 OSPI PSRAM(即内置芯片为 ESP32-S3R8)的模组中,管脚 IO35、IO36、IO37 用于连
接至模组内部集成的 OSPI PSRAM,不可用于其他功能。

SPI用哪些引脚,通过example或者文档,可以找到答案

在这里插入图片描述
例如SPI2
在这里插入图片描述
那么代码中

#define SPI2_IOMUX_PIN_NUM_HD   9
#define SPI2_IOMUX_PIN_NUM_CS   10
#define SPI2_IOMUX_PIN_NUM_MOSI 11
#define SPI2_IOMUX_PIN_NUM_CLK  12
#define SPI2_IOMUX_PIN_NUM_MISO 13
#define SPI2_IOMUX_PIN_NUM_WP   14

结束语

时隔许久又想起来写点什么,好久没玩单片机了,最近做了一个血氧仪,把之前的8266模块又拾起来玩了一下
在这里插入图片描述
不过自己做的东西,自己也不确定好不好用,数据准不准,是不是挺可笑。不过这可能就是目前小厂员工的状态,用不知底的东西做出来的东西,有时候就没有信息。
所以目前好多公司,还是会希望每个模块,都需要自己吃透,才能放心用在自己产品了。所以人员一旦过少,无法研发出高质量的产品,因为只来得及用起来,没有时间去思考为什么。
在这里插入图片描述
今天看到了这个消息
在这里插入图片描述
普通人通过生孩子和努力还会成功吗?
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/170061.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过logstash将Redis数据写入ElasticSearch

点击上方蓝字关注我使用logstash将Redis中数据自动同步至ES中1. 部署Redis上传编译好的Redis二级制安装包,使用redis用户启动redis即可具体编译安装过程可参考https://mp.weixin.qq.com/s/RaWy0sqRxcAti1qbv-GbZQ2. 部署logstash下载二进制安装包wget https://ar…

HTTP FLV交互流程及实例解析

HTTP FLV交互流程及实例解析 文章目录HTTP FLV交互流程及实例解析HTTP FLV传输方式HTTP FLV 抓包分析结束语HTTP FLV传输方式 前文已经介绍过,HTTP FLV利用了一个HTTP的协议约定,http 的content-length头字段如果不存在,则客户端就会一直接收…

ESP32-Camera性能(简单)测试评估

TOC 1. ESP32-Camera简介 最近因为接触了ESP32摄像头相关的资料和信息,稍微简单整理下,希望对该方案有兴趣的朋友可以有所帮助。 1.1 资料&信息 The Internet of Things wit ESP32ESP32-S Series开发模组Github: ESP32-Camera 1.2 ESP-EYE摄像头…

别忘记我:通过局部-全局内容建模进行文本擦除方法

本文简要介绍了发表于ECCV 2022的论文“Don’t Forget Me: Accurate Background Recovery for Text Removal via Modeling Local-Global Context”的相关工作。该论文针对文本擦除中存在的复杂背景修复的问题,提出了CTRNet,它利用局部和全局的语义建模提…

一个 go-sql-driver 的离奇 bug

文|郝洪范京东技术专家Seata-go 项目共同发起人微服务底层技术的探索与研究。本文 3482 字 阅读 7 分钟对于 Go CURD Boy 来说,相信 github.com/go-sql-driver/mysql 这个库都不会陌生。基本上 Go 的 CURD 都离不开这个特别重要的库。我们在开发 Seata-g…

LabVIEW将现有数据文件映射至TDMS数据文件格式

LabVIEW将现有数据文件映射至TDMS数据文件格式在某些情况下,可能无法使用TDMS文件格式,例如客户或供应商指定必须使用某种格式存储数据。有些传统仪器可能会自动使用某种自定义格式提供数据输出文件。此外,已经用某种方式收集的传统测量数据无…

PyQt6快速入门-自定义Widget

自定义Widget 文章目录 自定义Widget1、准备工作2、重写paintEvent事件3、Position策略4、更新显示5、绘制条形框5.1 绘制计算5.2 绘制条形框6、自定义样式7、添加鼠标交互能力8、完整代码QPainter是Qt中所有小部件绘制的基础。在本文中,详细介绍如何构建一个全新的自定义 GUI…

vue文本点击样式设置

vue文本点击样式设置嘚吧嘚干就完了光标边小手文本域样式修改hover语法语法一语法二语法三语法四学以致用,效果实现嘚吧嘚 相信当家在写代码的过程中,文本的点击事件是常有的吧,如历史搜索记录、页面跳转等。本次就就分享一下文本点击样式设…

从CES的亚马逊云科技展台,看云计算如何改变汽车行业

当云计算技术被广泛运用于智能汽车的制造,会给整个汽车行业带来怎样的变革?CES 2023汽车展区:亚马逊云科技展台成为焦点作为全球规模最大、影响力最为广泛的国际消费电子展,CES 2023于近日在美国拉斯维加斯圆满落下帷幕。在这场汇…

数据结构和算法的基本概念和基本术语(数据,数据元素,数据项,数据对象)

目录 一、数据结构的研究内容 1.1学生信息管理系统 1. 2人机对弈问题 1. 3最短路径问题 二、基本概念和术语 2.1数据,数据元素,数据项,数据对象 2.1.1 数据(Data): 2.1.2 数据元素(Data Element)&a…

关于elasticsearch一些基本操作

哈喽~大家好,这篇来看看关于elasticsearch一些基本操作。 🥇个人主页:个人主页​​​​​ 🥈 系列专栏: 【微服务】 🥉与这篇相关的文章: SpringCloud Se…

Import语句基础

1 问题 在 Java 中,如果给出一个完整的限定名,包括包名、类名,那么 Java 编译器就可以很容易地定位到源代码或者类。import 语句就是用来提供一个合理的路径,使得编译器可以找到某个类。 2 方法 1.import导入声明可分为两种: 1&a…

【每日一道智力题】之 轮流取石子(简单的尼姆博弈)

题目:一共有N颗石子(或者其他乱七八糟的东西),每次最多取M颗最少取1颗,A,B轮流取,谁最后会获胜?(假设他们每次都取最优解)。解答:结论&#xff1a…

告诉大家几个好用的功能

功能一:打开通知面板/月历面板 WinN的作用是调出通知面板,由于Windows 11将月历与通知面板合在了一起,因此它的另一项功能,就是——打开月历。 功能二:WindowsW:启用小组件面板 如果我们需要用到系统自带的小组件&am…

WC2023游记

今年,我势必打破铜牌魔咒 Day -?~? 虽然已年及高二,但WC的讲课还是没有听懂多少,这段时间,北师大还有一名E队来我校训练,我只能感慨:“如果一个选手比你强,还比你小,那你就再也打…

51 种 AI 工具,生活、编程、内容创建都应该使用它

AI 正在席卷全球 🔥🔥🔥 它具有无限的潜力,并将改变我们的生活,让生活变得更美好。这项技术将迅速改进,您今天可以使用许多工具来提高您的工作效率,帮助您完成工作,为您提供有关许多…

单网口ubuntu主机配置virt-manager传统桥接bridge网络

单网口ubuntu主机配置virt-manager传统桥接bridge网络 虚拟机的网络桥接bridge模式往往需要物理宿主机有两个网口,一个网口1连接外网配置ip,另一个网口2空闲不配置ip,在virt-manager里配置虚拟机的网卡绑定网口2,从而实现虚拟机桥…

81.门控循环单元(GRU)以及代码实现

1. 关注一个序列 做RNN的时候,处理不了太长的序列,因为把整个序列信息全部放在隐藏状态中,所有东西都放进去,当时间步很长的话,隐藏状态就会累积太多东西,就可能对很前面的信息不那么容易抽取出来了。 所…

Aftermath:一款针对macOS的免费开源事件响应框架

关于Aftermath Aftermath是一款针对macOS的事件响应框架,该工具基于Swift语言开发,是一款完全免费且开源的网络安全事件响应框架。 在Aftermath的帮助下,广大研究人员可以轻松收集并分析受感染主机的数据。除此之外,在理想情况下…

“深度学习”学习日记。误差反向传播法--Affine/Softmax层的实现

2023.1.17 Affine层: 在神经网络的正向传播中,为了计算加权信号的总和,使用矩阵乘积运算。 比如: import numpy as npx np.arange(6).reshape(2, 3) # (2,3) w np.arange(6).reshape(3, 2) # (3,2) b np.arange(4).resha…