当前位置: 首页 > 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();
}

相关文章:

  • MySQL调优之SQL语句
  • 从历年315曝光案例,看APP隐私合规安全
  • el-form 的表单校验,如何验证某一项或者多项;validateField 的使用
  • 面试经典-34-验证回文串
  • Github主页设置贪吃蛇详细教程
  • 对AQS的理解
  • coingecko获取token price --php版
  • PTA模拟+数学分析
  • Linux中的文件类型
  • 分享常用的62 个九宫格抽奖及各种宫格效果源码
  • 【Linux】Centos7上安装MySQL5.7
  • phpstudy自定义安装mysql8.3并启动
  • Seata中四种模式的适用场景
  • Atomsk球形化合物建模方法
  • MySQL---索引
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Js基础知识(一) - 变量
  • scala基础语法(二)
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • 讲清楚之javascript作用域
  • 聊聊sentinel的DegradeSlot
  • 区块链共识机制优缺点对比都是什么
  • 如何解决微信端直接跳WAP端
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 学习Vue.js的五个小例子
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 进程与线程(三)——进程/线程间通信
  • # C++之functional库用法整理
  • #if 1...#endif
  • %check_box% in rails :coditions={:has_many , :through}
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)Oracle存储过程编写经验和优化措施
  • .Mobi域名介绍
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .Net Remoting常用部署结构
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .NET 分布式技术比较
  • .net打印*三角形
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • .NET中两种OCR方式对比
  • .sdf和.msp文件读取
  • /bin、/sbin、/usr/bin、/usr/sbin
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • @Resource和@Autowired的区别