当前位置: 首页 > news >正文

【兆易创新GD32H759I-EVAL开发板】 TLI(TFT LCD Interface)用法详细介绍

大纲

1. 引言
2. TLI外设特点
3. TLI硬件架构
4. TLI寄存器功能
5. TLI的配置和使用步骤
6. TLI图层概念
7. 图像处理和显示优化
8. 基于GD32H759I-EVAL开发板的TLI应用示例

 

1. 引言

在当今的嵌入式系统设计中,图形用户界面(GUI)的应用越来越广泛,这不仅仅是因为它们提供了更直观、易用的交互方式,还因为强大的GUI能够极大地提升产品的市场竞争力。GD32H7系列微控制器(MCU)作为高性能的ARM Cortex-M7平台,以其高达480 MHz的处理速度和丰富的外设集成度,成为实现复杂GUI应用的理想选择。其中,TFT LCD Interface(TLI)作为GD32H7系列的一项关键外设,为开发人员提供了一个强大而灵活的工具,用于开发高质量的图形显示应用。

TLI外设不仅支持多种颜色格式和高分辨率的显示,还内置了硬件图层叠加和像素格式转换等高级功能,这使得开发者能够轻松实现复杂的图形界面设计,同时保持系统的高性能运行。此外,GD32H7系列的高集成度意味着开发者可以利用更少的外围组件来完成更多的功能,这在成本和空间受限的应用场景下尤为宝贵。

2. TLI外设特点:

  1. 支持的分辨率:TLI外设支持高达2048x2048像素的分辨率,使其能够驱动高清显示屏,为用户提供丰富、清晰的图形和文本显示。

  2. 图层:支持多达2个图层,每个图层可以单独控制和配置,包括颜色格式、大小、位置等,支持图层间的混合和透明度控制。

  3. 像素格式:支持多种像素格式,包括但不限于RGB565, RGB888, ARGB1555, ARGB4444, L8(灰度图像)等,为不同类型的图像显示提供灵活性。

  4. 直接存储访问(DMA):内置DMA控制,减轻CPU的负担,提高数据传输效率,使得图像能够快速更新。

  5. 外部存储器接口:与外部存储器接口(如SDRAM)的无缝集成,允许存储大型图像和图形资产,为复杂或动态界面提供必要的存储支持。

  6. 同步控制:提供灵活的同步控制选项,包括水平和垂直同步,以及像素时钟控制,确保与各种LCD显示屏的兼容性。

  7. 节能模式:支持多种节能模式,包括关闭背光和减少帧率,帮助减少整体功耗。

3. 应用场景:

  • 高清图形用户界面(GUI):如触摸屏界面、仪表盘、信息娱乐系统等。
  • 工业控制:如机器人控制器、自动化设备的操作界面。
  • 医疗设备:如患者监视器、诊断仪器的显示屏。
  • 消费电子:如智能家居控制面板、便携式媒体播放器。

3.1提示:

在设计和实现基于TLI的解决方案时,需要特别注意以下几点:

  • 确保所选显示屏兼容TLI支持的同步模式和像素格式。
  • 图层管理和内存分配策略对于高效使用TLI和优化性能至关重要。
  • 利用DMA传输和外部存储器来存储和管理大型图形资源,以提高系统性能和响应速度。

通过精确地配置TLI的各种参数和利用其强大的图形处理能力,GD32H7系列微控制器可以为需要高性能图形显示的应用提供强有力的解决方案。

3.2 TLI硬件块图和组成部分:

  1. 图层控制器:TLI包含多个独立的图层控制器,每个控制器负责管理一个图层的显示。这些控制器允许不同图层的内容独立渲染和控制,包括颜色格式、大小、位置及透明度等参数。

  2. 像素格式转换器:TLI内置的像素格式转换器支持多种像素格式的转换,确保不同格式的图像数据可以被正确地处理并显示。这对于兼容多种图像资源和提供灵活的图形设计至关重要。

  3. 定时器同步模块:该模块负责生成与外部LCD显示屏同步所需的时序信号,包括水平同步(HSYNC)、垂直同步(VSYNC)和像素时钟(Pixel Clock)。正确的时序信号是保证图像稳定显示的关键。

  4. DMA控制器:TLI的DMA(直接存储器访问)控制器允许图像数据直接从内存传输到TLI,无需CPU干预。这极大提高了数据传输的效率和整体系统性能。

  5. 背光控制模块:控制LCD背光的模块,提供对背光亮度的调节功能,以适应不同的环境光条件,并帮助节能。

3.3 关键组件介绍:

  • 图层控制器:每个图层控制器都可以配置为不同的颜色深度和格式,如RGB565、ARGB8888等。此外,图层控制器还支持图层的透明度混合和色键功能,以实现复杂的图形效果。

  • 像素格式转换器:该转换器支持从一种像素格式到另一种像素格式的转换,如从RGB格式到YUV格式。这对于视频播放和图像处理应用特别有用。

  • 定时器同步模块:通过精确配置,该模块生成与特定LCD面板规格相匹配的时序信号,保证显示内容的同步和稳定性。

  • DMA控制器:DMA控制器支持高效的数据传输,能够同时处理多个图层数据的传输任务。它可以根据需要配置为连续模式或一次性传输模式。

通过这些高度集成的硬件组件,GD32H7系列微控制器中的TLI能够为开发者提供强大而灵活的显示控制能力,使其能够轻松构建高质量的图形用户界面和视频播放应用。

4. TLI的使用方法及寄存器介绍

TLI(LCD-TFT显示控制器)的使用方法包括初始化配置、图层设置、时序参数配置以及图形数据的管理。以下是详细的使用方法和关键寄存器的介绍,以表格形式呈现以便于理解。

初始化配置

在开始使用TLI之前,首先需要进行初始化配置,包括系统时钟配置、TLI时钟源选择、以及基本的显示参数设置。

步骤1:系统时钟配置

确保系统时钟有足够的频率以供TLI正常工作。GD32H7系列通常支持的最高系统时钟频率可以满足大多数TLI应用场景的需求。

步骤2:TLI时钟源选择

选择合适的TLI时钟源,并根据LCD显示器的规格设置相应的时钟分频,以生成正确的像素时钟。

步骤3:基本显示参数设置

设置TLI的基本显示参数,包括显示方向、分辨率等。

图层设置

TLI支持多个独立图层的显示控制,每个图层可以单独配置,包括图层大小、位置、颜色格式等。

步骤1:图层使能

通过设置TLI图层控制寄存器来使能特定的图层。

步骤2:图层配置

配置图层的颜色格式、起始地址、大小和位置等参数。

时序参数配置

根据连接的LCD显示器规格,配置TLI的时序参数,包括同步脉冲宽度、背沿和前沿时间等。

图形数据管理

通过DMA传输图形数据到图层的帧缓冲区,或者直接通过CPU写入数据。

TLI(TFT-LCD接口)寄存器

