背景介紹
想起來之前做的半成品單片機游戲機,又想繼續(xù)做一個,不過之前那個單片機驅動屏幕速率太低,已經無法改進了。所以這次斥巨資購買了一款頂配的ESP32S開發(fā)板,做個簡單的游戲機,沒問題。
完整介紹鏈接
這花花綠綠的介紹,看著讓人甚是喜歡呢。
開發(fā)環(huán)境搭建
參考樂鑫官網的方式,我選擇了windows開發(fā)環(huán)境
Windows 平臺工具鏈的標準設置
安裝完成會有兩個圖標,按照推薦選擇了cmd方式
雙擊運行
隨便選擇一個工作目錄,將范例的代碼拷貝過來,就可以進行編譯燒錄了。
Hello World
必須先用hello world熱熱身
- 拷貝工程
范例工程都在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>
- 配置工程
選擇開發(fā)目標,目前支持’esp32’, ‘esp32s2’, ‘esp32c3’, ‘esp32s3’, ‘linux’, ‘esp32h2’.
idf.py set-target esp32s3
配置參數
idf.py menuconfig
查看開發(fā)板手冊得知flash和內存類型
配置方法如下
flash大小
我買的是16MB flash
Serial flasher config —>
片外ram
Component config —> ESP32S3-Specific —>選中支持片外ram
再進入SPI ram config
選擇mode,切換為Octal模式
最后返回上一級,順帶改一下工作頻率
誰還嫌運行的快呢
- 編譯
idf.py build
- 燒寫與監(jiān)測串口
燒寫
idf.py -p COM6 flash
監(jiān)視串口
idf.py -p COM6 monitor
燒寫后監(jiān)視串口
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
那么代碼中文章來源:http://www.zghlxwxcb.cn/news/detail-817588.html
#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模塊又拾起來玩了一下
不過自己做的東西,自己也不確定好不好用,數據準不準,是不是挺可笑。不過這可能就是目前小廠員工的狀態(tài),用不知底的東西做出來的東西,有時候就沒有信息。
所以目前好多公司,還是會希望每個模塊,都需要自己吃透,才能放心用在自己產品了。所以人員一旦過少,無法研發(fā)出高質量的產品,因為只來得及用起來,沒有時間去思考為什么。
今天看到了這個消息
普通人通過生孩子和努力還會成功嗎?文章來源地址http://www.zghlxwxcb.cn/news/detail-817588.html
到了這里,關于單片機開發(fā)---ESP32-S3模塊上手的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!