ESP32 开发小结

1 引言

        最近用微雪的ESP32-S3的开发板做了个lvgl界面给客户用来监测产品的实时状态和生成pdf文档到SD卡中。记录一下遇到的问题。在之前的开发中使用的是正点原子的ESP-S3开发板,已经完成了所有的工作,但是因为项目的实际需求(正点原子的开发板的价格较贵,而且没有485芯片和can芯片以及可以扩展增加电池的管理芯片),其实让硬件工程师开发可以更节省成本,但是都说没空,只能作罢。

2 问题总结

2.1 屏幕点不亮和发生偏移

        两款开发板使用的屏幕驱动芯片是一样的,但是出现了不一样的情况。先对比屏幕驱动部分。

正点原子代码

 /* 使用双缓冲 */
    buf1 = heap_caps_malloc(ltdcdev.width * 60 * sizeof(lv_color_t), MALLOC_CAP_DMA);
    buf2 = heap_caps_malloc(ltdcdev.width * 60 * sizeof(lv_color_t), MALLOC_CAP_DMA);

    /* 初始化显示缓冲区 */
    static lv_disp_draw_buf_t disp_buf;                                 /* 保存显示缓冲区信息的结构体 */
    lv_disp_draw_buf_init(&disp_buf, buf1, buf2, ltdcdev.width * 60);   /* 初始化显示缓冲区 */
    
    /* 在LVGL中注册显示设备 */
    static lv_disp_drv_t disp_drv;      /* 显示设备的描述符(HAL要注册的显示驱动程序、与显示交互并处理与图形相关的结构体、回调函数) */
    lv_disp_drv_init(&disp_drv);        /* 初始化显示设备 */

微雪代码

void *buf1 = NULL;
void *buf2 = NULL;
#if CONFIG_EXAMPLE_DOUBLE_FB
    ESP_LOGI(TAG, "Use frame buffers as LVGL draw buffers");
    ESP_ERROR_CHECK(esp_lcd_rgb_panel_get_frame_buffer(panel_handle, 2, &buf1, &buf2));
    // initialize LVGL draw buffers
    lv_disp_draw_buf_init(&disp_buf, buf1, buf2, EXAMPLE_LCD_H_RES * EXAMPLE_LCD_V_RES);
#else
    ESP_LOGI(TAG, "Allocate separate LVGL draw buffers from PSRAM");
    buf1 = heap_caps_malloc(EXAMPLE_LCD_H_RES * 160 * sizeof(lv_color_t), MALLOC_CAP_DMA);
    assert(buf1);
    // buf2 = heap_caps_malloc(EXAMPLE_LCD_H_RES * 80 * sizeof(lv_color_t), MALLOC_CAP_DMA);
    // assert(buf2);
    // initialize LVGL draw buffers
    lv_disp_draw_buf_init(&disp_buf, buf1, buf2, EXAMPLE_LCD_H_RES * 160 );
#endif // CONFIG_EXAMPLE_DOUBLE_FB

    ESP_LOGI(TAG, "Register display driver to LVGL");
    lv_disp_drv_init(&disp_drv);
    disp_drv.hor_res = EXAMPLE_LCD_H_RES;
    disp_drv.ver_res = EXAMPLE_LCD_V_RES;
    disp_drv.flush_cb = example_lvgl_flush_cb;
    disp_drv.draw_buf = &disp_buf;
    disp_drv.user_data = panel_handle;

微雪的代码跑它提供的例程是正常的,但是移植我的代码就不行了,具体原因没有去深究。最开始是黑屏,将分配的缓冲去大小修改到和原子一致的时候,屏幕有画面了,但是是偏移的,通过降低缓冲区的大小到800*8可以使画面显示完整,但是这样画面刷新的速度就太慢了。所以不能通过降低缓冲去大小来适配屏幕。

        在咨询微雪的技术支持后,意识到屏幕的DCLK Frequency也会影响到屏幕的显示。          对比了两者的代码之后将微雪工程中DCLK Frequency由21MHz降低到了18MHz,屏幕可以正常显示了。

2.2 SD卡的挂载和写入问题

        微雪的开发板使用了外部扩展芯片CH422G来控制CD_CS引脚,微雪提供的驱动是C++的库,问售后要到C库的驱动,将SD卡成功挂载。

        挂载成功之后,生成的pdf文件一直无法保存,后来想起来之前在ESP32的menconfig配置过fatf的什么,查看之后发现长文件名支持没有打开所以保存不了。

        到这里所有问题都已经解决了。

3 总结

        原子的开发板更适合初学者,代码注释很全,可移植性很强,SD卡的驱动代码直接使用的原子的,因为微雪不提供ESP-IDF的SD卡驱动代码。微雪的开发板更像是工业产品提供给想要快速开发的工程师使用,成本更低而且考虑到了工业领域中常用的东西。顺便吐槽一下,微雪的例程里基本没有注释。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值