在GD32H737, GD32H757, 和GD32H759系列微控制器中,TLI (TFT-LCD接口)寄存器是用于配置和管理TFT-LCD显示模块的关键组成部分。下面是TLI寄存器中一些重要寄存器的详细介绍和它们的用法 :

  1. 同步脉冲宽度寄存器(TLI_SPSZ):用于配置水平同步(HS)和垂直同步(VS)脉冲的宽度。这决定了每帧中同步信号的精确时长。

  2. 后沿宽度寄存器(TLI_BPSZ):设置水平和垂直后沿的宽度,即HS和VS信号结束后到下一个像素数据开始的时间间隔。

  3. 有效宽度寄存器(TLI_ASZ):定义了显示区域的有效宽度,即屏幕上实际显示图像的区域。

  4. 总宽度寄存器(TLI_TSZ):设置了整个显示区域的总宽度,包括同步脉冲、后沿、显示区域及前沿的宽度。

  5. 控制寄存器(TLI_CTL):负责整个TLI模块的启动、停止以及其他控制功能,如抖动功能的启用或禁用。

  6. 背景色配置寄存器(TLI_BGC):设置LCD显示的背景颜色,包括红色、绿色和蓝色的值。

  7. 中断使能寄存器(TLI_INTEN):启用或禁用TLI的各种中断源,如行标记中断、FIFO错误中断等。

  8. 中断标志寄存器(TLI_INTF):显示当前哪些中断事件已经发生,例如行标记事件或FIFO下溢错误。

  9. 中断标志清除寄存器(TLI_INTC):用于手动清除已发生的中断标志,确保中断处理程序正确执行。

  10. 行标记寄存器(TLI_LM):用于设置当屏幕刷新到特定行时,触发一个行标记中断,这通常用于动画或屏幕更新同步。

  11. 当前像素位置寄存器(TLI_CPPOS):显示当前正在处理的像素的水平和垂直位置,这对于调试显示问题非常有用。

  1. 第x 层控制寄存器(TLI_LxCTL):每个图层都有一个对应的配置寄存器,用于控制图层的可见性、像素格式、Alpha值等关键特性。通过配置这些寄存器,可以对各个图层进行精确的控制,包括启用/禁用图层、选择合适的像素格式,以及调整图层的透明度。

  2. 图层窗口偏移寄存器(窗口参数寄存器)(TLI_LxHPCR、TLI_LxVPCR):这两个寄存器集合定义了每个图层在整个屏幕中的位置和大小。通过设置水平和垂直方向的起始和结束位置,可以控制图层的精确显示区域。

  3. 图层帧缓冲区地址寄存器(TLI_LxFBADDR)指定了每个图层的帧缓冲区的物理地址。帧缓冲区是存储图像数据的内存区域,TLI根据此地址读取相应的像素数据用于显示。

  4. 图层帧缓冲区行距寄存器(TLI_LxFLLEN:设置了图层帧缓冲区中每行像素数据的长度和偏移,确保TLI正确解析帧数据。  注意的是 缓冲区的 大小 不仅与屏幕大小相关,还与图像的数据格式相关 如果是 RGB565,则一个像素占2个字节,如果是RGB888,则一个像素占3个字节, 这将影响 寄存器的值 如果 图层为全屏大小(480*272),采用RGB565图像,

    1. STDOFF[13:0] (<<16) 步幅偏移  这个值定义了从某行起始处到下一行起始处之间的字节数,则为 (480 * 2)

    2. FLL [13:0]  :   ((480 * 2) + 3)
  5. 颜色键控制寄存器(TLI_LxCKEY):用于配置图层的颜色键功能,可以设置一个特定的颜色作为“透明”颜色,当图层中的像素为该颜色时,不会被显示出来,从而实现图层之间的透明叠加效果。

  6. 图层混合配置寄存器(TLI_LxBFCR):控制图层间的混合模式和Alpha混合参数,通过调整这些参数,可以实现图层之间复杂的视觉效果,如淡入淡出、图层遮罩等。

  7. CLUT配置寄存器(TLI_LxCLUTWR):对于使用颜色查找表(CLUT)的图层,此寄存器用于写入CLUT的颜色值。颜色查找表允许使用较少的数据位表示宽色域,节省内存同时保持良好的图像质量。

  8. 中断使能寄存器(TLI_INTEN):控制TLI的中断使能状态,可用于开启或关闭特定的TLI事件中断,如帧结束中断、行标记中断等,以便在这些事件发生时执行相应的中断服务程序。

  9. 中断状态寄存器(TLI_INTF)和中断清除寄存器(TLI_INTC):这两个寄存器用于管理TLI产生的中断。中断状态寄存器显示了哪些中断事件已经发生,而中断清除寄存器则用于清除已经处理的中断事件标志,防止重复响应。

5. TLI的配置和使用步骤

5.1. 初始化步骤
        系统时钟配置
  • TLI的时钟来源于PLL2输出,需要在RCU(复位和时钟控制单元)中进行配置和启用。
  • 确保PLL2配置了正确的乘法和除法因子,以获得适合TLI的时钟速率。
        GPIO配置
  • 为TLI功能配置GPIO引脚,包括RGB数据、像素时钟(PIXCLK)、水平同步(HSYNC)、垂直同步(VSYNC)和显示使能(DE)信号的引脚。
  • 用于TLI功能的特定引脚可能需要设置为复用功能模式,并配置为高速输出。
5.2. TLI核心配置
  • 启动TLI:通过设置TLI_CTL寄存器中的TLIEN位来启用TLI。
  • 配置显示时序:编程TLI_SPSZ、TLI_BPSZ、TLI_ASZ和TLI_TSZ寄存器,为水平和垂直尺寸定义同步脉冲宽度、背景宽度、活动区域大小和总大小。
5.3. 图层配置
  • 定义图层属性,包括颜色格式、窗口大小、位置,以及适用的话,颜色键控和CLUT(颜色查找表)设置。
  • 每个图层都有自己的控制和配置寄存器,如LxWHPCR、LxWVPCR、LxDCCR,这些寄存器定义了图层的窗口大小、位置和默认颜色。
5.4. 图层叠加和透明度设置
  • 使用LxPFCR和LxCAxCR寄存器配置图层的混合因素,以达到多个图层之间所需的透明度和混合效果。
  • 利用颜色键控功能,通过配置LxCKCR寄存器使特定颜色透明。
5.5. 启动和停止显示更新
  • 要开始显示,确保图层被启用,并且TLI主控制被启用。此操作启动从内存通过DMA到TLI的数据传输,然后TLI将像素数据输出到连接的LCD。
  • 停止显示更新涉及禁用图层和/或主TLI控制,以停止数据传输和输出。
5.6 示例代码       
/*** @brief 配置LCD的TLI接口* * 该函数初始化TLI接口,配置其时钟源、信号极性、同步宽度、像素格式等参数,* 以及配置两个图层(layer0和layer1)的窗口位置、像素格式、默认颜色和融合因子等参数。* * @note 函数中不接受任何参数,也不返回任何值。*/
void lcd_config(void)
{/* 启用TLI时钟 */rcu_periph_clock_enable(RCU_TLI);tli_gpio_config();/* 配置PLL2以生成72MHz的TLI时钟 */rcu_pll_input_output_clock_range_config(IDX_PLL2, RCU_PLL2RNG_1M_2M, RCU_PLL2VCO_150M_420M);if(ERROR == rcu_pll2_config(25, 188, 3, 3, 3)) {while(1) {}}rcu_pll_clock_output_enable(RCU_PLL2R);rcu_tli_clock_div_config(RCU_PLL2R_DIV8);rcu_osci_on(RCU_PLL2_CK);if(ERROR == rcu_osci_stab_wait(RCU_PLL2_CK)) {while(1) {}}/* TLI初始化 *//* 初始化水平同步信号极性为低电平有效 */tli_initstruct.signalpolarity_hs = TLI_HSYN_ACTLIVE_LOW;/* 初始化垂直同步信号极性为低电平有效 */tli_initstruct.signalpolarity_vs = TLI_VSYN_ACTLIVE_LOW;/* 初始化数据使能信号极性为低电平有效 */tli_initstruct.signalpolarity_de = TLI_DE_ACTLIVE_LOW;/* 初始化像素时钟极性为输入的像素时钟 */tli_initstruct.signalpolarity_pixelck = TLI_PIXEL_CLOCK_TLI;/* 时序配置 *//* 配置水平同步宽度 */tli_initstruct.synpsz_hpsz = 40;/* 配置垂直同步高度 */tli_initstruct.synpsz_vpsz = 9;/* 配置累计水平后 porch */tli_initstruct.backpsz_hbpsz = 42;/* 配置累计垂直后 porch */tli_initstruct.backpsz_vbpsz = 11;/* 配置累计激活宽度 */tli_initstruct.activesz_hasz = 522;/* 配置累计激活高度 */tli_initstruct.activesz_vasz = 283;/* 配置总宽度 */tli_initstruct.totalsz_htsz = 524;/* 配置总高度 */tli_initstruct.totalsz_vtsz = 285;/* 配置LCD背景颜色的R、G、B分量值 */tli_initstruct.backcolor_red = 0xFF;tli_initstruct.backcolor_green = 0xFF;tli_initstruct.backcolor_blue = 0xFF;tli_init(&tli_initstruct);/* 配置图层0的窗口位置和大小 */tli_layer0_initstruct.layer_window_leftpos = 45;tli_layer0_initstruct.layer_window_rightpos = (43 + 480 - 1);tli_layer0_initstruct.layer_window_toppos =  12;tli_layer0_initstruct.layer_window_bottompos = (12 + 272 - 1);/* 配置图层0的像素格式 */tli_layer0_initstruct.layer_ppf = LAYER_PPF_RGB565;/* 配置图层0的常量Alpha值 */tli_layer0_initstruct.layer_sa = 255;/* 配置图层0的默认颜色(R、G、B、A分量值) */tli_layer0_initstruct.layer_default_blue = 0xFF;tli_layer0_initstruct.layer_default_green = 0xFF;tli_layer0_initstruct.layer_default_red = 0xFF;tli_layer0_initstruct.layer_default_alpha = 0xFF;/* 配置图层0的融合因子 */tli_layer0_initstruct.layer_acf1 = LAYER_ACF1_PASA;tli_layer0_initstruct.layer_acf2 = LAYER_ACF1_PASA;/* 配置图层0的输入地址(帧缓冲区位于FLASH内存中) */tli_layer0_initstruct.layer_frame_bufaddr = (uint32_t)image_background0;tli_layer0_initstruct.layer_frame_line_length = ((480 * 2) + 3);tli_layer0_initstruct.layer_frame_buf_stride_offset = (480 * 2);tli_layer0_initstruct.layer_frame_total_line_number = 272;tli_layer_init(LAYER0, &tli_layer0_initstruct);/* 配置图层1的窗口位置和大小 */tli_layer1_initstruct.layer_window_leftpos = 162;tli_layer1_initstruct.layer_window_rightpos = (160 + 240 - 1);tli_layer1_initstruct.layer_window_toppos =  12;tli_layer1_initstruct.layer_window_bottompos = (12 + 272 - 1);/* 配置图层1的像素格式 */tli_layer1_initstruct.layer_ppf = LAYER_PPF_RGB565;/* 配置图层1的常量Alpha值 */tli_layer1_initstruct.layer_sa = 255;/* 配置图层1的默认颜色(R、G、B、A分量值) */tli_layer1_initstruct.layer_default_blue = 0xFF;tli_layer1_initstruct.layer_default_green = 0xFF;tli_layer1_initstruct.layer_default_red = 0xFF;tli_layer1_initstruct.layer_default_alpha = 0;/* 配置图层1的融合因子 */tli_layer1_initstruct.layer_acf1 = LAYER_ACF1_PASA;tli_layer1_initstruct.layer_acf2 = LAYER_ACF1_PASA;/* 配置图层1的输入地址(帧缓冲区位于内存SDRAM中) */tli_layer1_initstruct.layer_frame_bufaddr = (uint32_t)0xC1000000;tli_layer1_initstruct.layer_frame_line_length = ((240 * 2) + 3);tli_layer1_initstruct.layer_frame_buf_stride_offset = (240 * 2);tli_layer1_initstruct.layer_frame_total_line_number = 272;tli_layer_init(LAYER1, &tli_layer1_initstruct);tli_dither_config(TLI_DITHER_ENABLE);
}

6.图层概念

在GD32H7系列的TLI(TFT LCD Controller)中,图层(Layer)是独立的图像区域,可以单独控制并与其他图层叠加显示。每个图层可以设置不同的属性,如颜色格式、大小、位置和透明度等。这种多图层的设计允许开发者创建复杂且动态的用户界面,如菜单、按钮、动画和其他图形元素,而不会互相干扰。

6.1 如何创建和配置图层
  1. 选择图层并启用:GD32H7的TLI支持多个图层。首先需要根据需求选择并启用特定的图层。例如,使用TLI_LayerEnable(LAYERx);函数启用图层。

  2. 配置图层属性

    • 设置颜色格式:根据图像数据的类型,选择合适的颜色格式,如RGB565或ARGB8888等。
    • 设定图层大小和位置:指定图层在LCD上的显示位置和大小。
    • 设置帧缓冲区:为图层指定帧缓冲区的地址,这里存放图层要显示的图像数据。
  3. 透明度和颜色键控:配置图层的透明度和颜色键控(Color Keying)功能,以实现图层之间的透明或半透明效果。

6.2 图层的动态管理和更新在LVGL项目中的应用

在使用LVGL(Light and Versatile Graphics Library)构建GUI项目时,TLI的图层管理功能可以与LVGL框架结合,以优化显示效果和性能。

  1. 图层与LVGL对象绑定:可以将TLI图层与LVGL的对象或页面绑定,为不同的UI元素使用不同的图层。这样做可以减少重绘的需要,提高界面响应速度。

  2. 动态更新内容:当UI元素需要更新时,只需修改对应图层的帧缓冲区内容或属性,而无需重新绘制整个屏幕。这在动画效果或内容频繁变动的场景中特别有用。

  3. 透明度和叠加效果:利用TLI的透明度管理,可以创建具有透明或半透明效果的UI元素,如弹出窗口、提示框等。同时,颜色键控功能可用于实现复杂的叠加效果。

  4. 性能优化:通过精心设计图层的使用和配置,可以优化内存使用和提高渲染效率。例如,静态背景可以放置在一个单独的图层中,而动态内容在另一个图层,减少了不必要的刷新。

7. 图像处理和显示优化

        在GD32H7系列MCU中,TLI的设计提供了强大的图像显示功能,包括支持多种像素格式的处理、像素DMA传输、层窗口和混合功能、抖动功能,以及颜色查找表(LUT)支持。这些功能可以用于提高图像处理和显示的效率和质量。以下是一些优化策略:

7.1利用像素DMA优化数据传输

        像素DMA功能使得图像数据可以直接从内存传输到显示缓冲区,减少CPU的负担。为了最大化数据传输效率,应确保图像数据存储布局与TLI的数据需求相匹配,从而减少任何不必要的数据重排或转换。

7.2采用多层显示策略

通过TLI支持的多层显示,可以将不同的视觉元素放置在不同的图层上,例如,背景、图标、文本可以分别在不同的层上处理和渲染。这样做不仅可以简化图像合成的复杂度,还可以在不重绘整个屏幕的情况下更新局部区域,从而提高更新效率和响应速度。

7.3优化像素格式使用

根据显示的需求选择合适的像素格式,可以在保证视觉效果的同时优化内存使用。例如,对于不需要透明效果的简单图形,可以选择不带Alpha通道的像素格式,以节省内存空间。

7.4使用颜色查找表(LUT)

对于使用颜色较少的图像,比如图标或用户界面元素,使用颜色查找表(LUT)可以减少每个像素所需的数据量,同时保持良好的视觉效果。这对于减少内存占用和加速图像渲染尤为有效。

7.5色键透明处理

利用TLI的色键功能,可以实现简单的图像透明处理,通过设定特定的颜色值作为“透明”标记,TLI在渲染时会自动将匹配该颜色的像素渲染为透明。这种方法适用于实现简单的图像叠加效果,而无需复杂的Alpha混合计算。

 8.嘟嘟嘟啊?示例代码:


#include "gd32h7xx.h"
#include "systick.h"
#include <stdio.h>
#include "gd32h759i_eval.h"
#include "image1.h"
#include "image2.h"
#include "image3.h"
#include "image4.h"
#include "image5.h"
#include "image6.h"
#include "image7.h"
#include "image8.h"
#include "image9.h"
#include "image10.h"
#include "image11.h"
#include "image12.h"#if defined (__clang__)
#include "logo.h"
#elif defined ( __ICCARM__ )
#include "logo_iar.h"
#endif
// 定义显示设备的同步脉冲和有效显示区域参数// 水平方向参数
#define HORIZONTAL_SYNCHRONOUS_PULSE  41 // 水平同步脉冲宽度
#define HORIZONTAL_BACK_PORCH         2 // 水平后 porch 宽度
#define ACTIVE_WIDTH                  480 // 水平有效显示宽度
#define HORIZONTAL_FRONT_PORCH        2 // 水平前 porch 宽度// 垂直方向参数
#define VERTICAL_SYNCHRONOUS_PULSE    10 // 垂直同步脉冲高度
#define VERTICAL_BACK_PORCH           2 // 垂直后 porch 高度
#define ACTIVE_HEIGHT                 272 // 垂直有效显示高度
#define VERTICAL_FRONT_PORCH          2 // 垂直前 porch 高度__ALIGNED(16) uint8_t blended_address_buffer[58292];static void ipa_config(uint32_t baseaddress);
static void tli_config(void);
static void tli_blend_config(void);
static void tli_gpio_config(void);
static void lcd_config(void);
static void cache_enable(void);/*!\brief      main program\param[in]  none\param[out] none\retval     none
*/
int main(void)
{/* enable the CPU cache */cache_enable();/* configure the SysTick, TLI */systick_config();lcd_config();/* enable TLI layers */tli_layer_enable(LAYER0);tli_layer_enable(LAYER1);tli_reload_config(TLI_FRAME_BLANK_RELOAD_EN);/* enable TLI */tli_enable();/* configure TLI and display blend image */tli_blend_config();tli_reload_config(TLI_REQUEST_RELOAD_EN);while(1) {/* IPA configuration and display the images one by one */ipa_config((uint32_t)&gImage_image1);ipa_transfer_enable();while(RESET == ipa_interrupt_flag_get(IPA_INT_FLAG_FTF));delay_1ms(50);ipa_config((uint32_t)&gImage_image2);ipa_transfer_enable();while(RESET == ipa_interrupt_flag_get(IPA_INT_FLAG_FTF));delay_1ms(50);ipa_config((uint32_t)&gImage_image3);ipa_transfer_enable();while(RESET == ipa_interrupt_flag_get(IPA_INT_FLAG_FTF));delay_1ms(50);ipa_config((uint32_t)&gImage_image4);ipa_transfer_enable();while(RESET == ipa_interrupt_flag_get(IPA_INT_FLAG_FTF));delay_1ms(50);ipa_config((uint32_t)&gImage_image5);ipa_transfer_enable();while(RESET == ipa_interrupt_flag_get(IPA_INT_FLAG_FTF));delay_1ms(50);ipa_config((uint32_t)&gImage_image6);ipa_transfer_enable();while(RESET == ipa_interrupt_flag_get(IPA_INT_FLAG_FTF));delay_1ms(50);ipa_config((uint32_t)&gImage_image7);ipa_transfer_enable();while(RESET == ipa_interrupt_flag_get(IPA_INT_FLAG_FTF));delay_1ms(50);ipa_config((uint32_t)&gImage_image8);ipa_transfer_enable();while(RESET == ipa_interrupt_flag_get(IPA_INT_FLAG_FTF));delay_1ms(50);ipa_config((uint32_t)&gImage_image9);ipa_transfer_enable();while(RESET == ipa_interrupt_flag_get(IPA_INT_FLAG_FTF));delay_1ms(50);ipa_config((uint32_t)&gImage_image10);ipa_transfer_enable();while(RESET == ipa_interrupt_flag_get(IPA_INT_FLAG_FTF));delay_1ms(50);ipa_config((uint32_t)&gImage_image11);ipa_transfer_enable();while(RESET == ipa_interrupt_flag_get(IPA_INT_FLAG_FTF));delay_1ms(50);ipa_config((uint32_t)&gImage_image12);ipa_transfer_enable();while(RESET == ipa_interrupt_flag_get(IPA_INT_FLAG_FTF));delay_1ms(50);}
}/*!\brief      LCD Configuration\param[in]  none\param[out] none\retval     none
*/
static void lcd_config(void)
{/* configure the GPIO of TLI */tli_gpio_config();/* configure TLI peripheral */tli_config();
}
/*! \brief      配置TLI外设\param[in]  无\param[out] 无\retval     无
*/
static void tli_config(void)
{tli_parameter_struct               tli_init_struct; // TLI配置结构体tli_layer_parameter_struct         tli_layer_init_struct; // TLI层配置结构体// 启用TLI外设的时钟rcu_periph_clock_enable(RCU_TLI);tli_gpio_config(); // 配置TLI相关的GPIO// 配置PLL2时钟:CK_PLL2P/CK_PLL2Q/CK_PLL2R = HXTAL_VALUE / 25 * 150 / 3rcu_pll_input_output_clock_range_config(IDX_PLL2, RCU_PLL2RNG_1M_2M, RCU_PLL2VCO_150M_420M);if(ERROR == rcu_pll2_config(25, 150, 3, 3, 3)) {while(1) {}}// 启用PLL2R时钟输出并配置TLI时钟分频rcu_pll_clock_output_enable(RCU_PLL2R);rcu_tli_clock_div_config(RCU_PLL2R_DIV8);// 启用PLL2时钟rcu_osci_on(RCU_PLL2_CK);// 等待PLL2时钟稳定if(ERROR == rcu_osci_stab_wait(RCU_PLL2_CK)) {while(1) {}}/* 配置TLI参数结构体 */// 配置水平同步、垂直同步、DE及像素时钟极性tli_init_struct.signalpolarity_hs = TLI_HSYN_ACTLIVE_LOW;tli_init_struct.signalpolarity_vs = TLI_VSYN_ACTLIVE_LOW;tli_init_struct.signalpolarity_de = TLI_DE_ACTLIVE_LOW;tli_init_struct.signalpolarity_pixelck = TLI_PIXEL_CLOCK_TLI;// 配置LCD显示时序参数tli_init_struct.synpsz_hpsz = HORIZONTAL_SYNCHRONOUS_PULSE - 1;tli_init_struct.synpsz_vpsz = VERTICAL_SYNCHRONOUS_PULSE - 1;tli_init_struct.backpsz_hbpsz = HORIZONTAL_SYNCHRONOUS_PULSE + HORIZONTAL_BACK_PORCH - 1;tli_init_struct.backpsz_vbpsz = VERTICAL_SYNCHRONOUS_PULSE + VERTICAL_BACK_PORCH - 1;tli_init_struct.activesz_hasz = HORIZONTAL_SYNCHRONOUS_PULSE + HORIZONTAL_BACK_PORCH + ACTIVE_WIDTH- 1;tli_init_struct.activesz_vasz = VERTICAL_SYNCHRONOUS_PULSE + VERTICAL_BACK_PORCH + ACTIVE_HEIGHT - 1;tli_init_struct.totalsz_htsz = HORIZONTAL_SYNCHRONOUS_PULSE + HORIZONTAL_BACK_PORCH + ACTIVE_WIDTH +HORIZONTAL_FRONT_PORCH - 1;tli_init_struct.totalsz_vtsz = VERTICAL_SYNCHRONOUS_PULSE + VERTICAL_BACK_PORCH + ACTIVE_HEIGHT +VERTICAL_FRONT_PORCH - 1;// 配置LCD背景RGB颜色tli_init_struct.backcolor_red = 0xFF;tli_init_struct.backcolor_green = 0xFF;tli_init_struct.backcolor_blue = 0xFF;tli_init(&tli_init_struct); // 初始化TLI/** TLI(Transport Layer Interface)层配置* 此代码段初始化了一个TLI层的配置结构体,并设置了TLI层0的参数。* 配置包括窗口的位置、颜色格式、透明度、帧缓冲区地址等。*//* 设置TLI层窗口的左边界位置 */tli_layer_init_struct.layer_window_leftpos = 80 + HORIZONTAL_SYNCHRONOUS_PULSE +HORIZONTAL_BACK_PORCH + 2;/* 设置TLI层窗口的右边界位置 */tli_layer_init_struct.layer_window_rightpos = (80 + 320 + HORIZONTAL_SYNCHRONOUS_PULSE +HORIZONTAL_BACK_PORCH - 1);/* 设置TLI层窗口的上边界位置 */tli_layer_init_struct.layer_window_toppos = 150 + VERTICAL_SYNCHRONOUS_PULSE + VERTICAL_BACK_PORCH;/* 设置TLI层窗口的下边界位置 */tli_layer_init_struct.layer_window_bottompos = (150 + 100 + VERTICAL_SYNCHRONOUS_PULSE +VERTICAL_BACK_PORCH - 1);/* 设置TLI层的颜色格式为RGB565 */tli_layer_init_struct.layer_ppf = LAYER_PPF_RGB565;/* 设置层的饱和度调整因子为最大值 */tli_layer_init_struct.layer_sa = 0xFF;/* 设置层的默认蓝色成分值为最大值 */tli_layer_init_struct.layer_default_blue = 0xFF;/* 设置层的默认绿色成分值为最大值 */tli_layer_init_struct.layer_default_green = 0xFF;/* 设置层的默认红色成分值为最大值 */tli_layer_init_struct.layer_default_red = 0xFF;/* 设置层的默认透明度为不透明 */tli_layer_init_struct.layer_default_alpha = 0x0;/* 设置层的ACF1属性为PASA */tli_layer_init_struct.layer_acf1 = LAYER_ACF1_PASA;/* 设置层的ACF2属性为PASA */tli_layer_init_struct.layer_acf2 = LAYER_ACF2_PASA;/* 设置层的帧缓冲区地址 */tli_layer_init_struct.layer_frame_bufaddr = (uint32_t)gImage_logo;/* 设置层的帧缓冲区每行字节数 */tli_layer_init_struct.layer_frame_line_length = ((320 * 2) + 3);/* 设置层的帧缓冲区步长 */tli_layer_init_struct.layer_frame_buf_stride_offset = (320 * 2);/* 设置层的总行数 */tli_layer_init_struct.layer_frame_total_line_number = 100;/* 初始化TLI层0并应用配置 */tli_layer_init(LAYER0, &tli_layer_init_struct);
}
/** 函数名称:ipa_config* 功能描述:初始化并配置IPA(图像处理加速器),包括设置像素格式转换模式、目标内存地址、前景图等。* 参数说明:baseaddress - 输入前景图像 的基础地址。* 返回值:无。*/
static void ipa_config(uint32_t baseaddress)
{ipa_destination_parameter_struct  ipa_destination_init_struct; // 定义IPA目标配置结构体ipa_foreground_parameter_struct   ipa_fg_init_struct; // 定义IPA前景图配置结构体// 启用IPA的时钟rcu_periph_clock_enable(RCU_IPA);// 初始化IPAipa_deinit();/* 配置IPA像素格式转换模式 */ipa_pixel_format_convert_mode_set(IPA_FGTODE);/* 配置目标像素格式 */ipa_destination_init_struct.destination_pf = IPA_DPF_RGB565;/* 配置目标内存基地址 */ipa_destination_init_struct.destination_memaddr = (uint32_t)&blended_address_buffer;/* 配置目标预定义的Alpha值(RGB) */ipa_destination_init_struct.destination_pregreen = 0;ipa_destination_init_struct.destination_preblue = 0;ipa_destination_init_struct.destination_prered = 0;ipa_destination_init_struct.destination_prealpha = 0;/* 配置目标行偏移量 */ipa_destination_init_struct.destination_lineoff = 0;/* 配置待处理图像的高度 */ipa_destination_init_struct.image_height = 118;/* 配置待处理图像的宽度 */ipa_destination_init_struct.image_width = 247;ipa_destination_init_struct.image_rotate = DESTINATION_ROTATE_0;ipa_destination_init_struct.image_hor_decimation = DESTINATION_HORDECIMATE_DISABLE;ipa_destination_init_struct.image_ver_decimation = DESTINATION_VERDECIMATE_DISABLE;/* 初始化IPA目标配置 */ipa_destination_init(&ipa_destination_init_struct);/* 配置IPA前景图初始化结构体 *//* baseaddress: 前景图内存地址的起始位置 */ipa_fg_init_struct.foreground_memaddr = baseaddress;/* 设置前景图的像素格式为RGB565 */ipa_fg_init_struct.foreground_pf = FOREGROUND_PPF_RGB565;/* 设置前景图的透明度计算模式为模式0 */ipa_fg_init_struct.foreground_alpha_algorithm = IPA_FG_ALPHA_MODE_0;/* 设置前景图的预透明值为0 */ipa_fg_init_struct.foreground_prealpha = 0x0;/* 设置前景图的行偏移为0 */ipa_fg_init_struct.foreground_lineoff = 0x0;/* 设置前景图的预蓝色值为0 */ipa_fg_init_struct.foreground_preblue = 0x0;/* 设置前景图的预绿色值为0 */ipa_fg_init_struct.foreground_pregreen = 0x0;/* 设置前景图的预红色值为0 */ipa_fg_init_struct.foreground_prered = 0x0;/* 前景图初始化 */ipa_foreground_init(&ipa_fg_init_struct);
}/*!\brief      configure TLI peripheral and display blend image这个函数负责配置TLI(Thin-Layer Interface)以进行图像的混合显示。在此函数中,通常会进行层(Layer)的配置,包括层的背景色、透明度、图像数据源等。它可能还会设置图像的大小、位置以及如何将多个图像层混合在一起显示的具体参数。\param[in]  none\param[out] none\retval     none
*/
static void tli_blend_config(void)
{// 初始化TLI(Terminal Layer Interface)相关的参数和硬件设置// 此段代码主要配置TLI的时钟源、PLL2的输入输出时钟范围,并启用PLL2时钟输出。tli_parameter_struct               tli_init_struct;tli_layer_parameter_struct         tli_layer_init_struct;rcu_periph_clock_enable(RCU_TLI);  // 启用TLI的外设时钟tli_gpio_config();                 // 配置TLI相关的GPIO/* 配置PLL2的输入时钟范围和输出时钟范围 */rcu_pll_input_output_clock_range_config(IDX_PLL2, RCU_PLL2RNG_1M_2M, RCU_PLL2VCO_150M_420M);/* 配置PLL2时钟:CK_PLL2P/CK_PLL2Q/CK_PLL2R = HXTAL_VALUE / 25 * 150 / 3 */if(ERROR == rcu_pll2_config(25, 150, 3, 3, 3)) {while(1) {}}/* 启用PLL2R时钟输出 */rcu_pll_clock_output_enable(RCU_PLL2R);rcu_tli_clock_div_config(RCU_PLL2R_DIV8);  // 配置TLI时钟分频rcu_osci_on(RCU_PLL2_CK);  // 开启PLL2时钟if(ERROR == rcu_osci_stab_wait(RCU_PLL2_CK)) {  // 等待PLL2时钟稳定while(1) {}}/** 配置TLI(Transport Layer Interface)参数结构体* 本段代码主要负责初始化TLI参数结构体,并设置LCD显示时序配置和背景颜色。*//* 配置TLI参数结构体中的信号极性 */tli_init_struct.signalpolarity_hs = TLI_HSYN_ACTLIVE_LOW;  /* 水平同步信号极性配置为活动低电平 */tli_init_struct.signalpolarity_vs = TLI_VSYN_ACTLIVE_LOW;  /* 垂直同步信号极性配置为活动低电平 */tli_init_struct.signalpolarity_de = TLI_DE_ACTLIVE_LOW;    /* 数据使能信号极性配置为活动低电平 */tli_init_struct.signalpolarity_pixelck = TLI_PIXEL_CLOCK_TLI; /* 像素时钟极性配置 *//* 配置LCD显示时序 */tli_init_struct.synpsz_hpsz = HORIZONTAL_SYNCHRONOUS_PULSE - 1;  /* 水平同步脉冲宽度配置 */tli_init_struct.synpsz_vpsz = VERTICAL_SYNCHRONOUS_PULSE - 1;    /* 垂直同步脉冲宽度配置 */tli_init_struct.backpsz_hbpsz = HORIZONTAL_SYNCHRONOUS_PULSE + HORIZONTAL_BACK_PORCH - 1;  /* 水平方向后 porch 宽度配置 */tli_init_struct.backpsz_vbpsz = VERTICAL_SYNCHRONOUS_PULSE + VERTICAL_BACK_PORCH - 1;      /* 垂直方向后 porch 宽度配置 */tli_init_struct.activesz_hasz = HORIZONTAL_SYNCHRONOUS_PULSE + HORIZONTAL_BACK_PORCH + ACTIVE_WIDTH- 1; /* 水平方向活动区域宽度配置 */tli_init_struct.activesz_vasz = VERTICAL_SYNCHRONOUS_PULSE + VERTICAL_BACK_PORCH + ACTIVE_HEIGHT - 1; /* 垂直方向活动区域高度配置 */tli_init_struct.totalsz_htsz = HORIZONTAL_SYNCHRONOUS_PULSE + HORIZONTAL_BACK_PORCH + ACTIVE_WIDTH +HORIZONTAL_FRONT_PORCH - 1;  /* 水平方向总线周期配置 */tli_init_struct.totalsz_vtsz = VERTICAL_SYNCHRONOUS_PULSE + VERTICAL_BACK_PORCH + ACTIVE_HEIGHT +VERTICAL_FRONT_PORCH - 1;     /* 垂直方向总线周期配置 *//* 配置LCD背景颜色(红色、绿色、蓝色) */tli_init_struct.backcolor_red = 0xFF;   /* 背景红色值配置 */tli_init_struct.backcolor_green = 0xFF; /* 背景绿色值配置 */tli_init_struct.backcolor_blue = 0xFF;  /* 背景蓝色值配置 *//* 应用TLI初始化结构体配置 */tli_init(&tli_init_struct);  /** TLI(Transfer Layer Interface)层1配置* 此代码段初始化TLI层1的设置,包括窗口位置、像素格式、默认颜色及缓冲区配置等。*//* 设置TLI层1的窗口左边界位置 */tli_layer_init_struct.layer_window_leftpos = 80 + HORIZONTAL_SYNCHRONOUS_PULSE +HORIZONTAL_BACK_PORCH + 2;/* 设置TLI层1的窗口右边界位置 */tli_layer_init_struct.layer_window_rightpos = (80 + 247 + HORIZONTAL_SYNCHRONOUS_PULSE +HORIZONTAL_BACK_PORCH - 1);/* 设置TLI层1的窗口上边界位置 */tli_layer_init_struct.layer_window_toppos = 20 + VERTICAL_SYNCHRONOUS_PULSE + VERTICAL_BACK_PORCH;/* 设置TLI层1的窗口下边界位置 */tli_layer_init_struct.layer_window_bottompos = 20 + 118 + VERTICAL_SYNCHRONOUS_PULSE +VERTICAL_BACK_PORCH - 1;/* 配置TLI层1的像素格式为RGB565 */tli_layer_init_struct.layer_ppf = LAYER_PPF_RGB565;/* 设置层的alpha混合因子为全透 */tli_layer_init_struct.layer_sa = 0xFF;/* 配置层的ACF1参数为PASA */tli_layer_init_struct.layer_acf1 = LAYER_ACF1_PASA;/* 配置层的ACF2参数为PASA */tli_layer_init_struct.layer_acf2 = LAYER_ACF2_PASA;/* 设置层的默认Alpha值为0 */tli_layer_init_struct.layer_default_alpha = 0;/* 设置层的默认蓝色值为0 */tli_layer_init_struct.layer_default_blue = 0;/* 设置层的默认绿色值为0 */tli_layer_init_struct.layer_default_green = 0;/* 设置层的默认红色值为0 */tli_layer_init_struct.layer_default_red = 0;/* 设置层的帧缓冲区地址 */tli_layer_init_struct.layer_frame_bufaddr = (uint32_t)&blended_address_buffer;/* 设置层的帧缓冲区每行长度 */tli_layer_init_struct.layer_frame_line_length = ((247 * 2) + 3);/* 设置层的帧缓冲区步长偏移 */tli_layer_init_struct.layer_frame_buf_stride_offset = (247 * 2);/* 设置层的帧缓冲区总行数 */tli_layer_init_struct.layer_frame_total_line_number = 118;/* 初始化TLI层1 */tli_layer_init(LAYER1, &tli_layer_init_struct);
}
/*!\brief      configure TLI GPIO\param[in]  none\param[out] none\retval     none
*/
static void tli_gpio_config(void)
{/* enable GPIO clock */rcu_periph_clock_enable(RCU_GPIOA);rcu_periph_clock_enable(RCU_GPIOB);rcu_periph_clock_enable(RCU_GPIOC);rcu_periph_clock_enable(RCU_GPIOD);rcu_periph_clock_enable(RCU_GPIOE);rcu_periph_clock_enable(RCU_GPIOF);rcu_periph_clock_enable(RCU_GPIOH);rcu_periph_clock_enable(RCU_GPIOG);/* configure HSYNC(PE15), VSYNC(PA7), PCLK(PG7) */gpio_af_set(GPIOE, GPIO_AF_14, GPIO_PIN_15);gpio_af_set(GPIOA, GPIO_AF_14, GPIO_PIN_7);gpio_af_set(GPIOG, GPIO_AF_14, GPIO_PIN_7);gpio_mode_set(GPIOE, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_15);gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_15);gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_7);gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_7);gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_7);gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_7);/* configure LCD_R7(PG6), LCD_R6(PH12), LCD_R5(PH11), LCD_R4(PA5), LCD_R3(PH9),LCD_R2(PH8),LCD_R1(PH3), LCD_R0(PH2) */gpio_af_set(GPIOG, GPIO_AF_14, GPIO_PIN_6);gpio_af_set(GPIOH, GPIO_AF_14, GPIO_PIN_12);gpio_af_set(GPIOH, GPIO_AF_14, GPIO_PIN_11);gpio_af_set(GPIOA, GPIO_AF_14, GPIO_PIN_5);gpio_af_set(GPIOH, GPIO_AF_14, GPIO_PIN_9);gpio_af_set(GPIOH, GPIO_AF_14, GPIO_PIN_8);gpio_af_set(GPIOH, GPIO_AF_14, GPIO_PIN_3);gpio_af_set(GPIOH, GPIO_AF_14, GPIO_PIN_2);gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_6);gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_6);gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_12);gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_12);gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_11);gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_11);gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_5);gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_5);gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_9);gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_9);gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8);gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_8);gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_3);gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_3);gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_2);gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_2);/* configure  LCD_G7(PD3), LCD_G6(PC7), LCD_G5(PC1), LCD_G4(PH15), LCD_G3(PH14), LCD_G2(PH13),LCD_G1(PB0), LCD_G0(PB1) */gpio_af_set(GPIOD, GPIO_AF_14, GPIO_PIN_3);gpio_af_set(GPIOC, GPIO_AF_14, GPIO_PIN_7);gpio_af_set(GPIOC, GPIO_AF_14, GPIO_PIN_1);gpio_af_set(GPIOH, GPIO_AF_14, GPIO_PIN_15);gpio_af_set(GPIOH, GPIO_AF_14, GPIO_PIN_14);gpio_af_set(GPIOH, GPIO_AF_14, GPIO_PIN_13);gpio_af_set(GPIOB, GPIO_AF_14, GPIO_PIN_0);gpio_af_set(GPIOB, GPIO_AF_14, GPIO_PIN_1);gpio_mode_set(GPIOD, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_3);gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_3);gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_7);gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_7);gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_1);gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_1);gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_15);gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_15);gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_14);gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_14);gpio_mode_set(GPIOH, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_13);gpio_output_options_set(GPIOH, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_13);gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_0);gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_0);gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_1);gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_1);/* configure LCD_B7(PB9), LCD_B6(PB8), LCD_B5(PB5), LCD_B4(PC11), LCD_B3(PG11),LCD_B2(PG10), LCD_B1(PG12), LCD_B0(PG14) */gpio_af_set(GPIOB, GPIO_AF_14, GPIO_PIN_9);gpio_af_set(GPIOB, GPIO_AF_14, GPIO_PIN_8);gpio_af_set(GPIOB, GPIO_AF_3, GPIO_PIN_5);gpio_af_set(GPIOC, GPIO_AF_14, GPIO_PIN_11);gpio_af_set(GPIOG, GPIO_AF_14, GPIO_PIN_11);gpio_af_set(GPIOG, GPIO_AF_14, GPIO_PIN_10);gpio_af_set(GPIOG, GPIO_AF_14, GPIO_PIN_12);gpio_af_set(GPIOG, GPIO_AF_14, GPIO_PIN_14);gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_9);gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_9);gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8);gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_8);gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_5);gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_5);gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_11);gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_11);gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_11);gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_11);gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_10);gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_10);gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_12);gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_12);gpio_mode_set(GPIOG, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_14);gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_14);/* configure LCD_DE(PF10) */gpio_af_set(GPIOF, GPIO_AF_14, GPIO_PIN_10);gpio_mode_set(GPIOF, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_10);gpio_output_options_set(GPIOF, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_10);/* LCD PWM BackLight(PG13) */gpio_mode_set(GPIOG, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_PIN_13);gpio_output_options_set(GPIOG, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_13);gpio_bit_set(GPIOG, GPIO_PIN_13);
}/*!\brief      enable the CPU cache\param[in]  none\param[out] none\retval     none
*/
static void cache_enable(void)
{/* enable i-Cache */SCB_EnableICache();/* enable d-Cache */SCB_EnableDCache();
}

