【兆易创新GD32H759I-EVAL开发板】 移植LVGL

17 篇文章 3 订阅
4 篇文章 0 订阅

为什么最终选择了 LVGL?

经过比较多种主流的界面设计软件,emWin 开发方便 ,但是没有开放源码  所以感觉不太自由;

TouchGFX目前仅限于STM32用, 应用范围小;

ThreadX 的配套GUI  GUIX   这个用起来感觉确实很方便,其实很想用, 但是由于对ThreadX还不太熟悉,所以GD32移植ThreadX还是有点麻烦,所以暂时放弃,但是 不得不说ThreadX 系统的性能还是很厉害的,它的中断响应速度在目前流行的多数嵌入式系统中是数一数二的,

国产的周立功也推出了GUI界面库以及配套设计,AWTK全称为Toolkit AnyWhere,是周立功倾心打造的一套基于C语言开发的GUI框架。旨在为用户提供一个功能强大、高效可靠、简单易用、可轻松做出炫酷效果的GUI引擎。其特点是支持跨平台同步开发,一次编程,到处编译,跨平台使用。但是目前感觉用的人不多,根据官方介绍 ,对系统资源也是有些要求的,

QT for MCU  对资源受限的单片机来说 还是不太流畅

GuiLite 是简单,易学的GUI库,代码量少,例子很多, 但是没有图形化设计软件;

所以最终综合考虑 ,LVGL 可以在多平台运行, 也有图形化设计软件,就选择了它

移植LVGL  基本的思路是

1使用GUI Guider 设计好LVGL的界面, 这个软件是 NXP官方为自家芯片的图形化界面设计而推出的, 也支持PC端模拟设计, 可以生成lvgl图形的源码;

2创建目标板的工程,调试好液晶屏的驱动程序 RGB,SPI等任何接口都可以

3界面移植工作

        1)移植LVGL 源码,不包含设计的GUI界面;(先把文件加入工程中)

        2)移植GUI Guider生成的界面代码(先把文件加入工程中)

        3)对LVGL界面库的代码进行配置,主要是修改一些头文件里的 宏定义(修改文h件)

        4)对GUI Guider的代码移植后 要在主函数中进行 配置和调用 (修改c文件)

        5) 有时候要根据GUI Guider界面所用到的控件和资源 对 LVGL的配置文件进行二次调整

        移植时注意 建议尽量按照官方指导的文件结构去移植,

GD32H7 移植要点

1 搞明白TLI的用法。

 TLI实际上是rgb接口液晶屏的控制器,除了要定义基本的rgb接口输出时要设置参数之外。

里面有两个图层控制单元,图层0和图层1可以进行简单的图层混合操作。

在使用时可以使用一个图层,也可以使用两个图层。但是即使不用的图层也会参与到后期的2个图层的混合过程中,最后输出混合的图像。不使用的图层可以设置一个默认的图层参数。图层没有使用时,这个默认参数就会被激活。

 TLI的工作过程是将 初始化时指定的显存区域的 图像内容 输出到GRB接口上。

暂时先用一个图层。

2移植 LVGL  的要点

1 .定义显存,定义显存位置,因为这个板子的屏幕也不小。,所以就算是单个整屏显存也要占用250kb左右的大小。使用双显存的话,需要将显存的位置定义在外部的任务中。

将显存定义在外部任务中有几种方式。

1) 不使用自定义sct文件,在Keil的工程中配置好外部显存的地址。然后在代码中指定分配地址,或者在代码属性中设置分配地址

2)使用自定义的sct文件, 在代码中指定 显存的位置

如 Arm V6下 :

先在sct中定义 SDRAM 的分配区,然后再代码中定义:

__ALIGNED(32) lv_color_t buf_disp[LV_HOR_RES_MAX * LV_VER_RES_MAX] __attribute__((section("SDRAM")));

2 .实现刷屏函数

static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p);

这个的函数实现 是lvgl的一个重点,涉及到系统工作效率

方式1  内存到内存 想 准备好的显示内容  逐个字节搬运至 指定的TLI显存地址中

方式2  使用IPA的DMA

方式3 使用DMA-DMA


