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

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

[复制链接]
TLLED 发布时间:2025-2-18 15:02
9 ^' ?) W+ C8 y: B

; l7 v1 M8 A7 }% G
8 {0 g% w5 I* k4 S
一、硬件部分
  A5 F( C9 \8 K! B9 l, b2 _2 H1.1、LCD显示屏硬件接口部分电路
4 S+ T8 o$ L$ `# M( s, r lcd.png 2 t+ a0 l" x! A, g. ^6 W! H

7 r. Q; w. l+ e9 a' f8 E7 s, E" K% s
) c+ Z1 ?# l$ v. Z3 ?0 L

2 I0 T  E5 w0 {
: T1 U" g+ b( J# |1.2、LTDC显示内部框图
  {7 I' ]1 a6 m9 s7 x" KLTDC可驱动24位的RGB显示屏,内部有两个显示层
" F# k- b5 C' o0 I) Y  l 002.png
6 O5 d6 E/ A% j2 t  T: p
' o; K* L4 o. M0 ^

3 V  l" M4 f- c; d6 X! R

& S" J6 E2 ^/ t: `! f4 x二、配置LTDC% l1 {2 j8 Z) X$ @
- c. U+ @" n( \6 c1 P) G
2.1、屏幕的参数设置
$ G+ j, R4 i+ `$ P6 Y 003.png " E) n, t1 e4 X' t& r  I

% G) O5 e& \$ `. ^9 X4 f. e3 [+ Q
; j- @7 E6 X) y. I" w9 G- k) D1 y' o9 s
2.2、层参数设置: h5 r, |1 f/ |7 K
004.png   @1 u' ?" r0 F5 I, Z) }0 x' {3 c

# E0 Y. u# i. a; `: w& t9 L  p8 H% J, a. d5 A

7 T" o0 _2 G: L  Z5 b3 s2.3、LTDC引脚设置
+ b- o  q, A* T' b/ o$ W 005.png 0 k9 e8 F0 g: _5 F( ~2 f; I  X" v

) ?6 P- E) X) D4 T. A3 i+ @% [2 E9 X) u! e$ [0 @0 s

  j/ K2 Y5 o4 r! y  w三、程序部分2 d4 F: f! S& A, q6 M
5 \/ S% h- k1 b! z
3.1、在项目中添加LCD驱动程序
# q7 }$ r$ M: }% Q  r1 ^使用官方BSP中的LCD驱动程序
* E: }( |: R5 g" S2 z0 ~stm32n6570_discovery_lcd.c, ~: ~- m# ]/ o; P9 u  A

! k1 Y  {; f; ~
  1. /**
    & W) S2 Z' _0 e5 v
  2.   ******************************************************************************
    % T, L+ {4 j- ?, }. b  J5 S4 o- w9 _
  3.   * @file    stm32n6570_discovery_lcd.c* w5 z+ w4 p" T! N1 r* I
  4.   * @author  MCD Application Team
    ' i$ }. A% i6 K) Z% f
  5.   * @brief   This file includes the driver for Liquid Crystal Display (LCD) module) E$ \& ~- ]6 N3 @
  6.   *          mounted on STM32N6570_DK board.
    + u+ B) j& R- m* W& p3 x2 h/ |
  7.   ******************************************************************************0 H. ~0 T4 k" _) C4 _- }
  8.   * @attention
    * d' |) j- R8 W( ]
  9.   *: `! q; ?" {) }( q0 U6 z; s) P
  10.   * Copyright (c) 2022 STMicroelectronics.: G! u! ^4 g" s* J9 c
  11.   * All rights reserved.
    0 k2 `8 o9 i9 H1 C, [0 m
  12.   *
    : T$ S4 j- ?( ^7 U4 v+ b: p/ c
  13.   * This software is licensed under terms that can be found in the LICENSE file
    ) `. z3 @: r* \' z6 H" u& U
  14.   * in the root directory of this software component.
    ! C- B# }- F5 e9 G. e$ E
  15.   * If no LICENSE file comes with this software, it is provided AS-IS.
    6 y9 [. ?6 O& R
  16.   *
    2 |/ o' t" Z1 t- y8 s  w, }
  17.   ******************************************************************************
    $ Z, E7 t* S* U
  18.   @verbatim
    , N* J7 f7 i% s8 w* o
  19.   How To use this driver:
    / y0 R* x* a6 g
  20.   --------------------------
    6 v) Q5 C7 i3 G) N% [6 g
  21.    - This driver is used to drive directly a LCD TFT using the LTDC controller.2 |6 Y6 c1 D& X: P9 _
  22.    - This driver uses the adequate timing and setting for the RK050HR18 LCD component( Z; E9 B- h8 M* M
  23. % |: {* j+ z3 m5 O* W8 s, r& l
  24.   Driver description:3 u" A6 U5 ]. J, s
  25.   ---------------------8 [% Z. ]3 h" E8 F6 l
  26.    + Initialization steps:& k2 F0 t2 p9 r+ ~
  27.      o Initialize the LCD in default mode using the BSP_LCD_Init() function with the
    * T  t* J% l7 L, @; J0 I! Y8 u
  28.        following settings:" z* z+ B' f' d+ z: J7 ~! G8 U
  29.         - Pixelformat : LCD_PIXEL_FORMAT_RGB888
    3 ~6 S0 Y) q7 c
  30.         - Orientation : LCD_ORIENTATION_LANDSCAPE.3 z6 n* o! v$ ]/ ]' k
  31.         - Width       : LCD_DEFAULT_WIDTH (800)/ z) `8 {; [' {
  32.         - Height      : LCD_DEFAULT_HEIGHT(480)
    ' q7 j% y: \9 M
  33.        The default LTDC layer configured is layer 0.
    9 x+ c- U( z+ d: U/ X( U$ u" z
  34.        BSP_LCD_Init() includes LTDC, LTDC Layer and clock configurations by calling:' S, N* o5 A* ^: }6 ?2 z1 N
  35.         - MX_LTDC_ClockConfig()9 x! H% a& h" ?0 u  `$ y
  36.         - MX_LTDC_Init(), ]: L( r6 q* Q* d) d
  37.         - MX_LTDC_ConfigLayer()9 g  k2 q3 d8 b( J, {/ C* U* r* O' ?

  38. 3 {. ^$ i7 @7 u  L' _
  39.      o Initialize the LCD with required parameters using the BSP_LCD_InitEx() function.* M2 Z: X& G+ C! O
  40. . }2 ~0 O6 `5 q1 ~4 c
  41.      o Select the LCD layer to be used using the BSP_LCD_SelectLayer() function.: N1 u6 W8 {: Y
  42.      o Enable the LCD display using the BSP_LCD_DisplayOn() function.
    6 V# B$ \7 y* h- q+ V6 u4 H& E
  43.      o Disable the LCD display using the BSP_LCD_DisplayOff() function.
    ! _/ Q; P2 c+ l, j3 S
  44.      o Write a pixel to the LCD memory using the BSP_LCD_WritePixel() function.
    ! w+ X: g: q1 _* a' @  g
  45.      o Read a pixel from the LCD memory using the BSP_LCD_ReadPixel() function.
    % Z3 ]! `& J4 o2 v5 R
  46.      o Draw an horizontal line using the BSP_LCD_DrawHLine() function.4 t7 ^' j" s% T0 D4 L
  47.      o Draw a vertical line using the BSP_LCD_DrawVLine() function., B) e4 v3 N& S# i' x& a6 B
  48.      o Draw a bitmap image using the BSP_LCD_DrawBitmap() function.. |6 \0 \5 d0 Y" \9 S

  49. ( G5 }# `& }* V1 I
  50.    + Options' q  b" j* j- D4 l- `
  51.      o Configure the LTDC reload mode by calling BSP_LCD_Reload(). By default, the- U, m8 \5 j6 V# o( W2 v7 F# r
  52.        reload mode is set to BSP_LCD_RELOAD_IMMEDIATE then LTDC is reloaded immediately.6 q+ e8 u" F- D1 {/ l9 ^, U6 p
  53.        To control the reload mode:/ w% F) A1 v) ^/ C( O  _
  54.          - Call BSP_LCD_Reload() with ReloadType parameter set to BSP_LCD_RELOAD_NONE% Y& k4 D( d* w0 l$ h) v
  55.          - Configure LTDC (color keying, transparency ..)
    ; M6 r9 _+ Z" N" z3 A
  56.          - Call BSP_LCD_Reload() with ReloadType parameter set to BSP_LCD_RELOAD_IMMEDIATE7 H7 O- \; u& w9 c; y, G) I
  57.            for immediate reload or BSP_LCD_RELOAD_VERTICAL_BLANKING for LTDC reload
    1 D) k! }0 D+ H$ [8 h: \0 t+ Q$ Y7 u; B
  58.            in the next vertical blanking2 B+ N$ v, A/ F
  59.      o Configure LTDC layers using BSP_LCD_ConfigLayer()! j, q0 r- \6 \( _' W' @' _0 {
  60.      o Control layer visibility using BSP_LCD_SetLayerVisible()
    ( _! X1 E9 u3 Y5 V
  61.      o Configure and enable the color keying functionality using the: y2 ]* E1 }4 X: Y& _/ b7 i( w
  62.        BSP_LCD_SetColorKeying() function.0 T$ e) N; A1 C. d' R' z- k
  63.      o Disable the color keying functionality using the BSP_LCD_ResetColorKeying() function.
    5 `5 @3 s" ]+ B/ P( v3 t" E
  64.      o Modify on the fly the transparency and/or the frame buffer address
    & l7 k8 s$ S  e
  65.        using the following functions:( W3 _  R) T5 Y3 b& N
  66.        - BSP_LCD_SetTransparency()/ W0 u7 t* x7 R  p* i
  67.        - BSP_LCD_SetLayerAddress()" u/ ~; L: f4 @! U4 o# G, O

  68. $ I! f7 H6 M( |
  69.    + Display on LCD
    4 |4 K2 [) Z/ U
  70.      o To draw and fill a basic shapes (dot, line, rectangle, circle, ellipse, .. bitmap)
    % }# K, ~% G* s5 P- j5 b3 E
  71.        on LCD and display text, utility basic_gui.c/.h must be called. Once the LCD is initialized,
    : `. V3 O- a8 t
  72.        user should call GUI_SetFuncDriver() API to link board LCD drivers to BASIC GUI LCD drivers.
    3 g8 @0 s  [9 x' M
  73.        The basic gui services, defined in basic_gui utility, are ready for use.
    * ~5 _$ W: V8 X. d

  74. * x/ a' i. x" Q+ |5 w- ^; A, d
  75.   Note:
    * u# s4 g- r# t4 s
  76.   --------
    ) \7 B5 R, a- I# @6 t
  77.     Regarding the "Instance" parameter, needed for all functions, it is used to select
    # Q) E) f: d& l2 c0 V& |
  78.     an LCD instance. On the STM32N6570 Discovery board, there's one instance. Then, this2 d2 ]$ O* ^. }7 ^1 _0 D. d
  79.     parameter should be 0.( }; k2 N( U0 j0 G* B- C! a
  80. 5 i5 @) Q1 `9 f* X
  81.   @endverbatim
    1 p5 u4 H0 w/ H7 X2 Z- w8 K
  82.   ******************************************************************************
    8 ]' v, l; @( ~: O: D
  83.   */. ~) D; p0 l: y4 V2 X$ S

  84. 5 p  w; G) ~3 W# U
  85. /* Includes ------------------------------------------------------------------*/
    $ R5 A2 I7 Q/ r; o0 R( c
  86. #include "stm32n6570_discovery_lcd.h"
    * b6 H1 F% R3 ?

  87. 9 Q, r6 S3 D1 L
  88. /** @addtogroup BSP- q+ B8 W( ~6 ]" R9 \
  89.   * @{
    + ^! T. w1 U, n& c9 a7 K
  90.   */
    & _, g, M, R. j' d1 a7 J) X

  91. 4 j( I3 v( K& ?) y
  92. /** @addtogroup STM32N6570_DK
    # T  M1 t  g  y  b
  93.   * @{. D- v: ~) F0 J7 c7 f' |
  94.   */
    3 n# Z( U6 O) N' I1 y9 `6 G. `& b

  95. 0 E4 h1 l2 T& {- I$ c
  96. /** @defgroup STM32N6570_DK_LCD LCD
    / y: m5 f" ]$ k( |9 o2 m
  97.   * @{
    / l+ q% z" d0 p, @1 \
  98.   */7 M3 W$ @" W# S$ c. k. p
  99. 4 ~" s6 _1 x& K2 x; N- b
  100. /** @defgroup STM32N6570_DK_LCD_Private_Variables LCD Private Variables
    5 I( y$ f* t0 A3 z: P
  101.   * @{* ?/ h6 x5 h/ `
  102.   */9 p' e5 C- U+ \3 P4 j* E

  103. 3 J. q+ {% B% V
  104. /**
    6 t( ?( l1 T( S* m/ [0 n+ u& V
  105.   * @}
    . P# n& g; d$ c: O# [9 J
  106.   *// J/ \/ J! A2 C: d* d0 V! {
  107. 4 {( F3 F# Z* A6 h, b: D
  108. /** @defgroup STM32N6570_DK_LCD_Private_TypesDefinitions LCD Private TypesDefinitions
    $ r$ m. N( f3 v  ]" c
  109.   * @{- ^# d1 I8 i: K( E7 n" [  X
  110.   */
    2 A' S( u; C$ S
  111. const LCD_UTILS_Drv_t LCD_Driver =: {' l8 {- f5 z8 g' {) t8 y5 ^4 g
  112. {
    ( D- X3 @1 y4 ^
  113.   BSP_LCD_DrawBitmap,
    . R6 T8 h! B& J8 _8 J. D1 r
  114.   BSP_LCD_FillRGBRect,* r4 o' B) j3 S* [
  115.   BSP_LCD_DrawHLine,
    1 \5 e" c2 K* s! c4 M( o
  116.   BSP_LCD_DrawVLine,( Z! a$ g/ |( i" y
  117.   BSP_LCD_FillRect,
    * {" }7 k0 z. ~. F" P8 {
  118.   BSP_LCD_ReadPixel,
    ) v4 ^/ X& I% k$ u7 Y
  119.   BSP_LCD_WritePixel,5 A% w9 C( T& n5 g
  120.   BSP_LCD_GetXSize,
    5 f; W! ~  S+ B$ W
  121.   BSP_LCD_GetYSize,
    , q% H2 F8 A! r" V8 u" L7 O; L
  122.   BSP_LCD_SetActiveLayer,7 r5 j$ ~& s: E3 {. b( ^* _' J9 i
  123.   BSP_LCD_GetPixelFormat' z0 x6 ^' J6 L" Y
  124. };
    1 A* u$ q. q5 F0 J& {/ N
  125. ) s: P  F* Y& z
  126. /**" F) k2 f- P! M
  127.   * @}9 z7 g. M! l! p
  128.   */
    : H4 s, X1 |* ~
  129. 5 E% j1 `( k6 r$ [
  130. /** @defgroup STM32N6570_DK_LCD_Exported_Variables LCD Exported Variables
    & w! ?) J  M1 c$ a8 k
  131.   * @{5 y% i9 ~3 b7 b! ^/ U, p
  132.   */  f9 A* T7 x; x+ E4 N4 b# J
  133. DMA2D_HandleTypeDef hlcd_dma2d;
    . O: O5 p+ }5 Z3 w
  134. LTDC_HandleTypeDef  hlcd_ltdc;+ g& X$ O5 h* W! x8 l
  135. BSP_LCD_Ctx_t       Lcd_Ctx[LCD_INSTANCES_NBR];
    ) J9 y8 t6 S2 V8 q
  136. /**
    8 Z! q: g8 T' u. A3 M5 f, F: E' C4 o/ V
  137.   * @}
    ; y% k$ w$ r: a% w- C) Y! u9 l
  138.   */
    & z4 X1 X+ Z- ?7 D

  139. ( y* r! ?/ ^' l3 Q/ ~. u
  140. /** @defgroup STM32N6570_DK_LCD_Private_FunctionPrototypes LCD Private FunctionPrototypes1 x( T$ y0 x- L- o, c
  141.   * @{7 q6 O" N, |" U4 a
  142.   */1 F6 D: S- h# b

  143. 9 y/ L' |6 f" |5 F: _) V
  144. static void LTDC_MspInit(LTDC_HandleTypeDef *hltdc);
    ; {2 {9 Z4 E; {+ f
  145. static void LTDC_MspDeInit(LTDC_HandleTypeDef *hltdc);
    " M8 G, }# D5 ^, K& s0 Q* }/ s# O  j7 c
  146. static void DMA2D_MspInit(DMA2D_HandleTypeDef *hdma2d);4 _3 |) }! _1 o# M7 q: |! X
  147. static void DMA2D_MspDeInit(DMA2D_HandleTypeDef *hdma2d);6 D2 X) Q1 R7 V/ M( h
  148. static void LL_FillBuffer(uint32_t Instance, uint32_t *pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t Color);
    6 y! ]: R! `  D& R: U$ {. f
  149. static void LL_ConvertLineToRGB(uint32_t Instance, uint32_t *pSrc, uint32_t *pDst, uint32_t xSize, uint32_t ColorMode);+ W3 g  u3 D, O7 Z0 y
  150. /**- ~. }7 G/ _4 }; X4 f: V
  151.   * @}1 H1 q7 ^" i, {  M& f/ |
  152.   */
    4 a% M1 K8 K# P
  153. /** @defgroup STM32N6570_DK_LCD_Private_Macros  Private Macros
    . y4 d, p/ N8 d& a8 t) I
  154.   * @{
    $ G0 v1 P7 U& {) e& n8 v
  155.   */
    $ b: i" k. Y9 m6 c" @
  156. #define CONVERTRGB5652ARGB8888(Color)((((((((Color) >> (11U)) & 0x1FU) * 527U) + 23U) >> (6U)) << (16U)) |\
    / j( O# y. e* R' x2 N! T3 z8 x$ W8 v
  157.                                      (((((((Color) >> (5U)) & 0x3FU) * 259U) + 33U) >> (6U)) << (8U)) |\
    7 c5 j) P4 t; o/ T, w, X+ P
  158.                                      (((((Color) & 0x1FU) * 527U) + 23U) >> (6U)) | (0xFF000000U))
    # Y, J6 A8 i" G0 ^
  159. $ p/ m& I4 D% l* b! T
  160. #define CONVERTARGB44442ARGB8888(Color)((((((Color) >> 12U) & 0xFU) * 17U) << 24U) |\
    ! X' p5 X  B+ v  [; E4 [% B$ q/ ~! E
  161.                                         (((((Color) >>  8U) & 0xFU) * 17U) << 16U) |\
    9 A5 E  e* o) v# m+ H9 e
  162.                                         (((((Color) >>  4U) & 0xFU) * 17U) << 8U) |\% K( }; d) p: f. U
  163.                                         (((((Color) >>  0U) & 0xFU) * 17U) << 0U))! ~7 c* _# d8 f& M. }  f

  164. 0 h" L$ d: h; n1 n
  165. #define CONVERTRGB8882ARGB8888(Color)((Color) | 0xFF000000U)
    4 a/ S) l2 a9 I9 b; y1 V/ }* J& H

  166. ! b, e/ e; r0 L  D+ D/ S( t
  167. #define CONVERTARGB88882RGB888(Color)((Color) & 0x00FFFFFFU)) q4 M5 E# ^& O5 ^) {6 l) ?5 A

  168. ! R1 b) ^8 }* x- T! v  l6 ^
  169. /**
    6 ]- n( Q6 `. V3 t  k! P
  170.   * @}
    ) e4 _" v1 `% D" T0 h1 _
  171.   */
    - C( ]* Q, Q0 v7 _- P( r
  172. 5 _0 {9 s7 W0 U$ L9 n
  173. /** @defgroup STM32N6570_DK_LCD_Exported_Functions LCD Exported Functions- u# s  Z% [& D# H9 x) k
  174.   * @{
    : v4 T" `1 c' c+ _9 E: U" V6 \
  175.   */5 E. |: y  O0 T6 ^
  176. /**
    + v' t. Q8 V$ j+ [1 k( c6 ~8 q  u
  177.   * @brief  Initializes the LCD in default mode.( w  V8 s" T% e" o
  178.   * @param  Instance    LCD Instance
    ! z3 h4 }& g! u" S; V. t: n2 w' F8 R$ C: m
  179.   * @param  Orientation LCD_ORIENTATION_LANDSCAPE
    " |! S1 x) u) f
  180.   * @retval BSP status8 j, `) q2 z3 X, @. N: s8 I% s0 |
  181.   */
    6 c( p6 J% ?" x
  182. 7 Q0 M* s, Y; |9 I: E3 h! |
  183. int32_t BSP_LCD_Init(uint32_t Instance, uint32_t Orientation)
    0 H/ g' q7 l; m) p) N
  184. {# M  L4 [1 u6 a# b. M5 a5 W/ _" Z
  185.   return BSP_LCD_InitEx(Instance, Orientation, LCD_PIXEL_FORMAT_RGB565, LCD_DEFAULT_WIDTH, LCD_DEFAULT_HEIGHT);
    % Q' e6 {' c. p& C% p
  186. }+ r8 H. \+ M# k( p: c3 @/ m7 Z
  187. : Y2 Q$ ?4 t6 g0 C/ g. ~
  188. /**
    ( F, `+ d7 m! E5 R/ L
  189.   * @brief  Initializes the LCD.
    + n$ h/ O9 ]4 f$ \5 [1 F+ Q/ U. X4 U
  190.   * @param  Instance    LCD Instance
    ; l$ s8 Q5 h- I2 B, N9 C# F0 Z. d2 X
  191.   * @param  Orientation LCD_ORIENTATION_LANDSCAPE
    : n0 |; N8 u- u) K
  192.   * @param  PixelFormat LCD_PIXEL_FORMAT_RGB565, LCD_PIXEL_FORMAT_ARGB4444, LCD_PIXEL_FORMAT_ARGB8888
      |! @- S; V% F0 Q% \
  193.   *                     or LCD_PIXEL_FORMAT_RGB888/ i& e; \$ `# m" c1 C
  194.   * @param  Width       Display width
    $ P0 k: L( k0 T  f+ ]0 h/ A7 C; C2 L( H
  195.   * @param  Height      Display height6 ]. n& F& ]; o
  196.   * @retval BSP status
    / {4 G2 @5 a$ @! O8 H  [# \
  197.   */! q" |* S: p. x/ p
  198. int32_t BSP_LCD_InitEx(uint32_t Instance, uint32_t Orientation, uint32_t PixelFormat, uint32_t Width, uint32_t Height)% K9 r) ~4 _! u$ f4 v" e, V
  199. {8 `- C) G/ x% G& O
  200.   int32_t ret = BSP_ERROR_NONE;
    3 E) I  F( D+ \8 y6 O) ^
  201.   uint32_t ltdc_pixel_format;
    4 [% D7 e! S/ M0 e0 ~4 W
  202.   MX_LTDC_LayerConfig_t config = {0};
    8 F8 _9 ^$ K5 k

  203. 0 N7 q: V5 D2 Y2 d9 e# T6 J
  204.   if ((Orientation > LCD_ORIENTATION_LANDSCAPE) || (Instance >= LCD_INSTANCES_NBR) || \9 ?& G; K6 ?9 [  Y
  205.      ((PixelFormat != LCD_PIXEL_FORMAT_RGB565) && (PixelFormat != LCD_PIXEL_FORMAT_RGB888) && \
    ; e) S) I$ b' g7 G# n1 d
  206.       (PixelFormat != LCD_PIXEL_FORMAT_ARGB8888) &&  (PixelFormat != LCD_PIXEL_FORMAT_ARGB4444)))4 \" @# i% b' Q% [1 V! z" I
  207.   {, K4 E. T9 e* {/ u% s1 y  V
  208.     ret = BSP_ERROR_WRONG_PARAM;9 J9 q) Z# f" L; Z: l
  209.   }
    , r- _4 e7 Q" O/ V, c+ A
  210.   else7 V3 r0 O+ h: ]0 y' a0 B8 y
  211.   {
    0 h' p- j8 v5 w$ U+ z2 a
  212.     if (PixelFormat == LCD_PIXEL_FORMAT_RGB565)
    3 |7 p% x( N- j$ I
  213.     {
    6 J# \' D/ ^1 `7 x
  214.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_RGB565;
    5 |- P2 a* M' v
  215.       Lcd_Ctx[Instance].BppFactor = 2U;" H$ D/ U2 V6 ?, S
  216.     }  E9 G7 E+ B. f
  217.     else if  (PixelFormat == LCD_PIXEL_FORMAT_RGB888)9 _6 `* W4 a: M' r7 t5 P
  218.     {
    # i$ {8 U7 }0 }- A& V% T; h5 H
  219.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_RGB888;$ @1 q# M4 O$ ?1 s( t% N2 H& N
  220.       Lcd_Ctx[Instance].BppFactor = 3U;# K; G8 k: }# P/ N" o
  221.     }
    & s6 n0 G: R, x# Y" S, g% o
  222.     else if  (PixelFormat == LCD_PIXEL_FORMAT_ARGB4444)$ E: S/ A, F: E8 C) g$ [1 u, n2 e  R. o$ M
  223.     {
    * L* b' Y8 R) P% D" C
  224.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_ARGB4444;
    3 G9 r, x4 C$ e% y
  225.       Lcd_Ctx[Instance].BppFactor = 2U;
    6 j& o9 t/ m3 K
  226.     }3 @0 T4 S" x  e1 N5 f1 D
  227.     else /* LCD_PIXEL_FORMAT_ARGB8888 */
    & C( _# W7 @1 I# m3 D5 H6 H
  228.     {
    0 E& `) F) U& Z* F: w
  229.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_ARGB8888;, B4 S: `3 b; L) D* U
  230.       Lcd_Ctx[Instance].BppFactor = 4U;
    " p& _+ P4 R+ L; `
  231.     }
    : d! ~, W" U3 Q6 {' }1 y8 \

  232. ( E3 c2 Q: m+ Y& h" N
  233.     /* Store pixel format, xsize and ysize information */" T" `6 l! u- E
  234.     Lcd_Ctx[Instance].PixelFormat = PixelFormat;
    8 g3 x5 D0 J2 t# [, d' ]9 c
  235.     Lcd_Ctx[Instance].XSize  = Width;7 p: s+ D- s$ o4 q; {) N
  236.     Lcd_Ctx[Instance].YSize  = Height;- _5 ^  E/ a" p# g$ M) e

  237. ( R" m) C! y8 v" m- r
  238.     /* Initializes peripherals instance value */" [8 }. i: ~3 @( |) m
  239.     hlcd_ltdc.Instance = LTDC;2 s6 Z; M$ L' Z* K4 N" [
  240.     hlcd_dma2d.Instance = DMA2D;7 v; A3 Y1 W0 q3 W$ D  B* ^

  241. 7 S- {( u% \) t& L, r
  242.     /* MSP initialization */& V$ p0 q$ M1 X1 {* r
  243. #if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1)- C! @. M3 r* k1 s  w
  244.     /* Register the LTDC MSP Callbacks */
    - @$ i; F6 i+ J
  245.     if (Lcd_Ctx[Instance].IsMspCallbacksValid == 0U)5 n( n* x& ]  w
  246.     {# v7 h1 I' ~' A: |5 K/ C: J# k
  247.       if (BSP_LCD_RegisterDefaultMspCallbacks(0) != BSP_ERROR_NONE)6 `* U' z" {8 ]* [- b/ L, @2 w
  248.       {3 w) g4 n9 O+ m9 M
  249.         return BSP_ERROR_PERIPH_FAILURE;
    . B- ~/ x1 \+ B9 |; O4 i
  250.       }5 r1 @+ ?  U, s) r- \9 ~5 T' _- M3 z5 B
  251.     }
    ) k: d- h9 V- O* S9 B; k
  252. #else
    4 {4 ~, u3 m5 G7 X
  253.     LTDC_MspInit(&hlcd_ltdc);
    6 Z0 O8 U' n7 |! _" y; B* Q
  254. #endif /* (USE_HAL_LTDC_REGISTER_CALLBACKS == 1) */
    0 S! B" T( R. O0 d& t9 p
  255. 1 ~" T% }& ]% t0 C! Y8 W7 u9 U  F
  256.     DMA2D_MspInit(&hlcd_dma2d);. J: p; R, `- i, r

  257. / a  H4 u. v; F: L
  258.     if (MX_LTDC_ClockConfig(&hlcd_ltdc) != HAL_OK)
    " d$ ]( r4 l( q0 D# N" u
  259.     {
    1 M& C4 i) [7 f7 M% n* b
  260.       ret = BSP_ERROR_PERIPH_FAILURE;% A$ I  [5 a5 \" H' r( |; l
  261.     }
    * C9 v  Q2 X5 l" s7 [
  262.     else8 y/ k, u# r5 e& u
  263.     {( X8 e' C3 R0 a3 v$ b" U8 l
  264.       if (MX_LTDC_Init(&hlcd_ltdc, Width, Height) != HAL_OK)7 A% P; ^. f' K
  265.       {8 q* }$ c3 {4 V' k2 ~3 U
  266.         ret = BSP_ERROR_PERIPH_FAILURE;  {$ K3 p2 {/ f/ _6 J' a2 `: f
  267.       }: r! \6 T4 U8 l: a# i
  268.     }
    - a  z6 i+ k3 _$ X

  269. & n; R# s0 ~% M7 ^% r- U1 |4 U. n  n
  270.     if (ret == BSP_ERROR_NONE), b" E9 j4 `8 |# R% v
  271.     {4 B/ B% n% s* F! j6 a  \
  272. #if defined(DATA_IN_ExtRAM)
    0 ?% p% D. F( Y& ]% w. Y
  273.       /* Before configuring LTDC layer, ensure XSPI RAM is initialized */
    4 y' y9 v6 d9 ]/ M! u
  274.       /* Initialize the XSPI RAM */- c$ ]% o) q' t8 B
  275.       if (BSP_XSPI_RAM_Init(0) != BSP_ERROR_NONE)
    1 }7 r! _! f/ N' q/ m. L% |
  276.       {" V+ g" |* ^% s- L! X' e6 C2 g1 D
  277.         ret = BSP_ERROR_NO_INIT;( X% Y+ ]* R5 B$ D
  278.       }
    8 ^% g0 [5 M+ D7 x: C7 ^6 y
  279.       else if (BSP_XSPI_RAM_EnableMemoryMappedMode(0) != BSP_ERROR_NONE); b9 L/ f2 X% f3 c  U& B6 P9 v% X
  280.       {
    & S' T/ S  J' _2 Z. G" G
  281.         ret = BSP_ERROR_PERIPH_FAILURE;
    4 }) Y+ |2 A. Z5 m- ^- p
  282.       }
    " u8 z# h6 u) ~, \
  283.       else
    " G+ a5 l. m- S1 x* b3 ~
  284.       {1 P( M2 N8 B# U6 M- q; ^/ S
  285. #endif /* DATA_IN_ExtRAM */0 L  b* x4 i9 S
  286.         /* Configure default LTDC Layer 0. This configuration can be override by calling: k' U2 u2 [! `% l
  287.         BSP_LCD_ConfigLayer() at application level */
    , Q6 B# a6 k; ~7 w# X+ }
  288.         config.X0          = 0;
    6 k$ W; I2 c2 S# I+ f# I
  289.         config.X1          = Width;, _: U1 {* ^7 R. e$ j3 x
  290.         config.Y0          = 0;
    ; p1 C* k2 u8 A2 e5 x
  291.         config.Y1          = Height;
    / J/ s. r* \0 I# C& T
  292.         config.PixelFormat = ltdc_pixel_format;& ]- u7 c; B. ^" R$ h
  293.         config.Address     = LCD_LAYER_0_ADDRESS;
    : P8 z! \0 t% F( s1 v
  294. $ P# R. ]" @5 W' K0 K. J+ q' H
  295.         if (MX_LTDC_ConfigLayer(&hlcd_ltdc, 0, &config) != HAL_OK). g7 ]" N9 k* S7 O( V
  296.         {
    % {/ T, l+ J& D& ^) k* I% b2 y" b
  297.           ret = BSP_ERROR_PERIPH_FAILURE;: F- y9 R) r2 ~8 n
  298.         }
    ( s. I: h) e/ l9 Z! s6 e& C6 s
  299. 5 l. ]: a6 S% ]  s. {5 w' N3 |
  300.         /* By default the reload is activated and executed immediately */
    4 F3 `7 H# s( T( d7 a
  301.         Lcd_Ctx[Instance].ReloadEnable = 1U;: B, m# ~$ d" {1 H+ s3 q* O/ y
  302. #if defined(DATA_IN_ExtRAM)- `$ Z- E9 [" l# k0 \* y
  303.       }. n. s$ T3 }$ U$ A
  304. #endif /* DATA_IN_ExtRAM */
    3 L5 }* o% p7 }: O% R; O
  305.     }8 H6 W6 Y+ v7 C3 Z. ~' B! ]8 u$ J
  306.   }
    / y9 j% ?: e$ i; s1 H

  307.   o1 Q: R5 r" r& c$ A
  308.   return ret;
    # h  u& e& P  f
  309. }- e# }: Z& @6 @3 W

  310. 2 M& |" O+ u) X
  311. /**
    & a, R# D( r1 k! L/ V6 s
  312.   * @brief  De-Initializes the LCD resources.$ g1 R; w6 d  P, e5 H! k, w
  313.   * @param  Instance    LCD Instance2 `3 W5 x, u! U4 o9 T/ _
  314.   * @retval BSP status0 {1 V! j, J. h
  315.   */; S4 h% Y/ G# [2 A2 W
  316. int32_t BSP_LCD_DeInit(uint32_t Instance)7 j) J* `+ U+ x' K8 H
  317. {. n: B$ w- o( n) i
  318.   int32_t ret = BSP_ERROR_NONE;
    . c# v* d6 \; X* Q

  319. - u. D2 L9 H, O8 l
  320.   if(Instance >= LCD_INSTANCES_NBR)
    6 w/ E1 a% Q7 f& G
  321.   {
    " }$ R' g1 F6 w& I5 H) z1 X4 r
  322.     ret = BSP_ERROR_WRONG_PARAM;1 r5 Y3 ^5 K. h- x+ e
  323.   }& G' J* c' i! P2 n% S4 F
  324.   else; z+ Z' {& S. i7 N, [8 M  e
  325.   {6 Q4 Q, [0 I- k7 `& }
  326. #if (USE_HAL_LTDC_REGISTER_CALLBACKS == 0)+ {8 B/ x1 P0 b4 N: A7 P
  327.     LTDC_MspDeInit(&hlcd_ltdc);# R; \: B' u2 F; \. L
  328. #endif /* (USE_HAL_LTDC_REGISTER_CALLBACKS == 0) */
    4 a; k: t' u" P  w: Q
  329. " U8 e! R- f+ o: a; J7 |! k9 L) K( h
  330.     (void)HAL_LTDC_DeInit(&hlcd_ltdc);
    0 |. B( f4 X- V$ N# g9 ~, s2 l
  331.     if(HAL_DMA2D_DeInit(&hlcd_dma2d) != HAL_OK)
    8 Y3 Y4 B  ^! ^
  332.     {1 s  J0 r( m! B6 L& H
  333.       ret = BSP_ERROR_PERIPH_FAILURE;
    $ t, P& R$ f) C' L
  334.     }0 e. f( ^% B4 F6 _% ]
  335.     else
    " s; v4 I# `2 Y+ ]4 i* R8 m0 U1 E
  336.     {
    # V: j: x" U# I& h- |0 i' m/ |
  337.       DMA2D_MspDeInit(&hlcd_dma2d);
    8 \% v7 v0 a8 s3 w2 ?: X5 ^
  338.       Lcd_Ctx[Instance].IsMspCallbacksValid = 0;
    6 Y- \) [$ Q+ s& M* o7 C
  339.     }' Q! I, _" K  B( b8 G
  340.   }
    % W, F$ h# P) `% o' H

  341. 3 m& m9 l0 e2 u1 r" m
  342.   return ret;; j' m; k1 h* J4 M3 r
  343. }* M) J  N0 Q6 w) ]' u% p# H

  344. 1 e- w: Z" }- P9 F0 ^4 X% R9 W; s. B: J
  345. /**
    7 k3 D# v1 f1 f
  346.   * @brief  Initializes the LTDC.
    0 }  V/ `) S& N$ M0 B. V  K
  347.   * @param  hltdc  LTDC handle
    - ~6 E, R/ [& z4 I+ N4 \$ W9 V" d
  348.   * @param  Width  LTDC width
    ' ~. `' ~2 W' c9 f: i
  349.   * @param  Height LTDC height
    & h9 ^# Z9 ^1 }9 e. |7 l: ?% s
  350.   * @retval HAL status( {4 ?" b) n; G& o9 D. A
  351.   */
    3 G  Y* h5 a# W2 y( [, \
  352. __weak HAL_StatusTypeDef MX_LTDC_Init(LTDC_HandleTypeDef *hltdc, uint32_t Width, uint32_t Height)
    ; S3 @6 A# S' F& M  n: Q: X
  353. {
    # k$ C& @1 U6 {) d4 b4 E$ Z
  354.   hltdc->Instance = LTDC;% z8 n4 |. Q: L& K6 b7 X/ x, H
  355.   hltdc->Init.HSPolarity = LTDC_HSPOLARITY_AL;& e  r1 B; o9 r( y" h
  356.   hltdc->Init.VSPolarity = LTDC_VSPOLARITY_AL;' R- v! q# E7 _4 h2 G
  357.   hltdc->Init.DEPolarity = LTDC_DEPOLARITY_AL;" e- t; S6 s2 X8 q1 k
  358.   hltdc->Init.PCPolarity = LTDC_PCPOLARITY_IPC;9 B% @8 e  X$ b2 `, g
  359. . ]$ A; ?7 m, J: U# @4 V
  360.   hltdc->Init.HorizontalSync     = (uint32_t)RK050HR18_HSYNC - 1U;- x6 k4 X. K4 q- e  L9 Z* j% B5 T
  361.   hltdc->Init.AccumulatedHBP     = (uint32_t)RK050HR18_HSYNC + (uint32_t)RK050HR18_HBP - 1U;, u5 {: x$ q4 |  ^7 U3 f
  362.   hltdc->Init.AccumulatedActiveW = (uint32_t)RK050HR18_HSYNC + Width + (uint32_t)RK050HR18_HBP -1U;
    ' f! z, I7 E0 y- f
  363.   hltdc->Init.TotalWidth         = (uint32_t)RK050HR18_HSYNC + Width + (uint32_t)RK050HR18_HBP + RK050HR18_HFP - 1U;
    ) d, V. F0 i& X. P4 J
  364.   hltdc->Init.VerticalSync       = (uint32_t)RK050HR18_VSYNC - 1U;
    5 P) Z" m' u0 ?$ m0 a3 _+ V- z9 R
  365.   hltdc->Init.AccumulatedVBP     = (uint32_t)RK050HR18_VSYNC + (uint32_t)RK050HR18_VBP - 1U;
    7 q; `# Z$ F5 K; }
  366.   hltdc->Init.AccumulatedActiveH = (uint32_t)RK050HR18_VSYNC + Height + (uint32_t)RK050HR18_VBP -1U;
    8 {. P& w. w' B: u2 {- U
  367.   hltdc->Init.TotalHeigh         = (uint32_t)RK050HR18_VSYNC + Height + (uint32_t)RK050HR18_VBP + RK050HR18_VFP - 1U;
    " {$ q- ]2 {6 n+ C7 H
  368. . c, y" l" l/ F; C6 p  T0 B/ x
  369.   hltdc->Init.Backcolor.Blue  = 0x0;9 x& ?  [/ M* t# Q3 y* \' z! C" F
  370.   hltdc->Init.Backcolor.Green = 0x0;8 b5 a; ^9 L4 o9 P- G. @9 ?
  371.   hltdc->Init.Backcolor.Red   = 0x0;
    / V' G6 \- c, I# V/ S$ B$ o

  372. * C9 u* v% h" |7 H
  373.   return HAL_LTDC_Init(hltdc);6 q$ C9 W: c; Z" }9 F6 C
  374. }
    - w% p3 [& g6 _0 E( f$ \  [
  375. 7 ]0 W4 g6 e7 I3 z
  376. /**( f3 k7 B. y; s+ `8 s4 c& w$ w6 y
  377.   * @brief  MX LTDC layer configuration.2 |2 X9 q" a3 i/ o! a0 r
  378.   * @param  hltdc      LTDC handle, F7 E! ^' e+ e" j
  379.   * @param  LayerIndex Layer 0 or 1" E4 o+ L5 a8 ]/ m5 ~+ B- c- C6 T
  380.   * @param  Config     Layer configuration
    / ]' w; k. \. t2 A
  381.   * @retval HAL status4 q- K9 I% j+ E/ \* Y
  382.   */4 ^# F7 I) F+ ]3 X+ g% K3 v5 |! a* o; W
  383. __weak HAL_StatusTypeDef MX_LTDC_ConfigLayer(LTDC_HandleTypeDef *hltdc, uint32_t LayerIndex, MX_LTDC_LayerConfig_t *Config)/ f# @  @4 z0 B% }8 l
  384. {% \/ G8 n. z* W6 }4 J
  385.   LTDC_LayerCfgTypeDef pLayerCfg ={0};
    3 j$ x8 Q$ ]# a  T2 H! Z2 H2 E/ I0 N

  386. % Y' g( s( w# `7 J- j  g
  387.   pLayerCfg.WindowX0 = Config->X0;% e! o( F* e: ~
  388.   pLayerCfg.WindowX1 = Config->X1;
    1 J2 U* @# r2 {) a, @
  389.   pLayerCfg.WindowY0 = Config->Y0;3 L$ R6 h5 r+ v+ ~4 q' D
  390.   pLayerCfg.WindowY1 = Config->Y1;
    2 ^( i3 S# }1 W2 X( l) l2 q( A! n# E
  391.   pLayerCfg.PixelFormat = Config->PixelFormat;
    7 F: X0 |" D" q5 [' N
  392.   pLayerCfg.Alpha = LTDC_LxCACR_CONSTA;
    & [" r/ j  q6 m! y
  393.   pLayerCfg.Alpha0 = 0;
    2 z: m( w  \" ]8 y- Z! y
  394.   pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;# e4 K) D' C( e3 @0 y' A$ e( x; @# O0 `
  395.   pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;' J* r3 Z4 n2 b
  396.   pLayerCfg.FBStartAdress = Config->Address;
    + A6 O' q  E% k6 m9 z+ c8 f! P9 A
  397.   pLayerCfg.ImageWidth = (Config->X1 - Config->X0);
    ) F% F6 I+ @7 w) x# Y
  398.   pLayerCfg.ImageHeight = (Config->Y1 - Config->Y0);
    2 {4 F8 x+ J0 h6 E
  399.   pLayerCfg.Backcolor.Blue = 0;
    5 t0 y/ U) M1 ~1 D( L2 y) [
  400.   pLayerCfg.Backcolor.Green = 0;
    * M; z' S% q. [) X2 i
  401.   pLayerCfg.Backcolor.Red = 0;2 D( k* t+ e! M/ A: u% g4 R
  402.   return HAL_LTDC_ConfigLayer(hltdc, &pLayerCfg, LayerIndex);
    " ?3 K$ g# k3 w. d3 B
  403. }
    " s1 ?, K$ U6 ^: e. ~/ q% [

  404. 6 z1 g( Z3 X5 p$ J/ B/ V, z
  405. /**
    * l0 Y1 ^* ^! i6 e9 M6 T6 N% b
  406.   * @brief  LTDC Clock Config for LCD DPI display./ L1 ^9 F! d/ V4 F# f8 [. x4 `( F" n
  407.   * @param  hltdc  LTDC Handle0 Z5 Q9 E( k7 L2 y, Y; }7 _
  408.   *         Being __weak it can be overwritten by the application
    8 ^0 o, z! q4 e: W% B) R
  409.   * @retval HAL_status
    ( P: [* Y: r! |% N
  410.   */+ m8 f6 K3 G  F$ D# D& H: ^( ^
  411. __weak HAL_StatusTypeDef MX_LTDC_ClockConfig(LTDC_HandleTypeDef *hltdc)
    9 ?# e  k" S& Y3 `* k
  412. {& O$ d& }  J  r6 d. D+ N6 p
  413.   /* Prevent unused argument(s) compilation warning */+ f* x$ g. C& b
  414.   UNUSED(hltdc);
    9 Y1 U: b) O# ^2 o" w8 t  H
  415. , x8 ]1 z* q/ K0 @9 S  c/ }0 j
  416.   HAL_StatusTypeDef   status =  HAL_OK;
    ' \% r# i8 X* D5 A
  417.   RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInitStruct = {0};8 y' e; [' Q4 R. W6 l+ n

  418. ( G( e0 \& `+ o' n& F' m1 c
  419.   /* LCD clock configuration */
    1 ~7 ~' Y& j& t4 V
  420.   /* Typical PCLK is 25 MHz so the PLL4 is configured to provide this clock */2 f4 c9 @  l3 Y
  421.   /* LTDC - PLL4 */
    4 k" Q6 q) T- `3 ~: W* Q4 {
  422.   /* Configure LTDC clock to IC16 with PLL4  */
    4 u* {# {$ E9 z: _6 U

  423. 5 \9 `) y7 |* e$ Y# C
  424.   /* LCD clock configuration */& `+ W1 x. |4 |9 d/ Y9 u0 |$ |
  425.   /* Typical PCLK is 25 MHz so the PLL4 is configured to provide this clock */
    ' D4 r+ o. m: p# ?3 ^( R
  426.   /* LCD clock configuration */
    & C5 V# ~" Z+ l4 y, s
  427.   /* PLL3_VCO Input = HSE_VALUE/PLLM = 48 Mhz / 192 = 0.25 */
    * m( v, F+ ?' f8 {5 {
  428.   /* PLL3_VCO Output = PLL3_VCO Input * PLLN = 0.25 Mhz * 100 = 25 */
    - g# f8 V' f* I- j2 v4 q8 a& E8 n
  429.   /* PLLLCDCLK = PLL3_VCO Output/(PLLP1 * PLLP2) = 25/1 = 25Mhz */
    2 a3 f# u, x9 O% p8 `/ V- |4 V
  430.   /* LTDC clock frequency = PLLLCDCLK = 25 Mhz */" |" P( O2 h9 Z- e! {

  431. 5 z  L; N7 j; M: r
  432.   RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC;
    ( o, _. u. _2 \6 t% _
  433.   RCC_PeriphCLKInitStruct.LtdcClockSelection = RCC_LTDCCLKSOURCE_IC16;
    ( M1 `( g' t. T6 U; y/ P9 g2 D
  434.   RCC_PeriphCLKInitStruct.ICSelection[RCC_IC16].ClockSelection = RCC_ICCLKSOURCE_PLL4;6 G3 w/ E$ `, q% ?. u
  435.   RCC_PeriphCLKInitStruct.ICSelection[RCC_IC16].ClockDivider = 2;
    " N) j- ~. Z1 t6 {. e
  436.   if (HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct) != HAL_OK)+ A/ a7 {5 o- f2 x& U0 P
  437.   {
    1 o, ~, C4 _! c# S5 _5 L
  438.     status = HAL_ERROR;. A, B- ~# F. R* s) p% X
  439.   }2 Y& |! `( l* t$ T! o2 i/ U
  440. 7 u# h# ?! n0 x' _  h0 A, l% ^
  441.   return status;6 y: ]% A: [8 F# \  b% d
  442. }" r3 U1 v( s8 O- W' A
  443. # Z6 F& ?4 M. d; \! a
  444. #if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1)
    ' o- E) [1 t+ W7 y2 z5 a. y
  445. /**
    1 U: J' \  D/ I: |& K
  446.   * @brief Default BSP LCD Msp Callbacks; Z( i8 o7 T6 n3 c4 B# d
  447.   * @param Instance BSP LCD Instance. ^" g: \, C+ m: r  [* q
  448.   * @retval BSP status
    9 {% S9 r$ ]+ u; w- K+ Q
  449.   */# b5 e+ w, _0 {' }% T
  450. int32_t BSP_LCD_RegisterDefaultMspCallbacks (uint32_t Instance)  t1 Y9 |( {7 b0 ?- Q9 e: r
  451. {  k; n: C' u* H6 F5 K+ u
  452.   int32_t ret = BSP_ERROR_NONE;0 w0 Y: ^( Z. }' `
  453. 3 X& G# J' a+ W/ u
  454.   if(Instance >= LCD_INSTANCES_NBR)' l' x3 w9 a* z# T
  455.   {
    % t: q  o. J* y& |
  456.     ret = BSP_ERROR_WRONG_PARAM;0 Y0 p$ _' o9 a) X" o
  457.   }# P: K0 S3 L$ ~  b: U+ |4 N
  458.   else2 o& y0 D3 K3 \+ v% z9 m
  459.   {
    7 d* D7 J/ |/ K& Q: l
  460.     if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPINIT_CB_ID, LTDC_MspInit) != HAL_OK)4 H1 H" ~4 @1 R& t
  461.     {
    # k1 {. {! A$ b8 |0 O
  462.       ret = BSP_ERROR_PERIPH_FAILURE;
    # v& {9 {5 \$ ?7 R5 F
  463.     }0 O" {# s8 b, W9 @
  464.     else+ Z: _7 O" h8 g' H- b8 L( y) U) r' H
  465.     {! a2 s5 g1 f* q7 N0 L
  466.       if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPDEINIT_CB_ID, LTDC_MspDeInit) != HAL_OK)
    ! Z. H. A- f. }0 Z* z  E9 W3 a
  467.       {9 U3 o! N2 I' c/ J
  468.         ret = BSP_ERROR_PERIPH_FAILURE;2 K' x9 {4 ]  S$ z- b, w
  469.       }
    " h4 }. @( P1 w, Z4 c
  470.     }1 h8 P  d$ B6 J/ k

  471. * G) g0 l& |- D+ W0 |1 D4 M* p; D2 U
  472.     Lcd_Ctx[Instance].IsMspCallbacksValid = 1;+ F4 b6 |, E+ p5 x9 `+ D
  473.   }
    . g7 h* K8 o0 j- L, |1 Y

  474. ; v4 K' y- W# T
  475.   return ret;
    , w7 V1 C( w5 _8 a' `' @6 @' M
  476. }
    9 }% Y3 X: w) K+ T' `! i
  477. 0 Y/ f* i! Q, M) }8 W) F
  478. /**
    . F+ }% q# `9 x% D
  479.   * @brief BSP LCD Msp Callback registering
    ' L" a9 X- O7 a) S; ]. j" O5 \0 c
  480.   * @param Instance    LCD Instance; |$ I9 G6 o9 u& e4 t2 e% J
  481.   * @param CallBacks   pointer to LCD MspInit/MspDeInit functions& L3 Z* n9 Z& h6 ~7 H/ |: n. a( _0 c
  482.   * @retval BSP status
    ; u$ j7 n* v1 K, c7 _) v, S
  483.   */; x; D6 Z- X9 c
  484. int32_t BSP_LCD_RegisterMspCallbacks (uint32_t Instance, BSP_LCD_Cb_t *CallBacks)
    ( u; l! x( G6 Y/ U
  485. {. [+ a8 _' J+ y3 U
  486.   int32_t ret = BSP_ERROR_NONE;
    4 K6 N0 ?4 ^) t3 p8 Q; h/ d, b- v

  487. # z8 @1 S2 |5 i/ C- Z
  488.   if(Instance >= LCD_INSTANCES_NBR)
    : E# U) k& @' P5 j& t, z
  489.   {" U' Q+ L& y4 {5 \) X! u+ X
  490.     ret = BSP_ERROR_WRONG_PARAM;
    : |4 q6 Q; x! B$ S& E' g- C+ F3 v' X
  491.   }( a1 X! Z" H: [- J, k  ^2 `
  492.   else
    ( V. m" T0 i( ?9 w- ?$ O
  493.   {* X* X8 G: I3 A+ ?( F8 n8 d4 L
  494.     if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPINIT_CB_ID, CallBacks->pMspLtdcInitCb) != HAL_OK)
    . }9 w0 o# Q; k7 O& C8 L
  495.     {
    ! C( |) J8 x5 o! x! Q( B
  496.       ret = BSP_ERROR_PERIPH_FAILURE;5 L. O: m3 s# F2 I
  497.     }$ i: P$ D" j6 K
  498.     else
    ! W& r0 ?8 f- n7 ~  x
  499.     {; T: E% I% c, `5 \
  500.       if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPDEINIT_CB_ID, CallBacks->pMspLtdcDeInitCb) != HAL_OK)
    / `" L. v* c( u/ l* @0 `0 u
  501.       {* a; S, g/ f# a) Q( }. _" }
  502.         ret = BSP_ERROR_PERIPH_FAILURE;
    ) x  B; N$ M. P+ Z7 {& r
  503.       }
    1 V0 @! f1 g# \
  504.     }
    6 t0 G$ ?5 d+ H1 R+ t# E

  505. 8 C! E% E. m* E
  506.     Lcd_Ctx[Instance].IsMspCallbacksValid = 1;" f) {, ^2 h/ O" f9 E& r1 L
  507.   }
    % W: A+ B8 P  i
  508. 0 s6 l* P8 p$ [! i6 g
  509.   return ret;
    ( f3 D3 ^! q& k5 Z$ l- X2 R
  510. }8 ]. w! @5 R5 Q4 c, L. C# u: Z, e
  511. #endif /*(USE_HAL_LTDC_REGISTER_CALLBACKS == 1) */
    1 Z4 M2 [+ u; l4 }/ O) ]
  512. 6 e. x! R/ g9 k% D, [
  513. /**
    + I" s, Y$ N$ K) ^9 o8 X* G
  514.   * @brief  LTDC layer configuration.) \; a' _) Y2 O8 z" C, ?# `! Q1 o
  515.   * @param  Instance   LCD instance4 _4 j' V1 n4 R2 ?1 P( P6 h
  516.   * @param  LayerIndex Layer 0 or 1
    8 G+ J& n7 r8 M4 A
  517.   * @param  Config     Layer configuration
    " h  j" G% i5 z
  518.   * @retval HAL status$ J$ f! l, P9 |9 r- }+ d
  519.   */
      j- f9 |) _; F7 k7 l% i" C
  520. int32_t BSP_LCD_ConfigLayer(uint32_t Instance, uint32_t LayerIndex, BSP_LCD_LayerConfig_t *Config)
    $ E3 t9 n7 N( @$ q# B8 q
  521. {
      K: h' E0 e/ [+ n, F* ^) u
  522.   int32_t ret = BSP_ERROR_NONE;
    ) K  f6 n# b* O& W5 j$ _3 k4 [
  523.   if(Instance >= LCD_INSTANCES_NBR)  H7 A8 c( r4 f( Y
  524.   {
    9 L! X% M" f# y( f8 s8 Y
  525.     ret = BSP_ERROR_WRONG_PARAM;- O4 Y) e' D2 E+ |, G
  526.   }
    3 d: W# r) z3 z+ d+ K; a
  527.   else" J5 S$ A" s1 S' s$ G( @
  528.   {
    " H  ]9 |, c( P" g7 ^/ l
  529.     if (Config->PixelFormat ==  LCD_PIXEL_FORMAT_RGB565)
    . p3 t- \9 J& z/ j4 O7 V
  530.     {
    / S' y. H% U' }5 I! U
  531.       Config->PixelFormat = LTDC_PIXEL_FORMAT_RGB565;
    % o& Q1 b8 p% p! ]
  532.     }% q8 V' D) H" E" Z! k% F2 [/ P
  533.     else if (Config->PixelFormat ==  LCD_PIXEL_FORMAT_ARGB4444)/ r$ _2 P6 W+ E: S6 V. u+ o& k
  534.     {9 w+ |) |8 @" K, i
  535.       Config->PixelFormat = LTDC_PIXEL_FORMAT_ARGB4444;
    $ s. ?. ?5 t2 ]
  536.     }7 m* L" W4 ?0 T$ @3 o, s+ D
  537.     else if (Config->PixelFormat ==  LCD_PIXEL_FORMAT_ARGB8888)6 A0 R2 g1 g1 \8 e  m! _! g$ a' N. T
  538.     {
    5 s5 T: O9 V2 X' t; E- H
  539.       Config->PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888;
    , g, @. D) {9 P6 n% U/ U
  540.     }
    0 Q) ]$ X; M# Y( ]$ S: k; J
  541.     else/ H, |1 c. Z, }5 h: p, |5 o
  542.     {
    7 A; J- w/ o1 B/ ~4 L$ {
  543.       Config->PixelFormat = LTDC_PIXEL_FORMAT_RGB888;
    ! Y* ?, Z) }9 |" ^8 ?+ @
  544.     }
    9 H# r( X$ T" A6 G- ~
  545.     if (MX_LTDC_ConfigLayer(&hlcd_ltdc, LayerIndex, Config) != HAL_OK)$ H! `: I5 i2 ^+ x; p/ i. f* l
  546.     {! g$ H! r9 H' Y
  547.       ret = BSP_ERROR_PERIPH_FAILURE;
    ; P8 H6 x' g- T. E1 a! [6 w$ P
  548.     }5 ?' s" {7 I# a  `7 A
  549.   }1 G; w9 W- P( C8 }2 \6 P
  550.   return ret;
    4 k$ K2 f& G9 Y9 h! H7 M
  551. }) h9 ?% j, d( R& T5 h3 L- ]9 w7 l
  552. : L0 }7 U; D! j# F9 O) k# n
  553. /**
    6 [( L% ?- g4 V; q" r% V0 E  H; U
  554.   * @brief  Gets the LCD Active LCD Pixel Format.
    5 M/ O7 a; T( Y& q3 a% K
  555.   * @param  Instance    LCD Instance
    ! i: k9 F% [: Z8 ~
  556.   * @param  PixelFormat Active LCD Pixel Format
      H9 E; t4 K4 J' u+ i  ]
  557.   * @retval BSP status
    + |# M( Z% O. _+ N. u' o' k
  558.   */
    7 g! X" I7 V& j
  559. int32_t BSP_LCD_GetPixelFormat(uint32_t Instance, uint32_t *PixelFormat)
    : Y% X* m1 H6 `" d; ^. ^1 ~1 u
  560. {
    4 t7 m; p  _, T! z; A
  561.   int32_t ret = BSP_ERROR_NONE;
    ) K6 x. [) F; L$ Y! C1 S

  562. ; N" U4 M2 @$ h, X' Y
  563.   if(Instance >= LCD_INSTANCES_NBR)- I, P6 Q. j9 |6 y
  564.   {4 x3 O& r( r/ q8 K' O
  565.     ret = BSP_ERROR_WRONG_PARAM;
      K7 D6 b9 M* Q! k
  566.   }
    $ b( C5 q: l( [
  567.   else8 K2 ]9 c* J# b1 ^. y# G4 e
  568.   {
    1 C$ |: @) Y! [1 ?0 s( b
  569.     /* Only RGB565 format is supported */1 {* P) `, V9 s8 z3 {2 W
  570.     *PixelFormat =  Lcd_Ctx[Instance].PixelFormat;- X+ k" g  o2 W' E5 S
  571.   }
    + D; @6 t* t8 \5 Y. A0 i: E. g& Q

  572. 6 G9 t) m; C7 q/ I1 z! q/ i+ v
  573.   return ret;3 O) W% O' j# Z% t( y1 v% Q. M9 L
  574. }5 T3 I( v$ `$ o( j, T# V6 j

  575. 2 M5 j1 L" u" }( W: m5 L- V
  576. /**7 c6 f+ z8 a6 B/ f+ C
  577.   * @brief  Set the LCD Active Layer.
    3 F  u5 k" Q( ~0 w7 E& @/ w
  578.   * @param  Instance    LCD Instance3 \3 G+ [# V" y
  579.   * @param  LayerIndex  LCD layer index
    , }  w* d& p+ P- R
  580.   * @retval BSP status* ]" w5 o- [3 J
  581.   */
    & `2 T# D: p# B) A
  582. int32_t BSP_LCD_SetActiveLayer(uint32_t Instance, uint32_t LayerIndex)" S8 k$ f4 M3 N% X
  583. {
    + V  _5 Z. _) R. D; x% g' ~; [
  584.   int32_t ret = BSP_ERROR_NONE;" }3 G* G+ w8 E# N; L
  585.   LTDC_LayerCfgTypeDef *pLayerCfg;
      j( e( ~" A9 {0 Y  s6 p
  586. 7 L9 y. ]  f: O7 K" D) O
  587.   if(Instance >= LCD_INSTANCES_NBR)
    0 m2 t; ^# u5 c5 G3 P
  588.   {
    . `8 Y7 _5 K5 n  C+ O
  589.     ret = BSP_ERROR_WRONG_PARAM;+ f) J' {( m3 t& j# d. V
  590.   }
    ! [) I, ^" M- y$ f' y
  591.   else
    - k+ C" g/ {3 U
  592.   {( C- S8 E1 r3 ~8 @
  593.     pLayerCfg = &hlcd_ltdc.LayerCfg[LayerIndex];& t- N/ B; Q: g# g& b: m
  594. ! L, Z# w+ t$ E3 H8 i% F
  595.     Lcd_Ctx[Instance].ActiveLayer = LayerIndex;/ _- I4 d! w6 t, e! L/ q
  596.     Lcd_Ctx[Instance].XSize = pLayerCfg->ImageWidth;
    6 Y" ^) O/ D* {! \& H7 C! r5 x
  597.     Lcd_Ctx[Instance].YSize = pLayerCfg->ImageHeight;
    " C/ s- F* q1 o
  598. 2 D1 x% M5 f4 H6 S3 @8 v* \( K8 s
  599.     if (pLayerCfg->PixelFormat ==  LTDC_PIXEL_FORMAT_RGB565)4 `' j* C# s7 E  R. O" g8 I
  600.     {7 e- j7 o; o' X( h; w: k: S$ S
  601.       Lcd_Ctx[Instance].BppFactor = 2;
    * ?; G* N% g; G8 ]
  602.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_RGB565;5 y2 N: N; [& J& m, m4 q0 P1 m
  603.     }
    + x' O4 }: F# u; j2 x
  604.     else if (pLayerCfg->PixelFormat ==  LTDC_PIXEL_FORMAT_ARGB4444)
    5 j* a6 z# A1 e7 W
  605.     {
    # [1 W3 ?( v% s( F0 l' Y% y; \
  606.       Lcd_Ctx[Instance].BppFactor = 2;
    7 }) U2 n  r( Y. Q
  607.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_ARGB4444;7 ~3 r, G( Q' D! Z6 k" ^
  608.     }: o. I8 L8 ?. U! ^! G! I
  609.     else if (pLayerCfg->PixelFormat ==  LTDC_PIXEL_FORMAT_RGB888)6 j; f( W( o! Y( @: V. ]
  610.     {. J& f* a0 z3 A7 n5 y6 `5 c
  611.       Lcd_Ctx[Instance].BppFactor = 3;
    / R. j. e4 R7 M* ~$ u* `
  612.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_RGB888;
    ; o+ o2 C0 N/ B( T( S. N
  613.     }( e  J: Y3 Z) d* Z! s
  614.     else
    7 ]5 B9 j2 a$ Z4 \0 u# O7 k2 W! G
  615.     {
    . B) Z9 b6 Z7 `; w
  616.       Lcd_Ctx[Instance].BppFactor = 4;/ T, u& K2 P) k
  617.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_ARGB8888;9 G/ l' |5 Z. N/ q0 G0 Y; y% x
  618.     }
    2 ], q( X7 e. c
  619.   }3 A2 Z  |9 {" i3 B  ~( f  C0 i
  620. ' e' B0 t, X% G. ]$ ?% e
  621.   return ret;
    & L* c8 _; `2 f  b1 o( J0 p" X& T3 A
  622. }/ O7 |' m# R; G; \8 w- K2 y9 M

  623. 1 B" M4 }  I+ o/ P/ L
  624. /**
    / A0 _, w+ I  B
  625.   * @brief  Control the LTDC reload
    & U( X2 f: ?4 f6 U1 ~& w# ?
  626.   * @param  Instance    LCD Instance
    $ d2 L+ Y  Z/ a5 C+ v
  627.   * @param  ReloadType can be one of the following values
      o/ E; a  p& g6 R3 X* R$ y
  628.   *         - BSP_LCD_RELOAD_NONE
    / X2 b3 ~9 O5 L7 J
  629.   *         - BSP_LCD_RELOAD_IMMEDIATE
    / c4 l" n' s# G- L* A
  630.   *         - BSP_LCD_RELOAD_VERTICAL_BLANKING4 o6 J( r: M7 h7 I; I, a6 S
  631.   * @retval BSP status
    $ d$ M( o' j' ]4 \3 b
  632.   */! j! ~$ ~9 c" X( H( z
  633. int32_t BSP_LCD_Reload(uint32_t Instance, uint32_t ReloadType)
    - D" }" n, n3 i+ N" Z/ c
  634. {2 }, `) Y6 K9 Z! D3 E
  635.   int32_t ret = BSP_ERROR_NONE;! s3 N0 _6 Z8 G" W

  636. - Y* I& O& W) U2 b
  637.   if(Instance >= LCD_INSTANCES_NBR)
    9 Y; w4 N- U* E) e/ c2 x. g# y
  638.   {
    : e# e& o& u( M1 T5 D' e  G
  639.     ret = BSP_ERROR_WRONG_PARAM;
    8 q0 i  p9 ?2 G, k
  640.   }
    8 X1 q# h* o  U
  641.   else if(ReloadType == BSP_LCD_RELOAD_NONE)- G6 Y$ n) c; z
  642.   {
    ; t4 M7 C1 i4 o0 ^. ~. i! v
  643.     Lcd_Ctx[Instance].ReloadEnable = 0U;
    7 e. [# U. v% V2 M/ A
  644.   }  h, N( w9 ~+ f1 B8 D5 F
  645.   else if(HAL_LTDC_Reload(&hlcd_ltdc, ReloadType) != HAL_OK)/ X1 ^8 \- h2 H* u' i5 E1 ^- ]
  646.   {: Z1 }" E. G& c1 o0 i$ }; z: f5 c
  647.     ret = BSP_ERROR_PERIPH_FAILURE;3 i$ j/ |) n% P3 Q3 w5 ?5 f' T# ?, z
  648.   }$ ~" k" A; i+ a, D
  649.   else7 J8 m: E: A7 b/ |
  650.   {! w$ `" W4 z  y, }8 z9 i9 T
  651.     Lcd_Ctx[Instance].ReloadEnable = 1U;0 n$ Z3 Y0 @$ n* ?8 K
  652.   }$ Y: g2 @5 o" h6 @; a& q

  653. - T. _5 W/ s9 C/ T+ t- ~/ b
  654.   return ret;
    / V7 \* ~8 M+ d- H
  655. }
      l; x% \( G0 u- X( `
  656. # Y2 d7 G. S0 p, c8 [
  657. /**
    4 ^  V- p! C) a! F& Y
  658.   * @brief  Sets an LCD Layer visible
    - V. T  }' u! d; {
  659.   * @param  Instance    LCD Instance% j% {) z+ S- p3 q
  660.   * @param  LayerIndex  Visible Layer
    4 A0 p$ ]% P0 L
  661.   * @param  State  New state of the specified layer- ~1 q9 n0 y- n) Z" B; `2 P
  662.   *          This parameter can be one of the following values:4 G) e; H3 ^: t  K
  663.   *            @arg  ENABLE" t7 _2 x8 G( e0 |8 n9 W
  664.   *            @arg  DISABLE* i% }# n8 n& I) e
  665.   * @retval BSP status
    - {, o" @9 e) \/ O$ c1 ?6 ~
  666.   */
    - v5 K, {9 h/ i5 C1 L5 n1 V3 N* {
  667. int32_t BSP_LCD_SetLayerVisible(uint32_t Instance, uint32_t LayerIndex, FunctionalState State)% z: X9 w' w+ Y# `0 h! ]( k
  668. {; r* }% m, X6 N4 w! r
  669.   int32_t ret = BSP_ERROR_NONE;) y- f5 b) W" i' Y

  670. 3 A3 ~1 _0 d; Q5 g) a  d
  671.   if(Instance >= LCD_INSTANCES_NBR)3 W3 s+ i! b- E* t' U& y
  672.   {
    4 A& z5 E1 U9 ^, a* A' R
  673.     ret = BSP_ERROR_WRONG_PARAM;
    5 Y# q( Z) c+ S) O) T9 t1 U& V
  674.   }( q0 s8 ^; Y1 W  V
  675.   else5 C. q* o. b( }, D# M0 l
  676.   {8 p" b& I1 B: E- U4 l6 C0 u
  677.     if(State == ENABLE)
    $ V! T! }9 R0 Q$ y
  678.     {) ]/ f7 X+ V  H- L  H
  679.       __HAL_LTDC_LAYER_ENABLE(&hlcd_ltdc, LayerIndex);; i2 f# }0 u  ^7 t- _4 t4 i8 u! ]
  680.     }
    / Y- J9 P, X2 s8 e" q7 G3 N6 T/ n& Z
  681.     else; t2 V9 m6 _! R2 n; Y: @* |
  682.     {
    8 |7 ~) w# k3 O+ ^( O
  683.       __HAL_LTDC_LAYER_DISABLE(&hlcd_ltdc, LayerIndex);
    ' F, r% n/ m6 ~/ N" v# x
  684.     }  }& j% I0 J2 a; \# e, Q2 L& \- V9 s
  685. , s- Z3 |) s/ m) b0 B( H
  686.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    - ~3 {& ^2 l* |2 G$ a3 N
  687.     {7 X* @2 L/ R2 v4 D) s; B% l
  688.       __HAL_LTDC_RELOAD_IMMEDIATE_CONFIG(&hlcd_ltdc);
    8 W: Q, G8 V$ q; w5 }
  689.     }
    7 V5 g: @2 U' ~) f5 h. w4 x
  690.   }! A4 j7 S3 Q& \# _

  691. 0 ?0 ?' r0 j2 q
  692.   return ret;$ q: `- M: r& F9 s
  693. }, T( H( G: u9 v! V( e

  694. ) s4 ?# t" Y. I3 y; q
  695. /**# s+ r  T& T/ u9 G- h
  696.   * @brief  Configures the transparency.# f# H! ]( ~4 u( D
  697.   * @param  Instance      LCD Instance$ M; f# K" B) }( M+ G% t* x  L
  698.   * @param  LayerIndex    Layer foreground or background.- [+ a$ R( I& \8 v  R
  699.   * @param  Transparency  Transparency/ T, l- j9 b1 W( E7 [; v
  700.   *           This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF& e1 G* i3 y& A; v2 E8 e. o
  701.   * @retval BSP status
    , f% q9 E; x( E3 ^
  702.   */! h" k$ Q* M- R4 M. j3 k
  703. int32_t BSP_LCD_SetTransparency(uint32_t Instance, uint32_t LayerIndex, uint8_t Transparency)
    $ A# \0 m/ X  p0 I- U* X3 R2 R2 s# s
  704. {
    6 X, A5 |- l- W1 _
  705.   int32_t ret = BSP_ERROR_NONE;! b) O7 k: r( r8 S( k; x
  706. 0 r8 a9 G3 G; Q4 e% _' X
  707.   if(Instance >= LCD_INSTANCES_NBR)
    7 P8 ?2 Q) }! v& w
  708.   {
    9 _3 O9 u( Y$ \8 g
  709.     ret = BSP_ERROR_WRONG_PARAM;
    ( T3 d# V4 o" k. x* F4 n0 n
  710.   }
    & T" U! T' `" k6 {& `* @$ S& x+ x
  711.   else
    4 Q( o# F7 Z8 S: @7 l
  712.   {
    ; a3 p" Q' n* Y
  713.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)/ \" f6 P" }2 e5 V$ Y0 c
  714.     {/ d( P8 `3 P" n1 X' y
  715.       (void)HAL_LTDC_SetAlpha(&hlcd_ltdc, Transparency, LayerIndex);1 ?1 e4 U: h! W: c( B1 ]1 i
  716.     }
    8 j+ X" v4 Y! D) ^0 z. S
  717.     else/ Q* t. u  I  [+ M% H6 U
  718.     {
    6 w- t/ g; t6 {( b) m$ n4 @
  719.       (void)HAL_LTDC_SetAlpha_NoReload(&hlcd_ltdc, Transparency, LayerIndex);
    & r( v1 v# P/ G6 @% ]  G& f$ ]- @
  720.     }; N" J( t6 e* |( K
  721.   }) h9 h5 x! t* ~" ~
  722. ! Q$ ^! x7 h; f; b2 y4 h
  723.   return ret;
    6 i/ D8 @6 i6 R+ O7 H- F3 R
  724. }
    " t  l8 v0 m+ r8 I9 w3 j$ Q0 s# d/ Z
  725. $ w2 v8 d, r* ?" Y- L
  726. /**2 }) h+ ?9 Q" o1 c
  727.   * @brief  Sets an LCD layer frame buffer address.1 ~& _/ ?# V0 i
  728.   * @param  Instance    LCD Instance: i6 ?/ |  ]3 q8 K0 l2 ~4 Y( J$ r
  729.   * @param  LayerIndex  Layer foreground or background
    % Q' F( s4 j" @/ {: u& T8 l; W
  730.   * @param  Address     New LCD frame buffer value/ A% I7 U" g6 q4 T
  731.   * @retval BSP status, c4 R: m6 o7 N; k* t7 n. W+ q  O, ^
  732.   */* L' i8 |; f! U) y4 ~3 l0 ]" r/ M$ r
  733. int32_t BSP_LCD_SetLayerAddress(uint32_t Instance, uint32_t LayerIndex, uint32_t Address)7 }9 v& D  W1 i$ e
  734. {
    - [# D& S8 `+ j
  735.   int32_t ret = BSP_ERROR_NONE;
    5 _) Y3 r* Q6 X& ^. o* f1 J3 @) I

  736. + j; a) x1 ~# ]
  737.   if(Instance >= LCD_INSTANCES_NBR)2 a7 _, y" C3 a* B/ N- A
  738.   {- i/ \7 M" X6 p' g$ d
  739.     ret = BSP_ERROR_WRONG_PARAM;
    - b9 L8 b" ?* {( q* [1 Q
  740.   }
    ' s# p; N. c! W
  741.   else7 {$ u$ G  \7 Q# G  B$ j% l
  742.   {9 o; a2 `1 ?& A. \7 v' @. j
  743.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    , {3 d' |5 m' F& w' |. D; P
  744.     {, K* p: A' l# A7 z2 H& }
  745.       (void)HAL_LTDC_SetAddress(&hlcd_ltdc, Address, LayerIndex);% y; P6 W) n' x/ v7 W4 Z
  746.     }
    5 M7 I9 v. ~& P6 A9 l
  747.     else' C7 P0 i" q/ J& t1 T. ~4 X4 w1 Y& G' f
  748.     {! @4 q+ w6 P" r) B
  749.       (void)HAL_LTDC_SetAddress_NoReload(&hlcd_ltdc, Address, LayerIndex);
    6 X' y; O3 v3 J: z
  750.     }$ ^$ ?: n- V4 o3 g! h$ ]! _) Z
  751.   }
    0 n; O9 _* e8 \" M  W

  752. ( K! m5 R; m3 F
  753.   return ret;0 K# V" Z* ?4 d2 I
  754. }5 w$ w/ T5 D/ c% G# T* |7 F
  755. % K% J/ D  [, {+ J. f
  756. /**
    * A4 o2 _4 U$ ?; r
  757.   * @brief  Sets display window.9 C( d7 p7 Q. H" V$ ^
  758.   * @param  Instance    LCD Instance
    - j, r2 b6 w( R6 S. R& u, ~
  759.   * @param  LayerIndex  Layer index( B3 {+ x. z# y
  760.   * @param  Xpos   LCD X position! b6 F# l4 s6 _$ j9 p& k! U5 h" q
  761.   * @param  Ypos   LCD Y position" e* t0 u3 g" X  q% L- m) Z
  762.   * @param  Width  LCD window width6 W. u1 j2 N/ B4 ~5 F
  763.   * @param  Height LCD window height- U2 Q& X2 l9 n5 ]6 p
  764.   * @retval BSP status
    ! e" |' f& Z2 H
  765.   */- F1 Z1 X. `0 k" R' Y2 U
  766. int32_t BSP_LCD_SetLayerWindow(uint32_t Instance, uint16_t LayerIndex, uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)4 j; N, F# N, `: i2 I
  767. {7 C+ h* A; j, h
  768.   int32_t ret = BSP_ERROR_NONE;# x0 W8 x- W/ v: p; o

  769. # w- j: [( q5 W: Q" V  y
  770.   if(Instance >= LCD_INSTANCES_NBR)/ N/ l% |/ c. O8 ~
  771.   {
    0 J2 J+ L& J4 O  o
  772.     ret = BSP_ERROR_WRONG_PARAM;
    ( G' T0 L3 i9 |  e, z
  773.   }. j/ F: c: A8 D+ H% f( \5 W# n
  774.   else
    # l( B% l5 i5 P# }: m+ W/ L' n8 A
  775.   {
    ; ^9 @  j7 j' o! b2 P& q
  776.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    7 ~7 k, Z. D. y: m3 R! V+ e2 r
  777.     {
    * P' y- [7 m4 @' U5 l7 P. X8 G
  778.       /* Reconfigure the layer size  and position */
    ; r$ a, Y9 G6 V) B
  779.       (void)HAL_LTDC_SetWindowSize(&hlcd_ltdc, Width, Height, LayerIndex);+ P' P, Q3 l9 t# y  j' a
  780.       (void)HAL_LTDC_SetWindowPosition(&hlcd_ltdc, Xpos, Ypos, LayerIndex);
    ' c' H; w2 c" P" ^+ P/ z
  781.     }
    : g: U) o+ e& ?  ^0 D# U
  782.     else
    , F/ x4 A) M: s/ P; Y
  783.     {7 F. t+ J" W  ]) ^& D
  784.       /* Reconfigure the layer size and position */
    7 x- H, D/ b' G
  785.       (void)HAL_LTDC_SetWindowSize_NoReload(&hlcd_ltdc, Width, Height, LayerIndex);( \( G/ `' ^6 V
  786.       (void)HAL_LTDC_SetWindowPosition_NoReload(&hlcd_ltdc, Xpos, Ypos, LayerIndex);( p4 ?) i9 W7 \5 R( [; C* Y! x; r
  787.     }  [/ X6 Y! c$ E& Q+ ?! X" s. }

  788. - L" X5 O, s& w. g
  789.     Lcd_Ctx[Instance].XSize = Width;
    . X5 }) v5 E; K2 b# x4 @
  790.     Lcd_Ctx[Instance].YSize = Height;
    8 B$ d7 r8 L* L, h9 s
  791.   }
    ) ?+ \/ d) _# I5 h7 j

  792. / k7 s6 M: X( a) o8 d) l9 m: p) `
  793.   return ret;7 A6 W2 Y9 a! E+ s( U- M: n
  794. }
    : G1 J3 K+ n; m1 L- O6 f
  795. ( ?% T& Y9 p  ~' Q- K% M" R
  796. /**
    7 Q; ?. T& m6 M; [% P
  797.   * @brief  Configures and sets the color keying.
    3 N, u' E8 g  T6 g  r
  798.   * @param  Instance    LCD Instance( W( T% [5 _) u! ?" q. Q2 i
  799.   * @param  LayerIndex  Layer foreground or background; C9 i. t; v! x* V- K4 q
  800.   * @param  Color       Color reference
    + P% H% o8 S- Q& A
  801.   * @retval BSP status
    ! X  B" D& }& G7 W+ ~
  802.   */
    8 B5 A3 Y$ k5 H3 l" T( E2 ]/ t, |% }
  803. int32_t BSP_LCD_SetColorKeying(uint32_t Instance, uint32_t LayerIndex, uint32_t Color)8 A# F3 [  r/ P3 `! A+ K! x4 H
  804. {1 e9 r; g9 w4 d8 [8 u$ j& W. r
  805.   int32_t ret = BSP_ERROR_NONE;* e0 r/ d. e9 F* I7 w

  806. , |+ _; Q2 S3 v
  807.   if(Instance >= LCD_INSTANCES_NBR)$ G) c& j! F6 T0 ^! J' K9 n; y
  808.   {
    : }( y) @9 o0 A8 R0 q1 Y
  809.     ret = BSP_ERROR_WRONG_PARAM;" r" `/ b( V" I8 `; P) L
  810.   }
    4 C/ z/ r/ r" N- n; r! S1 w% r
  811.   else+ y' f) Y% g2 c7 k  J* ^
  812.   {! p1 X' J0 A2 I* o
  813.     (void)HAL_LTDC_ConfigColorKeying(&hlcd_ltdc, Color, LayerIndex);$ Q/ ]" @9 S: h% O
  814.     if(Lcd_Ctx[Instance].ReloadEnable == 1U); K  X2 r8 \8 t6 K7 r3 ]2 t3 Y
  815.     {
    & b: [; z' S! `7 {4 O! [
  816.       /* Configure and Enable the color Keying for LCD Layer */
    " y1 H, m) H2 {7 u+ K( L' w, f
  817. : J6 L7 p/ n5 Z
  818.       (void)HAL_LTDC_EnableColorKeying(&hlcd_ltdc, LayerIndex);
    " w% K: u4 v( F3 T" N: [1 R6 ~
  819.     }
    7 Y* e  B' Z# @
  820.     else9 b: C: ^# d6 m  o
  821.     {4 N  D  }3 }0 e$ }5 Z! q
  822.       /* Configure and Enable the color Keying for LCD Layer */" P7 \7 I: a3 o: A
  823.       (void)HAL_LTDC_EnableColorKeying_NoReload(&hlcd_ltdc, LayerIndex);
    - M" m8 k$ ?; f! t$ n7 s
  824.     }" R# A1 ?  o: Z
  825.   }
    # V' s# P0 m( S

  826. 2 j) q! l7 D# C2 k2 A& d
  827.   return ret;* a4 v7 Y6 H& |* E- |) L
  828. }
    ' A+ p1 @9 ]4 s" K

  829. ( Q; B, L3 A8 l8 q2 L. g4 ]
  830. /**
    % u1 h3 I  n. G- |1 {8 f
  831.   * @brief  Disables the color keying.) n) ?1 R/ J$ M! n( p8 a
  832.   * @param  Instance    LCD Instance% d7 l) i; c% |! `
  833.   * @param  LayerIndex Layer foreground or background
    6 [6 c+ U$ E- p  W
  834.   * @retval BSP status+ h. r+ A7 b9 h3 M: y2 Q8 b
  835.   */, u0 n7 k; A7 q* ~+ M! W& W  d
  836. int32_t BSP_LCD_ResetColorKeying(uint32_t Instance, uint32_t LayerIndex)3 k5 S! W! Z7 R
  837. {, X6 F' o1 [8 }
  838.   int32_t ret = BSP_ERROR_NONE;5 l7 `& s* |+ t; I

  839. 2 T! y% V* t( l7 p' m' J
  840.   if(Instance >= LCD_INSTANCES_NBR)" Y, c1 k+ c( M7 C. s
  841.   {. {& ~" @* V) b. Q# T/ G
  842.     ret = BSP_ERROR_WRONG_PARAM;
    : Z/ F8 E1 E. r# s- A3 j
  843.   }
    % N3 n( S: u9 g) B# @, O
  844.   else9 O& p2 ?1 }; h
  845.   {, a1 R) D7 e4 m8 d. n7 L& m( q
  846.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)9 @2 m6 \' G2 c& u$ R
  847.     {
    4 T2 h$ x3 c% v
  848.       /* Disable the color Keying for LCD Layer */5 J. F/ `  u" I1 }  \
  849.       (void)HAL_LTDC_DisableColorKeying(&hlcd_ltdc, LayerIndex);
    2 X6 U+ x$ @7 [( ]
  850.     }
    ( P- z0 @5 h& v
  851.     else
    ; G% p1 v/ F6 J' b) ~' f
  852.     {- h7 q, K9 w8 B# k2 |
  853.       /* Disable the color Keying for LCD Layer */
    ' P3 ~9 |8 U8 [1 r" {
  854.       (void)HAL_LTDC_DisableColorKeying_NoReload(&hlcd_ltdc, LayerIndex);! z5 s, C# ]  A0 \! P
  855.     }
    , S" F9 z, X( A& N5 e; T0 c- C% R. W
  856.   }
    - c" L4 C1 m, |8 P+ s

  857. 0 i3 c& A1 n) |, y3 o
  858.   return ret;
    * I; Y7 V& g# A6 S
  859. }
    5 ~+ P$ v5 w; W( E7 ?2 B4 A) X5 C
  860. + S! p/ P- a5 [0 w% [+ A4 n
  861. /**  z- |% Z1 E$ X  Q% x3 I4 M; E. t
  862.   * @brief  Gets the LCD X size.6 @8 C7 `# y& O0 c% v, {
  863.   * @param  Instance  LCD Instance
    . S8 B# \: T& f, x
  864.   * @param  XSize     LCD width/ X$ _1 o% ^& Q- o  j2 K
  865.   * @retval BSP status
    : l" w# x6 X- X: s3 W* `+ ~$ x
  866.   */
      X. j# m1 n$ A& l) }
  867. int32_t BSP_LCD_GetXSize(uint32_t Instance, uint32_t *XSize)7 k# R$ j% |+ j% @3 o8 |& v
  868. {* E3 n( Y) x/ T0 S% G$ T
  869.   int32_t ret = BSP_ERROR_NONE;7 F- C+ g- M5 R, w
  870.   b7 C# C- y8 E
  871.   if(Instance >= LCD_INSTANCES_NBR)9 _* s2 C, K# T6 E7 [
  872.   {( Y, D3 ~# M. j4 M$ u4 z
  873.     ret = BSP_ERROR_WRONG_PARAM;2 C' m) `& O/ _6 }6 g! W
  874.   }7 P: A/ |5 [% @. J4 j9 r& Z7 K  y
  875.   else
      i9 C* U. V+ D# a; c1 T
  876.   {$ \: b' r1 K/ ~  a6 ]3 i. I
  877.     *XSize = Lcd_Ctx[Instance].XSize;. A) W. {- z/ m7 m% q
  878.   }
    4 `: ]0 L( V& I  a# v
  879. 7 B, g5 ]0 _* m8 @/ W# u2 ~/ S
  880.   return ret;
    7 c6 A) W. B/ S. N4 ~/ g$ ?
  881. }3 a1 @4 W' s- Z  G# d, c
  882. , R7 q2 ~9 _& C6 i# k' N% U0 t
  883. /**/ H6 }$ o' x% [* R) k
  884.   * @brief  Gets the LCD Y size.
    " r# k$ h- r2 u9 ~- y+ F
  885.   * @param  Instance  LCD Instance( H8 u, c( l2 Y" @
  886.   * @param  YSize     LCD Height: e* ?4 i; M& m5 h
  887.   * @retval BSP status1 ?, e3 y2 I+ p- Z7 N) \$ L/ E
  888.   */# p  u: L& L. y; B& I0 R) _' |+ C
  889. int32_t BSP_LCD_GetYSize(uint32_t Instance, uint32_t *YSize), N$ C8 Q3 R# x% J- L& g
  890. {- K9 J$ M; [# k6 b  f' o+ }
  891.   int32_t ret = BSP_ERROR_NONE;
    , m  ^" ^( A8 N5 s. f/ w
  892. # n/ \& ?* b, E
  893.   if(Instance >= LCD_INSTANCES_NBR)& D4 b; T8 g: j& g
  894.   {
    - Z' i5 P3 W+ W/ Z7 _( x$ f2 S; j
  895.     ret = BSP_ERROR_WRONG_PARAM;* p) L: ~3 q0 @
  896.   }7 V" b. Z# l5 [1 b
  897.   else
    2 P9 S# K) F: S0 n; I
  898.   {
    4 ]& [. A0 [0 g) l
  899.     *YSize = Lcd_Ctx[Instance].YSize;$ Z8 Y. s! S( }" F" M9 q2 |! r5 b
  900.   }/ X: N) `4 Q, `) e: n% _0 T

  901.   L9 F  U* ~8 w/ y" h- m, v2 N, w
  902.   return ret;
    $ O4 L" Z# W0 ~+ x" C8 D& G* X
  903. }) |7 W# f' Z! t

  904. 9 z5 t6 ]7 \9 w2 }
  905. /**
    4 z3 e% R0 B, J2 B, ]
  906.   * @brief  Switch On the display.; C4 q5 C, |$ V$ m1 {
  907.   * @param  Instance    LCD Instance. ~1 s1 m# D) q, u. m- L( _
  908.   * @retval BSP status3 Y& k" S9 m  J
  909.   */
    8 ]& \# B' _, Q8 y- O2 M
  910. int32_t BSP_LCD_DisplayOn(uint32_t Instance)0 @% G/ y/ k, ]4 V1 S
  911. {: j2 @: x6 m, i# p# A
  912.   int32_t ret = BSP_ERROR_NONE;
    4 f  b: Q9 P' m0 R1 u/ [; e3 a
  913.   GPIO_InitTypeDef gpio_init_structure = {0};% L( l" W: o" n9 D4 c: [

  914. * j4 U9 ^$ F. i* r" o3 r! Z. x
  915.   if(Instance >= LCD_INSTANCES_NBR)
    " f9 ]- e5 r, k0 ?9 B# S+ j8 u
  916.   {
    5 T) ^6 ]* B7 n* W* T# J& W
  917.     ret = BSP_ERROR_WRONG_PARAM;8 x+ V( M4 d/ y6 Q
  918.   }2 P' A4 s' E8 O2 G+ W& p/ Q
  919.   else2 }, N1 L* X% Q% {+ h3 z
  920.   {  {( d- Y6 s3 }! C2 n# h
  921.     __HAL_LTDC_ENABLE(&hlcd_ltdc);$ a; A0 R. t8 r( {  T" s
  922.     gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP;/ Q8 A  s% ^  r9 O$ Q8 a9 O( O. [9 I
  923.     gpio_init_structure.Pull = GPIO_PULLUP;- M+ \# H6 V( `/ Z9 ^
  924.     gpio_init_structure.Pin  = LCD_DISP_EN_PIN;- [, L; g0 l. O1 K
  925.     HAL_GPIO_Init(LCD_DISP_EN_GPIO_PORT, &gpio_init_structure);* {1 U0 O" B! U

  926. / S" @& l" K9 T4 p
  927.     /* Assert LCD_DISP_EN pin */
    6 c$ G9 t+ C8 \, E, p5 {: d
  928.     HAL_GPIO_WritePin(LCD_DISP_EN_GPIO_PORT,LCD_DISP_EN_PIN, GPIO_PIN_SET);5 T8 b9 h9 ^+ ?
  929.   }; v7 F) O! n% t- |7 z

  930. . i0 J. ]5 _& V; s2 M! _; H
  931.   return ret;
    3 z/ }( F4 u% I. n- S8 I3 G
  932. }
    7 h$ _3 B( e) s2 {0 h

  933. 1 q3 E2 D4 X  I# P
  934. /**
    # ~& x4 e. q+ N  M. ^) t' `$ ^
  935.   * @brief  Switch Off the display.: G% S9 y; _$ m. y! s
  936.   * @param  Instance    LCD Instance6 @1 j0 n6 H' u
  937.   * @retval BSP status
    . _$ H/ }: K3 M
  938.   */+ T, M' _4 A( h2 _
  939. int32_t BSP_LCD_DisplayOff(uint32_t Instance)
    ) Y! b9 ^) e7 _" K4 U
  940. {, j: Q1 @9 H2 d% n0 k. `4 Z% P
  941.   int32_t ret = BSP_ERROR_NONE;
    ' T* e3 K# v2 v4 U5 \. `$ f
  942.   GPIO_InitTypeDef gpio_init_structure = {0};7 @" A. u9 S6 G5 T  p, Q9 c8 Q+ b

  943. " x6 ]( Z/ y9 E2 m- T0 b
  944.   if(Instance >= LCD_INSTANCES_NBR)6 J4 C6 ]$ ?/ o7 c; @8 L
  945.   {
      j& D- a+ d0 n5 X) y, ]! y
  946.     ret = BSP_ERROR_WRONG_PARAM;& K4 O2 B4 f" i+ R( b
  947.   }% z- y  E% b$ }) ~) T$ k8 Z
  948.   else
    , N8 G9 u# B+ c$ W( [; c* ^
  949.   {
    5 {$ F3 ^4 g& X
  950.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;
    ( j8 [6 U6 n6 u: T' Q% y" \6 y7 U8 G
  951.     gpio_init_structure.Pull      = GPIO_NOPULL;4 R2 H7 n9 T4 D, u1 x" l, X# L" w" ], _
  952.     gpio_init_structure.Speed     = GPIO_SPEED_FREQ_MEDIUM;, f0 `9 \! S1 c) D. g
  953.     gpio_init_structure.Pin       = LCD_DISP_EN_PIN;
    ( e9 f# O" ~% D5 I" [% F. l4 G
  954.     HAL_GPIO_Init(LCD_DISP_EN_GPIO_PORT, &gpio_init_structure);& S3 @" j$ C% H) l* m$ `

  955. ! P; B- a( ~7 U/ s0 {, T8 J
  956.     HAL_GPIO_WritePin(LCD_DISP_EN_GPIO_PORT,LCD_DISP_EN_PIN, GPIO_PIN_RESET);
    ( `. u6 [0 T' r0 p

  957. ; k# `1 @4 _1 O, d2 C& S: \( V
  958.     __HAL_LTDC_DISABLE(&hlcd_ltdc);) m! B- w/ S5 d4 d0 s4 {+ X: [

  959. & E/ ?# v# R7 f5 \
  960.   }% e) ?! i' u& i, _/ o' K/ t
  961. ' \: q- t' t1 q% Z
  962.   return ret;' a  J: c: `2 _* @3 g( }
  963. }
      w# s; x, |* u' g6 |* s3 \

  964. ! D5 {4 a" x  a0 j5 S/ ~! e2 r5 P& e
  965. /**2 f* h  x- b/ _1 A3 u
  966.   * @brief  Draws a bitmap picture loaded in the internal Flash in currently active layer.
    # P$ g' i- S. q9 }2 j+ z
  967.   * @param  Instance LCD Instance
    ) f$ B" t& T! {1 c+ ?4 f
  968.   * @param  Xpos Bmp X position in the LCD5 L6 W/ p0 \4 l9 W8 \3 H* H7 |" Y
  969.   * @param  Ypos Bmp Y position in the LCD
    3 K+ Z) o- f! i
  970.   * @param  pBmp Pointer to Bmp picture address in the internal Flash.# Q7 s3 ^1 C9 ?4 C( ]
  971.   * @retval BSP status
    1 |* H* V4 S, d+ P
  972.   */
    ) T2 L: f" I3 Z0 C
  973. int32_t BSP_LCD_DrawBitmap(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint8_t *pBmp)
    , N: ~$ z- f' J$ W
  974. {
    ; [/ W* c; [1 N6 a  Q2 O
  975.   int32_t ret = BSP_ERROR_NONE;
    6 |) I5 r2 J# m! g  V
  976.   uint32_t index;
    / {5 D# W) U  I( X
  977.   uint32_t width;
    7 J: ?$ Z9 N" \/ u
  978.   uint32_t height;" {  d/ G2 b6 g2 m: u  D
  979.   uint32_t bit_pixel;
    # A0 l3 K, q$ V& `% I1 M5 p/ q
  980.   uint32_t Address;& J0 [/ |3 @( @$ _
  981.   uint32_t input_color_mode;
    , W: F! f* }$ Q" r
  982.   uint8_t *pbmp;
    / h) [4 `& `# B* c4 [# ~
  983. 6 K2 t7 D4 M& j6 q! X
  984.   /* Get bitmap data address offset */4 N" U% T  g* M9 \
  985.   index = (uint32_t)pBmp[10] + ((uint32_t)pBmp[11] << 8) + ((uint32_t)pBmp[12] << 16)  + ((uint32_t)pBmp[13] << 24);
    3 E4 }) E% C/ \, x& V4 e! u% f

  986. 8 a; _/ V7 p3 z# L: _
  987.   /* Read bitmap width */2 x" e5 g1 P' j( {
  988.   width = (uint32_t)pBmp[18] + ((uint32_t)pBmp[19] << 8) + ((uint32_t)pBmp[20] << 16)  + ((uint32_t)pBmp[21] << 24);( j: }( R# a8 u' f3 p, r! |
  989. ; f" R9 v0 m, B
  990.   /* Read bitmap height */
    5 y* V* [) \: @# ~
  991.   height = (uint32_t)pBmp[22] + ((uint32_t)pBmp[23] << 8) + ((uint32_t)pBmp[24] << 16)  + ((uint32_t)pBmp[25] << 24);
    ! |) x. o" V( |8 J& w

  992. $ N6 U% m- M  j/ N0 \- M% Z
  993.   /* Read bit/pixel */6 n* q- U  W, c# e; X5 P& i) ~
  994.   bit_pixel = (uint32_t)pBmp[28] + ((uint32_t)pBmp[29] << 8);) v9 ^" h1 ]4 G' d
  995. ! \% s) r: U! @$ y# L
  996.   /* Set the address */% n7 S9 Y- ?6 k! _0 \* ~
  997.   Address = hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (((Lcd_Ctx[Instance].XSize*Ypos) + Xpos)*Lcd_Ctx[Instance].BppFactor);  Z4 `3 F4 r. N& S. Z/ G5 t# ~

  998. 3 W3 z2 w' M# v$ k' G
  999.   /* Get the layer pixel format */8 S" z7 M8 b. P# D  v0 e
  1000.   if ((bit_pixel/8U) == 4U)
    1 N$ X' B; a2 a( b! ]
  1001.   {
    5 o4 z1 e& b0 E/ T
  1002.     input_color_mode = DMA2D_INPUT_ARGB8888;* ]) H9 z7 e9 \' J. e! B
  1003.   }/ d8 x5 R2 D9 W+ b
  1004.   else if ((bit_pixel/8U) == 2U)  p* W0 ]/ `  I; ~
  1005.   {" a/ H3 O" e. C2 y; q/ ~# k# L5 z
  1006.     input_color_mode = DMA2D_INPUT_RGB565;% q6 m9 @% j. W) m! F  _
  1007.   }2 g' Z8 w7 O. Q. b. S3 x
  1008.   else3 U' F! L# K) K$ k& V& Z" L
  1009.   {0 s, B0 u3 ~3 R9 c: b
  1010.     input_color_mode = DMA2D_INPUT_RGB888;' v2 \( O  W. C  r! |
  1011.   }" B7 t# D9 F  I

  1012. 0 U! X0 t' X% o: C0 _. m
  1013.   /* Bypass the bitmap header */
    & B3 ~1 y$ O; @2 B+ v) \) }  x
  1014.   pbmp = pBmp + (index + (width * (height - 1U) * (bit_pixel/8U)));
    ! e9 k' G4 N" |) L7 n

  1015. / o  V: t/ w3 D* Z* V- i
  1016.   /* Convert picture to ARGB8888 pixel format */+ C/ I2 Z7 [1 b" V6 d8 {8 j+ E
  1017.   for(index=0; index < height; index++)
    5 S5 |* Q8 ^$ Y" s& M
  1018.   {
    . ?6 c6 O% k( ^. B9 V0 d7 `
  1019.     /* Pixel format conversion */% O4 _' t# S+ w! _# k
  1020.     LL_ConvertLineToRGB(Instance, (uint32_t *)pbmp, (uint32_t *)Address, width, input_color_mode);
    + j; T1 Q/ [- \; x8 g' |, {
  1021. ; s. U! i+ x5 W  _4 c: {; W
  1022.     /* Increment the source and destination buffers */% D. B/ S1 y% j% U: X6 j) A
  1023.     Address+=  (Lcd_Ctx[Instance].XSize * Lcd_Ctx[Instance].BppFactor);. o4 M9 M; Z& D$ l# ~$ }8 X
  1024.     pbmp -= width*(bit_pixel/8U);
      u# r* N& t9 B% Y* q  j
  1025.   }# S1 j: a9 {0 X

  1026. / L! V% K7 q2 z* S) @; |
  1027.   return ret;
    % {7 m: f4 J, I, A- z. n4 q  I
  1028. }
    , |% s( }7 z1 _1 H3 J3 U& k
  1029. ' z: h# M6 {  A5 b( W* R
  1030. /**% z7 [( a% A7 m; b
  1031.   * @brief  Draw a horizontal line on LCD.5 U* c9 t2 v+ y5 b) S
  1032.   * @param  Instance LCD Instance.
    0 \- Y/ r4 u; ]1 b$ w! A$ ?. @
  1033.   * @param  Xpos X position.3 e! |: ]4 B- X: a9 p4 W
  1034.   * @param  Ypos Y position.: k4 E* e  T# l% W- e+ A
  1035.   * @param  pData Pointer to RGB line data
    9 i) Q+ I3 k( u7 V
  1036.   * @param  Width Rectangle width.: a5 u, @6 |8 b
  1037.   * @param  Height Rectangle Height.
    # q6 r8 \! v5 \
  1038.   * @retval BSP status.
    3 j. R/ n' n. E/ z2 ]. B# k  S
  1039.   */. e0 d* K/ J8 F% e
  1040. int32_t BSP_LCD_FillRGBRect(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint8_t *pData, uint32_t Width, uint32_t Height)  X! d" m2 F$ V& g. j
  1041. {: @: L+ N- d* }, m$ m# @
  1042.   uint32_t i;
    / Q9 U- I. s% o: G
  1043.   uint8_t *pdata = pData;6 y* _1 o) o, l. F
  1044. / |% U6 r$ T( ]+ ~3 J
  1045. #if (USE_DMA2D_TO_FILL_RGB_RECT == 1)
    . c/ Z$ k# M9 K, ^- T
  1046.   uint32_t  Xaddress;! S# H( I1 F. b$ k* y6 i
  1047.   for(i = 0; i < Height; i++)+ l) W4 P3 k3 E) a& v7 D
  1048.   {7 I4 L% c" Y7 w/ J
  1049.     /* Get the line address */
    0 B5 T3 |0 n$ P4 n. s
  1050.     Xaddress = hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*(Ypos + i)) + Xpos));
    & K5 J% C+ c+ p7 x

  1051. ) r9 I, K" [# E1 ]/ o! [
  1052. #if (USE_BSP_CPU_CACHE_MAINTENANCE == 1)
    1 }" m+ f1 M& P( z  t6 b) g
  1053.     SCB_CleanDCache_by_Addr((uint32_t *)pdata, Lcd_Ctx[Instance].BppFactor*Lcd_Ctx[Instance].XSize);9 n& h+ u( v( H' s3 {- E" q9 t) P
  1054. #endif /* USE_BSP_CPU_CACHE_MAINTENANCE */
    : o7 e  f- E( o7 q2 l  v

  1055. 9 z, P+ T3 O9 G2 c0 _) _& }3 G& ?8 s
  1056.     /* Write line */
    ' U9 P3 T. b8 o! H( Y
  1057.     if(Lcd_Ctx[Instance].PixelFormat == LCD_PIXEL_FORMAT_RGB565): q" ^( k/ n; @+ S+ S) j9 a3 f3 I9 \
  1058.     {2 X. ?9 g$ B& t/ q, X9 t( S
  1059.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_RGB565);7 l+ D) i1 o7 Y0 W  A9 t$ O6 S) T
  1060.     }
    6 Y! _) y, w9 R" P& T
  1061.     else if(Lcd_Ctx[Instance].PixelFormat == LCD_PIXEL_FORMAT_ARGB4444)
    * @9 F- @. ^# p
  1062.     {
    ( [: [, l& z9 F8 F- f
  1063.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_ARGB4444);
    4 V; i9 Q8 u& N3 m( z
  1064.     }
    : R* c+ \' w# Z% L- X  m* u3 I
  1065.     else if(Lcd_Ctx[Instance].PixelFormat == LCD_PIXEL_FORMAT_RGB888)
    . a4 D+ b0 V% n; Y0 \' t7 L$ m3 X
  1066.     {, {- ^! B  d, h+ u, |5 l6 {1 E
  1067.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_RGB888);
    ! v8 C# Z' C: {$ |0 o5 m& k  z
  1068.     }
    $ k) [' ?: q  f7 K
  1069.     else
    " J3 f( X3 g, s" k
  1070.     {; V8 }; {) k7 O
  1071.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_ARGB8888);4 P4 I* i: n2 a+ w* y$ i
  1072.     }6 j8 Y& M- v+ g$ U4 g% w$ D* U
  1073.     pdata += Lcd_Ctx[Instance].BppFactor*Width;
    ! R1 a) u1 K$ t& m. S
  1074.   }& b5 _+ l- Q+ F: K, P! ~: }
  1075. #else; E% M! Q3 Y8 q7 |: k
  1076.   uint32_t color;
    . s' \) j1 U* g& i
  1077.   uint32_t j;$ V4 S0 n  r5 P7 J
  1078.   for(i = 0; i < Height; i++); O& I' Z+ I6 W6 G& Y2 t* x8 N
  1079.   {- A' ~" b* Y1 S& H2 K
  1080.     for(j = 0; j < Width; j++)7 J( n; @% s) @
  1081.     {
    , t- z! p7 @4 U- c
  1082.       color = (uint32_t)((uint32_t)*pdata | ((uint32_t)(*(pdata + 1U)) << 8U) | ((uint32_t)(*(pdata + 2U)) << 16U) | ((uint32_t)(*(pdata + 3U)) << 24U));9 f  Z7 S7 P7 x: T5 c* h- }
  1083.       (void)BSP_LCD_WritePixel(Instance, Xpos + j, Ypos + i, color);" c6 S9 d: r3 A: z! R3 R. z. c* l
  1084.       pdata += Lcd_Ctx[Instance].BppFactor;
    4 v6 R+ i5 q: a# R; y# |8 D
  1085.     }
    $ `2 X6 L( }3 L, N
  1086.   }
    ( F7 ]' B2 t9 b1 C
  1087. #endif /* (USE_DMA2D_TO_FILL_RGB_RECT == 1) */+ _+ u3 U! j3 h& i' N+ @

  1088. 1 S% T  {5 r/ `$ w: V* G
  1089.   return BSP_ERROR_NONE;
    6 e7 a$ ^- u$ w- ?: s: b
  1090. }$ K; ~9 [: U7 N% y% K

  1091. 1 s& Y: i! N- P) M! S7 a. n
  1092. /**: h0 h2 t# O; U( M5 `5 H2 q
  1093.   * @brief  Draws an horizontal line in currently active layer.; a3 H" J) R+ X7 Y: H) q
  1094.   * @param  Instance   LCD Instance
    , c6 l+ @  ~' R. v) p2 ?1 n4 y
  1095.   * @param  Xpos  X position# g9 y; `6 R! M$ d& G% P3 L
  1096.   * @param  Ypos  Y position
    $ Q7 B* u0 p" ~3 v# i; \. r; o
  1097.   * @param  Length  Line length% R# _- k  @4 X5 F; ~
  1098.   * @param  Color RGB color
    $ z/ o3 o* B* `9 N8 ^+ y) F$ B& T3 F
  1099.   * @retval BSP status
    / J- p6 ^& U) `
  1100.   */) ^  m: n' R! s; m& ]1 U
  1101. int32_t BSP_LCD_DrawHLine(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Length, uint32_t Color)
    0 Z2 q1 U! j# o. j, `1 T
  1102. {
    6 c6 Y4 y6 N+ S
  1103.   uint32_t  Xaddress;
    ( E' b8 D+ ^: b6 f5 p) Z
  1104. * X2 ]' @! V, i2 X- V& M
  1105.   /* Get the line address */  d  H# |2 m. {. I
  1106.   Xaddress = hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*Ypos) + Xpos));% L" `; m% c' n& f# C

  1107. + Z3 z  v( H9 a& q% u
  1108.   /* Write line */" P. `( S0 {- r. v) a5 O/ m
  1109.   LL_FillBuffer(Instance, (uint32_t *)Xaddress, Length, 1, 0, Color);; z( ~7 h5 D1 Q+ o

  1110. ; z4 i" j$ C7 `  Q
  1111.   return BSP_ERROR_NONE;
    $ j$ J7 y7 R+ o, [
  1112. }; F; N. l# n3 D8 i3 b& ?1 v& v: |
  1113.   c0 D1 D9 E$ T
  1114. /**6 F) m2 Q; |: X* P
  1115.   * @brief  Draws a vertical line in currently active layer." k! n2 x( f0 f: t8 I$ _
  1116.   * @param  Instance   LCD Instance
    4 g  f5 b  f  b/ M3 I9 j2 }/ Z6 m& o
  1117.   * @param  Xpos  X position  g7 l5 Z* E& B+ A
  1118.   * @param  Ypos  Y position9 J$ h$ N2 G* q* K- k8 C
  1119.   * @param  Length  Line length
    * [9 s1 O# P5 F7 k. J5 Z
  1120.   * @param  Color RGB color3 \1 M6 c/ S: T" R9 u+ ?
  1121.   * @retval BSP status0 N/ v5 S/ @/ l" p5 f3 G
  1122.   */
    6 b& W+ L% J/ T
  1123. int32_t BSP_LCD_DrawVLine(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Length, uint32_t Color)4 l$ T$ R8 \' \, Z
  1124. {
    # ?/ U' _: U" x  O4 e# W9 y2 N
  1125.   uint32_t  Xaddress;& j! z: W  h1 m  ^
  1126. 3 w! ?) n. b: _; V; f
  1127.   /* Get the line address */, u' d; S" B% T+ O' n$ X  o( H& [" y
  1128.   Xaddress = (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress) + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*Ypos) + Xpos));. }- Q$ n) l9 C, U' w

  1129. ' z- C, Y' Q' ~4 u2 Q
  1130.   /* Write line */$ V! D" w* ]$ b# K4 D
  1131.   LL_FillBuffer(Instance, (uint32_t *)Xaddress, 1, Length, (Lcd_Ctx[Instance].XSize - 1U), Color);. U% q2 `% d, L

  1132. 5 _7 ^8 {& ^  w7 ]& v: Z
  1133.   return BSP_ERROR_NONE;
    . r* f: C8 E( J& I' }
  1134. }7 A, g5 S# E' C' [
  1135. ) z" L. C. q( M6 A1 I3 o7 z  n; i' f
  1136. /**# C+ W% g4 y; X
  1137.   * @brief  Draws a full rectangle in currently active layer.* q) v% O  a" _, S4 B
  1138.   * @param  Instance   LCD Instance
    & [4 L* E4 Z. `" W# h. w& a: i
  1139.   * @param  Xpos X position
    + j" O% ^7 O- S) f# D, U
  1140.   * @param  Ypos Y position
    4 J$ e/ I+ O3 U
  1141.   * @param  Width Rectangle width* m3 J3 P& B) R  |5 m
  1142.   * @param  Height Rectangle height
    : o  R* i3 t. I) k8 B8 u$ P0 H
  1143.   * @param  Color RGB color
    $ `( o8 Y& y/ \) {3 n3 o
  1144.   * @retval BSP status" n3 r2 Z3 e7 O, w9 Q9 m
  1145.   */
    2 M* i+ y1 P6 L5 C* }: Q
  1146. int32_t BSP_LCD_FillRect(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Width, uint32_t Height, uint32_t Color)/ s/ g1 Y- x4 S8 n
  1147. {
    . |2 A1 ?$ l, ]; H
  1148.   uint32_t  Xaddress;6 P+ M- M( B' i) g, C

  1149. . |+ \- P* R0 |  @% Z
  1150.   /* Get the rectangle start address */
    2 }4 Z; Q1 f3 p( z: @
  1151.   Xaddress = (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress) + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*Ypos) + Xpos));* {7 s0 P0 A: {
  1152. : t# Q7 V. L: {' i. Q8 x0 E2 H  E( x
  1153.   /* Fill the rectangle */
    ( e* C5 b4 C( ]3 Y: Q
  1154.   LL_FillBuffer(Instance, (uint32_t *)Xaddress, Width, Height, (Lcd_Ctx[Instance].XSize - Width), Color);
    ) w8 B$ q) q3 }3 w, S
  1155. 5 w$ ?( B" e) K- @" b4 r
  1156.   return BSP_ERROR_NONE;
    0 a) v$ D4 |9 F% K: F5 V1 ^
  1157. }
    $ T2 b2 F+ g  V7 n2 c
  1158. . ]- S9 n. H* b: t( a
  1159. /**
    " e. z: `5 ~' q- F$ M
  1160.   * @brief  Reads a LCD pixel./ y1 [0 G) r9 _9 L% P) B8 w9 X0 \, L- h
  1161.   * @param  Instance    LCD Instance
    / D9 G% q9 F9 {! o9 E1 U/ T6 G
  1162.   * @param  Xpos X position5 D4 J7 J5 `. }8 ]
  1163.   * @param  Ypos Y position, f. E5 Y3 c6 r
  1164.   * @param  Color RGB pixel color: @% Q2 W% T- \8 R4 T; f3 ]
  1165.   * @retval BSP status3 _- t- m, ^: K
  1166.   */
    $ |$ _: S: a0 R8 J
  1167. int32_t BSP_LCD_ReadPixel(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t *Color)
    : U0 y  r. z+ c
  1168. {% J& M9 U6 z1 x$ C4 K" s* F
  1169.   if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888)
    + Z; ]# e3 z7 Q0 \% H
  1170.   {
    % _' Y/ O* s% e0 w8 I
  1171.     /* Read data value from RAM memory */
    - Z1 \: E  f  U: ~
  1172.     *Color = *(__IO uint32_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (4U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos)));$ \( y, _% L4 h. l; y9 v$ n
  1173.   }
    # c* Q+ ?2 `$ g1 h
  1174.   else if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB888)
      @  f# E7 w. `8 o, B
  1175.   {
    + T$ H- B5 f6 M9 C- d  f1 h
  1176.     /* Read data value from RAM memory */
    - k0 j. {0 C2 Q* F
  1177.     *Color = *(__IO uint32_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos)));
      s+ |4 J9 l# D7 R/ ^1 S/ g$ W
  1178.     *Color = CONVERTARGB88882RGB888(*Color);
    8 r" t& C+ ^/ N* ]2 M, r! J0 Z" @/ ?! {, v
  1179.   }
    / Z/ p$ |& r5 E) g* @
  1180.   else /* if((hlcd_ltdc.LayerCfg[layer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565) */, S# I5 O7 U5 j+ ~
  1181.   {- B2 @* J- v6 I  R6 ^2 m# W
  1182.     /* Read data value from RAM memory */
    ; i- C3 U0 Y$ R& y
  1183.     *Color = *(__IO uint16_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (2U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos)));
    9 A2 I: z) u) I- E+ q4 A8 j
  1184.   }6 ^7 U# v' n: c5 t6 b! b
  1185. , s# A+ }% F3 w! p- @: _
  1186.   return BSP_ERROR_NONE;
    & p, d2 m  S0 w" E! X1 U
  1187. }
    # W5 e1 y. i: O% m

  1188. 1 Y. @9 g: h# Y. l% X# a" u
  1189. /**" c* r9 j, K7 n' B2 `
  1190.   * @brief  Draws a pixel on LCD.* m9 ~7 s+ _3 g
  1191.   * @param  Instance    LCD Instance& x0 J+ L3 h, k: r7 d) F
  1192.   * @param  Xpos X position
    , Y. g% [1 s2 `5 p3 D( D
  1193.   * @param  Ypos Y position
    , X# a* x  T9 o% Y0 s7 ^
  1194.   * @param  Color Pixel color2 w- b; [) P3 T- }8 C4 U# e
  1195.   * @retval BSP status
    4 m* `6 ]2 S9 C# K& n
  1196.   */: |8 J  K; J8 L0 s" E. V1 W4 @
  1197. int32_t BSP_LCD_WritePixel(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Color)/ w$ h7 O0 x, Q5 ]
  1198. {
    + x5 c1 O0 U9 |9 j
  1199.   if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888)
    & G6 e: {$ O( C8 q/ d
  1200.   {! H9 D! q9 J5 u" I5 O5 l
  1201.     /* Write data value to RAM memory */
    7 R" `) m! D( T' I
  1202.     *(__IO uint32_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (4U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))) = Color;# ^# E$ M& o" D1 [0 Y. T1 W
  1203.   }3 i& N  m8 C! L" m6 b% f
  1204.   else if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB888)
    7 s' n  q; f/ a0 x4 d
  1205.   {
    3 L5 W5 i* ~0 E
  1206.     /* Write data value to RAM memory */
    % U9 p& z( T. j  R0 X# i# U# F
  1207.     *(__IO uint8_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + ((3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))-3U)) = (uint8_t) (Color);
    . m* w; [$ V" o3 V0 \' ~
  1208.     *(__IO uint8_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + ((3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))-2U)) = (uint8_t) (Color>>8U);/ ]& [$ t4 y/ Q5 x, 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);' M- o/ i8 c" l& |
  1210.   }0 a) O; a, }7 ^, X1 Z
  1211.   else, r4 q$ S5 {/ t8 Q
  1212.   {
    + [% u( M. h6 I; W2 O3 ]; u: I" y2 R
  1213.     /* Write data value to RAM memory */
    ; h6 _. [3 T" }+ j" `* ^  \% H
  1214.     *(__IO uint16_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (2U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))) = (uint16_t)Color;
    1 e+ Q- K" o, B: J3 ?1 l# \. u
  1215.   }
    9 @6 B* S2 c& B# T( h
  1216. / M5 T! t  f" F3 B* A& O: O. z
  1217.   return BSP_ERROR_NONE;; }- b8 A. x' v5 p
  1218. }
    3 K- ]9 [/ l) Z% K: O$ L7 }# Z8 u
  1219. # L  c6 u: }7 f7 P2 B( q
  1220. /**
    & c+ v" s& w$ S: I! }+ |7 l( |( f
  1221.   * @}# R8 V$ O# Y! P- L
  1222.   */+ w* N9 C2 M" `+ M* e9 O- O" g

  1223. : J& T0 R" r/ F$ n3 n' J8 ?* T
  1224. /** @defgroup STM32N6570_DK_LCD_Private_Functions LCD Private Functions  D3 A* {. `: ^* k; ~9 ?) S
  1225.   * @{
    % S# m# E0 s, d& t, f7 z( [; l
  1226.   */
    3 f* E7 f! O/ p' l6 ?/ [
  1227. /**2 E/ E, [5 w  L  z8 U
  1228.   * @brief  Fills a buffer.
    2 b1 J- Q( U; \4 y. e# r* D
  1229.   * @param  Instance LCD Instance
    0 B8 p1 y4 _* {+ T3 M" h3 H, N
  1230.   * @param  pDst Pointer to destination buffer$ Q* O- {5 u* ^& f9 s
  1231.   * @param  xSize Buffer width
    9 a3 S& k) H$ Q
  1232.   * @param  ySize Buffer height# Y+ ]9 [4 h; O9 k! T2 [: q( e
  1233.   * @param  OffLine Offset0 n* J: [7 T; A# Z5 ]
  1234.   * @param  Color RGB color
    4 O/ c) a! r# r( ?
  1235.   */
    % f" p/ w; J) M
  1236. static void LL_FillBuffer(uint32_t Instance, uint32_t *pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t Color)
    ! b0 U# Q2 ?1 A7 {( s5 q4 Y3 g
  1237. {
    2 D) X' m, ~& G$ i
  1238.   uint32_t output_color_mode;
    ' K# R0 C# ?0 `
  1239.   uint32_t input_color = Color;
      @: r% C- K% o% [) O$ t% b
  1240. 9 [+ n) }0 S) {+ _8 ?
  1241.   switch(Lcd_Ctx[Instance].PixelFormat); ^9 f* m: E1 z. V8 l
  1242.   {* r: }1 I) u; Y6 e' [
  1243.   case LCD_PIXEL_FORMAT_RGB565:
    8 ^$ @7 [3 W  W$ x
  1244.     output_color_mode = DMA2D_OUTPUT_RGB565; /* RGB565 */
    : ~- x6 w2 L7 [  N" t, l9 G: l% F
  1245.     input_color = CONVERTRGB5652ARGB8888(Color);& Y6 `7 k3 \( I5 w# H
  1246.     break;
    4 K! b# D6 m3 w! W! S( f6 z
  1247.   case LCD_PIXEL_FORMAT_ARGB4444:
    3 Z/ n* V/ u3 l9 Y9 g' m
  1248.     output_color_mode = DMA2D_OUTPUT_ARGB4444; /* ARGB4444 */" G% c9 r  X5 d! r
  1249.     input_color = CONVERTARGB44442ARGB8888(Color);* ]2 T; M* d# E. P$ S7 Q/ w& x$ C
  1250.     break;& ^- z* D" F& I
  1251.   case LCD_PIXEL_FORMAT_RGB888:
    # R- [/ ^3 B7 e2 l7 o
  1252.     output_color_mode = DMA2D_OUTPUT_RGB888; /* RGB888 */0 u: f, s+ ~4 D5 s* o
  1253.     input_color = CONVERTRGB8882ARGB8888(Color);+ V/ p7 ~, l  V0 r0 `
  1254.     break;
    / [) Y9 p. [" @2 N& V( [
  1255.   default:& T1 Q0 G8 e( v# Y+ C, t; T
  1256.     output_color_mode = DMA2D_OUTPUT_ARGB8888; /* ARGB8888 */9 o3 s( ^+ N6 Q# d+ b
  1257.     break;" T7 e* U, m  r% r5 v& I
  1258.   }
    & E* m2 r1 l9 k' \
  1259. % z7 \& G2 M, X+ h" M: j
  1260.   /* Register to memory mode with ARGB8888 as color Mode */0 U2 i# p3 h/ I, G) C# F
  1261.   hlcd_dma2d.Init.Mode         = DMA2D_R2M;5 w1 A/ l! o/ U. v5 i& T5 w9 v
  1262.   hlcd_dma2d.Init.ColorMode    = output_color_mode;( J7 b7 Q8 C2 O3 w3 @8 a
  1263.   hlcd_dma2d.Init.OutputOffset = OffLine;
    4 i' E; a6 ]2 }
  1264. 5 o8 u$ T) h9 v& m9 N* A1 v+ Q1 Y
  1265.   hlcd_dma2d.Instance = DMA2D;
    , g8 P1 b* H" D6 i, e  ~

  1266. " Q& n! H: v, y" R0 b! v
  1267.   /* DMA2D Initialization */2 X2 V0 u- n+ R9 @+ r, o
  1268.   if(HAL_DMA2D_Init(&hlcd_dma2d) == HAL_OK)1 A% m  ^8 G3 y8 k" f6 F4 k; u
  1269.   {7 d9 e; M% b" o
  1270.     if (HAL_DMA2D_Start(&hlcd_dma2d, input_color, (uint32_t)pDst, xSize, ySize) == HAL_OK)1 K0 J/ r" a$ ]: b1 p
  1271.     {8 M. q4 {' S3 a) F0 C% @7 [1 P
  1272.       /* Polling For DMA transfer */
    2 z3 d# R. O8 Z* G) U2 I" e4 [1 F  Q
  1273.       (void)HAL_DMA2D_PollForTransfer(&hlcd_dma2d, 50);' [  v6 X# W& a8 Z- b/ x
  1274.     }
    ; t$ U7 Y  N) f8 L, ]% s5 }! b
  1275.   }* k1 T8 B6 J3 W" f
  1276. }
    / l' q( c6 D$ |1 @

  1277. # I) O6 J! v! ^' D& T1 {. G
  1278. /**% W8 r$ u8 O! G, J* I/ z
  1279.   * @brief  Converts a line to an RGB pixel format.* s/ E% l; g+ l" g, u, H
  1280.   * @param  Instance LCD Instance
    2 f4 T5 H3 |& q3 P2 |; o
  1281.   * @param  pSrc Pointer to source buffer
    , Q; G; M; a$ [) F( J9 `, |- ?4 R
  1282.   * @param  pDst Output color- v( s" b) ~' I
  1283.   * @param  xSize Buffer width+ X1 W$ ?! s9 x/ v" \. w
  1284.   * @param  ColorMode Input color mode! W; V8 v: V7 e  v/ m
  1285.   */
    : X8 k* J9 x( t
  1286. static void LL_ConvertLineToRGB(uint32_t Instance, uint32_t *pSrc, uint32_t *pDst, uint32_t xSize, uint32_t ColorMode)
    : `, \* R, u2 ]8 t6 J! T3 b
  1287. {
    # G5 @" R- O! L# l0 Z
  1288.   uint32_t output_color_mode;+ f% V, k! s$ W) a* P6 E+ I1 G" _
  1289. " G/ \- u3 x4 ?; u/ r
  1290.   switch(Lcd_Ctx[Instance].PixelFormat)6 y1 S$ V( d. D
  1291.   {
    / z1 Z* r& E- Y/ G
  1292.   case LCD_PIXEL_FORMAT_RGB565:
    1 B( P: U8 ^4 [% ?2 U' M( O  e
  1293.     output_color_mode = DMA2D_OUTPUT_RGB565; /* RGB565 */
    3 d: N7 f# n* y+ M
  1294.     break;+ s- u( u1 v* C! r9 C- Q
  1295.   case LCD_PIXEL_FORMAT_ARGB4444:
    6 f8 K/ m" A! g) I% ~) k  ~+ `
  1296.     output_color_mode = DMA2D_OUTPUT_ARGB4444; /* ARGB4444 */7 r/ c. G6 w( k/ n/ w+ y
  1297.     break;% z, ]3 n. U. E$ ?9 g6 `& V3 K
  1298.   case LCD_PIXEL_FORMAT_RGB888:, u/ k% B# w" }  G+ R- z( Q
  1299.     output_color_mode = DMA2D_OUTPUT_RGB888; /* RGB888 */
    * J. C" k+ W5 T- [4 ~! J' x
  1300.     break;
    % l* T5 z* t+ \
  1301.   default:5 W  K# k6 ^% o+ M1 ~* i& N
  1302.     output_color_mode = DMA2D_OUTPUT_ARGB8888; /* ARGB8888 */; H3 z* l$ a! }& ?  b
  1303.     break;& W( M. n3 i! \5 F# t
  1304.   }
    & V+ D# h: w( ]* b- l
  1305. ) R$ d6 h# V2 j3 o% N: k& w' }3 j
  1306.   /* Configure the DMA2D Mode, Color Mode and output offset */
    3 Q( w7 Y1 _4 J* h. J  T& z
  1307.   hlcd_dma2d.Init.Mode         = DMA2D_M2M_PFC;
    4 F7 @5 {) U9 ?$ [1 b
  1308.   hlcd_dma2d.Init.ColorMode    = output_color_mode;  U& r9 z, @. x& A1 h( C
  1309.   hlcd_dma2d.Init.OutputOffset = 0;
    # R8 J2 M3 o% N7 S
  1310. 5 _0 e9 U, B$ Q2 H8 S8 b, E/ p: M
  1311.   /* Foreground Configuration */
    8 v1 t) e+ E; X
  1312.   hlcd_dma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;+ B- }$ x1 [  j. |1 f! q
  1313.   hlcd_dma2d.LayerCfg[1].InputAlpha = 0xFF;
    " j' d% K' [- T5 f2 H) B5 c
  1314.   hlcd_dma2d.LayerCfg[1].InputColorMode = ColorMode;
    - C0 p/ F, ?' \# c
  1315.   hlcd_dma2d.LayerCfg[1].InputOffset = 0;
    2 P, c' F* P" n2 K
  1316. 3 z9 a9 k8 A( E( p% @
  1317.   hlcd_dma2d.Instance = DMA2D;4 ?1 {2 [9 e6 u' w8 C; ^

  1318. ) M" t/ e5 _. s' U% H) Y& F1 Z
  1319.   /* DMA2D Initialization */
    / ^+ E; `0 N. Z5 ^' @
  1320.   if(HAL_DMA2D_Init(&hlcd_dma2d) == HAL_OK)
    " K/ Y8 U7 |' k6 I' u$ {9 S
  1321.   {
    , g2 w+ j' j9 V. `4 F1 I* k3 U
  1322.     if(HAL_DMA2D_ConfigLayer(&hlcd_dma2d, 1) == HAL_OK)
    - t& L/ G9 f. k) Q3 O; \  k+ H
  1323.     {
    4 P  Q* a% T7 E" p" A. T
  1324.       if (HAL_DMA2D_Start(&hlcd_dma2d, (uint32_t)pSrc, (uint32_t)pDst, xSize, 1) == HAL_OK)
    ) i7 h! {# \1 _- D2 K% C" o1 [+ @
  1325.       {6 ?* o( p% {0 v, s2 u+ j- z
  1326.         /* Polling For DMA transfer */
    ( I/ k: s* H& w' r1 m
  1327.         (void)HAL_DMA2D_PollForTransfer(&hlcd_dma2d, 50);
    ; e7 ], ?0 u9 I2 ]5 _
  1328.       }" T' K. X( M- F
  1329.     }
    : s% E1 C+ Z" `' |4 E9 k
  1330.   }. l9 C! a  Z$ ]6 n
  1331. }
    ) k# Y0 y1 h8 [$ D  I! V9 m5 S7 V
  1332. 0 I. E9 }! O* X% B% s' c
  1333. /**
    ! S; i. r% J% e+ ^( U
  1334.   * @brief  Initialize the BSP LTDC Msp.
    $ G/ s: @" w4 G2 O' D9 g
  1335.   * @param  hltdc  LTDC handle- g2 M& u: s$ h( W, M
  1336.   * @retval None
    ( K, D/ }4 t- A( M
  1337.   */3 |9 B" C- Q$ y0 p) b. \, l. Y
  1338. static void LTDC_MspInit(LTDC_HandleTypeDef *hltdc)
    6 h' k) R$ |$ b/ W/ l; ~' L0 y
  1339. {
    - v  M/ _8 s5 r8 }3 W" A
  1340.   GPIO_InitTypeDef  gpio_init_structure = {0};) {, I3 d/ n% W4 A) j, `

  1341. 7 c- f! J: ^0 i$ U$ \: E$ m! ~
  1342.   if (hltdc->Instance == LTDC)
    . W1 d& m& q5 f" A! K& |
  1343.   {
    5 R! g  ^& f# n2 v( Y' q) C# d$ Q# O
  1344.     __HAL_RCC_LTDC_CLK_ENABLE();  A7 n1 R  h# f6 z8 O4 s! G
  1345. : Y; X6 W, E" @
  1346.     __HAL_RCC_LTDC_FORCE_RESET();$ o3 |% ?: F; J4 J
  1347.     __HAL_RCC_LTDC_RELEASE_RESET();
    4 Q! x/ x  e& c2 u# u3 S' |( ^

  1348. ' C2 ^/ D" }* i3 v5 I
  1349.     /* STM32N6570-DK MB1860A RK050HR18 */' M0 a; a6 c& z; ?' {' ]' L7 P! T- u
  1350.     /* PG0  R0          */) A: _- h7 `0 ^$ y9 c6 I; N
  1351.     /* PD9  R1          */
    " Q0 p5 t. K. h& _4 D
  1352.     /* PD15 R2          */8 E) s5 W5 d: Q5 o# |0 d2 Q
  1353.     /* PB4  R3          */ // JTAG3 \. @0 G8 d5 `9 ]9 o
  1354.     /* PH4  R4          */( Q$ h- @! B# u
  1355.     /* PA15 R5          */ // JTAG JTDI1 Z* f5 i* t7 p3 j7 Q9 R
  1356.     /* PG11 R6          */
    + F2 U0 g# g& H4 g
  1357.     /* PD8  R7          */
    5 I" |$ f' M/ S) g
  1358.     /* PG12 G0          */# w5 e0 K! O3 |5 Z0 ?
  1359.     /* PG1  G1          */, n# n' H+ X$ ~9 B- a  G* C6 \
  1360.     /* PA1  G2          */+ q6 \5 H" E7 `! y/ ]
  1361.     /* PA0  G3          */2 g# m9 ?9 _$ I$ H2 J- Q9 l
  1362.     /* PB15 G4          */
    % p3 q$ `0 b8 c* V2 c" Q0 Z
  1363.     /* PB12 G5          */
    % S9 T7 ?2 J- U8 J4 I) l* w7 M
  1364.     /* PB11 G6          */3 j( V2 n% R# Q+ s  K4 D+ I
  1365.     /* PG8  G7          */
      ]' o% s4 w6 J
  1366.     /* P15  B0          */2 |1 s. \; Q3 x
  1367.     /* PA7  B1          */  e* S5 c# u* U8 m: ^
  1368.     /* PB2  B2          */+ k# l; }! J+ `" P% W( R' ?
  1369.     /* PG6  B3          */
    & o% Y; O4 l& F; @- e
  1370.     /* PH3  B4          */. t3 q1 i/ [/ f! R" t& Y1 _/ C
  1371.     /* PH6  B5          */; @: u0 l/ x# n' L! Q
  1372.     /* PA8  B6          */0 A) \7 m8 O0 E1 a7 N
  1373.     /* PA2  B7          */8 S7 ]  k" Y; [; b5 w/ P/ \
  1374.     /*                  */
    & c) h- L" J% r* T* Z- {6 {" x
  1375.     /* PG13 LCD_DE      */- m% N* o) I3 ?) b) f8 a
  1376.     /* PQ3  LCD_ONOFF   */2 z! v4 y. F- J, \4 U9 _
  1377.     /* PB14 LCD_HSYNC   */
    ; A0 h0 F% p4 M/ g' B* y# B
  1378.     /* PE11 PCD_VSYNC   */
    2 h, ], b9 M6 C; w( r4 i0 q0 x& a
  1379.     /* PB13 LCD_CLK     */
    9 A' i! i  j( a  d
  1380.     /* PQ4  LCD_INT     */1 h# ]( ~) `2 i- N6 B4 [4 L
  1381.     /* PQ6  LCD_BL_CTRL */
    3 X. G) M# }9 y, P' I$ _+ u
  1382.     /* PE1  NRST        */% R9 D  _. B9 J% \; |# d

  1383. * T! e/ V3 H- v* t
  1384.     __HAL_RCC_GPIOA_CLK_ENABLE();
    1 T1 ]  Z/ B5 @% I& V3 a
  1385.     __HAL_RCC_GPIOB_CLK_ENABLE();; Y3 ~2 U2 H5 {7 ^, C8 t- |
  1386.     __HAL_RCC_GPIOD_CLK_ENABLE();
    1 l& p3 p& K& z7 h, l
  1387.     __HAL_RCC_GPIOE_CLK_ENABLE();
    5 V0 t5 K$ i: `% _* t* a" o6 S
  1388.     __HAL_RCC_GPIOG_CLK_ENABLE();2 C. R* T1 M) K/ N6 M) u6 x) A
  1389.     __HAL_RCC_GPIOH_CLK_ENABLE();# I4 @( h0 y; _
  1390.     __HAL_RCC_GPIOQ_CLK_ENABLE();1 n2 N1 I  B1 D. Y0 n& u

  1391. / @, ^" r+ Y3 M% y6 X
  1392.     gpio_init_structure.Mode      = GPIO_MODE_AF_PP;
    ) `% H' Q+ [- e1 u3 O- H
  1393.     gpio_init_structure.Pull      = GPIO_NOPULL;9 U: Z& K3 ^; Z9 D, ]8 h8 ~: A
  1394.     gpio_init_structure.Speed     = GPIO_SPEED_FREQ_HIGH;9 S# p2 i4 c3 F  r2 a0 g+ H
  1395. ' m, y2 v* o: K( E/ Y1 D4 ~' b
  1396.     /* G3, G2, B7, B1, B6, R5 */
    # s- i$ i' ?) s, K2 H9 M
  1397.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_15;
    : }) Y  E& }; o
  1398.     gpio_init_structure.Alternate = GPIO_AF14_LCD;
    3 r& l- f$ G5 b- T* ~5 r/ W
  1399.     HAL_GPIO_Init(GPIOA, &gpio_init_structure);; u- G8 u8 |1 d7 g4 V0 t$ r& m" K
  1400. 6 o" P1 v7 N" j8 g1 m! ]
  1401.     /* LCD_CLK, LCD_HSYNC B2, R3, G6, G5, G4 */
    $ x0 \+ r: x' M; \; r$ P
  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;; ~: T# s. R  I9 q9 y
  1403.     gpio_init_structure.Alternate = GPIO_AF14_LCD;+ H; I: |" T# i/ u, f: p# n
  1404.     HAL_GPIO_Init(GPIOB, &gpio_init_structure);; K& ]0 ?' j' C
  1405. 0 t/ H: n6 u) L7 R
  1406.     /* R7, R1, R2 */
    1 J1 z7 G3 G& `
  1407.     gpio_init_structure.Pin       = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_15;% Q' ?0 l' v" ^' s
  1408.     gpio_init_structure.Alternate = GPIO_AF14_LCD;& n; z' j$ H0 Z4 M6 |& f) f8 `
  1409.     HAL_GPIO_Init(GPIOD, &gpio_init_structure);
    # y6 F0 X$ z! E- M$ W, U
  1410. " C0 ]2 @1 v8 @" r- [
  1411.     /* LCD_VSYNC */
    9 r3 |: J- n3 `3 i! Q# R; a0 T
  1412.     gpio_init_structure.Pin       = GPIO_PIN_11;; t# E7 v) T- v+ o
  1413.     gpio_init_structure.Alternate = GPIO_AF14_LCD;- W) O& d( g9 Q$ E" @" t# J  r! B# A0 O
  1414.     HAL_GPIO_Init(GPIOE, &gpio_init_structure);) U/ h1 _9 S8 O& l, J; j

  1415. , R( Z, Y% g9 H( g5 f
  1416.     /* R0, G1, B3, G7, R6, G0 */% p+ f7 C# }) ?, H  j8 I) G
  1417.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_6 | GPIO_PIN_8 | GPIO_PIN_11 | GPIO_PIN_12 ;$ r: k, v; Y" @& W
  1418.     gpio_init_structure.Alternate = GPIO_AF14_LCD;/ F5 ~! F/ \' C+ n
  1419.     HAL_GPIO_Init(GPIOG, &gpio_init_structure);1 c( _7 n# R, z; O; r. m
  1420. * ?  Q5 E$ @# M0 c* h" \
  1421.     /* B4, R4, B5 */, w% D) _  y  U2 c4 d
  1422.     gpio_init_structure.Pin       = GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_6;/ \  r) _8 i5 r6 E5 _! E; P5 X, X
  1423.     gpio_init_structure.Alternate = GPIO_AF14_LCD;3 H' g$ T; K, R3 v& v( u
  1424.     HAL_GPIO_Init(GPIOH, &gpio_init_structure);
    3 \) \6 t; \, d3 Q2 o* u

  1425. 8 z% w5 E6 {6 R' j# ?! F5 ]4 R
  1426.     /* NRST */
    5 }& H" }* Y7 y) ^
  1427.     gpio_init_structure.Pin       = GPIO_PIN_1;
    8 a% ^/ v. Q$ R1 U
  1428.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;9 L9 _3 w4 K! b+ l0 f" o$ @
  1429.     HAL_GPIO_Init(GPIOE, &gpio_init_structure);& s0 ~2 z/ E2 p
  1430. , ^7 V0 G) |! i1 d/ M8 d
  1431.     /* LCD_ONOFF, LCD_BL_CTRL */
    ( t* U6 G, I. O! |# K! |, i0 l
  1432.     gpio_init_structure.Pin       = GPIO_PIN_3 | GPIO_PIN_6;  x8 H2 l) l) E4 }. O
  1433.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;9 G/ u: a) f$ X. V
  1434.     HAL_GPIO_Init(GPIOQ, &gpio_init_structure);3 `7 \$ h+ L7 V; Z# _
  1435. ) E& J- m: y7 Y. ?& K# B2 E
  1436.     /* LCD_DE */2 q) f8 c: l0 D) ~5 E2 |0 I
  1437.     gpio_init_structure.Pin       = GPIO_PIN_13;
    ' e$ g8 Z- h6 @7 u' m; M: a
  1438.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;
      s# r3 X9 {$ O, T( o1 F+ G7 Z
  1439.     HAL_GPIO_Init(GPIOG, &gpio_init_structure);
    8 Q8 o  I. [" U% x- q
  1440.   E% h/ \9 C' ^2 E, S4 u+ E
  1441.     HAL_GPIO_WritePin(GPIOQ, GPIO_PIN_3, GPIO_PIN_SET); /* LCD On */ /* PQ3  LCD_ONOFF   */2 T, F: h4 M# @; r/ [
  1442.     HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET); /* Display Enable */ /* PG13 LCD_DE      */
    1 e7 @2 [7 s- O" t: f' {
  1443.     HAL_GPIO_WritePin(GPIOQ, GPIO_PIN_6, GPIO_PIN_SET); /* 100% Brightness */ /* PQ6  LCD_BL_CTRL */
    . F( L7 z9 ~6 e; f) g2 ^

  1444. 2 B: Z% y& d, _' t
  1445.   }
    1 Y' }# M0 X  |5 i! f) m: F
  1446. }# D. {! f# M* X, o8 u, X& l  T) I

  1447. 4 Q3 ^" G/ J8 M5 V: D1 ]
  1448. /**
    : o, y, S) V! \! ^% v/ v
  1449.   * @brief  De-Initializes the BSP LTDC Msp/ y5 H! f# p8 d* D3 \
  1450.   * @param  hltdc  LTDC handle
    # |9 l3 O, E, B( @# u  ]
  1451.   * @retval None: _2 r# U* M7 Z
  1452.   */( g$ m  l' E0 S" X" X7 p& S
  1453. static void LTDC_MspDeInit(LTDC_HandleTypeDef *hltdc)4 K  d; g3 ?2 ], t, J# S3 r" K' L
  1454. {
    , X& r7 w" |9 ?: b/ e
  1455.   GPIO_InitTypeDef  gpio_init_structure;
    ( B; r3 X, W- f1 m: n5 ]2 H# J
  1456. 5 \$ h) j3 H8 a4 h3 T
  1457.   if(hltdc->Instance == LTDC)
    6 v/ a1 S/ D: L, [' I
  1458.   {& P2 n$ w: u2 p  e+ z
  1459.     /* LTDC Pins deactivation */' L* [8 V+ N! b; @
  1460.     /* GPIOA deactivation */3 p: Y- _$ j8 H0 X
  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;
    : y4 `6 F9 z9 W! Z& l. I
  1462.     HAL_GPIO_DeInit(GPIOA, gpio_init_structure.Pin);' v9 O8 m. `. z* _9 V' K
  1463. 7 T# T+ v) L. p- k/ Y
  1464.     /* GPIOB deactivation */3 G$ v( u6 X; L6 `+ o  N: A2 j( w
  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;& |3 b4 s+ C5 |% I: ?$ H
  1466.     HAL_GPIO_DeInit(GPIOB, gpio_init_structure.Pin);2 Z+ v  |/ u+ F5 t
  1467. 1 q) q. V  R9 |) _' G8 G( S
  1468.     /* GPIOE deactivation */
    9 I6 {0 N' U, H( j- q# f
  1469.     gpio_init_structure.Pin       = GPIO_PIN_11 | GPIO_PIN_15;
    3 Q# E' D, d/ q
  1470.     HAL_GPIO_DeInit(GPIOE, gpio_init_structure.Pin);3 j; ~$ E6 U5 {* n

  1471. + C! F6 P4 h/ F+ L4 B1 Q' f
  1472.     /* GPIOF deactivation */: i( [9 l0 {" b  o3 w) S# E7 q
  1473.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_10|GPIO_PIN_11 | GPIO_PIN_9 | GPIO_PIN_7 | GPIO_PIN_15;- ]3 `: B  C, y) C1 o
  1474.     HAL_GPIO_DeInit(GPIOF, gpio_init_structure.Pin);: `( f  T2 {6 k! P5 m2 e( ^
  1475. $ A0 ]$ K. [/ ]+ ^# ]! b3 o' `( F# ]
  1476.     /* GPIOG deactivation */1 S" `7 q5 [% O/ b: [
  1477.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_1| GPIO_PIN_2 | GPIO_PIN_13|GPIO_PIN_14;
    / J% k. g9 i! A5 l) R, j. s( I
  1478.     HAL_GPIO_DeInit(GPIOG, gpio_init_structure.Pin);0 |0 v0 K4 j' X8 l0 ]! G4 a9 X
  1479. 7 A. q; o8 {  r0 z- z) u+ `
  1480.     /** Force and let in reset state LTDC */
    $ D! D& G* }4 R$ J" @2 l4 N
  1481.     __HAL_RCC_LTDC_FORCE_RESET();
    $ {  F) ~. L' V1 B
  1482.   ^: x" p: o/ @* |
  1483.     __HAL_RCC_LTDC_RELEASE_RESET();1 e  T7 B; v. {
  1484. - g, L- b" S7 ?; `% |0 v
  1485.     /** Disable the LTDC */
    6 r: o" ^8 I& \5 v0 n. p- H& i2 E6 t
  1486.     __HAL_RCC_LTDC_CLK_DISABLE();
    4 D: o( q- E2 w" h# U" B% j
  1487.   }
    2 ?5 ~4 `" c+ a0 |
  1488. }$ |/ F% Q' j! k' V% i+ H) Z
  1489. ) c/ ^3 z: M5 R9 P% A$ j
  1490. /**
    + p& k* t0 t: e2 q3 ?
  1491.   * @brief  Initialize the BSP DMA2D Msp.
    ) }0 h( B6 C" K: h
  1492.   * @param  hdma2d  DMA2D handle
    , L  B$ @* t  t; U. S4 c
  1493.   * @retval None# O/ g& e. k/ m$ [( i
  1494.   */
    : n0 @" l3 h3 G8 a
  1495. static void DMA2D_MspInit(DMA2D_HandleTypeDef *hdma2d)
    8 R2 m0 O5 X% R2 r# B* ~9 T7 ~3 {
  1496. {& Z* G& y2 Q9 {/ K3 `+ `+ _: B
  1497.   if(hdma2d->Instance == DMA2D)
    ; a' r0 c- ]8 N' K, S( S  X, W
  1498.   {7 Y  j$ ]% ?3 Z/ A
  1499.     /** Enable the DMA2D clock */8 r* o3 p6 G+ A% K/ X3 l( y, _
  1500.     __HAL_RCC_DMA2D_CLK_ENABLE();8 u; k4 ~# J3 R! }% v* v( S
  1501. ! k) H" {8 q0 v5 ?( C# w6 i
  1502.     /** Toggle Sw reset of DMA2D IP */
    % V' |! |/ y9 f8 \
  1503.     __HAL_RCC_DMA2D_FORCE_RESET();
    4 P% x- b* {; Z0 a
  1504.     __HAL_RCC_DMA2D_RELEASE_RESET();
    3 `: D) P; l! j, j  q- y* |
  1505.   }% R- h+ ^1 f1 B7 ]
  1506. }
    3 N3 Y0 Y8 v/ C- v& v

  1507. / ?3 S  W  Z/ E/ i, H. R+ h
  1508. /**+ W5 @5 b3 j& _
  1509.   * @brief  De-Initializes the BSP DMA2D Msp' V. o0 Y# ?- L* ?7 E
  1510.   * @param  hdma2d  DMA2D handle
    " }6 Q8 c7 D" t3 x# C1 q0 d
  1511.   * @retval None
    $ w0 ?) [/ _. y& U1 x/ N& K# q' P3 s$ {
  1512.   */' s5 R  d3 y2 Z# o* H
  1513. static void DMA2D_MspDeInit(DMA2D_HandleTypeDef *hdma2d)8 c3 X3 Q$ ]/ z  O
  1514. {9 p/ B) b# N! F7 s
  1515.   if(hdma2d->Instance == DMA2D)
    + S7 H; n" J. `+ X% N" _/ T
  1516.   {$ r3 l' [' P1 r- Z+ n; z- d* P
  1517.     /** Disable IRQ of DMA2D IP */8 _/ M- h0 v$ u! S
  1518.     HAL_NVIC_DisableIRQ(DMA2D_IRQn);7 l7 @1 Y  H7 G. ~2 X) b

  1519. 4 |# N8 r& H3 B1 m
  1520.     /** Force and let in reset state DMA2D */
    5 i' S' q% c$ m  j' L6 Z
  1521.     __HAL_RCC_DMA2D_FORCE_RESET();
    & L9 I0 M+ e3 ^6 H6 M! w; a  B
  1522.     __HAL_RCC_DMA2D_RELEASE_RESET();
    3 b+ f, \; m5 @  J: m. d$ w( z
  1523. ' |& T/ ?. x; Q) f
  1524.     /** Disable the DMA2D */! z) [" p: N) {( h
  1525.     __HAL_RCC_DMA2D_CLK_DISABLE();
    ; M% Y2 p+ E( V' u! Z, A
  1526.   }
    4 S- O! \  u* R+ b& t% p% c
  1527. }
    $ X6 W- I0 h) x
  1528. ! L# @8 s# C* u
  1529. /**- N' H2 i; P& q3 r9 j
  1530.   * @}! _: ^( o+ |7 @3 A6 D7 v/ F, [. ^
  1531.   */
    / W; g; d% ?+ E$ F, F$ T

  1532.   O! W5 r: t  K% f
  1533. /**
    + O% q) i8 v% [8 v* Q
  1534.   * @}
    + o& n; s2 V5 I& S4 h5 T7 ]; p
  1535.   */1 E2 [# C9 [) t
  1536. , g, F# T9 B% Q# l. P; b& l
  1537. /**
    * Q7 Z7 M+ v/ e8 [: v: a
  1538.   * @}* y2 P$ y$ b7 j' n1 v9 T9 n  T! I
  1539.   */
    * z0 l! N- B- w  p' i5 {: w- o: Y
  1540. ; |( S5 A# _- {/ O" x7 v
  1541. /**
    & D% N" T- k$ n, U5 ^' r
  1542.   * @}
    ! ~6 ?0 _9 C( t+ X! P
  1543.   */- I4 x$ c0 T. o! V0 }# f9 c' Z
  1544. 3 S. g. q0 |$ Y. s0 b
复制代码
8 i' G8 V( C& y$ A

# f% u6 e% m2 h2.2、main.c
, K2 A: k+ V- c
  1. int main(void)
    4 }; |# M' T- ]* I* k3 |4 P/ b6 T, B8 P
  2. {
    1 x7 D9 L% ]# @) ?5 w
  3.   uint32_t x_size;
    : K, ^2 W# m% a8 V1 @. Q) ?  w! l$ W2 V, u
  4.   uint32_t y_size;! n5 q& Z- l& c. o3 F. ~
  5.   uint16_t i,j;& N9 ?$ x3 g; o$ ^9 d* Y/ i! V8 B) R& E
  6. 3 g# A- M$ r  C6 J
  7.   HAL_Init();% C- p6 L. x" Z  h# k
  8.   SystemClock_Config();
    ! h) b0 ?" o4 S) j
  9.   
    9 J" C1 _3 s  u4 M
  10.   /* Update the RIF config for the used peripherals */4 k5 T& `/ M, P" A
  11.   RIMC_MasterConfig_t RIMC_master = {0};
    9 G( k; q9 i) U' n; Y3 e. i
  12.   RIMC_master.MasterCID = RIF_CID_1;
    3 \0 u" w: l6 J& ]9 l& \" h
  13.   RIMC_master.SecPriv = RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV;+ n' J- c6 ^4 r0 Q: F2 h
  14.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_DCMIPP, &RIMC_master);$ M7 n- r% e) i4 }/ g0 W
  15.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_DMA2D, &RIMC_master);
      i. _: p" s1 n2 Q3 m' P; H& u
  16.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_LTDC1 , &RIMC_master);& S' {; D- C8 `! Q! Y5 V' r
  17.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_LTDC2 , &RIMC_master);6 D4 D# q( x9 Z4 ]
  18.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_VENC  , &RIMC_master);4 A  h# @) p- c2 K0 K* n# v7 I
  19.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_DMA2D  , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);& p2 c. F( `5 Q
  20.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_DCMIPP , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);. ~% [9 |% ]8 m' y
  21.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_CSI    , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);7 a, O# f& ~8 V5 T/ W0 U5 q
  22.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDC   , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
    5 Y: V2 N# M. B6 I
  23.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDCL1 , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);1 c5 E' c3 @& j8 \( z" M
  24.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDCL2 , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);0 m# L4 I3 D- `7 W- _

  25. 5 u: s: H3 T3 l4 A% d, h
  26.   BSP_LED_Init(LED_GREEN);
    : `5 S# R: V: B5 }' m1 d
  27.   BSP_LED_Init(LED_RED);
    / Z3 t' d- ], }/ k( M+ S
  28.   
    4 Z* s" M# K. K* ?: k) e
  29.   #if USE_COM_LOG8 H+ v9 {; L8 }% A; ]: {7 v
  30.   COM_InitTypeDef COM_Init;
    , E: y6 P% @& y, D3 J4 Z, W

  31. 9 ~( U6 O) \. X; a. a$ l
  32.   /* Initialize COM init structure */! P; W* D* z7 `7 I5 M- K2 J% T4 Q
  33.   COM_Init.BaudRate   = 115200;3 }  C$ @* g1 D# b/ q1 q( k. B3 ~
  34.   COM_Init.WordLength = COM_WORDLENGTH_8B;7 B0 ]! L- ]+ c" H1 y% h. D
  35.   COM_Init.StopBits   = COM_STOPBITS_1;
    8 k' K' B! y  ~2 c+ P, e+ F- p
  36.   COM_Init.Parity     = COM_PARITY_NONE;
    3 K2 S. T) w. p/ \% {$ f9 U3 h& ?
  37.   COM_Init.HwFlowCtl  = COM_HWCONTROL_NONE;
    ( P) l$ m; Q* ?) [
  38. ( w1 _: a! X, Z0 ]( @$ i
  39.   BSP_COM_Init(COM1, &COM_Init);+ k! l7 z. d$ X; m0 L

  40. 3 p, ^' Y, I/ v/ M4 n. c1 N
  41.   if (BSP_COM_SelectLogPort(COM1) != BSP_ERROR_NONE)4 c" l0 k: ]$ {+ g) M$ }5 T
  42.   {' m1 C3 Y- w3 ~) X" ~. K
  43.     Error_Handler();/ {0 C  G. P# J6 X& |1 g
  44.   }3 _" f5 D4 I! d2 d8 s" r7 K( t6 R
  45. #endif' U# K5 u+ B& e: [* S5 `; A8 _
  46.   
    % A5 ~6 w3 n! G) e8 M" l5 m. {
  47.   BSP_LCD_Init(0, LCD_ORIENTATION_LANDSCAPE);8 [6 r$ E0 Z) Z5 }3 z
  48.   UTIL_LCD_SetFuncDriver(&LCD_Driver);
    & y9 L* N- z  J" p% D. k* Y
  49.   UTIL_LCD_Clear(UTIL_LCD_COLOR_RED);9 S& Q& U2 V4 t0 B; i
  50.   UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_RED);
    ; H( x% o; _0 F* l
  51.   UTIL_LCD_SetBackColor(UTIL_LCD_COLOR_WHITE);; j! @% l* t& M& t- ?
  52.   UTIL_LCD_SetFont(&Font24);8 Y8 B0 e* |3 W2 s& x. |
  53.   
    & s3 a# }$ ^6 W) r8 _, b- Q
  54.   while (1)
    4 `0 g) w) b6 j! D0 M: f
  55.   {& Y: P+ S5 c8 e3 A0 O. N
  56.     switch (i)$ y" ?2 \2 L! k+ O% O$ @
  57.     {( _/ D" z5 ~9 [& V
  58.       case 0:& n; `  Z& z& G) H' I+ h: p
  59.       {
    ; i  O+ y+ ]& w- m' s+ @: S, b
  60.           UTIL_LCD_Clear(UTIL_LCD_COLOR_WHITE);* L; f; d! D  @* P4 @
  61.           break;
    0 ~  d& B* ^, @1 ]
  62.       }  c/ Z( h0 o3 W; y
  63.       case 1:
    3 o# }: ~- x, z/ {+ _- a
  64.       {
      J* J  ]8 \1 y
  65.           UTIL_LCD_Clear(UTIL_LCD_COLOR_RED);% a7 c* j, T$ U' e
  66.           break;
    2 c" e+ ]' N0 C" R/ n) q0 K
  67.       }
    7 Z- B. M$ I( y; r0 t
  68.       case 2:6 c# n* B% @6 O( C! i" H* [
  69.       {; `* z! t+ }- E- r/ u
  70.           UTIL_LCD_Clear(UTIL_LCD_COLOR_GREEN);
    - z: k* Q- P! {8 ]- H: Y# u
  71.           break;/ J# K2 `( N& c5 k$ B; j1 g* V
  72.       }
    # x, A7 I- h9 ]7 Z6 j. R& f) L: ^
  73.       case 3:
    1 n2 m" {$ |# g0 T
  74.       {+ D+ d  I0 a$ l' h- m
  75.           UTIL_LCD_Clear(UTIL_LCD_COLOR_BLUE);
    ; h4 A! r3 G0 T% L
  76.           break;: P& s9 T6 ^$ E7 J# b
  77.       }
    & g) w$ p6 b- z3 J) I3 n4 z+ z
  78.       case 4:" L: G7 h( m  z$ q9 Y
  79.       {, K8 x6 T7 k/ @7 r0 x1 N( K
  80.           UTIL_LCD_Clear(UTIL_LCD_COLOR_MAGENTA);3 m( m4 G; E3 o. g) ~0 T4 G6 I
  81.           break;5 j% W" t% V# v, Q. O  z- o( ]
  82.       }! P6 C- M0 d8 E# v( r
  83.       case 5:
    9 u% _8 u1 f: m+ z
  84.       {- l1 F7 D* d8 `" p, G+ T
  85.           UTIL_LCD_Clear(UTIL_LCD_COLOR_YELLOW);
    ) N5 V/ J+ q2 S: f/ P
  86.           break;
    ! ^- f: B% G' r+ U+ _; Z
  87.       }; j, I4 p0 R, q1 ^
  88.     }- {, |& J1 c% |. Y- t) ~7 t+ j, f
  89.     ! \) z6 I* w1 Y2 w" |9 B* h
  90.     if(i==6)
    / A8 c9 }/ b. M
  91.     {
    ; Q1 p1 F* w3 H- T
  92.       i=0;* o7 M. Q( z0 D: ]1 q
  93.     }7 M: L6 v: m! a& f/ |
  94.     else7 ~' A! |+ n, ]6 \4 W3 |
  95.     {9 K3 s" K1 B8 B7 P* s- d2 }
  96.       i++;% |8 b6 R* A0 R& m
  97.     }9 v0 a8 a- }* V+ N  c( s% k3 i
  98.     UTIL_LCD_DisplayStringAt(10, 50, (uint8_t *)"STM32N6570 BOARD LCD TEST!", LEFT_MODE);
    " C; B' @* o% s" ]- a6 G
  99.     BSP_LED_On(LED1);
    % t3 `' [* \# ?5 Q
  100.     HAL_Delay(500);$ D0 c: F- i) O' c
  101.     BSP_LED_Off(LED1);
    6 ^  E3 f( X4 Z
  102.     HAL_Delay(500);8 g0 L6 A, f3 l0 L
  103.   }
    5 H  M7 h- ^8 T- s" j
  104. }
复制代码
7 ^) W- O8 k" V, R

/ y& i2 w' P: i. w) s7 {
5 ^  M) q! d$ Y' ~- o  g
+ B/ h) d. M. A; H. h" s
三、结果
* e; _' c/ ~( N0 t7 J, K' {+ V
( C4 F* B3 B3 B4 B6 X8 T
下载程序到开发板,运行开发板屏幕显示如下:
% I& m# b/ ]& g" f lcd.gif
* Q& r5 v0 N- `- v  M1 P" E* r3 _* H

! E5 |( b! ~7 }; v' B/ l
6 }  k1 S+ `* G, |

7 h7 H2 o; y1 u% ~/ g/ u7 u
6 `; M# A2 K- X0 i9 X" y0 v" B: ?3 L) t
收藏 评论0 发布时间:2025-2-18 15:02

举报

0个回答

所属标签

相似技术帖

官网相关资源

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