相关文章:

【兆易创新GD32H759I-EVAL开发板】 TLI(TFT LCD Interface)用法详细介绍

大纲 1. 引言 2. TLI外设特点 3. TLI硬件架构 4. TLI寄存器功能 5. TLI的配置和使用步骤 6. TLI图层概念 7. 图像处理和显示优化 8. 基于GD32H759I-EVAL开发板的TLI应用示例 1. 引言 在当今的嵌入式系统设计中&#xff0c;图形用户界面&#xff08;GUI&#xff09;的应…...

恒创科技:什么是BGP线路服务器?BGP机房的优点是什么?

在当今的互联网架构中&#xff0c;BGP(边界网关协议)线路服务器和BGP机房扮演着至关重要的角色。BGP作为一种用于在自治系统(AS)之间交换路由信息的路径向量协议&#xff0c;它确保了互联网上的数据能够高效、准确地从一个地方传输到另一个地方。那么&#xff0c;究竟什么是BGP…...

苍穹外卖-day04:项目实战-套餐管理(新增套餐,分页查询套餐,删除套餐,修改套餐,起售停售套餐)业务类似于菜品模块

苍穹外卖-day04 课程内容 新增套餐套餐分页查询删除套餐修改套餐起售停售套餐 要求&#xff1a; 根据产品原型进行需求分析&#xff0c;分析出业务规则设计接口梳理表之间的关系&#xff08;分类表、菜品表、套餐表、口味表、套餐菜品关系表&#xff09;根据接口设计进行代…...