/*Flush the content of the internal buffer the specific area on the display
 *You can use DMA or any hardware acceleration to do this operation in the background but
 *'lv_disp_flush_ready()' has to be called when finished.*/
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
    SCB_CleanInvalidateDCache();
    /*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/
#if (USE_IPA_INT == 0)
    uint32_t time_out;
#endif
    uint16_t offline;
    offline = LV_HOR_RES_MAX - (area->x2 - area->x1 + 1);
    
    IPA_CTL = 0x0;
    IPA_FMADDR = (uint32_t)color_p;
    IPA_DMADDR = (uint32_t)buf_disp + 2*(LV_HOR_RES_MAX*area->y1+area->x1);
    IPA_FLOFF = 0;
    IPA_DLOFF = offline;
    IPA_FPCTL = FOREGROUND_PPF_RGB565;
    IPA_IMS = (uint32_t)((area->x2 - area->x1 + 1) << 16) | (uint16_t)(area->y2 - area->y1 + 1);
    
#if (USE_IPA_INT == 1)
g_disp_drv = disp_drv;  // 将disp_drv的值赋给全局变量g_disp_drv,可能是用于设定显示驱动的参数
/* enable IPA interrupt */
// IPA_CTL_FTFIE :传输完成中断使能位 软件置位和清除 0:传输完成中断禁止 1:传输完成中断使能
//IPA_CTL_TAEIE : 传输访问错误中断使能位
//IPA_CTL_WCFIE : 配置错误中断使能位
IPA_CTL |= IPA_CTL_FTFIE | IPA_CTL_TAEIE | IPA_CTL_WCFIE;  // 将IPA_CTL_FTFIE,IPA_CTL_TAEIE,IPA_CTL_WCFIE这些标志位设置到IPA_CTL中,启用对应的IPA中断
IPA_CTL |= IPA_CTL_TEN;  // 将IPA_CTL_TEN设置到IPA_CTL中,可能为启用IPA的工作(例如开启传输等)
g_ipa_flag = 1;  // 将全局变量g_ipa_flag设置为1,表示IPA已经被设定并启用

#else
    IPA_CTL |= IPA_CTL_TEN;
    /* Wait until transfer is done */
    while (IPA_CTL & IPA_CTL_TEN)
    {
        if(time_out++ >= 0XFFFFFFFF) break;
    }

    /* IMPORTANT!!!
     * Inform the graphics library that you are ready with the flushing*/
    lv_disp_flush_ready(disp_drv);
#endif

}

#if (USE_IPA_INT == 1)

// /*!
//     \brief      this function handles IPA exception
//     \param[in]  none
//     \param[out] none
//     \retval     none
// */
// void IPA_IRQHandler(void)
// {
//     if(RESET != ipa_interrupt_flag_get(IPA_INT_FLAG_FTF)){
//         if(0U != (IPA_CTL & IPA_CTL_FTFIE)){
//             IPA_CTL &= (uint32_t)(~IPA_CTL_FTFIE);
//             ipa_interrupt_flag_clear(IPA_INT_FLAG_FTF);
            
//             if(1U == g_ipa_flag){
//                 g_ipa_flag = 0U;
//                 /* IMPORTANT!!!
//                  * Inform the graphics library that you are ready with the flushing*/
//                 lv_disp_flush_ready(g_disp_drv);
//             }
//         }
//     }
// }
/*!
    \brief      this function handles IPA exception
    \param[in]  none
    \param[out] none
    \retval     none
*/
void IPA_IRQHandler(void)
{
    // 检查是否有IPA FTF(Frame Transfer Finish)中断标志被置位
    if(RESET != ipa_interrupt_flag_get(IPA_INT_FLAG_FTF)){
        // 如果IPA 控制寄存器中启用了FTF中断(Frame Transfer Finish Interrupt Enable)
        if(0U != (IPA_CTL & IPA_CTL_FTFIE)){
            // 关闭FTF中断使能,防止中断重入问题
            IPA_CTL &= (uint32_t)(~IPA_CTL_FTFIE);
            // 清除FTF中断标志位,以便能够检测下一个FTF事件
            ipa_interrupt_flag_clear(IPA_INT_FLAG_FTF);
            // 如果全局的g_ipa_flag标志位被设定,说明正在等待处理某些操作
            if(1U == g_ipa_flag){
                // 将g_ipa_flag标志位清零,表示当前的操作已完成
                g_ipa_flag = 0U;
                /* 重要!!!
                 * 通知图形库刷新操作已经完成,可以进行下一个渲染周期。
                 * lv_disp_flush_ready是一个在图形库中定义的函数,它的调用
                 * 通知图形库当前的绘制操作已经完成,图形库可以对显示进行更新
                 * 或者处理其他图形任务。
                 */
                lv_disp_flush_ready(g_disp_drv);
            }
        }
    }
}

#endif

  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GD32F470I-EVAL是一款基于GD32F470芯片的开发。对于GD32F470I-EVAL的资料和使用说明,你可以参考GD32F4xxDemoSuites的开发资料,可以在E:\development\GD32\开发资料\GD32F4xxSeries\GD32F4xx_Demo_Suites_V2.6.1\GD32470Z_EVAL_Demo_Suites\Docs\Schematic位置找到电路资料。此外,你还可以查阅GD32系列的用户手册,该手册详细地说明了GD32各个功能部件的信息以及使用方法。在Keil上开发GD32F470I-EVAL,你可以使用GD32的库进行开发。如果你需要搭建一个GD32的工程模,可以参考相关的开发资料和用户手册,根据你的需求进行相应的配置和编程。希望这些资料能够帮助你完成GD32F470I-EVAL开发工作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [gd32f470总结](https://blog.csdn.net/wzgxhzdd/article/details/127885289)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [GD32F450I-EVAL学习准备工作](https://blog.csdn.net/qq_63759726/article/details/127141869)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值