单片机开发---ESP32-S3模块上手
创始人
2024-05-13 11:51:15
0

背景介绍

想起来之前做的半成品单片机游戏机,又想继续做一个,不过之前那个单片机驱动屏幕速率太低,已经无法改进了。所以这次斥巨资购买了一款顶配的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 5spi_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 transactiont.length=8;                     //Command is 8 bitst.tx_buffer=&SPI_Command;       //The data is the cmd itselft.user=(void*)0;                //D/C needs to be set to 0ret=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 transactiont.length=8;                 			//Len is in bytes, transaction length is in bits.t.tx_buffer=&SPI_Data;          		//Datat.user=(void*)1;                		//D/C needs to be set to 1ret=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 GPIOsgpio_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 displaygpio_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 busret=spi_bus_initialize(LCD_HOST, &buscfg, SPI_DMA_CH_AUTO);ESP_ERROR_CHECK(ret);//Attach the LCD to the SPI busret=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函数的单位为msOLED_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模块又拾起来玩了一下
在这里插入图片描述
不过自己做的东西,自己也不确定好不好用,数据准不准,是不是挺可笑。不过这可能就是目前小厂员工的状态,用不知底的东西做出来的东西,有时候就没有信息。
所以目前好多公司,还是会希望每个模块,都需要自己吃透,才能放心用在自己产品了。所以人员一旦过少,无法研发出高质量的产品,因为只来得及用起来,没有时间去思考为什么。
在这里插入图片描述
今天看到了这个消息
在这里插入图片描述
普通人通过生孩子和努力还会成功吗?
在这里插入图片描述

相关内容

热门资讯

【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
ASM贪吃蛇游戏-解决错误的问... 要解决ASM贪吃蛇游戏中的错误问题,你可以按照以下步骤进行:首先,确定错误的具体表现和问题所在。在贪...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...