深入探索C与C++的混合编程

实现混合编程的技术细节 混合使用C和C可能由多种原因驱动。一方面&#xff0c;现有的大量优秀C语言库为特定任务提供了高效的解决方案&#xff0c;将这些库直接应用于C项目中可以节省大量的开发时间和成本。另一方面&#xff0c;C的高级特性如类、模板和异常处理等&#xff0c;…...

数组中的flat方法如何实现

数组的成员有时还是数组&#xff0c;Array.prototype.flat()用于将嵌套的数组“拉平”&#xff0c;变成一维的数组。该方法返回一个新数组&#xff0c;对原数据没有影响。 [1, 2, [3, 4]].flat() // [1, 2, 3, 4]那flat怎么来实现呢&#xff1f; 1、使用while循环 实现的代码…...

计算机考研|北航北理北邮怎么选?

北航985&#xff0c;北理985&#xff0c;北邮211 虽然北邮事211&#xff0c;但是北邮的计算机实力一点也不弱&#xff0c;学科评级&#xff0c;计算机是A 北航计算机评级也是A&#xff0c;北理的计算机评级是A- 所以&#xff0c;这三所学校在实力上来说&#xff0c;真的大差…...

面试算法-52-对称二叉树

题目 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 解 class Solution {public boolean isSymmetric(TreeNode root) {return dfs(root, root);}public boolean dfs(Tr…...

独立维基和验收测试框架 Fitnesse 入门介绍

拓展阅读 junit5 系列教程 基于 junit5 实现 junitperf 源码分析 Auto generate mock data for java test.(便于 Java 测试自动生成对象信息) Junit performance rely on junit5 and jdk8.(java 性能测试框架。压测测试报告生成。) Fitnesse 完全集成的独立维基和验收测试…...

AI 初创公司趋势:Y Combinator 最新批次的见解

总部位于硅谷的著名创业加速器 Y Combinator (YC) 最近宣布了其 2023 年冬季队列&#xff0c;不出所料&#xff0c;约 31% 的初创公司&#xff08;269 家中有 80 家&#xff09;拥有自我报告的 AI 标签。在这篇文章中&#xff0c;我分析了这批 20-25 家初创公司&#xff0c;以了…...

tts语音合成原理

TTS&#xff08;Text-to-Speech&#xff0c;文本到语音&#xff09;语音合成技术是一种将文本数据转换为可听见的语音输出的技术。它允许计算机和其他电子设备读出文字信息&#xff0c;使得用户可以通过听的方式接收信息。TTS技术在无障碍服务、智能助手、语音导航、有声读物等…...

轮转数组题解

链接&#xff1a;189. 轮转数组 - 力扣&#xff08;LeetCode&#xff09; 这个题目很简单&#xff0c;因为说到了 k 是一个非负数&#xff0c;那么我们就可以 求模的时候就不用考虑的下标还会越界了&#xff0c;往右边 移动 其实就是当前下标 ik ,为了保证它能头尾相接并且不越…...

sqllab第二十四关通关笔记

知识点&#xff1a; 二次注入 先埋一个炸弹&#xff0c;然后通过其他路径引爆它 查看界面发现是一个登录框&#xff0c;尝试进行登录框的注入发现这里不存在注入点 那么就注册一个新的账户吧 通过点击注册&#xff0c;进入注册面板&#xff0c;注册一个新的账户 用户名为 re…...

web前端之多行文本擦除效果、文本逐个显示或展示、创建元素标签、querySelector、createElement、appendChild、requestAnimationFrame

MENU 版本一(requestAnimationFrame)版本二(setTimeout)版本三(css) 版本一(requestAnimationFrame) 前言 window.requestAnimationFrame()告诉浏览器——你希望执行一个动画&#xff0c;并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数…...

一文解读ISO26262安全标准:功能安全管理

一文解读ISO26262安全标准&#xff1a;功能安全管理 1 安全生命周期1.1 概念阶段1.2 产品开发阶段1.3 生产发布后续阶段 2 安全管理的角色和职责3 安全活动的裁剪4 安全活动的评审5 安全活动的评估6 交付物 下文的表中&#xff0c;一些方法的推荐等级说明&#xff1a; “”表示…...

【华为OD机试】找座位【C卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 在一个大型体育场内举办了一场大型活动,由于疫情防控的需要, 要求每位观众的必须间隔至少一个空位才允许落座。 现在给出一排观众座位分布图,座位中存在已落座的观众,请计算出, 在不移…...

LarkXR上新了 | Apollo多终端与XR体验的优化创新

作为领先的数字平行世界产品技术提供方&#xff0c;「Paraverse平行云」一直致力于为企业和开发者提供企业级实时云渲染解决方案。其多终端接入产品LarkXR Apollo&#xff0c;基于底层Runtime技术&#xff0c;实现了在Windows、Linux、MacOS、Android、iOS等多种操作系统下&…...

车载电子电器架构 - 网络拓扑

车载电子电器架构 - 网络拓扑 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师 (Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝完再挣扎,出门靠…...

2024蓝桥杯每日一题(DFS)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一&#xff1a;奶牛选美 试题二&#xff1a;树的重心 试题三&#xff1a;大臣的差旅费 试题四&#xff1a;扫雷 试题一&#xff1a;奶牛选美 【题目描述】 听说最近两斑点的奶牛最受欢迎&#xff0c;…...

Docker 笔记(五)--链接

这篇笔记记录了Docker 的Link。 官方文档&#xff1a; Legacy container links - Communication across links 目录 参考Legacy container linksConnect using network port mappingConnect with the linking systemThe importance of naming Communication across linksEnviro…...

如何处理Android悬浮弹窗双击返回事件?

目录 1 前言 1.1 准备知识 1.2 问题概述 2 解决方案 3 代码部分 3.1 动态更新窗口焦点 3.2 窗口监听返回事件 3.3 判断焦点是否在窗口内部 3.4 窗口监听焦点移入/移出 4 注意事项 4.1 窗口范围 4.2 空隙处的返回事件处理 1 前言 1.1 准备知识 1&#xff09;开发环…...

高可用篇_A Docker容器化技术_II Docker环境搭建和常见命令

原创作者&#xff1a;田超凡&#xff08;程序员田宝宝&#xff09; 版权所有&#xff0c;引用请注明原作者&#xff0c;严禁复制转载 Docker安装 Docker 要求 CentOS7 系统的内核版本在 3.10以上 &#xff0c;查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。 …...

Vue.js+SpringBoot开发食品生产管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 加工厂管理模块2.2 客户管理模块2.3 食品管理模块2.4 生产销售订单管理模块2.5 系统管理模块2.6 其他管理模块 三、系统展示四、核心代码4.1 查询食品4.2 查询加工厂4.3 新增生产订单4.4 新增销售订单4.5 查询客户 五、…...

Python面试笔记

Python面试笔记 PythonQ. Python中可变数据类型与不可变数据类型&#xff0c;浅拷贝与深拷贝详解Q. 解释什么是lambda函数&#xff1f;它有什么好处&#xff1f;Q. 什么是装饰器&#xff1f;Q. 什么是Python的垃圾回收机制&#xff1f;Q. Python内置函数dir的用法&#xff1f;Q…...

springboot 查看和修改内置 tomcat 版本

解析Spring Boot父级依赖 去到项目的根pom文件中&#xff0c;找到parent依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>${springboot.version}…...

003——移植鸿蒙

目录 一、顶层Make分析 二、添加一个新的单板 2.1 Kconfig 2.2 Makefile 2.2.1 顶层Makefile 2.2.2 platform下的Makefile 2.2.3 platform下的bsp.mk文件 2.3 编译与调试 2.4 解决链接错误 三、内核启动流程的学习 3.1 韦东山老师总结的启动四步 3.2 启动文件分析…...

罗马数字转整数-力扣通过自己编译器编译

学会将力扣题目用自己自带的编译软件编译---纯自己想的本题解法 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如&#xff0c; 罗马数字 2 写做 II &#xff0c;即为两…...

深入解析JVM加载机制

一、背景 Java代码被编译器变成生成Class字节码&#xff0c;但字节码仅是一个特殊的二进制文件&#xff0c;无法直接使用。因此&#xff0c;都需要放到JVM系统中执行&#xff0c;将Class字节码文件放入到JVM的过程&#xff0c;简称类加载。 二、整体流程 三、阶段逻辑分析 3…...

python redis中blpop和lpop的区别

python redis中lpop()方法是获取并删除左边第一个对象。 def lpop(self,name: str,count: Optional[int] None,) -> Union[Awaitable[Union[str, List, None]], Union[str, List, None]]:"""Removes and returns the first elements of the list name.By de…...

第四百一十回

文章目录 1. 概念介绍2. 方法与细节2.1 获取方法2.2 使用细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取当前系统语言"相关的内容&#xff0c;本章回中将介绍如何获取时间戳.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章…...

程序员的README——编写可维护的代码(一)

用户行为不可预测&#xff0c;网络不可靠&#xff0c;事情总会出错。生产环境下的软件必须一直保持可用状态。 编写可维护的代码有助于你应对不可预见的情况&#xff0c;可维护的代码有内置的保护、诊断和控制。 切记通过安全和有弹性的编码实践进行防御式编程来保护你的系统&a…...

网站制作 牛商网/百度指数分析官网

1、动画&#xff08;头部-开始动画&#xff09; [UIView beginAnimations:nil context:nil]; 2、设置动画的执行时间 [UIView setAnimationDuration:2.0]; // 默认时间是1/4秒&#xff0c;可根据自己需要设置 3、设置向上移动 CGRect temFrame _btn.frame; temFrame.origin.y …...

营销型网站建设网站建设资讯/杭州今天查出多少阳性

之前的文章 Kubernetes Pod 中的 ConfigMap 更新 中&#xff0c;我总结了三种 ConfigMap 或 Secret 的更新方法: 通过 Kubelet 的周期性 Remount 做热更新&#xff0c;通过修改对象中的 PodTemplate 触发滚动更新&#xff0c;以及通过自定义 Controller 监听 ConfigMap 触发更新…...

淘宝网站建设靠不靠谱/今日国际新闻最新消息

思路对于一个数N&#xff0c;N的最高位数值为T,N长度为L ,那么我们可以吧N分为两个部分 &#xff0c;令MN-T*10^(L-1)1, 分割为[0,M-1] 和 [M,A]两个部分&#xff0c;第一个部分可以用递归来求解&#xff0c; 第二个部分要计算了&#xff0c; 首先我们知道 000~999当中存在一的…...

骏域网站建设专家/百度云网盘资源

2019独角兽企业重金招聘Python工程师标准>>> ubuntu增加右键命令&#xff1a;在终端中打开 软件中心&#xff1a;搜索nautilus-open-terminal安装 命令行&#xff1a;sudo apt-get install nautilus-open-terminal 重新加载文件管理器 nautilus -q 或注销再登录 转载…...

新疆建设工程信息网官方网站/安卓神级系统优化工具

为了方便大家对博客园的捐助, 现在采用网上支付的方式进行捐款。 网上支付平台&#xff1a;网银在线 网上支付地址&#xff1a;http://www.cnblogs.com/begincontribute.aspx 捐助者签名&#xff1a;http://www.cnblogs.com/dudu/articles/134340.html 详…...

郑州建设工程信息网官网首页/谷歌优化技巧

新华网北京5月24日电 今日&#xff0c;清华大学量子信息班正式成立&#xff0c;由图灵奖得主、中国科学院院士姚期智担任首席教授。据了解&#xff0c;这是清华大学首个量子信息方向的本科人才培养项目&#xff0c;也是继计算机科学实验班、人工智能班之后&#xff0c;姚期智创…...