你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STM32N6570-DK评测】测试LCD显示

[复制链接]
TLLED 发布时间:2025-2-18 15:02
0 f* F3 L9 k8 F

2 }5 P* }/ r: `$ e2 ~! t. E

9 Q% ?& N6 T2 H$ @/ L3 }- y. u一、硬件部分0 o! H# N7 {0 f2 e) d+ O( L
1.1、LCD显示屏硬件接口部分电路
% v6 A0 N' x9 N8 w! u lcd.png
" T3 O4 Z* g8 t$ I5 \

# ^. V$ ?/ D1 P- f/ W9 S3 T
' g+ U: Z! ~% L! u8 g: V3 T/ J& D4 K. y' R( d( m
" R3 {  _* G  F- e
3 O5 d+ x, c# S2 _& _
1.2、LTDC显示内部框图
5 |+ M* y2 u4 W; o! N5 s# GLTDC可驱动24位的RGB显示屏,内部有两个显示层% b$ k6 V) ]- r
002.png
# m6 [: @! n) l
8 ^9 p& V- h! [4 w2 Q/ L4 A

+ b8 Z% X( k3 H, `9 H
) ?, G8 L" a" ]- o. K2 ]+ Y! S
二、配置LTDC( l/ H' w6 J- x. D2 Q" @# ]
: E- }0 V$ u8 u( w
2.1、屏幕的参数设置- \9 Z8 ~6 R" t1 Z
003.png
4 E: d1 P7 Q  L6 J$ s
* p; i2 M5 i" s" x3 {  {/ _

. p, w& x" Z( n4 v% ^' T  X2 }2.2、层参数设置
/ a8 X  g: B; Z, y" A: d$ ? 004.png
3 ~4 L8 X( G6 x  z% ]
1 f/ I7 B( r. j
; e+ q$ q! z1 D) }, y8 H

) t( I% h5 q5 E) c+ T4 G2 u! L2.3、LTDC引脚设置6 v: N+ d, r( x9 c
005.png
# E. i$ x! k9 v$ t* W* G5 N7 g
' u" Y0 K( h% {, t% ]& @2 ^# Q

* `0 v& h" ?. l2 r) E2 T

5 h+ E# S( ~. s0 a$ ?, n* s: A5 j! J三、程序部分+ k$ E) j1 A8 ]' M! |5 W8 \5 j
; _0 K9 O; o3 ^/ W* a
3.1、在项目中添加LCD驱动程序) d% Q! t3 ?, P" [" m
使用官方BSP中的LCD驱动程序: J* K* b/ S6 l" [1 a- c
stm32n6570_discovery_lcd.c  v5 G. g; O3 Q0 G

3 K5 n; f, Y1 n# `# q. T
  1. /**
    7 C! o5 v9 e) O% t# L' v' I
  2.   ******************************************************************************
    4 J* R0 c  y" h) ]0 K
  3.   * @file    stm32n6570_discovery_lcd.c! u1 l8 O' ]' p3 M+ \1 q$ C
  4.   * @author  MCD Application Team! \! G( g9 @* l: c( \# F
  5.   * @brief   This file includes the driver for Liquid Crystal Display (LCD) module& c& d' x, M$ z# m6 Z
  6.   *          mounted on STM32N6570_DK board.
    + u" V2 \# }' L) |
  7.   ******************************************************************************& H9 R7 g: |6 y
  8.   * @attention
    1 N: l$ H! Y# J/ R; O' z, i
  9.   *3 h6 J& j3 ]7 s4 N/ c
  10.   * Copyright (c) 2022 STMicroelectronics.6 @4 n; O7 L4 Q. ~/ I- J
  11.   * All rights reserved.
    2 c4 H9 G, J/ [; K1 G) \; K" k1 \
  12.   *
    7 t' I' U& m9 z8 _8 H! S4 t
  13.   * This software is licensed under terms that can be found in the LICENSE file
    , \$ L+ N3 O. ~0 J3 B8 n
  14.   * in the root directory of this software component.
    . T+ U' v. S9 k+ T) s% Z8 ~
  15.   * If no LICENSE file comes with this software, it is provided AS-IS.
    ! U8 a" ]- _- Q, c' Z' i$ f
  16.   *
    9 x# p# x7 c* x, `2 y& z, K% `$ v" E
  17.   ******************************************************************************
    % J- n% E3 n8 a
  18.   @verbatim) {2 R+ }" R9 q  X! W8 D0 k
  19.   How To use this driver:
    6 o( |* v7 S' D, ]# [
  20.   --------------------------7 p$ O1 m1 z# A
  21.    - This driver is used to drive directly a LCD TFT using the LTDC controller.! z! B! O. G; L2 ~) \# D
  22.    - This driver uses the adequate timing and setting for the RK050HR18 LCD component
    ' }( v! C; j! V2 g. N3 d/ j

  23. & Y$ ^7 Z. H! K, l
  24.   Driver description:
    / T; n  v* l7 [4 w  u
  25.   ---------------------
    ; l6 n8 D, t9 c5 y, s3 C
  26.    + Initialization steps:+ P& [8 e$ {% J' L
  27.      o Initialize the LCD in default mode using the BSP_LCD_Init() function with the
    - d$ p3 X0 v; Q3 j+ P# [
  28.        following settings:* w: B* {' n. j: b
  29.         - Pixelformat : LCD_PIXEL_FORMAT_RGB888
    $ ]4 f: t  ^/ d. ?' E
  30.         - Orientation : LCD_ORIENTATION_LANDSCAPE.
    & K; X7 X8 a, ~7 R/ [
  31.         - Width       : LCD_DEFAULT_WIDTH (800)- j8 ]9 I9 d! c$ q
  32.         - Height      : LCD_DEFAULT_HEIGHT(480)
    ; n" Y& g' s1 j
  33.        The default LTDC layer configured is layer 0." Z& B  `! F! ?2 n1 x, d. S; ]0 M
  34.        BSP_LCD_Init() includes LTDC, LTDC Layer and clock configurations by calling:
    / T, `/ v9 D4 n6 r8 G2 v5 P
  35.         - MX_LTDC_ClockConfig()
    + z, ]4 g# d5 A9 K4 ^* A2 ?
  36.         - MX_LTDC_Init()5 y1 P4 k/ p/ L  j. m. R! ?' m
  37.         - MX_LTDC_ConfigLayer()
    , G, u8 X, x. t2 e& g& V" m! v( q
  38. . ?/ t8 B1 N# ~
  39.      o Initialize the LCD with required parameters using the BSP_LCD_InitEx() function.
    9 t- P; L$ B: Y- V
  40. 5 ~% i. s& ~5 H1 V  B# d9 K
  41.      o Select the LCD layer to be used using the BSP_LCD_SelectLayer() function.) F6 z! v; P& S4 R: ?7 V3 r
  42.      o Enable the LCD display using the BSP_LCD_DisplayOn() function.8 P- G! f9 k+ h  @, U
  43.      o Disable the LCD display using the BSP_LCD_DisplayOff() function.
    ; h9 I. c3 B; w6 z4 L( U
  44.      o Write a pixel to the LCD memory using the BSP_LCD_WritePixel() function.
    / y+ Q4 F1 `" @. I) S8 M
  45.      o Read a pixel from the LCD memory using the BSP_LCD_ReadPixel() function.9 p) v, f' |. X, X0 ^( H
  46.      o Draw an horizontal line using the BSP_LCD_DrawHLine() function.
      i5 n4 Z- D8 m7 R9 r2 m9 m& f+ Q
  47.      o Draw a vertical line using the BSP_LCD_DrawVLine() function.9 k; t( Z6 V& J1 Y) O2 G
  48.      o Draw a bitmap image using the BSP_LCD_DrawBitmap() function.. G& E% c- n" w
  49. & k3 K/ U3 @7 p1 X/ Z8 C/ O, a' C
  50.    + Options
    9 w6 [4 I% n1 J+ I- q/ }, [
  51.      o Configure the LTDC reload mode by calling BSP_LCD_Reload(). By default, the
    + }  [. K4 c7 Q* B2 X' m! z
  52.        reload mode is set to BSP_LCD_RELOAD_IMMEDIATE then LTDC is reloaded immediately.
    9 a/ _# [- Q# @, ^5 Y
  53.        To control the reload mode:, S2 k) B7 p0 Z
  54.          - Call BSP_LCD_Reload() with ReloadType parameter set to BSP_LCD_RELOAD_NONE, p9 L* ~( |1 Z  A: p5 B
  55.          - Configure LTDC (color keying, transparency ..): ?6 f# j8 T$ _0 w' y$ X. b3 ~3 A. R
  56.          - Call BSP_LCD_Reload() with ReloadType parameter set to BSP_LCD_RELOAD_IMMEDIATE
    4 \/ i" d/ \. \; R
  57.            for immediate reload or BSP_LCD_RELOAD_VERTICAL_BLANKING for LTDC reload- t: k& O- E% @. ?
  58.            in the next vertical blanking6 e! a3 K. ], F5 F
  59.      o Configure LTDC layers using BSP_LCD_ConfigLayer()
    ' [. j. E4 ~4 O5 B/ ]
  60.      o Control layer visibility using BSP_LCD_SetLayerVisible()% H$ }5 V5 B1 {& f' Q6 J
  61.      o Configure and enable the color keying functionality using the: e' W; y: n$ b! b' K
  62.        BSP_LCD_SetColorKeying() function.  J5 L* F" I# \4 w7 G
  63.      o Disable the color keying functionality using the BSP_LCD_ResetColorKeying() function.
    ! h4 M$ e6 i% I1 U8 Y/ L
  64.      o Modify on the fly the transparency and/or the frame buffer address
    # a/ B" s% g. `7 Q
  65.        using the following functions:
    3 ?5 W8 @" m7 w" n* ?) e( d
  66.        - BSP_LCD_SetTransparency()
    " h4 }3 n" {+ T3 ^- H5 {! W- l  N) Q
  67.        - BSP_LCD_SetLayerAddress()) V* ?7 B5 y3 \% m

  68. % g6 ]5 x0 E- E% Y: R
  69.    + Display on LCD2 }9 U+ `8 M+ n
  70.      o To draw and fill a basic shapes (dot, line, rectangle, circle, ellipse, .. bitmap)$ E9 L3 |* C* Z+ p
  71.        on LCD and display text, utility basic_gui.c/.h must be called. Once the LCD is initialized,: A! U+ A) A" j6 D
  72.        user should call GUI_SetFuncDriver() API to link board LCD drivers to BASIC GUI LCD drivers.) `7 P$ b* R2 e) K% p5 H5 f) B3 ?7 `8 x
  73.        The basic gui services, defined in basic_gui utility, are ready for use.) @9 b7 o3 n  E5 y0 V
  74. ' M, d1 n% l( c# n3 j% p
  75.   Note:7 g( C/ c4 R; y- F9 L5 K
  76.   --------
    ' [, P/ z. T4 \* h, G- D! o. m
  77.     Regarding the "Instance" parameter, needed for all functions, it is used to select
    # _$ ~( G! D: j1 z
  78.     an LCD instance. On the STM32N6570 Discovery board, there's one instance. Then, this
    ! f+ s# M9 |8 V
  79.     parameter should be 0.
      y' F' g1 o, e- b6 n9 y
  80. * @" n! C. Q9 u$ b; M
  81.   @endverbatim4 I7 t: }1 t1 i6 n) J9 d5 L, Y
  82.   ******************************************************************************
    $ P6 A& G8 r% w8 o; Y
  83.   */8 m8 ~* O0 L% z4 }3 y4 O

  84. 7 i: b3 c  T7 {1 [$ {: j# b
  85. /* Includes ------------------------------------------------------------------*/
    ; ~! V) n' s2 W1 D! t" ]( s
  86. #include "stm32n6570_discovery_lcd.h"
    + w+ y3 F# ?# C/ B
  87. " P) q& N7 h  ~6 u
  88. /** @addtogroup BSP5 ]7 G3 ~# c  j5 i1 i8 ^" w* t4 A
  89.   * @{
    4 F7 Z& Q, w8 W
  90.   */
    8 G/ ^$ G. A5 j/ D- C( _

  91. ' H+ x0 e+ h& A/ j
  92. /** @addtogroup STM32N6570_DK+ s: @( {9 v% T
  93.   * @{9 c8 P4 n8 k# c6 j( Q
  94.   */5 k; r* D7 S* M  `6 |9 y9 R. v

  95. 7 @, |# z- T4 a+ T; l
  96. /** @defgroup STM32N6570_DK_LCD LCD9 B( w" b# u% E9 l+ p
  97.   * @{
    9 B/ \" m2 N3 j% \
  98.   */4 b# G2 _+ |' m

  99. ( [3 L  A$ D$ l/ Y/ T$ `
  100. /** @defgroup STM32N6570_DK_LCD_Private_Variables LCD Private Variables1 o0 y9 _- m" w9 J# N( k( K4 X0 k
  101.   * @{
    ' L9 p$ _; _4 U1 g
  102.   */
    " R: L* _- m, t  c3 b) i
  103. 5 ^4 N% H! p5 j- |
  104. /**! I/ q+ t# a) h) ]# Z. m
  105.   * @}
    . Q' {5 H1 n; ?: b% l. s
  106.   */
    " r, C8 w5 y$ G, @' u' I! k

  107. 8 E) x' \* a) V& ^* z
  108. /** @defgroup STM32N6570_DK_LCD_Private_TypesDefinitions LCD Private TypesDefinitions" j4 j4 d8 ^# q/ P5 F1 {3 W
  109.   * @{7 \+ @6 ]; {. N' f
  110.   */% \  ?4 Q" M* m( B
  111. const LCD_UTILS_Drv_t LCD_Driver =& _! k9 U* t2 s8 w
  112. {
    5 y% |. t- |- u) C# W3 Q
  113.   BSP_LCD_DrawBitmap,
    ( J4 J1 e9 r6 B' [1 d1 G
  114.   BSP_LCD_FillRGBRect,0 x/ {/ \6 \' A  K
  115.   BSP_LCD_DrawHLine,) N' Q) J. h% }; G1 @/ u" {# f, j- D
  116.   BSP_LCD_DrawVLine,
    : R: C# y* Y$ j( J6 E
  117.   BSP_LCD_FillRect,: D5 N6 ^0 V( r& ~& a+ S3 J0 J
  118.   BSP_LCD_ReadPixel,) P$ Q* ?4 @7 P) J* d
  119.   BSP_LCD_WritePixel,; u- P0 z1 }0 V6 d' d
  120.   BSP_LCD_GetXSize,
    ) V$ q4 o9 i& i9 M
  121.   BSP_LCD_GetYSize,
    . W# w, R7 [! P  z# v6 h& I
  122.   BSP_LCD_SetActiveLayer,! U9 G9 r2 D; G4 H% v( R! ^& r
  123.   BSP_LCD_GetPixelFormat; T3 s- j, N& T4 L( w; I5 V$ ]
  124. };5 [7 M4 s: r5 G1 U& _
  125. 6 q( t% l) X; Z8 K
  126. /**
    ; y1 Q  O% f) U  F3 L
  127.   * @}8 @- N) X; O# t4 V9 b7 v# d  K
  128.   */
    0 l; s( d1 q6 \- ^! f! q+ e

  129. 6 p2 V) Z5 c: @2 U
  130. /** @defgroup STM32N6570_DK_LCD_Exported_Variables LCD Exported Variables2 ~3 e- v% S/ f* ~& x# F
  131.   * @{
    " T  s! \; k/ c# A/ [! N0 U
  132.   */& Z$ T, ~$ ~2 y
  133. DMA2D_HandleTypeDef hlcd_dma2d;
    + E$ S0 f, C# Z4 j' k
  134. LTDC_HandleTypeDef  hlcd_ltdc;
    2 S3 l, x3 z$ {6 W
  135. BSP_LCD_Ctx_t       Lcd_Ctx[LCD_INSTANCES_NBR];+ S1 I4 U4 z9 C) s' p
  136. /**4 O% m" W: M" T+ G% ~, d
  137.   * @}
    & T) ?; p0 g2 L- O+ O
  138.   */
    5 I% _! Y* B& R# t0 D% R$ ~1 o; I9 A+ R

  139.   D0 T! p2 W% {" I- n. b& t
  140. /** @defgroup STM32N6570_DK_LCD_Private_FunctionPrototypes LCD Private FunctionPrototypes# o4 m( J6 A8 m
  141.   * @{
    6 L4 q. g+ k6 P8 n. ?
  142.   */9 d9 M% B  c. ^% ^/ G+ `

  143. - `' c# x. H! D, M; U# v9 X2 |
  144. static void LTDC_MspInit(LTDC_HandleTypeDef *hltdc);
    5 g: e+ o. |7 e) ?8 S# X
  145. static void LTDC_MspDeInit(LTDC_HandleTypeDef *hltdc);* A9 I! C4 q4 r, l! p' U8 m8 _, ]
  146. static void DMA2D_MspInit(DMA2D_HandleTypeDef *hdma2d);$ g$ E5 O* U3 |- a9 a1 F
  147. static void DMA2D_MspDeInit(DMA2D_HandleTypeDef *hdma2d);- F) c" t0 E+ A& y5 o5 X
  148. static void LL_FillBuffer(uint32_t Instance, uint32_t *pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t Color);0 l8 a  V% X- C+ q) l/ C7 J- a$ S' Q
  149. static void LL_ConvertLineToRGB(uint32_t Instance, uint32_t *pSrc, uint32_t *pDst, uint32_t xSize, uint32_t ColorMode);2 o1 y; e" Y+ ], e9 \, ~7 ?: ^
  150. /**
    , D5 Q- a5 A, z% G$ c
  151.   * @}
    : ?1 \9 ]7 v, k8 j9 M
  152.   */: z1 \' z, i1 ~: v! g  J
  153. /** @defgroup STM32N6570_DK_LCD_Private_Macros  Private Macros$ X* {% S9 d' }- ^
  154.   * @{
    " d, S8 k/ z, I. q5 n
  155.   */9 _  M5 E6 A. m1 }3 p2 o
  156. #define CONVERTRGB5652ARGB8888(Color)((((((((Color) >> (11U)) & 0x1FU) * 527U) + 23U) >> (6U)) << (16U)) |\3 k7 [# k1 B. K+ n: i$ [, ?+ w3 ^
  157.                                      (((((((Color) >> (5U)) & 0x3FU) * 259U) + 33U) >> (6U)) << (8U)) |\
    ) V" f9 Q6 {- }! Q
  158.                                      (((((Color) & 0x1FU) * 527U) + 23U) >> (6U)) | (0xFF000000U))
    . I) T/ v- R8 B: O6 \
  159. . j( H& h1 W/ Y0 S  P
  160. #define CONVERTARGB44442ARGB8888(Color)((((((Color) >> 12U) & 0xFU) * 17U) << 24U) |\5 j7 y/ N/ O5 `$ b
  161.                                         (((((Color) >>  8U) & 0xFU) * 17U) << 16U) |\4 q* ^7 W* M0 w  n! |
  162.                                         (((((Color) >>  4U) & 0xFU) * 17U) << 8U) |\8 J3 b5 c3 p! R8 Q/ z
  163.                                         (((((Color) >>  0U) & 0xFU) * 17U) << 0U))
    " [# Q+ m2 r% N
  164. ! {' ]5 u" r& }
  165. #define CONVERTRGB8882ARGB8888(Color)((Color) | 0xFF000000U)
    # R9 z4 \, O% N$ k$ O; `
  166. / ], S2 I4 P0 q6 M9 c/ T% E
  167. #define CONVERTARGB88882RGB888(Color)((Color) & 0x00FFFFFFU)
      w8 k. k) n3 x* S6 Z" ~2 x5 J
  168. % R' X: q" |6 G# ~6 E0 I% v0 |3 r
  169. /**
    5 z' w  D- ]# [6 c# S
  170.   * @}- C& p9 ?* M5 ~
  171.   */$ Q1 \0 q! M7 U6 i  M
  172. 2 }; J; v7 E7 X$ G
  173. /** @defgroup STM32N6570_DK_LCD_Exported_Functions LCD Exported Functions
    ) K5 L7 ]% `: J' E7 ^6 F
  174.   * @{9 R  z9 X2 i( f; C7 Y
  175.   */
    5 x% ~  g, o5 U+ {* @. N
  176. /**
    3 H7 f# g! ?9 O+ B& g
  177.   * @brief  Initializes the LCD in default mode.
    # }4 z/ _1 A$ h  N) U$ N1 i- D" L
  178.   * @param  Instance    LCD Instance! M# N& c3 G8 G2 A  L) I- X
  179.   * @param  Orientation LCD_ORIENTATION_LANDSCAPE
      X3 p/ L7 F% z; F9 j( J
  180.   * @retval BSP status
    + m& n2 c! o; a$ Z" X: L
  181.   */
    8 Q+ t3 w2 Z; s# {, y

  182. 1 F/ W5 i8 ]6 T, k
  183. int32_t BSP_LCD_Init(uint32_t Instance, uint32_t Orientation)
    / ~/ W4 W5 g( S6 P3 F, Z7 [+ L) c
  184. {
    9 j1 P0 Z# ~* Z' u' A
  185.   return BSP_LCD_InitEx(Instance, Orientation, LCD_PIXEL_FORMAT_RGB565, LCD_DEFAULT_WIDTH, LCD_DEFAULT_HEIGHT);
    3 S+ b& h) _$ I# L. w8 y
  186. }; n) P2 G  i( K: L# U" m

  187. " e/ n+ o" X2 h8 P, g
  188. /**
    8 A4 b! k! s, b4 F* Q. e3 h- Q  [  J
  189.   * @brief  Initializes the LCD.
    . L/ v4 P5 D# `
  190.   * @param  Instance    LCD Instance" n8 S& T+ s/ x, u" n: t/ Q0 s
  191.   * @param  Orientation LCD_ORIENTATION_LANDSCAPE
    % I) d" @* D7 V% Q
  192.   * @param  PixelFormat LCD_PIXEL_FORMAT_RGB565, LCD_PIXEL_FORMAT_ARGB4444, LCD_PIXEL_FORMAT_ARGB8888" i4 ?% E. q8 u' V
  193.   *                     or LCD_PIXEL_FORMAT_RGB8882 W1 W# B* Z; h
  194.   * @param  Width       Display width
    # o: ]2 v3 F6 `1 J/ f5 p
  195.   * @param  Height      Display height
    / x# Q& k4 z2 J) M$ D1 z; l8 R
  196.   * @retval BSP status
    / g9 P7 e8 e8 I( W8 e
  197.   */
    3 Z- I$ n1 }5 M8 t) `" A" B6 P: {
  198. int32_t BSP_LCD_InitEx(uint32_t Instance, uint32_t Orientation, uint32_t PixelFormat, uint32_t Width, uint32_t Height)
    / w8 i( J: w6 [. c1 B4 w( Z+ @  Y
  199. {& z7 _6 u! I% E- C* ]
  200.   int32_t ret = BSP_ERROR_NONE;
    8 y) [/ q5 Z! B  ~! y' O) B7 T
  201.   uint32_t ltdc_pixel_format;
    / g! {5 [, A, `' |1 x% @' l- a
  202.   MX_LTDC_LayerConfig_t config = {0};
    ) J+ ~4 X4 \6 n  ]6 H8 {% _
  203. % p( v# F" e. @& K5 \- p3 S4 q3 ?
  204.   if ((Orientation > LCD_ORIENTATION_LANDSCAPE) || (Instance >= LCD_INSTANCES_NBR) || \
    , X+ K' z) U) L, a
  205.      ((PixelFormat != LCD_PIXEL_FORMAT_RGB565) && (PixelFormat != LCD_PIXEL_FORMAT_RGB888) && \
    ; \& }- X4 m! u
  206.       (PixelFormat != LCD_PIXEL_FORMAT_ARGB8888) &&  (PixelFormat != LCD_PIXEL_FORMAT_ARGB4444)))
    5 `; e: Q3 j* m+ X1 q
  207.   {- J" T& B" K: d
  208.     ret = BSP_ERROR_WRONG_PARAM;
    ! X/ a( l. [+ B4 x4 }
  209.   }2 P0 z, l  j; p: b
  210.   else: \+ S% x  o* s7 u* H
  211.   {' H. ?! ?5 B& J7 o" `
  212.     if (PixelFormat == LCD_PIXEL_FORMAT_RGB565)
    3 n. a' I9 [' ~
  213.     {8 o; \! X+ k6 I. @: a# ~7 F
  214.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_RGB565;  C- L( o. f0 w
  215.       Lcd_Ctx[Instance].BppFactor = 2U;
    ) f* V# m! e' {! V. @
  216.     }6 C/ i7 g( c* @
  217.     else if  (PixelFormat == LCD_PIXEL_FORMAT_RGB888)1 I% J$ J' ~( W! X. t
  218.     {
    & `* N$ p) z0 d* h/ p" T4 z3 I
  219.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_RGB888;
    6 `5 i3 |8 }' S; w1 x
  220.       Lcd_Ctx[Instance].BppFactor = 3U;* }8 m$ a5 K2 ~& p$ D$ |
  221.     }
    5 h+ k4 b' V1 D* q# r
  222.     else if  (PixelFormat == LCD_PIXEL_FORMAT_ARGB4444)
    6 i- d% W, k6 x
  223.     {
    3 D! j$ u$ i% ?* |
  224.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_ARGB4444;
    + a) l. A8 ]0 L( U/ s( F. u2 Q
  225.       Lcd_Ctx[Instance].BppFactor = 2U;
    4 b( B8 a  K4 U
  226.     }; k6 H, p, Y" z- J
  227.     else /* LCD_PIXEL_FORMAT_ARGB8888 */
    $ k$ p% O) s# A6 k6 \: e) Y
  228.     {3 b7 _/ Z8 ?5 }3 J
  229.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_ARGB8888;
    ) A$ y& x7 n. j+ S4 b' W% e
  230.       Lcd_Ctx[Instance].BppFactor = 4U;
    : K: N0 J% P1 n
  231.     }
    . g1 s6 O* B; X1 B4 |) G7 i

  232. ; t0 n# b2 W- I% i9 A7 J4 P7 l
  233.     /* Store pixel format, xsize and ysize information */
    - A2 C: h0 N' l! f
  234.     Lcd_Ctx[Instance].PixelFormat = PixelFormat;$ R! O) `, ?$ E! ?; M, Z  F1 D
  235.     Lcd_Ctx[Instance].XSize  = Width;
    - Q9 w3 {! d! W( C, V% q4 H# W- u
  236.     Lcd_Ctx[Instance].YSize  = Height;9 G6 U8 s4 i! f6 j$ P, l

  237. + A4 [6 a3 l3 Q( t
  238.     /* Initializes peripherals instance value */2 T; K+ |+ G4 f8 N, K
  239.     hlcd_ltdc.Instance = LTDC;# L' y( M) X9 x: m7 |
  240.     hlcd_dma2d.Instance = DMA2D;
    ! `  \. \* K3 Y7 {4 }* L! M

  241. 5 o6 w7 x  j/ ^  p# Q+ H
  242.     /* MSP initialization */
    7 W9 Q- }( a, r, j/ ~" k
  243. #if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1)
    ! k" h3 P" f, \" h) c& c
  244.     /* Register the LTDC MSP Callbacks */
    3 ?: }' x, C; T; \; @( y+ X7 F
  245.     if (Lcd_Ctx[Instance].IsMspCallbacksValid == 0U)
    ( {) N% l  R; }* ^$ H% ]/ u
  246.     {
    0 p# F" c! ^: e* ~
  247.       if (BSP_LCD_RegisterDefaultMspCallbacks(0) != BSP_ERROR_NONE)! d1 M2 C2 ?0 K
  248.       {
    1 e, P8 r1 }0 g
  249.         return BSP_ERROR_PERIPH_FAILURE;4 t& t, ~7 ^. d+ o( o/ ^7 L
  250.       }
    ; f+ u" E% q& H3 c
  251.     }; ?( S" T; t7 K3 D/ ~
  252. #else
    & Y  ]8 r+ G/ W0 \6 \+ _2 y( f
  253.     LTDC_MspInit(&hlcd_ltdc);& T! m2 v, [) p. u# \
  254. #endif /* (USE_HAL_LTDC_REGISTER_CALLBACKS == 1) */
    ) Z8 `  c" u. {& }
  255. ( F& Z5 w- n3 \  _4 N' K) }2 p; l
  256.     DMA2D_MspInit(&hlcd_dma2d);
    , U/ H4 g; Q8 o8 O% n0 j" a

  257. 1 t3 B6 ?) Z3 Q0 z2 M
  258.     if (MX_LTDC_ClockConfig(&hlcd_ltdc) != HAL_OK)3 s' }5 C5 p9 X! `' Q
  259.     {
    & p8 ~& M5 a* n5 |* ~* H0 t% ~
  260.       ret = BSP_ERROR_PERIPH_FAILURE;" T$ M- @2 o, w
  261.     }* ~( z4 I, y" _/ c" k% B: z
  262.     else; m/ k& q6 ]3 [+ b& S
  263.     {
    4 G7 V# K$ Y' m2 Q( M, c$ X& l
  264.       if (MX_LTDC_Init(&hlcd_ltdc, Width, Height) != HAL_OK)
    # O# U; G( J$ p0 v- F
  265.       {
    - Z  }7 S, z- Y7 d1 r+ j
  266.         ret = BSP_ERROR_PERIPH_FAILURE;
    8 ^/ B/ p: b- _' o3 p0 \& _
  267.       }1 G# B  Z1 N- @6 M2 y6 m
  268.     }: S3 Z% M! X' {5 i4 Z1 h3 e! B

  269. 6 e3 {' u1 W/ j+ ^/ i1 A
  270.     if (ret == BSP_ERROR_NONE)) D  R% t/ A  n* m0 U: T4 y
  271.     {* [2 P7 X4 n+ b9 n
  272. #if defined(DATA_IN_ExtRAM)% ]" t7 _: f8 H& ^5 N& B3 J3 _
  273.       /* Before configuring LTDC layer, ensure XSPI RAM is initialized */+ E1 ^9 m: G. i; z- N6 b
  274.       /* Initialize the XSPI RAM */1 i$ U3 s3 i) I; P
  275.       if (BSP_XSPI_RAM_Init(0) != BSP_ERROR_NONE)3 q7 h. Z! A' p8 M4 [/ d1 o
  276.       {8 r$ k% R( d  F( P" c  T
  277.         ret = BSP_ERROR_NO_INIT;
    & B, m. |4 Y+ {, L0 U$ P6 J
  278.       }! y0 }6 y+ u7 v6 _2 L( Q# h
  279.       else if (BSP_XSPI_RAM_EnableMemoryMappedMode(0) != BSP_ERROR_NONE)$ I+ s  [% ~+ N6 ~7 `
  280.       {
    % |9 r# [* ?$ `- |/ c% Y
  281.         ret = BSP_ERROR_PERIPH_FAILURE;5 q/ ?4 Y  ?0 @! t4 q( n* ?1 d
  282.       }
    / f, p8 y+ H5 h
  283.       else
    / c7 b" k" e, Q" X
  284.       {* Z/ z2 q& h8 v" w. _9 w  i
  285. #endif /* DATA_IN_ExtRAM */
    1 m0 C# ~7 X* v  \$ j- R& d& t
  286.         /* Configure default LTDC Layer 0. This configuration can be override by calling
      J* t! y! r  M
  287.         BSP_LCD_ConfigLayer() at application level */
    , F2 H: H+ D% ^
  288.         config.X0          = 0;! ^7 j0 V2 ^3 p( `2 u+ O1 ^2 M
  289.         config.X1          = Width;5 `1 K9 p5 y+ P& B0 w3 n# V# |$ l
  290.         config.Y0          = 0;  W+ z2 o* ^/ O* G2 y  x) S( u
  291.         config.Y1          = Height;* z+ p: E/ w8 ~  X. F
  292.         config.PixelFormat = ltdc_pixel_format;
    ! T. l3 o% r" c7 L* ]) R3 g% `5 H" C
  293.         config.Address     = LCD_LAYER_0_ADDRESS;( a, F9 E6 r) x3 D2 ?$ n5 |) I
  294. 1 F( b1 |0 T: Q7 x1 f8 [# U4 w
  295.         if (MX_LTDC_ConfigLayer(&hlcd_ltdc, 0, &config) != HAL_OK)
    1 c/ G0 c5 N) |+ O
  296.         {: h8 S! k7 v- ]" I# |7 W
  297.           ret = BSP_ERROR_PERIPH_FAILURE;6 P0 `) |4 Z* u0 K5 w' D# m9 s
  298.         }
    + N! B6 j' x2 I

  299. - C% c$ I" o1 G/ ]# m5 f
  300.         /* By default the reload is activated and executed immediately */
    9 x$ x9 q: P) v
  301.         Lcd_Ctx[Instance].ReloadEnable = 1U;
    & Z, V2 U! c. U" g' N0 D
  302. #if defined(DATA_IN_ExtRAM)
    7 u5 i/ s+ w4 o  C' l
  303.       }9 H  v$ e( q9 k) G/ g2 b, p
  304. #endif /* DATA_IN_ExtRAM */- T5 z. ^8 ]$ W' _- Z" X
  305.     }
    3 l! h3 ^: y/ W* ~
  306.   }3 }+ a2 P. `0 L/ a
  307. 0 Z4 f+ c8 F( U: W$ \: w0 E6 C
  308.   return ret;3 ~% u& K. `( @  e. L0 d
  309. }$ w( k: e/ G0 }* M

  310. 4 P8 j6 d- [3 |. b: x
  311. /**
    6 r, g9 n% P6 H4 D
  312.   * @brief  De-Initializes the LCD resources., |$ a5 W; h$ d# T( |& F
  313.   * @param  Instance    LCD Instance
    ) T7 ^3 W: h3 ^1 z
  314.   * @retval BSP status7 _4 J$ _3 J5 t; K
  315.   */5 s% d2 N" g: a$ f9 [
  316. int32_t BSP_LCD_DeInit(uint32_t Instance)0 ?9 i9 [: S& S+ a: A" d
  317. {
    ( O- r" O9 R1 J
  318.   int32_t ret = BSP_ERROR_NONE;
    ) w3 ?1 b8 F, Y6 d

  319. " p0 p. X: f9 \3 W6 \/ I
  320.   if(Instance >= LCD_INSTANCES_NBR)
    , Q  V5 C) L; V6 V
  321.   {1 H9 G- }5 u- y  X
  322.     ret = BSP_ERROR_WRONG_PARAM;
    0 U, L; v3 e8 ?! t5 U( G3 P, P' |
  323.   }
    , b0 R1 o( Q- l6 w4 l2 b) E
  324.   else+ f" j) Z& @5 s$ W) L% I- |
  325.   {3 f( S1 }& h' {# m" @& o. i; \
  326. #if (USE_HAL_LTDC_REGISTER_CALLBACKS == 0)
    9 Y4 J( i! ?" g% @
  327.     LTDC_MspDeInit(&hlcd_ltdc);$ l& F% }- x2 f" u0 p" _9 v
  328. #endif /* (USE_HAL_LTDC_REGISTER_CALLBACKS == 0) */& F9 p0 u8 H0 y9 e6 t% n

  329. 5 L3 `0 a; G5 t8 f* o; g
  330.     (void)HAL_LTDC_DeInit(&hlcd_ltdc);
    4 E' y. M- ~- o1 l
  331.     if(HAL_DMA2D_DeInit(&hlcd_dma2d) != HAL_OK)/ C8 R8 T0 v" T( v! [0 u
  332.     {
    ; M5 g; B1 K# c1 }' c& i
  333.       ret = BSP_ERROR_PERIPH_FAILURE;# L! v- _2 |+ a
  334.     }
    7 n& \/ {+ S$ T0 G
  335.     else
    ; K2 `( Y$ N+ U- @4 K* t
  336.     {4 I! C; D2 e6 v0 D
  337.       DMA2D_MspDeInit(&hlcd_dma2d);
    0 L  R* L7 v- j1 T- I$ x7 k/ _3 s
  338.       Lcd_Ctx[Instance].IsMspCallbacksValid = 0;
    ) m; q+ ?( b* j8 g% I! L6 ?
  339.     }0 G* U4 I- T/ s4 L+ V
  340.   }" T& p% I! p8 y, C) e# _+ D
  341. * _2 a( c. t5 [  B' ?1 f$ E
  342.   return ret;
    6 s4 N7 @: e( x- V# Z0 b  n
  343. }
    & x1 l* I' ~2 J
  344. * {% h) h( D+ v: X7 v
  345. /**
    ! ~6 z" J: s. F& C1 ^/ r  g9 d. g2 m
  346.   * @brief  Initializes the LTDC.
    0 N4 j4 L* L' M' Z' u7 j1 L% k
  347.   * @param  hltdc  LTDC handle- U( n; s) f3 S7 V
  348.   * @param  Width  LTDC width0 g" a, |8 e7 V/ u3 _! e7 I
  349.   * @param  Height LTDC height) g, W9 w3 ~2 j( Z( H) p
  350.   * @retval HAL status
    . l/ o4 |& P) @6 A) _
  351.   */
    % F7 Q4 ], d5 f" s6 z! H
  352. __weak HAL_StatusTypeDef MX_LTDC_Init(LTDC_HandleTypeDef *hltdc, uint32_t Width, uint32_t Height)
    ! @& v  M0 o  K. N! d) R- H
  353. {
    ) s2 E* w1 ~) j3 c0 ]* P$ l
  354.   hltdc->Instance = LTDC;
    , L# Z/ t. `- l4 y; ]/ Q
  355.   hltdc->Init.HSPolarity = LTDC_HSPOLARITY_AL;- M. a2 R4 d" b) }/ S1 z7 T( d% O
  356.   hltdc->Init.VSPolarity = LTDC_VSPOLARITY_AL;
    # N0 r8 U: F: S% b2 B- W
  357.   hltdc->Init.DEPolarity = LTDC_DEPOLARITY_AL;. ?; b, C. l% m6 Z5 q# y" o3 G; ^
  358.   hltdc->Init.PCPolarity = LTDC_PCPOLARITY_IPC;0 m* g# _5 s% S! V% ~

  359. * Q+ P; H% r6 n7 m. I/ r* h
  360.   hltdc->Init.HorizontalSync     = (uint32_t)RK050HR18_HSYNC - 1U;% y/ Y" k, d3 d
  361.   hltdc->Init.AccumulatedHBP     = (uint32_t)RK050HR18_HSYNC + (uint32_t)RK050HR18_HBP - 1U;
    7 W% p; d) q* y3 r- `7 P9 K
  362.   hltdc->Init.AccumulatedActiveW = (uint32_t)RK050HR18_HSYNC + Width + (uint32_t)RK050HR18_HBP -1U;
    ' ~1 O8 w0 k6 z1 O/ P
  363.   hltdc->Init.TotalWidth         = (uint32_t)RK050HR18_HSYNC + Width + (uint32_t)RK050HR18_HBP + RK050HR18_HFP - 1U;
    & r3 ?. _4 r/ T% U4 ]
  364.   hltdc->Init.VerticalSync       = (uint32_t)RK050HR18_VSYNC - 1U;
      X' v% O# C3 h" P6 g
  365.   hltdc->Init.AccumulatedVBP     = (uint32_t)RK050HR18_VSYNC + (uint32_t)RK050HR18_VBP - 1U;- i3 N$ r$ Z# V1 `, @
  366.   hltdc->Init.AccumulatedActiveH = (uint32_t)RK050HR18_VSYNC + Height + (uint32_t)RK050HR18_VBP -1U;" A! T/ T1 {9 N; W9 d7 e: E
  367.   hltdc->Init.TotalHeigh         = (uint32_t)RK050HR18_VSYNC + Height + (uint32_t)RK050HR18_VBP + RK050HR18_VFP - 1U;1 y8 Q& @# K, v: b- h
  368.   i, K$ z3 y. E8 f; S1 f
  369.   hltdc->Init.Backcolor.Blue  = 0x0;' _2 Z! U+ Z7 L* d
  370.   hltdc->Init.Backcolor.Green = 0x0;& ^) m* o8 V/ Z3 u
  371.   hltdc->Init.Backcolor.Red   = 0x0;( V: N/ h- h+ b7 r3 |/ {

  372. $ W$ d2 p; w8 ~# @
  373.   return HAL_LTDC_Init(hltdc);' R9 j0 |# l; J
  374. }' w: y% D- e/ [' E/ h8 z/ n
  375. 9 W: L% H/ D' b' i  J
  376. /**3 z; g4 s! n7 i3 v  x4 ^
  377.   * @brief  MX LTDC layer configuration.% n: h( M3 a0 o: X# M* m9 W
  378.   * @param  hltdc      LTDC handle: [+ R; A5 ~/ l* h, K
  379.   * @param  LayerIndex Layer 0 or 1
    1 f. L' H7 @- V6 l
  380.   * @param  Config     Layer configuration
    / M0 X* A( v* W' s
  381.   * @retval HAL status
    , {& d, W" E2 ^% \
  382.   */; C. d0 b- _  H
  383. __weak HAL_StatusTypeDef MX_LTDC_ConfigLayer(LTDC_HandleTypeDef *hltdc, uint32_t LayerIndex, MX_LTDC_LayerConfig_t *Config)
    . E7 U$ w: Y: }. K4 M& s: N' g
  384. {; V: i( l3 K/ [* x
  385.   LTDC_LayerCfgTypeDef pLayerCfg ={0};9 e( O; s( F. {
  386. % B4 b0 n5 a' W5 U- p, A- Z
  387.   pLayerCfg.WindowX0 = Config->X0;; B1 o  C8 ^( h3 F4 K, a  C
  388.   pLayerCfg.WindowX1 = Config->X1;
    " j. q7 C3 `5 ]5 a$ g
  389.   pLayerCfg.WindowY0 = Config->Y0;
    9 T; [' @4 \8 ~
  390.   pLayerCfg.WindowY1 = Config->Y1;! E2 x  v7 Z4 J$ ]$ @. l1 f9 }5 Y/ {
  391.   pLayerCfg.PixelFormat = Config->PixelFormat;2 c" e6 _- K+ f5 o+ o! c
  392.   pLayerCfg.Alpha = LTDC_LxCACR_CONSTA;
    ( X4 c% y3 ?* P, Y) i5 K5 |
  393.   pLayerCfg.Alpha0 = 0;- \8 o( c- L- Q" Z$ b7 z3 M
  394.   pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;5 V) {* x) X5 b0 g0 X
  395.   pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;! K9 Y! T5 s' F3 u1 }5 e  T, a0 k- x. Y
  396.   pLayerCfg.FBStartAdress = Config->Address;
    6 @! [; y: ^6 s5 Z& s
  397.   pLayerCfg.ImageWidth = (Config->X1 - Config->X0);4 i( ~* j0 Z/ @% G/ j8 M0 j- ^
  398.   pLayerCfg.ImageHeight = (Config->Y1 - Config->Y0);
    ) y- A# [7 r9 }3 ]: i/ ~+ Y" b
  399.   pLayerCfg.Backcolor.Blue = 0;; |7 H+ \5 O% Z! O; {2 G1 y0 E2 Q& q
  400.   pLayerCfg.Backcolor.Green = 0;6 p* S6 |1 @/ A; S& }
  401.   pLayerCfg.Backcolor.Red = 0;
    ) T. U9 c6 }: O- E7 ~5 J
  402.   return HAL_LTDC_ConfigLayer(hltdc, &pLayerCfg, LayerIndex);& [; S4 L) J, A" E7 m
  403. }
    7 O, Y; `4 g( N7 @- j* F7 j* G* y& O

  404. ! p( G; c+ y7 t7 N# S7 a) u) e
  405. /**; Z$ m4 `! l! h5 x
  406.   * @brief  LTDC Clock Config for LCD DPI display.
    % J3 K5 \9 V. N2 b8 a4 z/ O
  407.   * @param  hltdc  LTDC Handle, D" _2 u: i. S6 e) \
  408.   *         Being __weak it can be overwritten by the application
    . x* _  F# j7 u4 s
  409.   * @retval HAL_status% V$ h; H, L9 R, [; f
  410.   */* B( V$ ~& {. t: K+ V* o: @0 v& }
  411. __weak HAL_StatusTypeDef MX_LTDC_ClockConfig(LTDC_HandleTypeDef *hltdc)
      L9 {8 A( V7 ~; t3 @/ G& Q
  412. {
    . ^0 \0 z& Y9 L/ d
  413.   /* Prevent unused argument(s) compilation warning */
    0 u. o1 T( j4 [$ ?0 h
  414.   UNUSED(hltdc);' M& I% {6 Y  b. _
  415. 8 j& r$ |$ }1 [
  416.   HAL_StatusTypeDef   status =  HAL_OK;) U9 R1 t' K' x- t6 s) k
  417.   RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInitStruct = {0};- ?. x7 _. P0 T0 G

  418. 9 g  O0 L& S; f: [; a0 C
  419.   /* LCD clock configuration */
    & M  H" _/ V$ i/ y1 V3 b1 u
  420.   /* Typical PCLK is 25 MHz so the PLL4 is configured to provide this clock */
    $ b$ q2 X6 l. E9 ~  e
  421.   /* LTDC - PLL4 */; C7 w5 p5 v  Q, [$ I" y/ X6 b
  422.   /* Configure LTDC clock to IC16 with PLL4  */; i9 T% A3 d. x* _

  423. 4 H+ V2 H7 s, x$ ^' z% L
  424.   /* LCD clock configuration */. f2 Z% [) p0 l
  425.   /* Typical PCLK is 25 MHz so the PLL4 is configured to provide this clock */- ^/ A0 x' S9 H4 u8 c" q3 ^
  426.   /* LCD clock configuration */
    1 C: g; X1 B6 \7 @6 S% \
  427.   /* PLL3_VCO Input = HSE_VALUE/PLLM = 48 Mhz / 192 = 0.25 *// z# x* }8 \& Z4 v; T# Y8 p, z
  428.   /* PLL3_VCO Output = PLL3_VCO Input * PLLN = 0.25 Mhz * 100 = 25 */
      S  O' W9 M, U) N9 V) s
  429.   /* PLLLCDCLK = PLL3_VCO Output/(PLLP1 * PLLP2) = 25/1 = 25Mhz */+ b2 A8 P$ V- }
  430.   /* LTDC clock frequency = PLLLCDCLK = 25 Mhz */$ m+ v8 ~/ J$ l2 z' y% t" r6 I# c
  431. 6 y4 r0 y7 m3 k* H
  432.   RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC;! Y# \" U4 u- V. M! I3 z
  433.   RCC_PeriphCLKInitStruct.LtdcClockSelection = RCC_LTDCCLKSOURCE_IC16;6 v9 V+ b- |, N5 S' _
  434.   RCC_PeriphCLKInitStruct.ICSelection[RCC_IC16].ClockSelection = RCC_ICCLKSOURCE_PLL4;
    $ H% c! J, K* h2 x
  435.   RCC_PeriphCLKInitStruct.ICSelection[RCC_IC16].ClockDivider = 2;
    2 i; d3 P" E- R" z" ]7 Y
  436.   if (HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct) != HAL_OK)
    $ k; A3 v- L  q! m3 v3 s8 K: s
  437.   {" T8 z, ]3 Q! ?, P& F4 ]% f# K
  438.     status = HAL_ERROR;: ^1 T2 @" j4 ]7 H' e
  439.   }* ~5 M; q; T5 h  V* N6 [: Q. \! L
  440. / }/ S  E7 w- X* y
  441.   return status;$ H) |' j. c( _7 i2 Q# O% w# g
  442. }
    ' ?- B: b8 @! B/ a; T* {" U5 @

  443. + w/ Z" X$ `2 K+ z
  444. #if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1)
    7 j; ]  z- {" Q( i" b, l
  445. /**+ B/ B1 S. x8 ~. R, q9 e
  446.   * @brief Default BSP LCD Msp Callbacks
    7 q& e1 x# ]) v  p# F
  447.   * @param Instance BSP LCD Instance9 ?7 p" n- S/ H$ _# z# y3 l6 x" y: b
  448.   * @retval BSP status
      @  T$ O* K: [. T2 j
  449.   */
    * Y5 F% }5 C3 P9 ^3 z
  450. int32_t BSP_LCD_RegisterDefaultMspCallbacks (uint32_t Instance)( @4 O3 ^& O4 e/ q$ C& v
  451. {: w3 p: H- t" s/ z
  452.   int32_t ret = BSP_ERROR_NONE;6 a0 [9 j8 p$ i/ S

  453. 2 [0 M9 s2 [) @
  454.   if(Instance >= LCD_INSTANCES_NBR)
    ! V% n* N  N3 R" s7 U/ Y
  455.   {
    2 d. o# Y) y( d- ]
  456.     ret = BSP_ERROR_WRONG_PARAM;; y- T8 {8 A9 N; }4 Z+ w
  457.   }
    . v4 K' y3 e3 W& s
  458.   else: u8 p% z9 a* ~% S0 V
  459.   {, s6 ?% k8 V0 q* ?% j( U/ g" G" @
  460.     if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPINIT_CB_ID, LTDC_MspInit) != HAL_OK)/ u4 a3 M- u7 Q$ U7 F% a0 N
  461.     {8 z& F$ r- M- X% P9 {. H& [; Y
  462.       ret = BSP_ERROR_PERIPH_FAILURE;
    8 ]0 K8 Z* J. x- c2 ~- l
  463.     }
    - n/ k1 P' V$ `( O' F
  464.     else" E5 ^  n2 g6 b) R! p1 b: I
  465.     {) o9 O) X& |& {% ~
  466.       if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPDEINIT_CB_ID, LTDC_MspDeInit) != HAL_OK)" }- q! n/ B5 H. _( n# k
  467.       {
    ( u$ k# w- t# [5 h" B
  468.         ret = BSP_ERROR_PERIPH_FAILURE;
    0 i) R( G1 Q! {
  469.       }
    ) z, _# O( }& u6 @
  470.     }& B8 Q" h# ?+ h8 b6 y; z

  471. , k# T. ?) G% w3 [" k
  472.     Lcd_Ctx[Instance].IsMspCallbacksValid = 1;5 R/ i8 g# H& Z8 \7 N! m5 i
  473.   }
    - Q) _7 ^& W, |6 l+ K3 N7 Q0 @6 j5 b
  474. , r2 a" Q& u$ D; [) c9 e
  475.   return ret;
    0 v7 o3 W; p" J8 }
  476. }
    9 `) i& N) @4 V, u& P6 X
  477. / h. {$ @% s3 F0 h; r/ T0 k9 I8 v% y
  478. /**
    ) Q4 {$ Z* E6 {$ N: N3 S
  479.   * @brief BSP LCD Msp Callback registering6 f' U; B- s% ~( _1 g) w) h
  480.   * @param Instance    LCD Instance
    ( B7 [2 {7 p  b* D  u1 w0 v2 H# F
  481.   * @param CallBacks   pointer to LCD MspInit/MspDeInit functions) i. Y; v; z9 n! T" T
  482.   * @retval BSP status6 C1 u, w: t  ]1 B! A& e: g) o
  483.   */
    $ U$ C6 h: O* }1 l" O  x  u# L
  484. int32_t BSP_LCD_RegisterMspCallbacks (uint32_t Instance, BSP_LCD_Cb_t *CallBacks)
    " h5 ^; Z8 V7 H& G+ A
  485. {$ e7 _  P& p: Q" K# N" w
  486.   int32_t ret = BSP_ERROR_NONE;
      m) y+ I6 N2 b5 b. {' \
  487. 0 a; t# E( k- B/ `% t& O
  488.   if(Instance >= LCD_INSTANCES_NBR)4 I2 a/ p! p. R  F0 k" Z  i* U5 g
  489.   {# `' t: W1 j& {
  490.     ret = BSP_ERROR_WRONG_PARAM;: f3 Y0 l1 \* U  O" j
  491.   }
    + l/ B/ c6 u2 d: h; u& j$ d
  492.   else! p0 K5 ?9 B- m5 J5 L# M" G
  493.   {
    8 A( o+ I! C2 U7 {& U8 k
  494.     if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPINIT_CB_ID, CallBacks->pMspLtdcInitCb) != HAL_OK)
    1 I6 H, o  ?* M, Y" z
  495.     {# J, }& A! m, S/ E) G: e: B
  496.       ret = BSP_ERROR_PERIPH_FAILURE;2 {; o% C8 m& @& p9 n+ k# ]
  497.     }4 H1 S+ ~, Q7 D8 P
  498.     else; ~3 O7 L8 A( e* |( a, R4 |
  499.     {: N7 [9 I7 u- x9 P% h
  500.       if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPDEINIT_CB_ID, CallBacks->pMspLtdcDeInitCb) != HAL_OK)5 I" F  L- ]" O( c" W
  501.       {( \% E! p% n4 ]  M( e
  502.         ret = BSP_ERROR_PERIPH_FAILURE;
    ) J9 q, e& D3 K& O) o, I
  503.       }- [! t# F! o$ C- P- [& T
  504.     }& j7 X0 r2 F# H

  505. ) I+ Z" }( E. j$ Y/ P* z
  506.     Lcd_Ctx[Instance].IsMspCallbacksValid = 1;  q4 F+ K* r8 ?# P+ N" E
  507.   }
    + F$ z9 q, Q8 b/ O" n0 `' N/ A
  508. % |% t) i  \0 y/ M' R4 c8 H$ [
  509.   return ret;4 x, F1 k" F3 N% A' s
  510. }5 L, s( F( T+ R/ w/ w4 q! q
  511. #endif /*(USE_HAL_LTDC_REGISTER_CALLBACKS == 1) */
    5 h' \: R# D: Y, Z4 Y( h$ N( i
  512.   t5 g9 `3 K# `" L
  513. /**
    $ d& w  k) @# D9 g1 {# y$ g7 W3 h
  514.   * @brief  LTDC layer configuration.; I% O2 [8 q$ ?3 T+ D; U
  515.   * @param  Instance   LCD instance2 V8 [* q- p5 X8 f' p+ ?: e% r6 r
  516.   * @param  LayerIndex Layer 0 or 11 b8 Z" e  W- p- u0 _: g5 j. P; _
  517.   * @param  Config     Layer configuration# M" `, K0 J- M  S3 W; ^
  518.   * @retval HAL status# A8 Y6 t7 e. W; m' w  J/ ^
  519.   */" H5 \% n" V8 w1 K( ?' a
  520. int32_t BSP_LCD_ConfigLayer(uint32_t Instance, uint32_t LayerIndex, BSP_LCD_LayerConfig_t *Config)! I- |) N8 Q4 h8 r" y
  521. {2 C0 I# V! R4 C5 C9 B2 I0 N. X" \
  522.   int32_t ret = BSP_ERROR_NONE;8 ~1 D. g1 F! M' h* V! U% S
  523.   if(Instance >= LCD_INSTANCES_NBR). t6 c9 v$ U% Y& ~9 k6 g8 P  A0 L5 {
  524.   {
    5 L$ W0 Y5 {$ s1 {2 c, A
  525.     ret = BSP_ERROR_WRONG_PARAM;' f/ q: @8 p5 l9 q3 R. y6 R
  526.   }4 R4 N1 M7 C3 \4 J  K$ ]
  527.   else
    / z% C" j* Q3 q
  528.   {  [" X) r6 M  s7 C: A  V* E- K
  529.     if (Config->PixelFormat ==  LCD_PIXEL_FORMAT_RGB565)
      R+ Z6 n! R; `4 {7 P/ A0 _! @
  530.     {, B+ N1 B0 n6 m4 A- x
  531.       Config->PixelFormat = LTDC_PIXEL_FORMAT_RGB565;
    ! o, @$ c) p) e; \/ o
  532.     }5 x, o- C7 Z5 a2 M0 z: O
  533.     else if (Config->PixelFormat ==  LCD_PIXEL_FORMAT_ARGB4444). ?/ ^8 m9 N3 Z. f% T7 S
  534.     {
    9 K4 P( B% O( M6 F
  535.       Config->PixelFormat = LTDC_PIXEL_FORMAT_ARGB4444;0 |# \$ d! X! T+ A/ Y% g; h
  536.     }! S# C6 a8 }4 H& S: t# e3 P6 V
  537.     else if (Config->PixelFormat ==  LCD_PIXEL_FORMAT_ARGB8888)! E8 D- u& U/ N
  538.     {
    8 o! l2 ]/ r* }( h9 F  z
  539.       Config->PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888;* T: M, ]% m: J+ i" k& ?+ E3 C
  540.     }# _1 Z) I5 r' c/ h0 \4 }
  541.     else
    6 Z) ~* @6 E1 r# y! ^5 m8 p
  542.     {
    . j% m0 X; j$ ?" D- \
  543.       Config->PixelFormat = LTDC_PIXEL_FORMAT_RGB888;  o+ C$ `8 k3 C8 g* y- [
  544.     }! ?( k/ X. Q" Z
  545.     if (MX_LTDC_ConfigLayer(&hlcd_ltdc, LayerIndex, Config) != HAL_OK)+ D5 n5 k/ I' j: \6 S: B' z/ b
  546.     {# l6 v7 l( u+ s& y  ?7 c
  547.       ret = BSP_ERROR_PERIPH_FAILURE;" o6 ?& r6 d" y0 M( ?* Q
  548.     }
    6 T% N  m' J4 H8 z
  549.   }
    5 x$ z5 K3 c$ b! u* G
  550.   return ret;. }, P; K9 i3 Z% k' n
  551. }+ `1 h! ]) d' E5 u# O
  552. & v4 w1 D6 u0 X  i1 J  E& h- X
  553. /**. x1 t. k8 g; v6 T8 O5 N
  554.   * @brief  Gets the LCD Active LCD Pixel Format./ J! x* n8 W5 p0 O; K, J* ^/ R* x; h
  555.   * @param  Instance    LCD Instance* }$ d% |% k+ A& ?! W  k
  556.   * @param  PixelFormat Active LCD Pixel Format
    " S2 l( }- Y; k) X6 ?2 i' S
  557.   * @retval BSP status
    : N9 p) S! K$ x% o! B" E5 R) _+ w5 U
  558.   */
    * Q4 C& f1 X/ G+ f" F1 A
  559. int32_t BSP_LCD_GetPixelFormat(uint32_t Instance, uint32_t *PixelFormat)$ j; X" }+ l: r6 E
  560. {- o: u9 ~( N. Q) @8 P+ X1 K
  561.   int32_t ret = BSP_ERROR_NONE;& u" ~" k" x, [+ e% d, s

  562. ' A* C8 n: {* e! T  p3 |0 q
  563.   if(Instance >= LCD_INSTANCES_NBR)
    % w6 M9 s" _; x' Q3 b# q2 S) e
  564.   {
    % s. w: M; W# R0 K# d
  565.     ret = BSP_ERROR_WRONG_PARAM;
    * }2 w1 s5 C" F* M* w
  566.   }. r$ Q  Y* t! j& F$ h1 M
  567.   else
    5 v2 w' Q* i! n( ~8 b. |! a  j5 e
  568.   {
    ! @/ @# c' i6 g# X
  569.     /* Only RGB565 format is supported */
    $ C/ }$ {! z. F1 j0 |
  570.     *PixelFormat =  Lcd_Ctx[Instance].PixelFormat;
    , S  _8 e% U/ p! T6 Y& C" R
  571.   }
    . u% W5 I/ _8 U7 X
  572. 1 `  x8 b4 A& |) ?8 A
  573.   return ret;$ N3 `7 \) |: M% y7 @# e
  574. }
    , A; y$ q3 G0 ?! J) v0 _% j' O
  575. ; l7 z: M9 E+ l) [
  576. /**' S/ Q9 Q+ r9 q* {+ _6 p4 k6 J
  577.   * @brief  Set the LCD Active Layer.
    ) N' Z8 D6 g8 g" A
  578.   * @param  Instance    LCD Instance
    7 V5 I. _) b: ^! r. Y- n
  579.   * @param  LayerIndex  LCD layer index  ^. M) I% R2 H, u7 o
  580.   * @retval BSP status
    - D0 D8 i9 `% P& \; q* @, O
  581.   */
    8 e7 B: O- W* `$ V2 X
  582. int32_t BSP_LCD_SetActiveLayer(uint32_t Instance, uint32_t LayerIndex)' _: G, U$ C; J! G
  583. {
    3 z5 ?9 K" F* ~) D7 Q
  584.   int32_t ret = BSP_ERROR_NONE;
    0 Y# \5 Y6 X( @' v& t
  585.   LTDC_LayerCfgTypeDef *pLayerCfg;2 j  U3 [8 J7 P" C. C5 w
  586. & j$ \' ^2 r2 T/ {
  587.   if(Instance >= LCD_INSTANCES_NBR)
    1 F( A. z! s+ g2 r2 e) k
  588.   {, ^4 t4 b7 u, g3 j" |9 V" a
  589.     ret = BSP_ERROR_WRONG_PARAM;* ~; ]# }& e; e
  590.   }1 Q7 r3 t' E8 |5 W
  591.   else6 s/ o& `/ x' R3 s( r2 z& H
  592.   {/ B4 v0 i; R9 J1 D; W4 E, r1 f- |
  593.     pLayerCfg = &hlcd_ltdc.LayerCfg[LayerIndex];; m1 g. T/ Q% I( }1 d
  594. 8 J5 ~/ H4 Y3 X9 _! L9 \! W7 R6 m
  595.     Lcd_Ctx[Instance].ActiveLayer = LayerIndex;' \- F! }& i, |1 G) s
  596.     Lcd_Ctx[Instance].XSize = pLayerCfg->ImageWidth;/ s2 m% G2 j9 c( D8 n6 P2 f
  597.     Lcd_Ctx[Instance].YSize = pLayerCfg->ImageHeight;/ \& b. l) [: H: ^$ P
  598. 0 F- J% E' j( q. h1 d
  599.     if (pLayerCfg->PixelFormat ==  LTDC_PIXEL_FORMAT_RGB565)
      ?$ t  j% u0 C! P
  600.     {. S. V8 X" d3 j# J; ?$ c# @
  601.       Lcd_Ctx[Instance].BppFactor = 2;% g3 ]9 T# k2 [8 x2 B- Y! b
  602.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_RGB565;
    * |6 S6 U. p) r' n+ T7 B' l7 V( P
  603.     }6 i2 E( a8 M$ W6 {
  604.     else if (pLayerCfg->PixelFormat ==  LTDC_PIXEL_FORMAT_ARGB4444). g1 K% Z1 w- b0 d" [. J
  605.     {+ E, h. J. k7 R* q2 q* P
  606.       Lcd_Ctx[Instance].BppFactor = 2;
    1 |- Z+ }$ B; u' h) p/ E: n
  607.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_ARGB4444;! q. L( k! N0 R  @+ f. |/ ^2 G) E; i
  608.     }9 \( a" K2 e5 p
  609.     else if (pLayerCfg->PixelFormat ==  LTDC_PIXEL_FORMAT_RGB888)8 N- N  G3 W" d7 s
  610.     {
      E/ j7 i1 p! T9 p8 v5 q
  611.       Lcd_Ctx[Instance].BppFactor = 3;; S* n& t+ L2 w6 q0 ^8 g) ]6 R
  612.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_RGB888;( a9 A5 w1 Q* z3 `
  613.     }
    ( u4 B7 ]2 L& _7 U+ d7 I  B# H3 c
  614.     else
    " z. i9 s, }9 E+ K
  615.     {
    & y/ F+ C  r& `3 _- e% k$ C
  616.       Lcd_Ctx[Instance].BppFactor = 4;
    4 B) I* b! r; e/ T0 `
  617.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_ARGB8888;  [# c+ E1 t1 l0 j
  618.     }2 T) W% t  Z& M0 ?# Z. R
  619.   }
    ( O: s& I8 l6 p. v6 Q

  620. ! }6 V- _8 u( i3 F- u0 |/ @
  621.   return ret;
    6 t& N- Z2 b- D& `
  622. }
    5 E. q" {, q+ M

  623. # I3 [* _2 Q1 D' q+ m
  624. /**! Q, t  x$ S+ _. D
  625.   * @brief  Control the LTDC reload0 c. b* ~6 I  f% H6 T
  626.   * @param  Instance    LCD Instance
    7 t2 u% q2 e6 `9 q2 k
  627.   * @param  ReloadType can be one of the following values
    # i" \* N1 e  Q- X8 L; s' A0 L) n
  628.   *         - BSP_LCD_RELOAD_NONE& I8 g0 z. i* E( ?$ K" M
  629.   *         - BSP_LCD_RELOAD_IMMEDIATE% n8 b8 W4 i* W& ~6 D1 X
  630.   *         - BSP_LCD_RELOAD_VERTICAL_BLANKING
      ~4 K) D+ U' h7 J4 V* i
  631.   * @retval BSP status
    , b& Z- ^$ m1 D* S4 A7 h
  632.   */
      Q% t9 `7 I" k4 a9 Q8 \1 C* `
  633. int32_t BSP_LCD_Reload(uint32_t Instance, uint32_t ReloadType)
    1 U( E" n& L; m1 m
  634. {  f% g3 k) F- _) A4 L
  635.   int32_t ret = BSP_ERROR_NONE;8 G% T, _3 T. q9 z" x3 Q
  636. 7 b/ q. N. x/ D' A5 q" h
  637.   if(Instance >= LCD_INSTANCES_NBR)" C- z5 Z+ A7 ^' a9 F7 g
  638.   {
    # n# o# n. S7 V
  639.     ret = BSP_ERROR_WRONG_PARAM;
    ( h2 \) Z) d8 F: S
  640.   }- A! \9 L2 @: f2 ^3 [. ^
  641.   else if(ReloadType == BSP_LCD_RELOAD_NONE)1 [9 r7 k0 Z$ x. A0 Z; k4 t
  642.   {) Y, C( y+ }4 @9 R+ ]# O  N! q
  643.     Lcd_Ctx[Instance].ReloadEnable = 0U;
    5 ]; s# V! o0 @. ~0 t! e& P' I
  644.   }( f% k7 i2 v0 _2 N1 k" ?5 ~
  645.   else if(HAL_LTDC_Reload(&hlcd_ltdc, ReloadType) != HAL_OK)
    , k3 @  j( {: k- ]; A+ f( C
  646.   {
    3 s2 \: i: _" _6 L/ L1 n
  647.     ret = BSP_ERROR_PERIPH_FAILURE;
    5 G9 M: v9 l; r9 C1 G
  648.   }
    / G# E3 S' `5 |! B2 G
  649.   else6 }3 F* S8 o$ l3 }0 w
  650.   {
    0 I2 q  b, G: t; k: C1 X
  651.     Lcd_Ctx[Instance].ReloadEnable = 1U;5 r8 c# P$ d5 l7 n9 y8 n( ]
  652.   }7 H) n9 \, h' F1 a( z
  653.   A4 ^9 }% p% L- k/ M
  654.   return ret;
    2 x; T, ]( u# U, @5 v- x( _: B) ~& b
  655. }9 O, W) H, Y, a

  656. ; M# o9 K: T+ m' ?5 w
  657. /**9 u4 }- O; s5 x4 u& p# P, ^% b
  658.   * @brief  Sets an LCD Layer visible% n% y- P* B& N4 J8 n5 m4 Y
  659.   * @param  Instance    LCD Instance( t1 k4 d1 k; [+ y  Y# z1 k
  660.   * @param  LayerIndex  Visible Layer
    , O" H  g1 e8 k& y* }# q
  661.   * @param  State  New state of the specified layer; c4 _/ B8 k# Z7 h! W2 t
  662.   *          This parameter can be one of the following values:
    & C8 d: B, Y$ F: g
  663.   *            @arg  ENABLE
    : B- O9 @. p9 f- z3 R! {' l+ ]" d
  664.   *            @arg  DISABLE
    ; u+ e5 B! ~0 u4 `& ^
  665.   * @retval BSP status/ M& {2 O) R( u
  666.   */
    3 {0 u# I% p! h& f& H
  667. int32_t BSP_LCD_SetLayerVisible(uint32_t Instance, uint32_t LayerIndex, FunctionalState State)
    8 o) X" H7 f9 w, }: D# x
  668. {
    3 U9 ]' O( G, }! n: t0 `
  669.   int32_t ret = BSP_ERROR_NONE;
    " T3 z; }+ M  h$ l4 O, A2 B; g
  670. ! K* R. b% Z( D( b" p
  671.   if(Instance >= LCD_INSTANCES_NBR)
    & q6 _: M& L0 P1 f2 [" Q
  672.   {6 U1 [) j9 b4 h8 |
  673.     ret = BSP_ERROR_WRONG_PARAM;- O5 ^9 N  |( H6 {  _
  674.   }, i8 c) o2 L- g; I& t% `
  675.   else
    ) G& j2 q* M" M$ F
  676.   {
    . s- h& {. l* ?% R
  677.     if(State == ENABLE)
    5 R9 `- j; J: g0 C
  678.     {- V9 s0 t+ u: u0 Z
  679.       __HAL_LTDC_LAYER_ENABLE(&hlcd_ltdc, LayerIndex);- m+ F# Y" f, A" }8 F$ M7 b% [" K6 E
  680.     }! [5 L) M: w3 g. z
  681.     else% F' M. p9 @& D% C/ o  N" ]
  682.     {2 Q8 K3 |& \4 G1 e6 }: A7 }
  683.       __HAL_LTDC_LAYER_DISABLE(&hlcd_ltdc, LayerIndex);
    / J0 S0 N1 V, O8 N4 `" p% L- Z) M
  684.     }
    ! {" A$ V3 |+ p( s

  685. - |' S' }2 k8 {; N; ~
  686.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    ; M% w5 d8 |5 @3 W2 d- t1 s
  687.     {, c) I1 d  [, q6 L
  688.       __HAL_LTDC_RELOAD_IMMEDIATE_CONFIG(&hlcd_ltdc);
    - y) o: @3 c: n5 {1 N
  689.     }
    ) h9 J' T) ^; _
  690.   }+ }) ]9 ?% N2 R/ f

  691. # n7 l8 f; c; G: r6 C
  692.   return ret;
    & k  H$ B- y1 ^* j
  693. }
    0 d, S$ k1 f3 B0 P0 U
  694. ! W: Y/ T( P! `: r% q
  695. /**
    $ {! B6 j3 q' u% F0 Z
  696.   * @brief  Configures the transparency.
    3 v* U$ h$ u+ o4 P4 k
  697.   * @param  Instance      LCD Instance6 Y4 ?$ C4 d4 }$ T  T9 b1 Q5 J, I
  698.   * @param  LayerIndex    Layer foreground or background.8 C5 Q! @; w4 t1 }9 Q% `0 V
  699.   * @param  Transparency  Transparency& U0 y3 n9 q4 y9 N
  700.   *           This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF, t" B( J. K& Z3 x2 T: }
  701.   * @retval BSP status& n/ Z; M2 o' ?. Z1 t4 H3 h
  702.   */; i1 ^8 @4 d" R3 `. `% j  ?
  703. int32_t BSP_LCD_SetTransparency(uint32_t Instance, uint32_t LayerIndex, uint8_t Transparency)1 l8 T1 V5 n; V3 {( ^! k. u9 D/ _
  704. {
    ' Q( W! E- O0 \, x+ ?
  705.   int32_t ret = BSP_ERROR_NONE;+ D$ z2 R5 A- @0 R" V$ W/ U

  706. 5 a3 {; J  }! ~/ T5 k% }  y
  707.   if(Instance >= LCD_INSTANCES_NBR)
    / s: U8 t. K: K# _3 x7 q5 H
  708.   {9 C, m) o% D( V/ t- D% j' n/ p
  709.     ret = BSP_ERROR_WRONG_PARAM;; Y% {- n9 y) w
  710.   }8 H: f' Z2 ]& O) i7 t5 _+ H
  711.   else
    , ~& K, k) K+ W5 z% [2 `
  712.   {
    1 m, ]; u" k: F" l: _
  713.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    $ z6 r3 ~; U4 G% ]8 A
  714.     {
    : v" i% ^; R$ F( y/ p+ f8 ~
  715.       (void)HAL_LTDC_SetAlpha(&hlcd_ltdc, Transparency, LayerIndex);
    + E5 J& Z* ^& l( G, _  R/ n
  716.     }
    ! K) D& Y- F8 S9 t; ?) f
  717.     else2 O+ n9 ^. N. P* c6 s0 t# c
  718.     {
    1 x2 b0 |2 ]( A8 R8 b* @- o, Y
  719.       (void)HAL_LTDC_SetAlpha_NoReload(&hlcd_ltdc, Transparency, LayerIndex);. e: u/ K& ]' `7 b" s$ O
  720.     }
    ! x- j; V0 V2 d) M) H
  721.   }
    9 A; R( B, [) u+ [

  722. : x& Z  s' s2 D' \; c) y+ F
  723.   return ret;9 z; b; a1 V. e, V* Q) x
  724. }! ^8 Q9 N- v/ o1 X. D& ]( `
  725. - I( d2 M' b+ v- M) v- W
  726. /**) v- U5 }  I% Q7 j) x$ o5 z
  727.   * @brief  Sets an LCD layer frame buffer address.  A9 i' G' K, j# j
  728.   * @param  Instance    LCD Instance2 Y' s( U7 ^+ P* }
  729.   * @param  LayerIndex  Layer foreground or background8 M% o. I, y$ l, _$ {% k
  730.   * @param  Address     New LCD frame buffer value
    # J0 P+ {/ f6 N8 I
  731.   * @retval BSP status
    1 [) W6 A! K. V
  732.   */: F8 O- Q/ w; E. D
  733. int32_t BSP_LCD_SetLayerAddress(uint32_t Instance, uint32_t LayerIndex, uint32_t Address)
    3 e- p) ]- o! R
  734. {
    $ h! l1 e' C. Z$ q# w) k
  735.   int32_t ret = BSP_ERROR_NONE;( |6 A5 N# ]8 G. h
  736. 6 t) z. e, E0 y) p9 i2 J
  737.   if(Instance >= LCD_INSTANCES_NBR)& V! l: X0 J3 X0 [+ ?. d! R
  738.   {* U/ ^2 o, H0 H: G
  739.     ret = BSP_ERROR_WRONG_PARAM;+ Y9 W7 r5 j. O  e1 a; j
  740.   }
    * ]5 e& N5 R" U
  741.   else
    0 u6 O, {* @9 d- @  L! f! L' ?$ G
  742.   {
    0 ?6 H( f% c$ @7 s5 L
  743.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    8 `5 T' k, [9 z4 Y1 v6 }6 r
  744.     {0 v, B1 d* P2 `( f  U1 m5 D( A) [3 N
  745.       (void)HAL_LTDC_SetAddress(&hlcd_ltdc, Address, LayerIndex);1 N1 T) b! a- p4 {# v& Q
  746.     }7 R+ d: C- w- u$ V$ [: U
  747.     else6 q2 V- Y/ Z4 O2 v
  748.     {8 w: D. n6 ]: u. x% r
  749.       (void)HAL_LTDC_SetAddress_NoReload(&hlcd_ltdc, Address, LayerIndex);
    . b7 e, S6 c- R! C4 c
  750.     }
    2 `: `& `! z2 \/ ~
  751.   }
      \8 `) {2 _: p% q: q1 f9 }3 w. Y
  752. 1 g& K: C( K+ h7 T$ e/ }" w
  753.   return ret;
    ' Z- e4 x$ @4 C% X: E6 e
  754. }9 v) v8 Q# G& S9 v# H9 h6 S! H

  755. ! C# D: E1 q6 ]$ K% p8 S
  756. /**
    ! _% g5 _' Q0 s- l* {
  757.   * @brief  Sets display window.
    ( i* `. l7 s2 \( R
  758.   * @param  Instance    LCD Instance6 i& m' ?: C7 |/ R5 ]+ U/ x
  759.   * @param  LayerIndex  Layer index6 d& h3 C2 V+ m; O# Z6 E: P  @2 J6 V
  760.   * @param  Xpos   LCD X position5 r' \8 T" r7 S$ g# C- Q
  761.   * @param  Ypos   LCD Y position9 {: @5 O- W) F' R# h
  762.   * @param  Width  LCD window width: F8 f& c: D0 i# m4 [3 Y" z! X
  763.   * @param  Height LCD window height
    9 {2 ~" F2 W" v* U  f
  764.   * @retval BSP status
    # u* m( M3 S! j2 T( l
  765.   */
      |, k' Q) T0 S& s# h$ D9 x
  766. int32_t BSP_LCD_SetLayerWindow(uint32_t Instance, uint16_t LayerIndex, uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)
    6 r' B( A* U1 w. `; C+ k( x
  767. {
    4 i3 z9 A' C4 D" p2 r* N
  768.   int32_t ret = BSP_ERROR_NONE;3 l& [, ]% l- r( I0 h* U( a

  769. ( z: H) V9 b* s" O+ Y6 ~
  770.   if(Instance >= LCD_INSTANCES_NBR)# x9 m1 K& y9 d, j
  771.   {/ ]7 ~% ^: V/ W1 X* E1 e
  772.     ret = BSP_ERROR_WRONG_PARAM;
    5 P, K7 t6 j8 W+ }9 e( m
  773.   }: C. j* `, l  _8 u: h
  774.   else
    / F6 Z, ~$ ]3 [, ^4 P
  775.   {( s# @0 ^9 R; A9 A' H9 X4 S
  776.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    ( W/ T3 {1 j8 @! \3 K
  777.     {" ]% @; M+ @. |6 ?" k4 A
  778.       /* Reconfigure the layer size  and position */% Z' u  P2 b  ~! L, a% a9 P
  779.       (void)HAL_LTDC_SetWindowSize(&hlcd_ltdc, Width, Height, LayerIndex);7 L8 L( M* }& `  |  j9 S% G" F
  780.       (void)HAL_LTDC_SetWindowPosition(&hlcd_ltdc, Xpos, Ypos, LayerIndex);& K6 z% x. r: u7 J
  781.     }! V) P  D9 v7 M' `6 f9 J0 j
  782.     else  M$ J8 H# ^9 S. }3 E3 \" T9 Y
  783.     {
    6 _: ^3 H9 P9 B$ I0 p; I
  784.       /* Reconfigure the layer size and position */0 T) a' [' ~" @; q5 Q
  785.       (void)HAL_LTDC_SetWindowSize_NoReload(&hlcd_ltdc, Width, Height, LayerIndex);
    7 Q# z+ W0 b% h0 ~# w7 i( a. C- Y
  786.       (void)HAL_LTDC_SetWindowPosition_NoReload(&hlcd_ltdc, Xpos, Ypos, LayerIndex);
    ( c3 p$ Q, G9 K& z
  787.     }5 C# R1 A$ @) a" p4 i

  788.   h$ m5 M  u) ?( i, \
  789.     Lcd_Ctx[Instance].XSize = Width;. S) g0 i/ ?# K% B
  790.     Lcd_Ctx[Instance].YSize = Height;. U' d: \: g& F# w0 ^6 @  @; N$ w
  791.   }
    / a8 {6 B' h; v7 G: k/ H9 {: H7 X

  792. $ U3 s" i5 @- I( V% s
  793.   return ret;
    & m" G6 K, d3 s; l, h
  794. }: P% l3 ]' y# _/ N- t0 b$ Z2 }3 q

  795. 7 x+ I; l% D; f& |* b) w( j. f5 ~
  796. /**$ n3 j$ a$ h( ?1 c# D4 e$ X
  797.   * @brief  Configures and sets the color keying.
      r9 m5 o+ k# f7 a
  798.   * @param  Instance    LCD Instance
    2 r- Y- w/ a. E
  799.   * @param  LayerIndex  Layer foreground or background( H5 P5 a, n# ]
  800.   * @param  Color       Color reference
    5 Y% h2 o5 e% H/ ~! H% h
  801.   * @retval BSP status
    # n! n; d; |) P0 }! f: B( @+ g
  802.   */
    . y) _1 E1 J; S+ P6 B* H
  803. int32_t BSP_LCD_SetColorKeying(uint32_t Instance, uint32_t LayerIndex, uint32_t Color)- r3 R6 C6 ~' ~9 [! R0 W
  804. {8 i! o9 A5 [3 {3 a# b$ `
  805.   int32_t ret = BSP_ERROR_NONE;
    / u9 l8 q- m' y$ `
  806. ' H. Z& J0 U" ?4 }) X" N6 x0 z
  807.   if(Instance >= LCD_INSTANCES_NBR)
    ' M! o' b9 f8 c  {9 w7 x
  808.   {3 E1 O, a$ P6 C7 W6 v
  809.     ret = BSP_ERROR_WRONG_PARAM;9 i  }+ }4 y' ?4 H) m
  810.   }
    3 u0 E4 L* C( Q+ h5 o( A3 i- U0 S
  811.   else
    1 d1 z/ b# l9 h  Q' ]! \
  812.   {
    " J/ M+ }# \- Z. {( N! k  x2 D
  813.     (void)HAL_LTDC_ConfigColorKeying(&hlcd_ltdc, Color, LayerIndex);
    ; g+ a7 t, e1 P5 {
  814.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    & S: {  x5 C5 a: y* M& _! J2 @/ S
  815.     {
    ) l0 _7 Q, t4 m$ \
  816.       /* Configure and Enable the color Keying for LCD Layer */
    / X* x3 v- ?, ], L3 U% d

  817. : X4 b+ P) C  G
  818.       (void)HAL_LTDC_EnableColorKeying(&hlcd_ltdc, LayerIndex);0 r0 `. V4 u: U2 Y7 p7 M5 A9 ~  c
  819.     }
    7 I. p9 K6 h: p, ^( p1 f6 S
  820.     else
    ) Y% P( j9 e$ I! O  {, k: \& \
  821.     {
    + F8 E$ F+ I  i% J# s" W+ f2 D
  822.       /* Configure and Enable the color Keying for LCD Layer */
      v8 G. p4 s. |# a1 d6 {: c
  823.       (void)HAL_LTDC_EnableColorKeying_NoReload(&hlcd_ltdc, LayerIndex);
    * Z2 W* {- h" T  R. T
  824.     }: b7 Z' H5 p3 M+ S( y) a7 X2 o. }) p
  825.   }
    $ v$ r8 n& h# V3 t
  826. : ~& u0 F% }: a& H+ \" }
  827.   return ret;, T1 H3 ^' c; u+ S! t+ u# T
  828. }
    9 o* J" j, }, l/ n, _% Z  k8 D4 J: W

  829. - }4 C+ B& k. D! l; r  @' ], u3 v
  830. /**
    ! q8 {* @& w' w% y
  831.   * @brief  Disables the color keying.4 I) U7 ^+ ~) M6 Y
  832.   * @param  Instance    LCD Instance- x* S$ b* [: h
  833.   * @param  LayerIndex Layer foreground or background
    5 j* I3 f9 |# r$ ~5 @1 s! b# u
  834.   * @retval BSP status. f5 E1 q% s0 t+ t7 v; k% _+ o: e
  835.   */
    4 P, N/ k( P/ c7 s. [1 ^5 Y
  836. int32_t BSP_LCD_ResetColorKeying(uint32_t Instance, uint32_t LayerIndex)
    " d$ e/ `4 x/ N; F( g
  837. {
    6 A3 J. S1 p; p- g( K$ d
  838.   int32_t ret = BSP_ERROR_NONE;$ e9 k3 y7 m: V3 _6 [% Y7 p
  839. % w5 ]6 X6 _6 c4 E% K; [0 b' i. r
  840.   if(Instance >= LCD_INSTANCES_NBR)
    " [: T8 f% k' T
  841.   {4 n7 [; Q1 l8 E4 I# L( j
  842.     ret = BSP_ERROR_WRONG_PARAM;
    ! c$ b- H2 `" u' N  S/ f0 ^* v4 p
  843.   }8 |5 K! B5 y9 P4 l5 W1 }9 |# V
  844.   else( f3 O# q) U% Z( k4 \: W) L: u
  845.   {
    ( o# u8 y1 Q5 u3 N; \
  846.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    , U: o" x6 T9 l
  847.     {
    8 ^# w4 ?/ t* U
  848.       /* Disable the color Keying for LCD Layer */' N# ]% Z" }) ?8 H
  849.       (void)HAL_LTDC_DisableColorKeying(&hlcd_ltdc, LayerIndex);
    : N8 h" S4 Y' u  X0 F! c
  850.     }5 M5 t8 S5 ~$ z- P0 Z" ]9 _! V
  851.     else- G: ?) J, E+ D- ?* w
  852.     {
    ; O- [1 v' V/ z) Q( H# a. I
  853.       /* Disable the color Keying for LCD Layer */
    - U, v; i: F" Z. D6 l0 L' e* Z) T
  854.       (void)HAL_LTDC_DisableColorKeying_NoReload(&hlcd_ltdc, LayerIndex);% `# L! X8 u9 U- x2 m* {
  855.     }
    9 @  q! T, m! Q9 C" J. D- Y5 l
  856.   }
    & m- I" G6 @9 K+ a: a
  857. # B# R; ]3 V2 w8 P  i* K5 {- c
  858.   return ret;
    * Y. M" @2 ^6 S
  859. }% b7 j! t5 d0 p! n1 ~

  860. 1 l: o" ~+ S3 k  W# c) P
  861. /**
    * R9 B, ?7 p" _
  862.   * @brief  Gets the LCD X size.
    + o% a4 u/ _4 x/ l$ N* j% ?
  863.   * @param  Instance  LCD Instance5 p! }  S' H: Z, ^; n2 _
  864.   * @param  XSize     LCD width- K1 Z( K& I1 p3 j2 u! l! e# c. g
  865.   * @retval BSP status
    / ^' w  m+ H( h+ @! V  e$ H
  866.   */
    / f/ H9 V1 D% O) O& M
  867. int32_t BSP_LCD_GetXSize(uint32_t Instance, uint32_t *XSize)
    , l0 l: T+ t+ m# q! r
  868. {
    : f- }' k1 n) Z2 {
  869.   int32_t ret = BSP_ERROR_NONE;
    9 c3 u# f0 z" I/ C; |* [  Z
  870. ' w4 y! G) t  M6 f# z9 J
  871.   if(Instance >= LCD_INSTANCES_NBR); B# F% a: Z9 p' X  \' r: Y
  872.   {
    + n# @, A1 K# V6 Z3 K; U
  873.     ret = BSP_ERROR_WRONG_PARAM;3 B% t+ c. A0 q8 F8 H
  874.   }8 |. r8 q4 }" c( y5 W* N
  875.   else
    $ Q8 Z3 M0 l$ A& L% o" y6 u
  876.   {
    ( Q0 b. _& H% |1 K5 r
  877.     *XSize = Lcd_Ctx[Instance].XSize;
    $ E$ c0 }8 h7 C" d2 `) h+ d. E' M0 @$ N
  878.   }: b+ A* q- _! L2 |( X: @) e. k
  879. - S" p, ]' A* k7 h; g% d
  880.   return ret;
    : y& p: ~" G! `/ [! V, P! ~' N
  881. }4 o9 B: E- Z5 e; Z

  882. 5 B' l/ z. w- B" J$ `& Z6 ~! [
  883. /**; O. i7 N, D# B3 Q  `. V3 N
  884.   * @brief  Gets the LCD Y size.
    ' H( W- W. U* b# i
  885.   * @param  Instance  LCD Instance7 ~& l. E" |7 C7 z' ^% s
  886.   * @param  YSize     LCD Height
    2 V9 a5 q4 u1 t7 q8 q
  887.   * @retval BSP status! \3 g$ Y3 w* n& I0 t
  888.   */
    ! {2 c3 w# V, M+ q& F0 p. C
  889. int32_t BSP_LCD_GetYSize(uint32_t Instance, uint32_t *YSize)
    * G. W: W9 p. l: l) u" V
  890. {9 V' t5 E# [! w" H5 Q: J8 m0 h
  891.   int32_t ret = BSP_ERROR_NONE;
    & v7 J0 `$ T  R9 l8 N

  892. * q. N* s- F9 c. K0 K6 P
  893.   if(Instance >= LCD_INSTANCES_NBR), O$ J" B* R. B8 f7 P( p
  894.   {
    1 }! n) ]% e( z# ^, [$ ^. E, h" E
  895.     ret = BSP_ERROR_WRONG_PARAM;) Q0 K9 j8 ]+ b5 X
  896.   }
    ) A. k* a0 K3 a, A. G( q# C
  897.   else
    ; M9 V. r1 j4 ^& ~
  898.   {2 q, C, q6 o2 a; e, s& F
  899.     *YSize = Lcd_Ctx[Instance].YSize;4 n" _1 {, m' t+ d, `+ F) ~0 `5 n
  900.   }
    : R' {. Y( I7 A3 j

  901. " h0 P( m, Z6 ?; U- b
  902.   return ret;
    $ ?! q- O- f# g% ^5 L" _3 n
  903. }
    - \7 i. d: R, b; A; d6 v/ N# Z9 }

  904. 1 q% z3 q8 C' @9 S) d
  905. /**
    / L3 I- n  J  ?% a) z3 b
  906.   * @brief  Switch On the display.
    9 z* I" R: r  }
  907.   * @param  Instance    LCD Instance
    ! Q* ^0 _+ L4 t. M: `
  908.   * @retval BSP status
    / B9 F+ n2 C/ n# F
  909.   */
    3 R/ s2 I2 w+ ~* L6 N
  910. int32_t BSP_LCD_DisplayOn(uint32_t Instance)
    * I0 ~" G: ~" U1 Z5 i$ `- y0 `- E
  911. {' L8 A  P( m* T  m- P
  912.   int32_t ret = BSP_ERROR_NONE;
    / d9 S5 {7 M3 e& s5 }+ U
  913.   GPIO_InitTypeDef gpio_init_structure = {0};+ ^& l+ ]: l8 Z5 d
  914. % y3 R9 T% [# L' @
  915.   if(Instance >= LCD_INSTANCES_NBR)1 g9 f+ o2 o4 K0 B9 X: v8 \
  916.   {
      |5 n+ Y6 Q+ ]2 M  B9 l1 P
  917.     ret = BSP_ERROR_WRONG_PARAM;
    0 L9 e4 D; l8 @. I7 ^9 [
  918.   }4 p2 l4 o8 n& @
  919.   else
    " A7 j+ h3 e0 Q# `% s) M
  920.   {
    1 U* N- d; n; v+ j! O0 z/ W
  921.     __HAL_LTDC_ENABLE(&hlcd_ltdc);+ p4 b" V) s4 h  i$ j6 F( g+ X2 g
  922.     gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP;+ ]; C3 z% H2 V% U
  923.     gpio_init_structure.Pull = GPIO_PULLUP;) M6 \& T  H5 b  _1 O$ r5 D! U$ C( d
  924.     gpio_init_structure.Pin  = LCD_DISP_EN_PIN;
    9 I/ G  z" m/ b
  925.     HAL_GPIO_Init(LCD_DISP_EN_GPIO_PORT, &gpio_init_structure);, B6 P5 s1 r* j$ Y1 P

  926. " c  G% B+ ]4 i
  927.     /* Assert LCD_DISP_EN pin */
    7 H# ]  p( u, h
  928.     HAL_GPIO_WritePin(LCD_DISP_EN_GPIO_PORT,LCD_DISP_EN_PIN, GPIO_PIN_SET);
    , Q" t) X3 P5 y* D: D& ~* B" x
  929.   }
    ) Z# |# N% W! V, W: h' |
  930. 9 H' v& p4 z& D8 ^1 T$ y% U% ?
  931.   return ret;
    ) B& F  V4 }3 U" D# g) u5 N6 S
  932. }% @2 @6 M. L1 t9 z
  933. " X8 g1 q$ h- ^$ O$ T
  934. /**7 x( K! T! u$ e# z* J
  935.   * @brief  Switch Off the display.
    2 `4 G' \: h1 u, `! B  `1 K7 B2 c
  936.   * @param  Instance    LCD Instance3 W1 m: U8 h5 k5 {; x
  937.   * @retval BSP status4 z; k. y$ A6 k
  938.   */, s- v3 F3 j& ]6 ?; f1 L
  939. int32_t BSP_LCD_DisplayOff(uint32_t Instance)
    - l* y8 ~* r( a$ ]( Q& m5 k* q* C
  940. {
    6 P* n9 T  U* j7 `. b# n/ [
  941.   int32_t ret = BSP_ERROR_NONE;. C: P6 H+ ~1 U( l- f$ g
  942.   GPIO_InitTypeDef gpio_init_structure = {0};* I$ u* a9 k& z. x& Y9 T* o" R# x
  943. + G% R4 G- h" z7 F2 [
  944.   if(Instance >= LCD_INSTANCES_NBR): `7 h) L/ c; d6 S7 ]& \
  945.   {2 Y* ~$ X# m$ `) a( q- |0 X
  946.     ret = BSP_ERROR_WRONG_PARAM;* _* v% N8 a8 O4 R
  947.   }
    6 x( N4 x! q, ^) M4 f. Z
  948.   else
    ! W8 i8 D* e( \% X: T
  949.   {6 B3 o- e) U$ ]% @. w# |
  950.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;
    4 Y! X; T( y3 ]5 M
  951.     gpio_init_structure.Pull      = GPIO_NOPULL;7 u2 D. d+ P% ?% I& X
  952.     gpio_init_structure.Speed     = GPIO_SPEED_FREQ_MEDIUM;
    2 c! u8 T6 i4 w* _- y/ H
  953.     gpio_init_structure.Pin       = LCD_DISP_EN_PIN;
    9 A; u. e2 m. s) D9 {% \
  954.     HAL_GPIO_Init(LCD_DISP_EN_GPIO_PORT, &gpio_init_structure);: Q( g' d- }3 o% ?+ O1 w( a

  955. 3 B: W# k5 u, o# f5 e2 f
  956.     HAL_GPIO_WritePin(LCD_DISP_EN_GPIO_PORT,LCD_DISP_EN_PIN, GPIO_PIN_RESET);
    4 y! F: Q1 a2 b* Z

  957. $ Q$ i6 S9 W% m
  958.     __HAL_LTDC_DISABLE(&hlcd_ltdc);! W' i3 V& _$ a1 C1 \, D& C
  959. , _( u% x, t& }6 p; o3 W
  960.   }
    " E8 G/ z- \- K3 m" z' q/ _

  961. " F% G& Y) N: J! d6 G6 \5 j/ F1 K. @3 w
  962.   return ret;
    5 m( k/ D" G) }' h. X0 ]
  963. }) @4 p* [8 ?) s: ]$ k. V8 Z* t$ u4 d* c, t

  964. ! q3 l: _. `7 l6 E( K
  965. /**
    6 R7 T2 U7 a2 R% ^& Z0 s- Z
  966.   * @brief  Draws a bitmap picture loaded in the internal Flash in currently active layer.3 v3 T% j, P# q' V/ m' O# c; u
  967.   * @param  Instance LCD Instance, l/ W  R$ c9 F2 X! r
  968.   * @param  Xpos Bmp X position in the LCD4 I' B1 s! \$ k& r2 ?" L  {0 m$ H
  969.   * @param  Ypos Bmp Y position in the LCD
    9 m8 N/ v9 |! w- L2 b
  970.   * @param  pBmp Pointer to Bmp picture address in the internal Flash.. C" n+ b/ i" Y5 o
  971.   * @retval BSP status
    " a" o. B. U8 O$ D. S; s* B- E
  972.   */- h& A9 i6 f0 c7 F9 `
  973. int32_t BSP_LCD_DrawBitmap(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint8_t *pBmp)7 C& y, ?; f( [
  974. {
    - c9 h6 L" t9 W5 O
  975.   int32_t ret = BSP_ERROR_NONE;, n5 f5 a# @" b4 w% I/ Q* @5 n
  976.   uint32_t index;. Z7 C$ z* `# C) s3 `% ^
  977.   uint32_t width;* C3 \: M4 _7 y9 ^" I$ B* R( Z9 z
  978.   uint32_t height;
    " l& J: R9 f- ?6 I- m2 n
  979.   uint32_t bit_pixel;. b. y) s! m7 p* `. K/ }
  980.   uint32_t Address;
    ) V  ?) P# B2 Q2 b0 B5 w) Y
  981.   uint32_t input_color_mode;
    * S! L- }! w" m+ ?
  982.   uint8_t *pbmp;  m' ~1 H. j2 I5 y$ f2 y/ O
  983. - Z. z0 y8 \! Q& Z# [8 Q
  984.   /* Get bitmap data address offset */
      W  `7 Z7 B4 v' E$ O: ?. h
  985.   index = (uint32_t)pBmp[10] + ((uint32_t)pBmp[11] << 8) + ((uint32_t)pBmp[12] << 16)  + ((uint32_t)pBmp[13] << 24);
      i: z  m3 m5 C9 @9 z. E
  986. . \9 ^$ A6 a- G/ h: ?
  987.   /* Read bitmap width */
    3 p6 S8 K; N# D
  988.   width = (uint32_t)pBmp[18] + ((uint32_t)pBmp[19] << 8) + ((uint32_t)pBmp[20] << 16)  + ((uint32_t)pBmp[21] << 24);4 b" }4 [: l3 K" P- }
  989. + l8 |+ Z8 G9 b& x) M, P# b
  990.   /* Read bitmap height */, ?8 e- |* t& N
  991.   height = (uint32_t)pBmp[22] + ((uint32_t)pBmp[23] << 8) + ((uint32_t)pBmp[24] << 16)  + ((uint32_t)pBmp[25] << 24);# Y0 C2 u& S' b7 [

  992. 5 \* M( F( Y: Y& j0 V* \  y+ s/ j
  993.   /* Read bit/pixel */
    # V- f  s2 T2 O! Z
  994.   bit_pixel = (uint32_t)pBmp[28] + ((uint32_t)pBmp[29] << 8);6 o8 Y$ x4 k2 N5 H' l6 ~6 i$ q8 L

  995. " Z) c8 L- I, q' S- i! B
  996.   /* Set the address */
    4 t+ o: g, V% r: k
  997.   Address = hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (((Lcd_Ctx[Instance].XSize*Ypos) + Xpos)*Lcd_Ctx[Instance].BppFactor);
      A- O3 `6 g2 ?. F  T+ C8 X

  998. 2 i6 K7 [! o7 s
  999.   /* Get the layer pixel format */
    # [  z3 |! Q5 Q6 r
  1000.   if ((bit_pixel/8U) == 4U)
    1 u9 O6 t" e! _" y* i
  1001.   {
    4 ]& f4 w. U9 h! {( z2 o
  1002.     input_color_mode = DMA2D_INPUT_ARGB8888;
    6 @# N) B! s& t  g8 F6 J
  1003.   }
    - o( \' R" ]0 [" J+ L
  1004.   else if ((bit_pixel/8U) == 2U)9 @- S5 Q: @0 a) V& [- d
  1005.   {1 O; }; o, F- ?; @, d. |4 i. O
  1006.     input_color_mode = DMA2D_INPUT_RGB565;
    ) M6 \3 a$ J5 p9 m% U1 I
  1007.   }
    ! Q! B9 o& ^3 l; Z' g* i8 Q2 w
  1008.   else
    ! z: ~/ Y; |, z
  1009.   {, _' H% V, W6 N; N! E% Z
  1010.     input_color_mode = DMA2D_INPUT_RGB888;
    + \3 {9 Z% u8 j$ A1 }- r+ m& y
  1011.   }6 D" [' a) l$ o4 i. ^7 o% F# z0 c

  1012. + K  B# X. J+ P7 s+ ]  N9 U
  1013.   /* Bypass the bitmap header */
    : |4 L; k1 x3 l
  1014.   pbmp = pBmp + (index + (width * (height - 1U) * (bit_pixel/8U)));
    & T# t# f+ [' |! M4 P

  1015. ! \# F: s) X2 ?# J0 m
  1016.   /* Convert picture to ARGB8888 pixel format */
    / |% W+ |2 |9 f" x
  1017.   for(index=0; index < height; index++)& v1 _3 Y2 `+ M+ n* ]) `$ ]
  1018.   {
    : \' O, N5 g% I. a, Y6 D2 H0 y
  1019.     /* Pixel format conversion */* P4 D/ k1 a8 f
  1020.     LL_ConvertLineToRGB(Instance, (uint32_t *)pbmp, (uint32_t *)Address, width, input_color_mode);
    : h# M( b2 q1 g2 ~/ u: I
  1021. 9 p9 e0 c: f3 ~! F9 \3 b
  1022.     /* Increment the source and destination buffers */
    9 X. i7 l; ~/ m
  1023.     Address+=  (Lcd_Ctx[Instance].XSize * Lcd_Ctx[Instance].BppFactor);( S- H0 [- d0 `& ^
  1024.     pbmp -= width*(bit_pixel/8U);4 R  f/ q7 F1 H6 w6 F8 j$ a
  1025.   }
    + {, u; D$ m% f0 }# p+ \, ], c+ K

  1026. ) N* M+ f( \( u' N5 l; P! K
  1027.   return ret;
    ( \! L& s) ?1 H7 D
  1028. }+ G8 H# S3 K5 K& I& D3 @/ d. L1 `# n
  1029. 6 W/ ^( W- n( J# I, U
  1030. /**6 Y1 N, l* E. i' _
  1031.   * @brief  Draw a horizontal line on LCD.# S( v" C' }  J' A- v0 ~
  1032.   * @param  Instance LCD Instance.+ M) y1 M+ x" p8 O  }, m2 }
  1033.   * @param  Xpos X position.
    ) z* T0 Z2 m4 S" h9 r4 [: C2 I* q
  1034.   * @param  Ypos Y position.
    8 S( m  A. k& J; R* d% G' j
  1035.   * @param  pData Pointer to RGB line data
    # s5 p. C$ I. T/ H% K7 A- j4 B# E
  1036.   * @param  Width Rectangle width.
    3 T2 D  C+ M) E$ S0 O4 V
  1037.   * @param  Height Rectangle Height.' L, `: [. v0 w7 z5 a
  1038.   * @retval BSP status.4 a9 Q% s- d/ z5 H# b; i
  1039.   */
    + V/ C- U5 [8 ~, E+ d
  1040. int32_t BSP_LCD_FillRGBRect(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint8_t *pData, uint32_t Width, uint32_t Height)
    , H0 H+ h; g* u2 z. j& \7 ]
  1041. {
    ' k( Z- ?9 l: d0 J! x" B5 s
  1042.   uint32_t i;
    7 N# ~6 V9 _& |, H7 N- O
  1043.   uint8_t *pdata = pData;
    6 f, d7 ?( B5 K+ r: ^

  1044. * d" b- ?" d8 X
  1045. #if (USE_DMA2D_TO_FILL_RGB_RECT == 1): Q2 p- D( J2 J) o' k
  1046.   uint32_t  Xaddress;; h* q1 m" V7 `0 h
  1047.   for(i = 0; i < Height; i++)1 O2 M1 s8 e" `0 v. c
  1048.   {
    # q; u5 Y0 E6 q* D% h# o/ e
  1049.     /* Get the line address */; s6 I# t6 x9 ?
  1050.     Xaddress = hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*(Ypos + i)) + Xpos));
    # a; U- I( B9 V" |. f
  1051. - x( e& |8 J! @
  1052. #if (USE_BSP_CPU_CACHE_MAINTENANCE == 1)4 z5 P0 Z, M- h+ L
  1053.     SCB_CleanDCache_by_Addr((uint32_t *)pdata, Lcd_Ctx[Instance].BppFactor*Lcd_Ctx[Instance].XSize);
    9 F8 `5 o; h0 y: C& X- I% H
  1054. #endif /* USE_BSP_CPU_CACHE_MAINTENANCE */) @! R) {* ~- S- J

  1055. ( ^4 ]. c, S; F% ~* @4 D, R
  1056.     /* Write line */
    * w1 z& Q( u% [- e& F+ E
  1057.     if(Lcd_Ctx[Instance].PixelFormat == LCD_PIXEL_FORMAT_RGB565)
    7 Q3 m/ p8 P' d, N. m
  1058.     {5 F" U: R2 q9 ]: v- n# a, {' a; ]1 m
  1059.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_RGB565);
    * ^2 _  ?2 p( P4 i
  1060.     }
    * S9 ?$ |9 O& D+ M" ^; g
  1061.     else if(Lcd_Ctx[Instance].PixelFormat == LCD_PIXEL_FORMAT_ARGB4444)) t* T3 ^" ]; P; T) n
  1062.     {
    * y4 p# W& G- c* s, s# ~+ `( w
  1063.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_ARGB4444);( w6 {1 l3 l$ j. D
  1064.     }
    8 e7 O) y! K# h1 K" x, h
  1065.     else if(Lcd_Ctx[Instance].PixelFormat == LCD_PIXEL_FORMAT_RGB888)+ a3 R8 b0 G) t
  1066.     {
    * U% F; I# T" x. U( m
  1067.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_RGB888);2 r7 r3 [$ ^  d6 o
  1068.     }8 Y: t2 J2 n3 p+ F7 ~  Z
  1069.     else
    2 P9 T( e0 B1 Y7 [* R
  1070.     {
    0 S0 d1 V$ ]1 D3 ?& l
  1071.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_ARGB8888);. ?: x4 q6 I, d
  1072.     }* @$ X- V. c$ _- ]1 F
  1073.     pdata += Lcd_Ctx[Instance].BppFactor*Width;" g# r9 {; b1 V! z  v  @3 u
  1074.   }
    ( z  v5 K, l2 @8 y: u$ _. q9 c# H1 y
  1075. #else) D2 F: @! L$ _. `( \; m) p
  1076.   uint32_t color;
    " x, z: B6 w3 Y) E, R7 K) ~
  1077.   uint32_t j;
    / A: J& D. l9 G% R& v- c
  1078.   for(i = 0; i < Height; i++)
    , ?" W6 p6 o+ j+ X
  1079.   {
    6 R! L$ ^7 N8 s& F! r" b. H
  1080.     for(j = 0; j < Width; j++)% k0 e$ ]: `7 {5 J# M! B
  1081.     {* v: H& a" w5 ~! x' v( g% {' B
  1082.       color = (uint32_t)((uint32_t)*pdata | ((uint32_t)(*(pdata + 1U)) << 8U) | ((uint32_t)(*(pdata + 2U)) << 16U) | ((uint32_t)(*(pdata + 3U)) << 24U));
    3 m" P! q/ s& o$ `
  1083.       (void)BSP_LCD_WritePixel(Instance, Xpos + j, Ypos + i, color);. ~6 I/ ^: Q$ u! q; v
  1084.       pdata += Lcd_Ctx[Instance].BppFactor;
    % r: h. V* w6 C! k9 D- Y: n5 _) H; @
  1085.     }# L3 }0 b4 F+ K3 e6 N1 R* a
  1086.   }3 D8 i1 z# X+ c, e( Z
  1087. #endif /* (USE_DMA2D_TO_FILL_RGB_RECT == 1) */* A; F- x1 }8 |+ D6 f+ z/ N0 Y

  1088. / V- |) C; T: l7 C
  1089.   return BSP_ERROR_NONE;
      b$ Y  R. M- a
  1090. }
    ' f! `" U0 A* R' k5 ~

  1091. ! X( Y" N1 N2 Q5 E- s5 ~) C
  1092. /**: l& x) i/ E/ P* r5 [
  1093.   * @brief  Draws an horizontal line in currently active layer.
    ) {5 |, ]; C% c
  1094.   * @param  Instance   LCD Instance( w; X: W- s" r, g
  1095.   * @param  Xpos  X position
    , s1 X8 Q) u1 u4 L0 x
  1096.   * @param  Ypos  Y position
    1 A1 U% t4 e. ]4 t8 T& h, D
  1097.   * @param  Length  Line length
    0 h' c6 s) {5 j. ]
  1098.   * @param  Color RGB color; u5 g% m' n6 I- n
  1099.   * @retval BSP status1 n& G; I. y  y
  1100.   */
    4 P. t# p/ A4 g( u
  1101. int32_t BSP_LCD_DrawHLine(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Length, uint32_t Color). U% W2 r( Q0 a
  1102. {  Z  ~4 B$ V2 x6 S' u0 `' p
  1103.   uint32_t  Xaddress;  g1 ~; _! V$ K$ x( D

  1104. 3 M# ^. m6 ^, j; z, G$ S( m
  1105.   /* Get the line address */9 D( n# G( W2 u! `* ]$ m* ]0 L1 d
  1106.   Xaddress = hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*Ypos) + Xpos));
    6 D) @, k7 h/ N( V0 V

  1107. : f9 Z* Z* B# z/ B$ Z
  1108.   /* Write line */) h1 w3 i$ v% Y4 r# G6 w4 S$ ?" n
  1109.   LL_FillBuffer(Instance, (uint32_t *)Xaddress, Length, 1, 0, Color);1 L% ]0 l& U- z$ Q, `+ d

  1110. ! W$ S3 N1 m8 X. {2 {
  1111.   return BSP_ERROR_NONE;
    9 a. i) u2 ?& m; V# |
  1112. }2 ~& y7 V# [) b- Z$ M
  1113. " a0 _' @% g% L7 r  F4 e$ a
  1114. /**- q6 _/ p; w( ^3 w
  1115.   * @brief  Draws a vertical line in currently active layer.
    7 G8 C) W6 w# E( c/ s# v
  1116.   * @param  Instance   LCD Instance
    5 K! ^: y# a# A% c$ [, U# R; ]
  1117.   * @param  Xpos  X position; C2 k4 F" m/ W5 G
  1118.   * @param  Ypos  Y position: _; J, M' J  U6 C" e! |# X6 l
  1119.   * @param  Length  Line length* ]3 C9 k' @. C- ]4 n7 o- X1 f
  1120.   * @param  Color RGB color
    ! l+ Q, N( K5 j7 s9 }& k
  1121.   * @retval BSP status
    / }3 \! E  I. M7 V3 Q+ `/ H  h
  1122.   */* |0 Z  `  q4 v. M
  1123. int32_t BSP_LCD_DrawVLine(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Length, uint32_t Color)$ T$ {' _" c4 z
  1124. {
    ! c0 ^+ c3 L' K) `* i1 _& x# W
  1125.   uint32_t  Xaddress;
    ! H. ]  E  j7 {! N* R- m  r

  1126. $ E% b, m+ s4 _) p
  1127.   /* Get the line address */) y1 y4 r" E  F. R5 D
  1128.   Xaddress = (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress) + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*Ypos) + Xpos));
    " P' a7 F/ H4 B' Y

  1129. ! _3 o- M+ p4 |/ f
  1130.   /* Write line */
    , K* m( G" e* _* P  l' O
  1131.   LL_FillBuffer(Instance, (uint32_t *)Xaddress, 1, Length, (Lcd_Ctx[Instance].XSize - 1U), Color);, K6 ]2 I+ c+ i4 @8 j

  1132. 4 T2 e7 E9 \" v/ k" n
  1133.   return BSP_ERROR_NONE;3 O5 W; r+ T& E% Z+ |
  1134. }$ _/ L$ I' ?8 Z0 G
  1135. 1 `. o. u0 [" r
  1136. /**2 k5 E* u! ]/ V
  1137.   * @brief  Draws a full rectangle in currently active layer.2 m9 s& ~/ ^4 `6 T1 j( C
  1138.   * @param  Instance   LCD Instance1 g* i5 a0 k0 S" b& P4 q# P
  1139.   * @param  Xpos X position) U3 [+ j4 y" O
  1140.   * @param  Ypos Y position
    . ~4 y3 ?# e. s0 Q5 l0 |, N+ q
  1141.   * @param  Width Rectangle width& O% k$ q  l. q! K6 c
  1142.   * @param  Height Rectangle height
    + r! t/ Y  C' B* C
  1143.   * @param  Color RGB color2 v" x! u5 e" X3 b( t- k) L
  1144.   * @retval BSP status, I, V+ v, ]& U4 ^9 O$ k8 \
  1145.   */
    2 O: d' h6 b& Y# X" D
  1146. int32_t BSP_LCD_FillRect(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Width, uint32_t Height, uint32_t Color)
    5 o& [3 k- l0 O) A2 B) H
  1147. {" s! ?$ [+ S$ g4 M+ X# m
  1148.   uint32_t  Xaddress;9 e9 N5 U' a# X7 A! H) d

  1149. , ?' N7 I6 e8 c: B
  1150.   /* Get the rectangle start address */
    " y, l- M3 E; [4 h" X; |/ |
  1151.   Xaddress = (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress) + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*Ypos) + Xpos));
    " ^; m0 U  c& A2 ~  }2 T

  1152. 7 a; s  o( v. ?9 C
  1153.   /* Fill the rectangle */. }* C+ w8 ^5 o0 y3 K8 x
  1154.   LL_FillBuffer(Instance, (uint32_t *)Xaddress, Width, Height, (Lcd_Ctx[Instance].XSize - Width), Color);9 t2 ]/ ~4 T$ g

  1155. : i8 Z+ b2 Z" {, t+ H7 \- |! v( c
  1156.   return BSP_ERROR_NONE;/ M7 Q" e4 f! i. Z# ^
  1157. }
    : j6 o% q: w& b8 s/ _2 F

  1158. . w7 J$ j* V! c5 H, a
  1159. /**+ x$ e9 \0 d# N% W2 O) U! n
  1160.   * @brief  Reads a LCD pixel.
    ' j) l: X! K/ P: T" F) T
  1161.   * @param  Instance    LCD Instance
    4 K: c; x! L& l8 H2 Y9 Q% y% ?' {
  1162.   * @param  Xpos X position) u; T- V; q* v/ v7 ?9 j
  1163.   * @param  Ypos Y position8 g7 d9 [% X0 w. t
  1164.   * @param  Color RGB pixel color! A$ o& K4 J' R/ j
  1165.   * @retval BSP status1 `* \1 s+ c( H3 ?& z4 L
  1166.   */
    7 g9 S1 D% y, @* T& }5 Q
  1167. int32_t BSP_LCD_ReadPixel(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t *Color)
      p0 e0 h: M4 e: s% \/ D
  1168. {
    ' e* r" j9 D* {* O- x
  1169.   if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888)% c5 m3 X3 R6 Q
  1170.   {5 G$ D# x! v6 L% `% p/ A- E
  1171.     /* Read data value from RAM memory */
    . I2 H/ g( ^3 n1 C7 S2 J& g
  1172.     *Color = *(__IO uint32_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (4U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos)));
    + G- r$ z( n/ p! B; m. b
  1173.   }9 M6 B5 T" X7 T3 k0 z
  1174.   else if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB888)
    9 @. d& ^! r/ D, N8 F
  1175.   {
      H/ M1 d3 T& K  M/ |, j1 |# E
  1176.     /* Read data value from RAM memory */
    8 [/ D# D/ \- L1 s; C
  1177.     *Color = *(__IO uint32_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos)));7 L# E( ^; {1 k/ X+ Z; f4 S( Q3 G
  1178.     *Color = CONVERTARGB88882RGB888(*Color);- P+ e4 @: F$ M+ T: ~
  1179.   }
    " A* D% T4 W) w" W- c9 u
  1180.   else /* if((hlcd_ltdc.LayerCfg[layer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565) */
    3 ^4 ^; r2 a% N: S  {) y$ ?2 L
  1181.   {# l# t7 g$ u2 S% T# S1 I( `
  1182.     /* Read data value from RAM memory */" F: b# Q/ c3 ^, C5 e
  1183.     *Color = *(__IO uint16_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (2U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos)));
    ' r. x/ m  Y1 Y! Y+ V* Z
  1184.   }
    ' h: R2 Y$ n7 B3 U5 n- o( ^7 ]
  1185. 4 a# ]; P/ q3 r& I6 k
  1186.   return BSP_ERROR_NONE;7 j# E* w- r1 G+ C
  1187. }
      T. N9 i$ v4 V& \, V

  1188.   T6 c/ v+ G1 t- X2 E4 c2 A1 g
  1189. /**3 H/ S; b( E  F& v, m
  1190.   * @brief  Draws a pixel on LCD.
    + v' a7 q7 z5 \# Y4 C# l
  1191.   * @param  Instance    LCD Instance, t5 k) E$ E! E! H+ A+ O
  1192.   * @param  Xpos X position1 _/ X: u" z- a( \
  1193.   * @param  Ypos Y position
    ' q- ]+ z6 r1 U: m7 Q3 \7 P: ~
  1194.   * @param  Color Pixel color4 m. P9 s/ U* R' ?. [* I  h9 D
  1195.   * @retval BSP status& b: T7 P' o, ~' [
  1196.   */$ y2 O* c5 {0 s0 v
  1197. int32_t BSP_LCD_WritePixel(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Color); q0 B. m% I1 A& }
  1198. {8 \4 L" b5 {" q6 t' H
  1199.   if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888)
    " ^9 u5 K0 Z3 g; F2 B% ]8 a
  1200.   {
      b! A5 n8 E' W% N6 p& a4 [/ q% c9 ~7 p
  1201.     /* Write data value to RAM memory */
    , O. ], X5 \( s
  1202.     *(__IO uint32_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (4U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))) = Color;
    * X; U0 l% N* ~3 ?
  1203.   }% h% H2 g% I& h# e1 a) I. o
  1204.   else if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB888)
    # ]7 v5 n: x* G+ ?. i) f  F
  1205.   {5 \5 N9 n6 q* @0 z& H2 F' V
  1206.     /* Write data value to RAM memory */% s, n9 W$ {5 f3 m1 n
  1207.     *(__IO uint8_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + ((3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))-3U)) = (uint8_t) (Color);
    8 u! C+ H$ v, S+ [) i
  1208.     *(__IO uint8_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + ((3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))-2U)) = (uint8_t) (Color>>8U);
    8 }# x$ P1 U; y8 C, G8 S
  1209.     *(__IO uint8_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + ((3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))-1U)) = (uint8_t) (Color>>16U);0 F: D- g7 l: m2 z+ k
  1210.   }$ ?9 a" L& e0 z" ]; l
  1211.   else- X; Q  L  u/ A0 e# b: r
  1212.   {
    " S! O; z" L, |  D4 J" `+ j" O9 @
  1213.     /* Write data value to RAM memory */
    9 `) |9 c( @  O. I. L
  1214.     *(__IO uint16_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (2U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))) = (uint16_t)Color;  q& b3 K1 _4 [0 ^: x8 e! B
  1215.   }
    ' G- ~; N1 W) _

  1216. 0 m0 r( {, E& G% z) y! W
  1217.   return BSP_ERROR_NONE;3 G. U! f, {- `  f2 B. ?2 C
  1218. }9 ^( g( [! L( \" L' i; L: z
  1219. : S* ^% ]/ x# i! G8 [! A. I9 ^
  1220. /**% v) `" k: h! x$ O; `' F
  1221.   * @}
    9 s, k" b' ?& e1 x, \: A
  1222.   */
    6 ^' A* c# f+ w9 y$ Q0 r2 H. P

  1223. - T3 L  m( [' M6 h7 I8 E: ?
  1224. /** @defgroup STM32N6570_DK_LCD_Private_Functions LCD Private Functions* ~; {% E$ ]" R
  1225.   * @{
      @1 W( o: T' M" S
  1226.   */
    , L! b: \1 q: q1 D; [1 T$ m1 Q
  1227. /**8 ^+ R2 M9 h  Q' n+ s4 v
  1228.   * @brief  Fills a buffer.
    ! ~: c- @8 n4 V) o, U1 ?
  1229.   * @param  Instance LCD Instance( {  r. S( o. F9 ?2 [% ?
  1230.   * @param  pDst Pointer to destination buffer% {, j: d' u" s6 v3 F! [
  1231.   * @param  xSize Buffer width
    ' H& Q- S1 J% T5 I( H( S
  1232.   * @param  ySize Buffer height' A( v; c2 C4 G9 @
  1233.   * @param  OffLine Offset
    ; V4 M+ M, u0 p2 u) O# W
  1234.   * @param  Color RGB color3 q- x- K" t9 _2 F- c* D2 C
  1235.   */- T6 L/ J! [( u) h1 Y
  1236. static void LL_FillBuffer(uint32_t Instance, uint32_t *pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t Color)
    + `; c8 C2 p/ m  ]' o' w# i! e6 H- Y
  1237. {
    6 o( }, K7 D' N1 d
  1238.   uint32_t output_color_mode;! ~8 T) u; E( b; T) S% g$ h+ r
  1239.   uint32_t input_color = Color;: [" m( p$ {: C1 R

  1240. 7 Q. c" c- M( {: L
  1241.   switch(Lcd_Ctx[Instance].PixelFormat)' R2 @& x# s! ]0 U
  1242.   {9 G5 Y7 S  K6 e1 d" w6 L8 Z
  1243.   case LCD_PIXEL_FORMAT_RGB565:; [0 ]* s% Q+ G+ [9 c
  1244.     output_color_mode = DMA2D_OUTPUT_RGB565; /* RGB565 */9 ]$ Q4 c2 R" ]; K
  1245.     input_color = CONVERTRGB5652ARGB8888(Color);
    9 |7 D9 j; ?, ]! e  g0 A6 K
  1246.     break;  l8 b4 r* `7 O! b# ~
  1247.   case LCD_PIXEL_FORMAT_ARGB4444:
    ( F9 k6 Q* l  `' p' i5 _! g' x. u
  1248.     output_color_mode = DMA2D_OUTPUT_ARGB4444; /* ARGB4444 */
    ) M0 U1 e, k8 a* v
  1249.     input_color = CONVERTARGB44442ARGB8888(Color);7 f  U& G1 d3 k" i0 y
  1250.     break;
    % x- |; s% G0 T0 c1 U: I
  1251.   case LCD_PIXEL_FORMAT_RGB888:: n! x$ y& I5 B3 {  u9 \
  1252.     output_color_mode = DMA2D_OUTPUT_RGB888; /* RGB888 */
    5 i3 y7 s0 D! t3 S1 J
  1253.     input_color = CONVERTRGB8882ARGB8888(Color);
    ! v5 q3 K9 [" |
  1254.     break;& G* H+ K  }& Z; R9 c3 Z6 b
  1255.   default:0 q" q- U7 t1 J; x  q
  1256.     output_color_mode = DMA2D_OUTPUT_ARGB8888; /* ARGB8888 */  u" X+ y  f2 }3 m% L
  1257.     break;5 ]" k; J8 {/ i/ B: q& S
  1258.   }% A. V4 d0 D- {) L: v$ F

  1259. - Q& D' v3 h3 b" ]2 Z, O  c
  1260.   /* Register to memory mode with ARGB8888 as color Mode */
    7 o# c/ t- L1 L9 H- i: q3 f
  1261.   hlcd_dma2d.Init.Mode         = DMA2D_R2M;
    $ Z/ `* k7 {  m6 F3 L
  1262.   hlcd_dma2d.Init.ColorMode    = output_color_mode;
    1 m( i! z; ?$ u! c8 a: w
  1263.   hlcd_dma2d.Init.OutputOffset = OffLine;2 G/ b) J$ b$ V* M: P% Q% y! }
  1264. " K" I- e( V7 J0 X; d
  1265.   hlcd_dma2d.Instance = DMA2D;3 l0 G3 Y, a! k! H' ?  V2 \

  1266. 0 W# Y: S( `& _
  1267.   /* DMA2D Initialization */8 V9 {: x8 f1 s* M
  1268.   if(HAL_DMA2D_Init(&hlcd_dma2d) == HAL_OK)
    7 d9 y. [+ o1 z8 ^( l( D5 S
  1269.   {; [4 m; y# i' t/ G7 Q7 ]
  1270.     if (HAL_DMA2D_Start(&hlcd_dma2d, input_color, (uint32_t)pDst, xSize, ySize) == HAL_OK)( t8 S& Y6 B* S4 B% N% s. t! U" b
  1271.     {; u7 B5 D4 F9 c( Y$ j0 v
  1272.       /* Polling For DMA transfer */
    ) R/ Y& x9 p2 ], z# q1 P
  1273.       (void)HAL_DMA2D_PollForTransfer(&hlcd_dma2d, 50);9 q" |0 W6 ^6 Q& c! W
  1274.     }, S& W2 z; u  x
  1275.   }+ h( l+ `, x& @8 u+ N
  1276. }
    # N. L  q: q7 f9 |( B2 S! J9 A' N6 U
  1277. 4 S1 ]6 {6 V- |: `( {
  1278. /**% k$ Q& h  Y' _/ I
  1279.   * @brief  Converts a line to an RGB pixel format.* `: W6 i% q' e1 H" X; F
  1280.   * @param  Instance LCD Instance$ m/ `4 j! y! T% ~' E$ Y/ X: @
  1281.   * @param  pSrc Pointer to source buffer
    ( F7 |" z! ?& `2 u2 T
  1282.   * @param  pDst Output color+ Z' R$ W9 u% \1 u7 r
  1283.   * @param  xSize Buffer width
    # w0 A( I6 a5 f9 ?
  1284.   * @param  ColorMode Input color mode
    6 D' D1 C* s1 E# ?1 _* u# x
  1285.   */
    . }3 i, _; t0 `
  1286. static void LL_ConvertLineToRGB(uint32_t Instance, uint32_t *pSrc, uint32_t *pDst, uint32_t xSize, uint32_t ColorMode)
    9 C" z' j9 {9 _# W- O* R' m( N1 V+ b
  1287. {' n3 a/ J9 n7 w9 U; d% x
  1288.   uint32_t output_color_mode;
    8 {; G# Y4 d8 B) L, B+ F3 g
  1289. $ o9 Z+ r4 F  |' x' m% b0 |
  1290.   switch(Lcd_Ctx[Instance].PixelFormat)" k; S# Z* T: B% O  H) d6 M: \
  1291.   {/ Q, H% v9 ?0 t# i
  1292.   case LCD_PIXEL_FORMAT_RGB565:
    . v5 s% N. z" {. }9 ^
  1293.     output_color_mode = DMA2D_OUTPUT_RGB565; /* RGB565 */3 i. |6 n9 Z; {
  1294.     break;
    8 }: |+ b1 `% V0 [+ u
  1295.   case LCD_PIXEL_FORMAT_ARGB4444:
    , f- o" T+ [5 x' }2 z4 g  [( I
  1296.     output_color_mode = DMA2D_OUTPUT_ARGB4444; /* ARGB4444 */" m) ?, i. G. O# e* d  g; W
  1297.     break;
    : d4 K: U0 e. X- q' T/ {
  1298.   case LCD_PIXEL_FORMAT_RGB888:
    ) E& \- m6 r- J' }1 u
  1299.     output_color_mode = DMA2D_OUTPUT_RGB888; /* RGB888 */
    # j+ D8 w2 R( H
  1300.     break;+ r; x( A. g9 z7 z
  1301.   default:" A6 C6 b, q, j. ]4 M" U! b8 K. w
  1302.     output_color_mode = DMA2D_OUTPUT_ARGB8888; /* ARGB8888 */
    ' ^9 c/ p& M7 [' C" g
  1303.     break;
    2 E! @7 Z( l: c0 n$ b
  1304.   }6 z" U" I7 ]# v, N

  1305. . _2 o8 E1 d( R& {9 h+ K; T4 }
  1306.   /* Configure the DMA2D Mode, Color Mode and output offset */
    # c9 j. [, u3 H
  1307.   hlcd_dma2d.Init.Mode         = DMA2D_M2M_PFC;9 O% q' |* _! T, U/ y; }
  1308.   hlcd_dma2d.Init.ColorMode    = output_color_mode;
    & W) E7 ~$ j( W% t, N1 P
  1309.   hlcd_dma2d.Init.OutputOffset = 0;
    8 C; z0 }; e( @1 J4 D$ `% C
  1310. 2 C' C) b! J9 Y  G
  1311.   /* Foreground Configuration */
    * X! R( t$ U8 Z  P
  1312.   hlcd_dma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;0 ^( d5 c5 q: c% _* Z" Y, f
  1313.   hlcd_dma2d.LayerCfg[1].InputAlpha = 0xFF;, `$ [8 _" X0 A$ F0 g% j6 g
  1314.   hlcd_dma2d.LayerCfg[1].InputColorMode = ColorMode;
    & f4 c( I8 q' {) C1 |8 I1 v
  1315.   hlcd_dma2d.LayerCfg[1].InputOffset = 0;
    $ Q. e4 R# Q9 d; A$ {8 S. u
  1316. * A' ?2 j2 P! @- j* L# y
  1317.   hlcd_dma2d.Instance = DMA2D;
    9 r" o1 |% X: {% R" t2 ~
  1318. 8 g: T6 Q- q& M; W4 I; r/ M
  1319.   /* DMA2D Initialization */
    1 ]3 F. B  c/ Y6 @( t& w8 U
  1320.   if(HAL_DMA2D_Init(&hlcd_dma2d) == HAL_OK)
    1 W) z! A, n0 |- {2 f8 @
  1321.   {
    $ H- a- U* v7 W- {
  1322.     if(HAL_DMA2D_ConfigLayer(&hlcd_dma2d, 1) == HAL_OK)$ h) w4 x: M) |1 t! O8 p
  1323.     {
    8 v9 ^8 h- z0 p. H! f# _- {$ [
  1324.       if (HAL_DMA2D_Start(&hlcd_dma2d, (uint32_t)pSrc, (uint32_t)pDst, xSize, 1) == HAL_OK)
    # n& L$ R/ ]5 }
  1325.       {. t, r; w, ?+ ]% \2 N! v1 d
  1326.         /* Polling For DMA transfer */- [) |4 G* }5 q$ j
  1327.         (void)HAL_DMA2D_PollForTransfer(&hlcd_dma2d, 50);$ k5 i  z8 x: A% h4 w8 b% S
  1328.       }& U% J4 R. K- q: Z; ^
  1329.     }
    ; g7 V- _0 q$ \" h
  1330.   }
    4 X: [* L; Y( Q" s7 v: p& c
  1331. }
    9 N0 @+ [1 O- T" e
  1332. : u2 y9 h4 F" B9 ~
  1333. /**) v# P+ m; ]& j) B- l9 c
  1334.   * @brief  Initialize the BSP LTDC Msp.2 f+ M. i, }2 {0 ?
  1335.   * @param  hltdc  LTDC handle( }2 g% _' g6 p1 x" m
  1336.   * @retval None. W3 _8 L; ^! B+ ~
  1337.   */( @- @& `! I1 x+ C
  1338. static void LTDC_MspInit(LTDC_HandleTypeDef *hltdc)
    & G# I) T& M  u3 U: m- i
  1339. {
    % y8 e* ^* G4 k- i( a( x+ k) R
  1340.   GPIO_InitTypeDef  gpio_init_structure = {0};
    " {, I9 M; d* \* y+ O
  1341. ; i8 j# g, T; }) d
  1342.   if (hltdc->Instance == LTDC)2 e7 P' R6 n. Q8 E
  1343.   {% Q, K7 y# P3 r
  1344.     __HAL_RCC_LTDC_CLK_ENABLE();
    2 q, ?- c6 a# z6 p5 k7 g$ j

  1345. 2 h; ^. \% ]0 K. Y; q7 s; Z
  1346.     __HAL_RCC_LTDC_FORCE_RESET();: W' D. D# l& h) B7 s) ^9 k
  1347.     __HAL_RCC_LTDC_RELEASE_RESET();
    . o! `/ B- U; c! r. h

  1348. . a4 Z1 q& ?2 [* i) H% |! c
  1349.     /* STM32N6570-DK MB1860A RK050HR18 */- X- I1 |( A" I' {
  1350.     /* PG0  R0          */: p+ K0 U$ G* Z+ h+ q: ?* d! V
  1351.     /* PD9  R1          */) K2 ?7 m) R! F7 X
  1352.     /* PD15 R2          */8 b, O0 \2 }# [* ?
  1353.     /* PB4  R3          */ // JTAG+ c5 |& q+ A2 M: i6 w
  1354.     /* PH4  R4          */% n9 H; e% ~- v( x1 n* H' m
  1355.     /* PA15 R5          */ // JTAG JTDI
    " D) ~7 T6 D& R& r
  1356.     /* PG11 R6          */
    / K5 e7 z( q. \3 ]. c- o/ r
  1357.     /* PD8  R7          */* R9 T; \$ e7 l) @* _
  1358.     /* PG12 G0          */: S6 A2 @2 F/ V; v( v
  1359.     /* PG1  G1          */
    & M6 \* b2 f5 j0 r
  1360.     /* PA1  G2          */4 e, X: R* s1 ]. I! D% l
  1361.     /* PA0  G3          */
    . f$ j! t1 @7 n4 l3 _& _' q
  1362.     /* PB15 G4          */9 x# J+ t+ R3 I1 u
  1363.     /* PB12 G5          */9 G  ~* X9 o4 r6 y
  1364.     /* PB11 G6          */
    - V* t3 o$ ?# Q$ X/ v
  1365.     /* PG8  G7          */
    $ E# ]9 P2 L, J( `9 C& ~2 |
  1366.     /* P15  B0          */
    " ~3 p2 z: `( L* l5 p
  1367.     /* PA7  B1          */) T8 d9 S) G3 e) ^# [
  1368.     /* PB2  B2          */) i& @1 \( X, o& M) U8 I
  1369.     /* PG6  B3          */1 L: g0 r% m! D; C  D$ o
  1370.     /* PH3  B4          */; C/ N7 v  H8 x) D
  1371.     /* PH6  B5          */
    , z/ q6 c1 T* w! @% j3 r
  1372.     /* PA8  B6          */) a5 p; S- @" A
  1373.     /* PA2  B7          */
    $ H5 U' U$ |$ L% T
  1374.     /*                  */$ @. [& l' ^, U% t. |
  1375.     /* PG13 LCD_DE      */: r, M2 [0 d+ q( [! S0 C. K
  1376.     /* PQ3  LCD_ONOFF   */! N/ b4 w* k3 {( @' I/ M
  1377.     /* PB14 LCD_HSYNC   */9 O8 n  T: f8 ?& P& v
  1378.     /* PE11 PCD_VSYNC   */
    $ Z, L; I" q3 e
  1379.     /* PB13 LCD_CLK     */
    5 G- @: B4 |: |: ?5 H2 v
  1380.     /* PQ4  LCD_INT     */
    ) a% [) `9 O$ h) o. q* Q( I0 j
  1381.     /* PQ6  LCD_BL_CTRL */
    # V7 K( o: o: ^2 q+ V' A! T
  1382.     /* PE1  NRST        */
    1 d& z" e3 D6 ?5 B' g9 k& ^
  1383. 6 `7 d5 Z8 Z8 w( R; O) Y5 V
  1384.     __HAL_RCC_GPIOA_CLK_ENABLE();( {2 X0 p7 a; g3 ]
  1385.     __HAL_RCC_GPIOB_CLK_ENABLE();5 c/ ~8 p  E5 L8 i7 N) c) v
  1386.     __HAL_RCC_GPIOD_CLK_ENABLE();
    . Y" T$ n- o  o: s- ?
  1387.     __HAL_RCC_GPIOE_CLK_ENABLE();
    . [+ {$ @2 p: |1 v# i
  1388.     __HAL_RCC_GPIOG_CLK_ENABLE();+ f" p3 `% \. |7 |6 r9 u
  1389.     __HAL_RCC_GPIOH_CLK_ENABLE();
    9 l3 h+ D3 b* L" H/ h  ?* C
  1390.     __HAL_RCC_GPIOQ_CLK_ENABLE();. Q" J* E# ^& o4 e+ k
  1391. , g4 ~6 a2 _% Y% g& G, y
  1392.     gpio_init_structure.Mode      = GPIO_MODE_AF_PP;
    6 }( d% i- }2 z! {
  1393.     gpio_init_structure.Pull      = GPIO_NOPULL;
    ( Y: R& l& X0 U7 w& Q6 K( I
  1394.     gpio_init_structure.Speed     = GPIO_SPEED_FREQ_HIGH;
    + C+ @4 T3 K0 B
  1395. " {! k3 V- A, X( @
  1396.     /* G3, G2, B7, B1, B6, R5 */. X+ e! d6 R" u0 u' ]5 Y
  1397.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_15;8 G& J5 @3 M+ q& E! f2 X
  1398.     gpio_init_structure.Alternate = GPIO_AF14_LCD;" O3 D- g; [$ ^5 C2 ~3 a8 q6 W+ }6 R
  1399.     HAL_GPIO_Init(GPIOA, &gpio_init_structure);
    : y# b% M. ?9 r4 E
  1400. 7 |2 J2 C% |0 I3 i6 S" X1 z
  1401.     /* LCD_CLK, LCD_HSYNC B2, R3, G6, G5, G4 */
    7 `& u4 x+ `8 [/ \9 M, V
  1402.     gpio_init_structure.Pin       = GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_15;4 a3 q) }1 U/ u  i# T7 Y$ a
  1403.     gpio_init_structure.Alternate = GPIO_AF14_LCD;
    ) ?+ @3 H. c, F9 {7 v1 f
  1404.     HAL_GPIO_Init(GPIOB, &gpio_init_structure);, V- i6 w, `; S  Z! A+ L; A- O
  1405. : f9 h  P0 `' g, R) D1 {
  1406.     /* R7, R1, R2 */9 i3 |/ T. V/ E0 t" B8 V
  1407.     gpio_init_structure.Pin       = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_15;
    / {. _. v9 @6 u! O- x
  1408.     gpio_init_structure.Alternate = GPIO_AF14_LCD;/ ~- y- [0 h6 f: v
  1409.     HAL_GPIO_Init(GPIOD, &gpio_init_structure);* u) q( T2 @0 A) Z

  1410. 9 O5 k4 s7 y2 J. ?9 T) f, `
  1411.     /* LCD_VSYNC */
    - i& V: l* }8 a+ @) ?! |0 T
  1412.     gpio_init_structure.Pin       = GPIO_PIN_11;8 e3 ~- p& ]* w, j  q3 N2 K
  1413.     gpio_init_structure.Alternate = GPIO_AF14_LCD;
    5 X; w8 S& v4 p  O$ {! O$ L: ~
  1414.     HAL_GPIO_Init(GPIOE, &gpio_init_structure);
    6 R9 a; l0 {& G8 E: p: p

  1415. 0 V; q! B- B7 O/ ^
  1416.     /* R0, G1, B3, G7, R6, G0 */
    4 Z* g) |( g# u- @* e2 Q. u3 F) C" \
  1417.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_6 | GPIO_PIN_8 | GPIO_PIN_11 | GPIO_PIN_12 ;
    $ i* k, y$ n5 X
  1418.     gpio_init_structure.Alternate = GPIO_AF14_LCD;: |  y9 C6 J: g% T' x5 y2 |
  1419.     HAL_GPIO_Init(GPIOG, &gpio_init_structure);
    & }9 b# G; h5 N& g% r* T. ?
  1420. 1 s7 m6 r  `3 F  O2 `
  1421.     /* B4, R4, B5 */
    8 Z+ q3 [8 X; n8 R0 D; m: T+ ~
  1422.     gpio_init_structure.Pin       = GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_6;
    $ q# P$ _0 `' g" S4 g$ [  _4 L7 p
  1423.     gpio_init_structure.Alternate = GPIO_AF14_LCD;
    4 p% q- H+ T) J8 `, T+ Y
  1424.     HAL_GPIO_Init(GPIOH, &gpio_init_structure);
      ^% F* b' h9 L& `

  1425. 3 J3 r) d( B' r! J& E+ w2 O
  1426.     /* NRST */
    7 h1 \4 Q+ |* n7 E$ O4 e8 |7 I
  1427.     gpio_init_structure.Pin       = GPIO_PIN_1;
    9 }; ?+ e2 [3 p! D
  1428.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;
    $ m2 |8 f* D) ~& C* i0 U
  1429.     HAL_GPIO_Init(GPIOE, &gpio_init_structure);& c& m& k9 W5 P* U; h& H" m! `

  1430. 6 \5 n7 |5 |4 M0 _& n  x
  1431.     /* LCD_ONOFF, LCD_BL_CTRL */
    3 {# F, G- g3 [) a7 @" N2 P! h
  1432.     gpio_init_structure.Pin       = GPIO_PIN_3 | GPIO_PIN_6;
    ' F- |+ |, _$ A+ O
  1433.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;$ U3 s8 b+ k1 B- K, G2 ^$ Z
  1434.     HAL_GPIO_Init(GPIOQ, &gpio_init_structure);
    ; ~1 k3 x0 V$ n7 d
  1435. * m7 }, l' \5 W: B+ A$ r
  1436.     /* LCD_DE */' e  X3 ~- Q9 |4 U
  1437.     gpio_init_structure.Pin       = GPIO_PIN_13;4 D. h! a# _4 R
  1438.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;
    ) W# i% f2 u+ V$ x) _! s% l9 W
  1439.     HAL_GPIO_Init(GPIOG, &gpio_init_structure);9 z! j" N, c' @
  1440. " F% p' ]5 o9 m0 F
  1441.     HAL_GPIO_WritePin(GPIOQ, GPIO_PIN_3, GPIO_PIN_SET); /* LCD On */ /* PQ3  LCD_ONOFF   */
    # h+ ~% `5 I: @
  1442.     HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET); /* Display Enable */ /* PG13 LCD_DE      */8 k7 d$ ~3 P4 ?) V  A: I  s
  1443.     HAL_GPIO_WritePin(GPIOQ, GPIO_PIN_6, GPIO_PIN_SET); /* 100% Brightness */ /* PQ6  LCD_BL_CTRL */
    3 C. D( B1 h1 o8 l# ]

  1444. , I0 w$ @7 c+ V! @
  1445.   }
    9 p% g0 z" m9 S
  1446. }
      Z/ U4 R) y% }! L! D( D! p

  1447. # _, U7 c8 m+ b# ~
  1448. /**
    * I7 Y6 Q- A4 V1 n) n/ d; C* \% b
  1449.   * @brief  De-Initializes the BSP LTDC Msp
    : T' c, o! `0 E; |
  1450.   * @param  hltdc  LTDC handle  p/ B; D' _3 ~
  1451.   * @retval None
    , F3 l8 t3 D" \3 a5 m" [
  1452.   */3 B1 [8 v: _' D  _
  1453. static void LTDC_MspDeInit(LTDC_HandleTypeDef *hltdc); `0 G: c, L$ i0 D
  1454. {" v" r0 g: Y& j# |! b# Q
  1455.   GPIO_InitTypeDef  gpio_init_structure;  I- O8 h7 Q8 N& e

  1456. 3 u2 G5 z$ m: T: ]1 t
  1457.   if(hltdc->Instance == LTDC)0 `' {2 q5 L5 g
  1458.   {
    3 a% T2 o' A# A* ?! N/ `% H; b+ \
  1459.     /* LTDC Pins deactivation */
    / C( a, j* h; u' ]$ T: T" R& D
  1460.     /* GPIOA deactivation */
    3 T9 e; l/ m9 T7 I+ j
  1461.     gpio_init_structure.Pin       = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_8|GPIO_PIN_11 |GPIO_PIN_12| GPIO_PIN_15 | GPIO_PIN_6 | GPIO_PIN_9|GPIO_PIN_10;
    - {  t1 r/ @4 w0 I& B
  1462.     HAL_GPIO_DeInit(GPIOA, gpio_init_structure.Pin);
    . N" \% w0 e+ o$ c* z6 Z/ w

  1463. ) m) L, H2 Q$ o# l1 x
  1464.     /* GPIOB deactivation */
    # ]# D4 g  @, k9 s1 C3 f" C+ v1 k+ p5 h
  1465.     gpio_init_structure.Pin       = GPIO_PIN_13 | GPIO_PIN_15 | GPIO_PIN_3 |GPIO_PIN_4 | GPIO_PIN_10| GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_14;; y( h$ a& L9 U5 N
  1466.     HAL_GPIO_DeInit(GPIOB, gpio_init_structure.Pin);' ^2 B: u0 B! A9 H

  1467. % C% C6 ?. y$ u' a8 I
  1468.     /* GPIOE deactivation */- ?) O5 `. X% y) Q6 ~: o) W: h
  1469.     gpio_init_structure.Pin       = GPIO_PIN_11 | GPIO_PIN_15;
    2 Q: I1 O: J8 |; O
  1470.     HAL_GPIO_DeInit(GPIOE, gpio_init_structure.Pin);9 @9 f/ h' l, d/ O4 q- l" t

  1471. : n: t8 ?# O( H; o/ q/ ]
  1472.     /* GPIOF deactivation */+ G. v4 e- s4 V- O
  1473.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_10|GPIO_PIN_11 | GPIO_PIN_9 | GPIO_PIN_7 | GPIO_PIN_15;% a( t7 N* n# v. S) x/ ]! j$ i! T
  1474.     HAL_GPIO_DeInit(GPIOF, gpio_init_structure.Pin);
    : `9 A8 |6 {- z6 {, ^1 R" G
  1475. & L  A" R3 b, \* U; `
  1476.     /* GPIOG deactivation */
    % D$ F* Z8 r. F& n* I& b# z: S
  1477.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_1| GPIO_PIN_2 | GPIO_PIN_13|GPIO_PIN_14;# S) R$ v8 b) H3 B" w
  1478.     HAL_GPIO_DeInit(GPIOG, gpio_init_structure.Pin);
    8 @6 s1 G9 L+ Y) T( i

  1479. / z3 d# a( l. p: u/ l
  1480.     /** Force and let in reset state LTDC */
    + J7 d! t! c! e; D  l. R8 ~
  1481.     __HAL_RCC_LTDC_FORCE_RESET();  s# z" r  U' ~. \
  1482. ! v( _. u" d* n7 d* i) W, s* n$ {. t
  1483.     __HAL_RCC_LTDC_RELEASE_RESET();
    + r% v( B$ M0 p8 r

  1484. - v0 H, u' L8 O: R' Q% k
  1485.     /** Disable the LTDC */5 A) a- m; j! T- w7 F
  1486.     __HAL_RCC_LTDC_CLK_DISABLE();( a9 @* u) q: W+ C+ a+ m. k7 q
  1487.   }: y8 T; H  ?! N8 `* Z5 H+ \- f
  1488. }
      w( C2 d* [) x/ G5 \$ T" Z
  1489. ) N, e( r  s. T1 W
  1490. /**
    0 U  B0 B! W  g( r* [# e* q/ d
  1491.   * @brief  Initialize the BSP DMA2D Msp." e# f9 g* }- I" H  \2 l
  1492.   * @param  hdma2d  DMA2D handle5 {! o6 N" J% R( U* B. X
  1493.   * @retval None8 O( C0 S0 I+ q$ V! z
  1494.   */
    : F: ?2 U9 b0 a7 k8 K
  1495. static void DMA2D_MspInit(DMA2D_HandleTypeDef *hdma2d)9 f% I; ~2 v  a, b% Y4 m  t$ E
  1496. {
    0 `3 e. |0 t! |4 g: B
  1497.   if(hdma2d->Instance == DMA2D)
    * W( H/ R6 v" J2 _, X6 l
  1498.   {
    8 Y4 E4 n& p  X1 I
  1499.     /** Enable the DMA2D clock */
    8 O+ g9 a' f3 R. i0 z
  1500.     __HAL_RCC_DMA2D_CLK_ENABLE();4 w6 W9 Q3 d* n6 c8 M- C" X

  1501. ( M9 U- y' N% }3 h+ Z+ ?9 B
  1502.     /** Toggle Sw reset of DMA2D IP */& \3 X' C) `/ k) N( R: I8 Y
  1503.     __HAL_RCC_DMA2D_FORCE_RESET();9 z7 K3 C! Y: `' o5 [
  1504.     __HAL_RCC_DMA2D_RELEASE_RESET();
      [6 h# @, L4 d: O4 _1 o6 h2 r- \: i5 w
  1505.   }
    : H' Z7 U& K; T/ b+ o/ M
  1506. }( Q) o# f3 X) t! O7 g% j
  1507. 3 ~2 \9 A  K! Y' \$ F1 r
  1508. /**
    * |1 \$ S# D& o1 z
  1509.   * @brief  De-Initializes the BSP DMA2D Msp! ]" o2 G* p: e4 n% |2 k
  1510.   * @param  hdma2d  DMA2D handle
    0 \% a* J' L" s  s- k
  1511.   * @retval None
    5 {; P4 S" c% Q0 ]
  1512.   */4 f7 r  ?- y, I% K5 L
  1513. static void DMA2D_MspDeInit(DMA2D_HandleTypeDef *hdma2d)" S3 a# e. i, y2 _7 U
  1514. {
    - ^7 E: X  o0 ?
  1515.   if(hdma2d->Instance == DMA2D)
    4 }" b' m  U( L1 l8 c$ u
  1516.   {
    ( r+ H) V* `. R* m& V; X
  1517.     /** Disable IRQ of DMA2D IP */
    7 l0 V- b) H& X8 O5 U3 N" ]  U
  1518.     HAL_NVIC_DisableIRQ(DMA2D_IRQn);1 B$ k, w8 q9 D
  1519. 1 _/ l+ l  V- G( _  v5 {
  1520.     /** Force and let in reset state DMA2D */! ]7 Z8 T1 r: a
  1521.     __HAL_RCC_DMA2D_FORCE_RESET();* ?0 J. E+ q3 Z
  1522.     __HAL_RCC_DMA2D_RELEASE_RESET();
    $ @0 W( F$ j7 {+ c  p

  1523. + S7 y4 p9 h% _6 Q0 V2 z
  1524.     /** Disable the DMA2D */
    0 A' I0 {, Z) C, B
  1525.     __HAL_RCC_DMA2D_CLK_DISABLE();
    5 u7 l8 w0 X: M5 ~! c- R
  1526.   }
    6 @! ^% I# D. F: e" ~
  1527. }! |4 A! h) ?1 K9 k6 E3 B$ d, P
  1528. 8 f0 W) B+ @  s- u8 [
  1529. /**! p" j9 m8 f5 S4 L1 ^: i  ]- _
  1530.   * @}
    0 k7 \$ v# j8 q" w
  1531.   */% z+ }  R1 I' A
  1532. ( K7 Z6 K" _# y) d5 @9 q# r% W4 s
  1533. /**
    * l) \; F8 [# |
  1534.   * @}
    ; B0 G3 P: h) S2 j' x
  1535.   */
    $ j  x9 ~  Z/ M: o

  1536. # T6 |1 W7 C$ f! h6 |
  1537. /**
    : c  i" ^" |: k2 t2 h
  1538.   * @}- }7 b8 R1 |; c
  1539.   */6 l" Y& j& H1 o2 ?8 Q; [. n
  1540. & Z/ c7 |* a  ]: o
  1541. /**
    5 E9 \0 g1 q/ L- Q% p) E" }
  1542.   * @}
    ' B# q3 K8 A5 w/ X9 R
  1543.   */
    ( r! n- C& \* w* Z: G; n

  1544. & R! ~! R+ \% z/ v5 x3 f3 Q
复制代码

) ^$ [+ e. i$ Y  T2 B7 n+ L; u
$ ~3 v/ y5 u0 c5 ]- U: {& q4 Q
2.2、main.c7 ]4 C, h* o/ Z" }! w
  1. int main(void)
    ' `# X4 s5 `& s  N5 n' }* S' {
  2. {
    + o! J3 e+ z" F/ j3 Z1 \; \
  3.   uint32_t x_size;. H7 k6 m. M/ k/ k/ s/ z) F
  4.   uint32_t y_size;
    ) j1 z9 Q2 c: w2 O9 N0 P5 \2 B+ ]
  5.   uint16_t i,j;" X; q( P( Y* `* u' w; s0 Y9 V6 u

  6. 9 G8 c! v1 N$ [! J
  7.   HAL_Init();
    2 |" w9 o4 G% M9 u# @0 {
  8.   SystemClock_Config();
    + o2 Q& M4 z7 I: O5 G3 B, j3 i# X
  9.   
    / j6 {7 K* q8 U2 S& V) }  C
  10.   /* Update the RIF config for the used peripherals */
    0 C4 ?3 Z% e2 V# Z& l$ J7 B
  11.   RIMC_MasterConfig_t RIMC_master = {0};
    ; T9 m8 }, H3 Z" p9 Q) e1 n3 V
  12.   RIMC_master.MasterCID = RIF_CID_1;! T9 E0 e9 e8 \
  13.   RIMC_master.SecPriv = RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV;
    - @4 t3 Y, G( A- ^8 p
  14.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_DCMIPP, &RIMC_master);( v" V1 _* a9 _6 j$ m; R
  15.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_DMA2D, &RIMC_master);
    : S! U# E, k& U1 Y; F! n
  16.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_LTDC1 , &RIMC_master);8 o  F$ k$ o4 W3 \
  17.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_LTDC2 , &RIMC_master);" a/ Z! }0 B. m
  18.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_VENC  , &RIMC_master);
    ' n" }* H' X- T) |7 g  {
  19.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_DMA2D  , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
    0 b7 s3 z! o! w3 ^$ ^0 Q( \+ w/ b
  20.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_DCMIPP , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);. w7 |  c6 }5 k# U+ s0 k+ d
  21.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_CSI    , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);5 }; Y7 u6 I1 M# i
  22.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDC   , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
    & }6 q9 s' }& _
  23.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDCL1 , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
    6 f2 I! \3 E9 M7 T! `. ^
  24.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDCL2 , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
    ; @  i4 s# G1 F% q( c  h

  25. $ @# t% X$ h) }. h+ J$ B+ |
  26.   BSP_LED_Init(LED_GREEN);
    8 z# R) o% W4 R* S& n
  27.   BSP_LED_Init(LED_RED);
    ( Q# T) K+ ?  K9 t* Y: f: l$ d' }
  28.   
      X/ F1 s6 J! `
  29.   #if USE_COM_LOG
    ' o, l2 N9 n3 X) W9 G
  30.   COM_InitTypeDef COM_Init;
    ; N1 \3 k3 p) X/ k& w" X
  31.   X9 `( c7 f% k) p5 }3 p. w
  32.   /* Initialize COM init structure */) k' v5 @2 ~9 H( x
  33.   COM_Init.BaudRate   = 115200;" _! t% k1 Y2 C" p2 ~
  34.   COM_Init.WordLength = COM_WORDLENGTH_8B;
    8 W$ T) d4 F+ Y8 b4 s
  35.   COM_Init.StopBits   = COM_STOPBITS_1;; r# u( I) g) X# ~- j9 ]: O! r
  36.   COM_Init.Parity     = COM_PARITY_NONE;$ x. H. N/ j: [# e7 \$ j
  37.   COM_Init.HwFlowCtl  = COM_HWCONTROL_NONE;
    ! b4 }: o$ A" ~+ T- K& E4 n

  38. ) g! |: Y! ~/ T! O- Y6 P
  39.   BSP_COM_Init(COM1, &COM_Init);) T4 Q/ \0 Z8 g% F/ k
  40. 4 g. E" q" w$ ~- z3 W- M# J
  41.   if (BSP_COM_SelectLogPort(COM1) != BSP_ERROR_NONE)
    $ `/ ~/ W; H3 _+ n8 a) f
  42.   {
    1 {4 ]/ U, \% K! }
  43.     Error_Handler();
    ( p( [0 v% b* d0 N
  44.   }4 I: l: ]9 K2 d9 f' Q; t
  45. #endif
    " ^8 E$ t7 C7 c% O
  46.   " p, }, q! K" W' w/ I* S
  47.   BSP_LCD_Init(0, LCD_ORIENTATION_LANDSCAPE);- g: F) p' {. ^0 \$ {. X
  48.   UTIL_LCD_SetFuncDriver(&LCD_Driver);
    ( T% \+ f) R" N( h, `9 N! j
  49.   UTIL_LCD_Clear(UTIL_LCD_COLOR_RED);% ^: y9 W2 Z' n( K9 ]
  50.   UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_RED);5 F$ }$ b$ P, W: o; W, g
  51.   UTIL_LCD_SetBackColor(UTIL_LCD_COLOR_WHITE);
    * y3 `' ^# s, N; K( M
  52.   UTIL_LCD_SetFont(&Font24);( E  t6 R" L; @
  53.   
    9 F! U$ |  m1 T
  54.   while (1)
    9 d9 r1 c9 O; A
  55.   {
    * t7 x* W1 @- B% s0 i' z% ^
  56.     switch (i)
    / o& N3 d, E4 ~" n$ I$ N  i: a  D
  57.     {1 {9 Y, g% @2 a6 F: W1 s
  58.       case 0:: O5 ?# C% g6 s& K
  59.       {
    1 [1 y  e/ `) W! d: A* x
  60.           UTIL_LCD_Clear(UTIL_LCD_COLOR_WHITE);7 j! e* ?9 @: e! B+ k
  61.           break;
    ! f. p% u4 a* v. a3 [) ~! }
  62.       }
    5 p5 ~7 s! X. l$ Z2 `* f7 Z
  63.       case 1:
    * c' F% `0 y( n. N' I  L/ ?
  64.       {& E$ W- P1 I) h4 u* }
  65.           UTIL_LCD_Clear(UTIL_LCD_COLOR_RED);
    % e! _, R; q5 E  O4 ?6 y' X
  66.           break;% F8 m: J1 F# p. x. y; V
  67.       }
    / M+ y9 _) V$ S+ _; s
  68.       case 2:
    4 @* S& n# _8 v3 `( N4 V, M
  69.       {; \" f  r+ D4 ?$ A5 N- `
  70.           UTIL_LCD_Clear(UTIL_LCD_COLOR_GREEN);  a# u6 B7 u- o5 K4 R' H
  71.           break;# s: n. r1 G, |6 V! A4 |
  72.       }
    : m7 R3 c3 ]7 w4 }
  73.       case 3:- J7 ]1 Z) X3 @" }
  74.       {
      r& [) l$ B" m
  75.           UTIL_LCD_Clear(UTIL_LCD_COLOR_BLUE);& \9 c, [% n) _8 }0 R8 T
  76.           break;# ]; W; B0 \, S, R# J0 p& A( X, w
  77.       }7 F3 R7 _: Z+ b, ?
  78.       case 4:9 c: I) P' C/ S& x+ p7 E7 A
  79.       {
    " Z+ @& z' K) q5 `' G5 g8 G; ~
  80.           UTIL_LCD_Clear(UTIL_LCD_COLOR_MAGENTA);
    ' A+ U; v1 y: a/ F
  81.           break;! w' `; J! ]# X, P: Q
  82.       }5 X/ z  P  G' G; B2 j9 Z
  83.       case 5:
    ; z& m0 H( G  v
  84.       {' @# b3 i( P* c# z4 b4 G
  85.           UTIL_LCD_Clear(UTIL_LCD_COLOR_YELLOW);
    % f4 z9 M+ ]) M
  86.           break;9 N4 \8 f3 M7 A. h' d
  87.       }
    8 l4 I1 R! c9 D8 o5 ~5 L
  88.     }
    9 m0 \& n' ~' W' m! |6 _5 Z; R! L
  89.     7 g- j' C( I, Z
  90.     if(i==6)
    9 k* v# e/ s5 u8 {
  91.     {
    . h# ]% w" x5 n0 I
  92.       i=0;0 P; N. R4 k. d9 b3 q% K
  93.     }6 Z% n  c, K; H0 ^7 f4 K0 C
  94.     else
    ( b7 }) g* r% c# x
  95.     {
    ' ^4 D  V" h5 i, r) n
  96.       i++;" J* m4 E' ~# b& l
  97.     }  U  f  _, B) n5 y( J6 h$ c3 f5 H
  98.     UTIL_LCD_DisplayStringAt(10, 50, (uint8_t *)"STM32N6570 BOARD LCD TEST!", LEFT_MODE);
    # O: B/ p' }4 x9 q, W6 O) ]8 M
  99.     BSP_LED_On(LED1);
    % C* G9 k- ?5 q8 u# Q& t
  100.     HAL_Delay(500);
    : [& c) R. w3 K# n6 g9 i
  101.     BSP_LED_Off(LED1);
    $ K/ D- ?% M6 \% b, t
  102.     HAL_Delay(500);
    5 H* M# L. ]0 S# ~$ ^
  103.   }
    ( H9 J6 J& t$ w) c' m: N
  104. }
复制代码
* r: O* h7 ]- X) j7 t0 N
! S( S, t9 r$ q

8 D+ ~# C; `% Q

/ I4 j5 ~9 X7 |9 @; m# f- e三、结果/ z1 m7 U! `- W' h$ M0 p; g# h
0 n4 ?# B# y. I" v4 R+ b
0 [- W, l' e$ q" h' e. f9 V
下载程序到开发板,运行开发板屏幕显示如下:6 z1 V/ @7 Z; L! M
lcd.gif
/ x7 p# b& K4 S7 W! V

, g, S+ A! Q7 {8 ~/ l  Y! i1 ^7 C

- T  d! |4 X7 B6 ^: \# Q8 }( y) x& `  `. x' h
收藏 评论0 发布时间:2025-2-18 15:02

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版