Esp8266_RTOS_SDK使用寄存器操作驱动ST7789

本文介绍了如何通过直接操作寄存器来提高Esp8266_RTOS_SDK中SPI驱动ST7789屏幕的效率。作者分析了官方SPI驱动,并提供了HSPI初始化程序和寄存器级别的SPI传输函数,以实现更高效的数据传输。通过比较修改前后的时序图,展示了速度的显著提升。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       在学习Esp8266_RTOS_SDK移植LVGL时,发现使用官方示例中的SPI驱动ST7789屏幕时,驱动效率没有达到自己的期望,我认为还能提高点效率,想着能不能直接操作寄存器,这样更有效率,同时也能学习esp8266的SPI。

        1.首先看看,官方给的SPI驱动OLED的示例,在examples->peripherals->spi_oled->main文件夹中的spi_oled_example_main.c。

     直接上程序。

        //包含的头文件

        #include "esp8266/spi_struct.h"

        #include "esp8266/gpio_struct.h"

        #include "driver/gpio.h"

        #include "driver/spi.h"

        //引脚定义

        #define CONFIG_ST7789V_PIN_RES      0

        #define CONFIG_ST7789V_PIN_DC       5

        #define CONFIG_ST7789V_PIN_CS       4

        #define ST7789V_PIN_RES (CONFIG_ST7789V_PIN_RES)

        #define ST7789V_PIN_DC (CONFIG_ST7789V_PIN_DC)

        #define ST7789V_PIN_CS (CONFIG_ST7789V_PIN_CS)

        #define ST7789V_PIN_BLK (CONFIG_ST7789V_PIN_BLK)

        //DC引脚引脚高低电平设置

        #define LCD_DAT  GPIO.out_w1ts |= (0x1 << ST7789V_PIN_DC)

        #define LCD_CMD  GPIO.out_w1tc |= (0x1 << ST7789V_PIN_DC)

        //ST7789初始化指令结构体定义

        typedef struct {

          uint8_t cmd;

          uint8_t data[16];

          uint8_t databytes;  // No of data in data; bit 7 = delay after set; 0xFF = end

                      // of cmds.

        } lcd_init_cmd_t;

        //变量定义

        static bool s_is_st7789v_inited = false;

        spi_trans_t spi_trans_tmp = {0};//为了增加速度,减少不必要的指令执行时间,设置成全局变量。

        //中断使能或者禁止宏定义

        #define spi_intr_enable() _xt_isr_unmask(1 << ETS_SPI_INUM)

        #define spi_intr_disable() _xt_isr_mask(1 << ETS_SPI_INUM)

        //HSPI初始化程序

        void my_spi_init(void)

        {

                     //中断使能配置

                    SPI1.slave.rd_buf_inten = 0;

                    SPI1.slave.wr_buf_inten = 0;

                    SPI1.slave.rd_sta_inten = 0;

                    SPI1.slave.wr_sta_inten = 0;

                    SPI1.slave.trans_inten  = 0;

                    // Clear interrupt status register

                    SPI1.slave.rd_buf_done  = false;

                    SPI1.slave.wr_buf_done  = false;

                    SPI1.slave.rd_sta_done  = false;

                    SPI1.slave.wr_sta_done  = false;

                    SPI1.slave.trans_done   = false;

                     //禁止中断

                    spi_intr_disable();

                   //以下是根据SDK里面的设置缩减而成,只适合SPI master模式发送,其他模式请自行修改。

                    // Waiting for all transfers to complete

                    while (SPI1.cmd.usr);

                    SPI1.user.flash_mode = false;

                    // Set to Master mode

                    SPI1.pin.slave_mode = false;

                    SPI1.slave.slave_mode = false;

                    // Master uses the entire hardware buffer to improve transmission speed

                    SPI1.user.usr_mosi_highpart = false;

                    SPI1.user.usr_miso_highpart = false;

                    SPI1.user.usr_mosi = true;

                    // Create hardware cs in advance

                    SPI1.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值