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

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

[复制链接]
TLLED 发布时间:2025-2-18 15:02

/ m' M% ]6 c6 p) a! L: b' v" g0 l4 W( G

9 S9 I9 e- b+ V一、硬件部分& T/ n6 L# _/ m' ]6 g; _
1.1、LCD显示屏硬件接口部分电路
5 H  m$ k' X# O! t2 ?' d7 y9 a& c5 W lcd.png ( ?* L$ b5 w& H+ }
) d& |# v/ I- A1 ?7 |

; r0 [# A1 p# L+ G: v# K
1 m4 n- T; U$ b! G8 Y0 ?+ K  ]% x

! Q1 Q- Z6 M- N+ W- N8 n: ^0 f6 {1 Z& H5 V
1.2、LTDC显示内部框图, m/ t2 H1 X$ G; W# C, j9 F& N* x
LTDC可驱动24位的RGB显示屏,内部有两个显示层/ D) p- g& K; |* L: {
002.png
, k* m! j1 ~2 f8 w
9 H# A; P: H6 i5 T/ m
# V- g. v; j. N9 M
* H$ D2 A/ M8 k; g% C) A
二、配置LTDC
' ~4 L6 S9 y3 F5 _1 T# B3 Y8 Y! l% V6 L; U3 d7 T2 n  h
2.1、屏幕的参数设置
7 J- Y' N  t6 U: {4 U 003.png
" T  F7 ]7 O/ k( M6 A9 F: k+ N3 t1 M, b2 ?- L/ w
: v3 K4 i: J# b$ @( S
2.2、层参数设置
; x0 g* c: @0 o 004.png
2 z) b; ~% U( l0 [

* o3 Z" r$ S# I( k& u, @
! @1 I9 n' y/ V! F; r( I/ ]

/ t  v5 p5 _0 x1 h3 Z# B2.3、LTDC引脚设置
$ a3 X& t. T: f% C$ m  ~. i* ?$ ~- r% ?" ] 005.png 4 t+ }2 B  N9 y

3 x0 S2 Q/ \, k' G) D
/ y  g# h  K6 N  {, M. Y" O

/ ?9 e  Q& E9 C3 x. Y# Z三、程序部分
! o4 r5 X" v  ?# [+ K" A: W# B  ^  O; H; V" z1 N% T
3.1、在项目中添加LCD驱动程序) [% k3 I) V) |' @9 q3 o. k* T
使用官方BSP中的LCD驱动程序# a# j+ a' ^+ X* s1 c7 R
stm32n6570_discovery_lcd.c
0 V4 V+ x0 Z- k$ f

& j  G; j, R) p8 x/ b* j
  1. /**
    1 i) v; d& g. H. T1 \9 f; q
  2.   ******************************************************************************* Z' @$ N1 i% Q; l& K
  3.   * @file    stm32n6570_discovery_lcd.c
    1 B* Z  B! Z- u# M3 {# L
  4.   * @author  MCD Application Team3 a' @. b+ c$ O; q
  5.   * @brief   This file includes the driver for Liquid Crystal Display (LCD) module
    2 a" F& {7 B* a. `* U* l
  6.   *          mounted on STM32N6570_DK board.$ T/ `2 Y+ A6 b- d. t5 h1 Z4 u
  7.   ******************************************************************************1 t  F2 g) R- _# M6 P
  8.   * @attention+ f+ m8 {9 i9 B3 z: `- Z+ e" ]
  9.   *
    3 a8 n4 J3 S* X8 Y5 O
  10.   * Copyright (c) 2022 STMicroelectronics.) `5 w" {# p1 U% e- `" w
  11.   * All rights reserved.
    0 v7 G) C8 ~( ^" A! J
  12.   *
    0 C0 E6 s; l# X7 W7 I: y, G  x
  13.   * This software is licensed under terms that can be found in the LICENSE file  K' g. l7 {/ o7 b2 ?8 p$ M+ P7 Z
  14.   * in the root directory of this software component.' N7 Y/ ?8 |; L0 B! V
  15.   * If no LICENSE file comes with this software, it is provided AS-IS.
    6 l1 u* t; t, I- p
  16.   *8 N& L5 `& E9 P
  17.   ******************************************************************************
    8 H3 e, ~2 D8 U
  18.   @verbatim; P3 Z( s% O, k
  19.   How To use this driver:
    ; g& S2 @: f; j  u( u
  20.   --------------------------
    * X1 h" \% G: n7 U1 I1 v: ^
  21.    - This driver is used to drive directly a LCD TFT using the LTDC controller.
    ! V5 `, `$ X0 C0 t4 {( Q! O+ P9 w
  22.    - This driver uses the adequate timing and setting for the RK050HR18 LCD component7 h" t. T- F  t, x+ g; }+ o! b- t
  23. + P. W- C, ]/ @9 @5 c) ?0 H
  24.   Driver description:7 {( c' I* d3 h$ ?
  25.   ---------------------
    % b) Y1 [( L' M) v7 d( A
  26.    + Initialization steps:
    " c8 y0 M# O! n+ t+ \7 }
  27.      o Initialize the LCD in default mode using the BSP_LCD_Init() function with the
      w+ J- _7 `" y2 H
  28.        following settings:- h3 a0 m2 ^$ p' Z8 B
  29.         - Pixelformat : LCD_PIXEL_FORMAT_RGB888
    3 Y. I( E3 I* i" b: O9 u; {
  30.         - Orientation : LCD_ORIENTATION_LANDSCAPE.2 u% }% l& ]1 w
  31.         - Width       : LCD_DEFAULT_WIDTH (800)* ^2 J( ^( O( r
  32.         - Height      : LCD_DEFAULT_HEIGHT(480)
    . y7 i8 ]; ^' j
  33.        The default LTDC layer configured is layer 0.
    " l7 J3 I. [  v' m9 q
  34.        BSP_LCD_Init() includes LTDC, LTDC Layer and clock configurations by calling:
    $ b+ @' E0 V$ @- j. M: k* V; D
  35.         - MX_LTDC_ClockConfig()3 O1 c9 f( v/ J% M: u4 r/ X
  36.         - MX_LTDC_Init()# l& `% ^5 R( I6 b1 L- t
  37.         - MX_LTDC_ConfigLayer()# l' v, L7 M6 {) t" [
  38. 6 T" I: l2 F. g; p& H' V
  39.      o Initialize the LCD with required parameters using the BSP_LCD_InitEx() function.) N* q- @0 `8 g; @& `6 h

  40. - x& m1 r& Q$ {: t* z+ C: {8 c
  41.      o Select the LCD layer to be used using the BSP_LCD_SelectLayer() function.# g. l& k% e( w$ [1 z/ Y! y
  42.      o Enable the LCD display using the BSP_LCD_DisplayOn() function.
    , D9 \4 F1 ^/ S
  43.      o Disable the LCD display using the BSP_LCD_DisplayOff() function.
    : s; F# c8 }' g4 d' B( A$ c
  44.      o Write a pixel to the LCD memory using the BSP_LCD_WritePixel() function.
    4 A6 R3 Q- X& ^0 C, S0 u$ |. }
  45.      o Read a pixel from the LCD memory using the BSP_LCD_ReadPixel() function.
    : m- u9 k- T$ G* {% U
  46.      o Draw an horizontal line using the BSP_LCD_DrawHLine() function.
    ' N  M4 H) `! o: h" P8 G0 L
  47.      o Draw a vertical line using the BSP_LCD_DrawVLine() function.
    * J$ z! B* T( l) w% p" I$ n5 O3 n
  48.      o Draw a bitmap image using the BSP_LCD_DrawBitmap() function.
    5 U, B$ x; r" Q6 Z4 Y7 Z; f, ^5 ]

  49. ; h! J% S- s! O9 `$ Z+ j4 d8 J- c
  50.    + Options
    9 h% s4 G& r: k7 {
  51.      o Configure the LTDC reload mode by calling BSP_LCD_Reload(). By default, the
    ' J; k! T7 [' Z0 O' N  |* b, i  H1 W
  52.        reload mode is set to BSP_LCD_RELOAD_IMMEDIATE then LTDC is reloaded immediately.' \  r. R9 z* m8 W2 Z4 M
  53.        To control the reload mode:
    $ ]7 }+ Z# A; [8 z
  54.          - Call BSP_LCD_Reload() with ReloadType parameter set to BSP_LCD_RELOAD_NONE, Z+ a6 P' |' p  c: E, a8 ~
  55.          - Configure LTDC (color keying, transparency ..)
    % q  g7 v3 |% J! y5 }$ {3 k# F, v7 m
  56.          - Call BSP_LCD_Reload() with ReloadType parameter set to BSP_LCD_RELOAD_IMMEDIATE
    : G1 g. H! C2 j* `5 @
  57.            for immediate reload or BSP_LCD_RELOAD_VERTICAL_BLANKING for LTDC reload
    % I7 D+ t8 Y) k
  58.            in the next vertical blanking# ^$ v! M7 u/ S; r
  59.      o Configure LTDC layers using BSP_LCD_ConfigLayer()
    ! |9 q9 V2 g; ~) P: o1 ?' C
  60.      o Control layer visibility using BSP_LCD_SetLayerVisible()
    : i7 x. Y) I3 [8 w! i
  61.      o Configure and enable the color keying functionality using the; `, @3 g) m1 f4 M: T
  62.        BSP_LCD_SetColorKeying() function.& X7 v( X3 i- q0 g
  63.      o Disable the color keying functionality using the BSP_LCD_ResetColorKeying() function.
    / C  b( [9 ^+ _& r8 ^
  64.      o Modify on the fly the transparency and/or the frame buffer address+ i2 @+ c4 m6 M/ K
  65.        using the following functions:# Y: F7 e  r% a! G- ~0 }
  66.        - BSP_LCD_SetTransparency()
    9 y# c" T0 I6 S$ r" J7 h
  67.        - BSP_LCD_SetLayerAddress()6 m( _4 R! {6 ?7 _  \

  68. , v# Q8 [! p+ s2 ~1 D5 l/ |
  69.    + Display on LCD* g6 K% p, D$ d, ~# k
  70.      o To draw and fill a basic shapes (dot, line, rectangle, circle, ellipse, .. bitmap)
    5 t% F5 D- s) ?2 G5 J) V' c* ?9 ~$ K
  71.        on LCD and display text, utility basic_gui.c/.h must be called. Once the LCD is initialized,- e% _  ^% T, P6 }
  72.        user should call GUI_SetFuncDriver() API to link board LCD drivers to BASIC GUI LCD drivers.
    / `4 j4 A  Z+ K; Q& [
  73.        The basic gui services, defined in basic_gui utility, are ready for use./ g5 E- ~# v% j+ ?

  74. 3 g8 i8 [( \6 L- D) y" |& N
  75.   Note:& X. a- C7 R3 q
  76.   --------
    + }, |0 h  W" M+ R; @: T! t
  77.     Regarding the "Instance" parameter, needed for all functions, it is used to select+ p- ?. U% u' ]0 U# C2 ?
  78.     an LCD instance. On the STM32N6570 Discovery board, there's one instance. Then, this
    - j7 R+ c4 S( R1 {' Q
  79.     parameter should be 0.  g5 O0 p0 i* B. _9 Q3 N9 p7 m
  80. " K: H$ A- Z7 g: G
  81.   @endverbatim
    8 `# F4 w( a7 M
  82.   ******************************************************************************
    1 m6 u0 {" |' e1 V
  83.   */
    & U; @3 H3 |' d( L, ?+ P5 b' j
  84. . E- E' L  Y8 }9 O. K
  85. /* Includes ------------------------------------------------------------------*/
    3 Y4 a( j2 d5 R8 y1 z' A7 ?0 [
  86. #include "stm32n6570_discovery_lcd.h"
    7 b+ h2 X7 f  X9 B& x" Q
  87. 5 L  W. l: C2 s3 E0 g2 j  L  j
  88. /** @addtogroup BSP' l8 B  B4 f& P; y1 ]/ m* F2 R
  89.   * @{- \) C/ U6 j, S8 Y/ N! [% F& r# x- a
  90.   */
    2 }/ d/ z5 q) m# C+ \, Q1 ~5 Z; R- b

  91.   W9 Q) I$ j+ V7 }' g* E% a* v4 z
  92. /** @addtogroup STM32N6570_DK; k+ A! C, T0 K$ Z; x4 X. C
  93.   * @{
    1 A3 a! U6 A) }4 C9 A6 s
  94.   */. J5 h$ n! l7 r+ W

  95. 3 J4 k, r5 w5 T3 ^2 ^3 y
  96. /** @defgroup STM32N6570_DK_LCD LCD
    - M* j" u6 _7 L: j
  97.   * @{  T/ c. e% e2 a3 n, d* j! F6 ~9 h
  98.   */
    9 @2 i% m; t. v4 z% ^* x

  99. 3 x! z- c3 F9 I5 J5 D2 z
  100. /** @defgroup STM32N6570_DK_LCD_Private_Variables LCD Private Variables
    ( a- x; u5 Y* d. s" [
  101.   * @{9 y( M9 [% e( W. Z0 U
  102.   */
    " G1 x7 J. f) j" t2 j* o6 _

  103. ! I1 q7 L9 T. u/ s; o5 \/ q
  104. /**! @8 l; _) B1 A/ R+ [
  105.   * @}$ P/ r& _4 K" s, k' I
  106.   */
    / \+ R* ~/ @5 Y; i9 Y
  107.   X) v7 c* B9 y& W  k: G
  108. /** @defgroup STM32N6570_DK_LCD_Private_TypesDefinitions LCD Private TypesDefinitions
    2 U' X4 U$ r* Q% k6 F
  109.   * @{
    ) l+ v& U3 n2 ^( ]
  110.   */5 P9 V2 g% l9 c$ l
  111. const LCD_UTILS_Drv_t LCD_Driver =
    # T4 [# P3 r1 Z& }% \( p
  112. {, v1 Q0 B$ @3 i1 r
  113.   BSP_LCD_DrawBitmap,
    / C. C  G7 P, E; U! X$ }6 {
  114.   BSP_LCD_FillRGBRect,, f- |$ E1 Q9 z8 t, l$ c
  115.   BSP_LCD_DrawHLine,
    6 b# @0 \  E9 G! A# Q
  116.   BSP_LCD_DrawVLine,
    0 O, Q: R! v% R4 H. H9 X
  117.   BSP_LCD_FillRect,
    % _/ s! ~/ G( N6 F( h
  118.   BSP_LCD_ReadPixel,. o7 w- h+ ~# }" e
  119.   BSP_LCD_WritePixel,
    ' [  u  Z; k: f
  120.   BSP_LCD_GetXSize,
    0 w" m: J. i5 I3 C, {9 B
  121.   BSP_LCD_GetYSize,
    , h/ }7 E- Q0 N  b
  122.   BSP_LCD_SetActiveLayer,
    ; s: b) g. A( E9 e8 u. Z
  123.   BSP_LCD_GetPixelFormat& G% p5 G( o. g% A
  124. };7 f+ n7 N4 L' b6 S
  125. # b$ F5 z# e: v9 G3 }
  126. /**1 ^' Y. m' G* E. p
  127.   * @}3 l( @( Y& R" Y3 `1 u+ P! Z
  128.   */
    0 x; l! n+ g2 Y: v# `

  129. $ J* d! v3 o: I9 m
  130. /** @defgroup STM32N6570_DK_LCD_Exported_Variables LCD Exported Variables# M. l6 S: [* [) `) U5 ^& G0 u
  131.   * @{
    5 S/ Z. Y8 L$ g/ c6 y/ F
  132.   */, g5 i3 O/ y# y/ A2 T' e( a$ P
  133. DMA2D_HandleTypeDef hlcd_dma2d;
    5 H9 L. K; E6 b3 B
  134. LTDC_HandleTypeDef  hlcd_ltdc;
    " E+ Y6 F# U/ Q2 ~! E
  135. BSP_LCD_Ctx_t       Lcd_Ctx[LCD_INSTANCES_NBR];
    5 }2 X  e- Y+ ?
  136. /**' }+ x; I% b# b3 a9 u5 u1 S
  137.   * @}
    4 `. M2 \  b' T2 x+ X6 s2 L; ]
  138.   */2 N* @* \/ d! J

  139. / m( @0 N7 O* G% |. E
  140. /** @defgroup STM32N6570_DK_LCD_Private_FunctionPrototypes LCD Private FunctionPrototypes
    , }- t$ s7 @" s* D
  141.   * @{
    ) H+ l  S( y/ J7 F& R
  142.   */
    & d3 `7 S5 s8 o- \7 y" Z5 b
  143. 3 C9 y4 I9 G+ {) E+ A: n
  144. static void LTDC_MspInit(LTDC_HandleTypeDef *hltdc);3 Y: q9 b7 ~! [3 R, N$ u
  145. static void LTDC_MspDeInit(LTDC_HandleTypeDef *hltdc);6 K9 o/ ]# K% S" X
  146. static void DMA2D_MspInit(DMA2D_HandleTypeDef *hdma2d);5 s$ F# n0 ?+ w, M3 S: R6 N1 k
  147. static void DMA2D_MspDeInit(DMA2D_HandleTypeDef *hdma2d);
    : {( E" c  [% I9 i
  148. static void LL_FillBuffer(uint32_t Instance, uint32_t *pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t Color);
    . W5 z8 i  r0 E9 X9 K1 c6 A* K
  149. static void LL_ConvertLineToRGB(uint32_t Instance, uint32_t *pSrc, uint32_t *pDst, uint32_t xSize, uint32_t ColorMode);
    ; u4 ~" j6 a$ {( e7 b+ K
  150. /**
    2 R1 o" W4 N- J) r- e0 L9 {
  151.   * @}# k6 p9 r( O3 w2 H- m* c5 `( {* K- P
  152.   */' _# r. E. Q) c9 e' ?
  153. /** @defgroup STM32N6570_DK_LCD_Private_Macros  Private Macros
    : g3 g' }, K8 o" e8 J$ Z
  154.   * @{' b  M/ K% O- C7 I3 \
  155.   */
    ! j% l: k7 P9 O- A  T
  156. #define CONVERTRGB5652ARGB8888(Color)((((((((Color) >> (11U)) & 0x1FU) * 527U) + 23U) >> (6U)) << (16U)) |\* _: [! F4 g4 m. ?8 o- b0 X
  157.                                      (((((((Color) >> (5U)) & 0x3FU) * 259U) + 33U) >> (6U)) << (8U)) |\
    ( T4 I7 [+ O  D8 s  d- c
  158.                                      (((((Color) & 0x1FU) * 527U) + 23U) >> (6U)) | (0xFF000000U))+ t8 \/ B1 Q( P) \; j
  159. ' U+ B( g5 y, ~3 }9 c& t0 O6 [' X+ U9 Q
  160. #define CONVERTARGB44442ARGB8888(Color)((((((Color) >> 12U) & 0xFU) * 17U) << 24U) |\3 \1 f2 e( B9 ]  ^
  161.                                         (((((Color) >>  8U) & 0xFU) * 17U) << 16U) |\
    2 M" J) z5 I% j/ c: q2 c) V* q
  162.                                         (((((Color) >>  4U) & 0xFU) * 17U) << 8U) |\
    3 R- I  O9 f2 F: C; x# W
  163.                                         (((((Color) >>  0U) & 0xFU) * 17U) << 0U))( [: x) Y: e% ]

  164. - A( ]& ^& W6 i, m. e1 X: N0 Z
  165. #define CONVERTRGB8882ARGB8888(Color)((Color) | 0xFF000000U)8 Q" Z' Y, l0 B0 W: `6 M9 r

  166. . A/ |9 W/ l% B( s# _- ]( I$ T5 ?
  167. #define CONVERTARGB88882RGB888(Color)((Color) & 0x00FFFFFFU)6 C; v" L( ]4 ^0 x. H
  168. 2 b" }! }' Z7 P8 u$ s, K
  169. /**
    . Z' l; s& q% K0 p. L, {. r
  170.   * @}
    , h/ q/ L; k0 {7 R# J6 k
  171.   */
    ( ?+ x4 a( J! s, c

  172. # h9 _% J" _2 `% L' L
  173. /** @defgroup STM32N6570_DK_LCD_Exported_Functions LCD Exported Functions! o, Y5 K$ [) A5 C* ~: d" }
  174.   * @{
    2 b+ ~! ~" a. |. p) [/ x, e9 m+ F
  175.   */% h! t: j3 r" Y2 j$ l
  176. /**5 P0 D" T7 h  B* g' X" {9 P- b
  177.   * @brief  Initializes the LCD in default mode.
    & }8 ^) j0 z& a& J6 `: r5 X
  178.   * @param  Instance    LCD Instance
    4 M8 E  A7 t& ~9 r9 }
  179.   * @param  Orientation LCD_ORIENTATION_LANDSCAPE& w% o/ F5 f8 n6 H  K
  180.   * @retval BSP status
    + s/ O0 X, j1 S  x1 j
  181.   */; I, l  Z; [$ S* N+ {( Z
  182. % A8 j# k; h: a6 c! W, E
  183. int32_t BSP_LCD_Init(uint32_t Instance, uint32_t Orientation)
    + i, C# X# ]9 u% L9 s
  184. {. l4 r# d* S  w& a' Y
  185.   return BSP_LCD_InitEx(Instance, Orientation, LCD_PIXEL_FORMAT_RGB565, LCD_DEFAULT_WIDTH, LCD_DEFAULT_HEIGHT);
      ]# c1 e9 V# T/ |
  186. }" z3 H1 W. r# T* L' x2 S
  187. ! `0 V+ y' G2 N; a  j% t9 ?
  188. /**# Q  v  Q9 a5 a6 N1 x
  189.   * @brief  Initializes the LCD.
    # Z( V! Q' V# {- l7 D! I
  190.   * @param  Instance    LCD Instance
    - f. m! s/ U0 e% o5 F
  191.   * @param  Orientation LCD_ORIENTATION_LANDSCAPE
    6 S, h4 _8 c4 G  A( t
  192.   * @param  PixelFormat LCD_PIXEL_FORMAT_RGB565, LCD_PIXEL_FORMAT_ARGB4444, LCD_PIXEL_FORMAT_ARGB8888
    + O7 e  B+ D. x1 U" p6 q, T3 P
  193.   *                     or LCD_PIXEL_FORMAT_RGB888$ Q# Q( }8 C. ~: C/ w6 I
  194.   * @param  Width       Display width( B2 `; T" ~5 ?
  195.   * @param  Height      Display height
    3 ~4 H( E  x- J/ I6 Z5 N. Y
  196.   * @retval BSP status7 S/ C8 H; H4 T+ R0 x6 T0 S
  197.   */' W8 v7 |+ o3 h$ U1 f' d: t
  198. int32_t BSP_LCD_InitEx(uint32_t Instance, uint32_t Orientation, uint32_t PixelFormat, uint32_t Width, uint32_t Height)
    ; J0 B3 F" y2 G* A: V4 @
  199. {3 ~8 \) x* b$ J6 P  W3 }0 @
  200.   int32_t ret = BSP_ERROR_NONE;, i: i, F2 T3 Z0 M8 W
  201.   uint32_t ltdc_pixel_format;- h1 P0 N9 u: D% M. o: O* t
  202.   MX_LTDC_LayerConfig_t config = {0};
    / B* @" R( |- i6 _# C: C8 t! c; U

  203. % @* V% C, T$ q! u4 a
  204.   if ((Orientation > LCD_ORIENTATION_LANDSCAPE) || (Instance >= LCD_INSTANCES_NBR) || \$ V6 y! e0 V+ j" l3 U" l. ^
  205.      ((PixelFormat != LCD_PIXEL_FORMAT_RGB565) && (PixelFormat != LCD_PIXEL_FORMAT_RGB888) && \& b% G# e" I- X+ g
  206.       (PixelFormat != LCD_PIXEL_FORMAT_ARGB8888) &&  (PixelFormat != LCD_PIXEL_FORMAT_ARGB4444)))
    9 |5 V6 S- T& \) s
  207.   {
    ) [& v+ K2 ]& `4 X5 T8 V5 T1 m  G3 x
  208.     ret = BSP_ERROR_WRONG_PARAM;4 |$ Q% N* Y7 U0 b; {2 x
  209.   }
    " b& {/ \7 D& x( z2 p# o
  210.   else( d0 [7 Y: ?+ b# }- B' L" p$ q' i
  211.   {
    $ M* e0 W- c) j" b
  212.     if (PixelFormat == LCD_PIXEL_FORMAT_RGB565)1 A4 [. ~) |+ ~. i: _" H$ L
  213.     {
    ! a- E9 ~4 b3 ^8 c  K6 m, `0 p8 d7 J7 y
  214.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_RGB565;
    , ^/ \( t1 _, w8 Z$ {3 f
  215.       Lcd_Ctx[Instance].BppFactor = 2U;
    9 u* K& f" j  g9 q. c
  216.     }
    1 ~( d, z2 Z4 L. B0 z- a, H
  217.     else if  (PixelFormat == LCD_PIXEL_FORMAT_RGB888)* s, l, [( @4 H
  218.     {
    " S) l' e  t! L) i
  219.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_RGB888;) u: k: F% m/ o  ?  y: S
  220.       Lcd_Ctx[Instance].BppFactor = 3U;* l  R* Q7 ]; o* L2 E
  221.     }
    7 i" m# k. D$ I
  222.     else if  (PixelFormat == LCD_PIXEL_FORMAT_ARGB4444)3 j/ @' Q$ h+ E: Z% V2 {
  223.     {
    + ]6 ]+ e  i4 p) G  x8 a+ U7 ^7 C! S
  224.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_ARGB4444;
    $ n1 V6 e/ ^: F5 ]' s& K
  225.       Lcd_Ctx[Instance].BppFactor = 2U;
    # v0 s6 }' Q: t' o
  226.     }
    ; [& R' V) `8 q( k/ Y( g
  227.     else /* LCD_PIXEL_FORMAT_ARGB8888 */) ?) h9 Z( @' ?7 j
  228.     {
    3 M+ T5 g0 L6 k, `
  229.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_ARGB8888;
    * A7 ~. Y6 c! r( d, z
  230.       Lcd_Ctx[Instance].BppFactor = 4U;
    : u" }3 p; y+ G! @4 @8 B2 i
  231.     }
    ' @  A# B2 j" R4 _0 d3 P4 ^

  232. " F5 m' I3 t2 T( s5 F
  233.     /* Store pixel format, xsize and ysize information */6 v3 B5 ~$ W" \5 A, E
  234.     Lcd_Ctx[Instance].PixelFormat = PixelFormat;* s5 x0 w6 e, A- {( U& J1 Z7 m
  235.     Lcd_Ctx[Instance].XSize  = Width;
    ! w1 ]8 o$ B7 Q! F$ d6 a
  236.     Lcd_Ctx[Instance].YSize  = Height;
    & g: [) V; F! I

  237. 0 e$ i* r9 |6 U
  238.     /* Initializes peripherals instance value */
      N. m  c( z9 r$ T( t& D8 a5 X+ m
  239.     hlcd_ltdc.Instance = LTDC;
    " I/ o' c( n* V1 W
  240.     hlcd_dma2d.Instance = DMA2D;
    : A3 Y% a/ K; |5 u# d

  241. 5 `5 ^9 T$ N8 f$ \* q
  242.     /* MSP initialization *// g" ]; \- Z) K  ~% B8 w
  243. #if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1), J0 L, |) D* R7 m" l! A( n3 i
  244.     /* Register the LTDC MSP Callbacks */5 ~# \. o+ R+ u7 f) Y
  245.     if (Lcd_Ctx[Instance].IsMspCallbacksValid == 0U)
      s* z; G1 D8 c5 w# S6 e$ s8 A
  246.     {
    ) G$ Y& Y5 W2 N7 _; U1 @  a
  247.       if (BSP_LCD_RegisterDefaultMspCallbacks(0) != BSP_ERROR_NONE)
    1 {* q4 L* N% d  U
  248.       {! X, {. ?, t+ N+ ~8 V6 k
  249.         return BSP_ERROR_PERIPH_FAILURE;
    , u' u- O& _) f; ~7 y
  250.       }6 F, p7 p/ Z: B, H/ \0 F, ^
  251.     }! |, B4 w: k+ `/ g
  252. #else% W, R2 Q' a/ r" K, h
  253.     LTDC_MspInit(&hlcd_ltdc);* o5 I! |! ]$ L4 u4 s. p7 w
  254. #endif /* (USE_HAL_LTDC_REGISTER_CALLBACKS == 1) */
    " n" H8 A$ a8 p5 L9 G, [

  255. 1 q3 U# P' j) J9 o  ]
  256.     DMA2D_MspInit(&hlcd_dma2d);5 D  a$ I* J% i: U8 [

  257. ! |% M  l* ?4 w. K
  258.     if (MX_LTDC_ClockConfig(&hlcd_ltdc) != HAL_OK)
    " Z2 j0 e" g# E: g7 ]
  259.     {: F$ E" H; S/ N7 N/ R! Q
  260.       ret = BSP_ERROR_PERIPH_FAILURE;% _2 F8 q  \9 j" L% E: c0 i/ Z: B( Y6 r
  261.     }
    + k9 V6 c- h3 U0 ]: ~7 L
  262.     else
    : O0 e4 S4 l% N2 ^* D5 Y
  263.     {9 h  g. k! ]) ^
  264.       if (MX_LTDC_Init(&hlcd_ltdc, Width, Height) != HAL_OK)
    ; F( B5 |9 d4 y; G6 O* w
  265.       {
    * G# x9 F, D. L! f
  266.         ret = BSP_ERROR_PERIPH_FAILURE;
    , k( H! Y. W  ~8 q! Z" X
  267.       }9 @' [) r9 \1 M0 `8 O& r! a3 Q2 ^/ X
  268.     }
    : {7 j0 v5 T* P4 s2 h

  269. 1 t# K" z3 r8 l8 u; v3 r
  270.     if (ret == BSP_ERROR_NONE)
    9 l* Q) t- k% f( K" w( |% f# r( Q' Z
  271.     {
    ; l# g1 d+ ]* R/ U
  272. #if defined(DATA_IN_ExtRAM)
    ; s4 y# Q4 W1 Q1 Y
  273.       /* Before configuring LTDC layer, ensure XSPI RAM is initialized */; Y5 V0 f+ a+ N; F4 Z$ ^
  274.       /* Initialize the XSPI RAM */( E$ Q5 D* Q, f
  275.       if (BSP_XSPI_RAM_Init(0) != BSP_ERROR_NONE)/ H* Z- V7 Y- n) P
  276.       {: C8 U2 o: T9 W6 C
  277.         ret = BSP_ERROR_NO_INIT;8 X7 ?0 {/ D  }% i/ w
  278.       }+ X2 I: {: r$ T
  279.       else if (BSP_XSPI_RAM_EnableMemoryMappedMode(0) != BSP_ERROR_NONE): G1 U4 S% i+ A& U7 ~3 N' m
  280.       {  ^+ ^8 x' r5 l, M* l) J1 h; z
  281.         ret = BSP_ERROR_PERIPH_FAILURE;( F# x7 e0 B; Z' g2 ^# ^1 L
  282.       }
    3 {: s. t5 @$ N
  283.       else5 i8 T5 G- g/ N. \
  284.       {
    ; n$ W' M' v' u/ f; }% ~4 q
  285. #endif /* DATA_IN_ExtRAM */6 t$ \) N9 \2 B
  286.         /* Configure default LTDC Layer 0. This configuration can be override by calling
    $ C4 y7 R9 o, s3 H
  287.         BSP_LCD_ConfigLayer() at application level */2 i* H. B6 X* k0 x
  288.         config.X0          = 0;
    & L9 g( U' v' ~: P- N
  289.         config.X1          = Width;1 K, z. _) q* f0 s
  290.         config.Y0          = 0;
    / [* g3 w' _: k# I- R# @
  291.         config.Y1          = Height;
    - [. M" N) [. Q1 N+ H; M9 F, ^: ?3 u. h7 t
  292.         config.PixelFormat = ltdc_pixel_format;
    ' ~$ V& J! P! x
  293.         config.Address     = LCD_LAYER_0_ADDRESS;8 j2 w+ V4 L; f, g  @, T$ c

  294. 6 d* ]" G+ I9 b0 K5 i) K+ s6 |
  295.         if (MX_LTDC_ConfigLayer(&hlcd_ltdc, 0, &config) != HAL_OK)5 h6 a# R3 C+ h. R* k
  296.         {4 v. A& k* k- }% k* m5 P& _
  297.           ret = BSP_ERROR_PERIPH_FAILURE;
    . V, [5 A& L. h
  298.         }
    , O4 J3 t8 e8 z0 t
  299. 0 f7 n+ y8 w2 s9 l9 v, K
  300.         /* By default the reload is activated and executed immediately */
    1 o( A6 }9 L) ~' x' i
  301.         Lcd_Ctx[Instance].ReloadEnable = 1U;& A. S1 u2 W0 {* _
  302. #if defined(DATA_IN_ExtRAM)+ r# U- n5 t' w* W3 v: B
  303.       }9 y- B6 D8 C2 G) p2 {) O; d- f
  304. #endif /* DATA_IN_ExtRAM */( V3 Y; k( ?: ~" s0 o+ G# H9 m
  305.     }2 ]/ R& n2 ^, w1 Y/ K+ b
  306.   }& E: M/ E' `1 ]7 C/ ~/ ^) b2 F

  307. 4 s4 [7 P8 y8 r
  308.   return ret;7 o" M  ^5 _8 c; {0 P1 T
  309. }
    , b* s; g, T$ n4 d) n7 v

  310. ; y# g& W9 h0 y5 l% W
  311. /**
    / M8 E3 d7 Y/ ^$ G0 c2 L: ~
  312.   * @brief  De-Initializes the LCD resources.
    2 s% e3 `6 }5 Z, x
  313.   * @param  Instance    LCD Instance
    ; d$ v: V% C0 O9 ]
  314.   * @retval BSP status
    5 m+ L7 i2 M( h) B2 [3 |
  315.   */
    3 g4 G; v* ?3 v$ ~, C$ P
  316. int32_t BSP_LCD_DeInit(uint32_t Instance)
    7 b1 ~: c) F6 b" A7 R- R
  317. {# R- M0 I+ c3 Q' _! V  T
  318.   int32_t ret = BSP_ERROR_NONE;  z+ _5 [( N# s

  319. 8 H6 ~1 i) o, @  u  ~" \9 F+ `7 W
  320.   if(Instance >= LCD_INSTANCES_NBR)
    ( ~( J. B$ f1 n* @$ o% l
  321.   {, Z- B& x; ]( r, [" `! |! x
  322.     ret = BSP_ERROR_WRONG_PARAM;
    5 x8 u: U- ~; v9 A4 k% o9 k; f: f
  323.   }
    " M) N: a* B0 W2 o
  324.   else
    0 q" u" k. O% Q/ b7 c
  325.   {
    3 h  O7 K5 ?; X* X4 U8 N/ ^
  326. #if (USE_HAL_LTDC_REGISTER_CALLBACKS == 0)
    * D5 w; {- N! U: u- h6 T
  327.     LTDC_MspDeInit(&hlcd_ltdc);
    7 w$ E7 Y5 N. U& {
  328. #endif /* (USE_HAL_LTDC_REGISTER_CALLBACKS == 0) */
    9 l* q) x! @* Z
  329. , |, I3 ~. i7 E0 h
  330.     (void)HAL_LTDC_DeInit(&hlcd_ltdc);$ C# Y" Y9 ^' }, Y: |
  331.     if(HAL_DMA2D_DeInit(&hlcd_dma2d) != HAL_OK)4 L9 H7 F0 `1 R& n2 c
  332.     {, W# V/ s9 ~8 V6 C
  333.       ret = BSP_ERROR_PERIPH_FAILURE;8 I2 Q2 k; q$ @( b/ C' L: {
  334.     }$ x  r! }+ u. e! d# S+ s% X7 A
  335.     else
    2 Y. m% K2 d0 y" L" x
  336.     {) L: W0 m. S- X. O+ N/ e3 F
  337.       DMA2D_MspDeInit(&hlcd_dma2d);7 ^* T' L, j8 k. ?, Y
  338.       Lcd_Ctx[Instance].IsMspCallbacksValid = 0;8 E2 p, ^5 j* o, H0 N
  339.     }9 U- {" a/ {1 n& D5 i, d9 c* }8 u4 l
  340.   }% z" O7 {: b2 M+ b

  341. / {, C% X/ Q9 S0 n
  342.   return ret;
    % e3 S7 a. x0 L4 v
  343. }
    0 s+ R* C! L2 J. m1 i: g  u3 {3 O' t

  344. 7 }7 U0 F. u2 F6 n, P$ k: a' y
  345. /**7 U$ z4 ]' \. K3 l* l
  346.   * @brief  Initializes the LTDC.% [/ @4 J5 p1 i1 x/ L/ O
  347.   * @param  hltdc  LTDC handle, @5 T9 y; @$ L" M4 W
  348.   * @param  Width  LTDC width: T/ S) ~7 N) y. V6 e3 @. Z
  349.   * @param  Height LTDC height3 F7 w+ r/ Z* [2 c/ x. Y5 Y9 T
  350.   * @retval HAL status
    6 H7 T- v+ ~! Q3 Q0 q
  351.   */7 x7 ^  g! @  ?% K4 J4 _) M* U# c
  352. __weak HAL_StatusTypeDef MX_LTDC_Init(LTDC_HandleTypeDef *hltdc, uint32_t Width, uint32_t Height)' a" ?0 U+ Z/ T# c* z5 X
  353. {
    5 J) N, i3 M" K( m6 e
  354.   hltdc->Instance = LTDC;7 W$ b) o9 W* ^  U
  355.   hltdc->Init.HSPolarity = LTDC_HSPOLARITY_AL;
    6 m% G# F8 T/ f3 o- E
  356.   hltdc->Init.VSPolarity = LTDC_VSPOLARITY_AL;/ r3 d" f. [' g
  357.   hltdc->Init.DEPolarity = LTDC_DEPOLARITY_AL;9 n& q. z* T) n' a
  358.   hltdc->Init.PCPolarity = LTDC_PCPOLARITY_IPC;
    5 x0 `% H) x1 `# w8 U
  359. ; |0 D! W9 i5 w6 u& g0 t
  360.   hltdc->Init.HorizontalSync     = (uint32_t)RK050HR18_HSYNC - 1U;# v: Z! _6 e* K# i" [$ J6 F9 ?
  361.   hltdc->Init.AccumulatedHBP     = (uint32_t)RK050HR18_HSYNC + (uint32_t)RK050HR18_HBP - 1U;
    ) I8 Q- ~* `0 I' o$ n" ]& O
  362.   hltdc->Init.AccumulatedActiveW = (uint32_t)RK050HR18_HSYNC + Width + (uint32_t)RK050HR18_HBP -1U;; z! B4 [4 y3 Y+ F+ g( t
  363.   hltdc->Init.TotalWidth         = (uint32_t)RK050HR18_HSYNC + Width + (uint32_t)RK050HR18_HBP + RK050HR18_HFP - 1U;" M/ R; p3 j/ [  ~+ ^: ~2 l
  364.   hltdc->Init.VerticalSync       = (uint32_t)RK050HR18_VSYNC - 1U;- J' Q6 t$ l6 |% @4 K
  365.   hltdc->Init.AccumulatedVBP     = (uint32_t)RK050HR18_VSYNC + (uint32_t)RK050HR18_VBP - 1U;$ f' g- v- }0 W0 G: g! ]2 v
  366.   hltdc->Init.AccumulatedActiveH = (uint32_t)RK050HR18_VSYNC + Height + (uint32_t)RK050HR18_VBP -1U;
    ' N! |- \3 a+ a8 Q. G% Y/ U0 }9 L
  367.   hltdc->Init.TotalHeigh         = (uint32_t)RK050HR18_VSYNC + Height + (uint32_t)RK050HR18_VBP + RK050HR18_VFP - 1U;& {! ?0 F  Q, z

  368. ' T: s' j( O' E7 T4 D, H
  369.   hltdc->Init.Backcolor.Blue  = 0x0;
    % q( _- ~3 C* ?3 c- D0 ^5 L% y& z
  370.   hltdc->Init.Backcolor.Green = 0x0;  h. u* N! y* T. ?( }! v
  371.   hltdc->Init.Backcolor.Red   = 0x0;
    8 ?; p. D7 z% J

  372. 6 t* H. H, V) v1 b
  373.   return HAL_LTDC_Init(hltdc);; i8 U# K# [  C+ n1 W- E
  374. }
    / }7 Y4 H9 x! G) t# }
  375. # s0 C" b( K$ j8 Q5 D
  376. /**& h! b5 _  K1 r: b) S# J; T
  377.   * @brief  MX LTDC layer configuration.4 P+ _; e9 t3 Q2 x0 n" w, U+ W
  378.   * @param  hltdc      LTDC handle
    . P# X( k% S) ^/ E. `0 }* A. ~
  379.   * @param  LayerIndex Layer 0 or 1/ q4 }2 g% g2 g7 v# V
  380.   * @param  Config     Layer configuration) Y, ]# B1 h! E: a
  381.   * @retval HAL status# B$ G. l: g+ T& ]
  382.   */( o' V/ q( g5 u) Y
  383. __weak HAL_StatusTypeDef MX_LTDC_ConfigLayer(LTDC_HandleTypeDef *hltdc, uint32_t LayerIndex, MX_LTDC_LayerConfig_t *Config)0 y: }- Y" V, y
  384. {
    ! E  D7 C) @. F, p" d3 Q
  385.   LTDC_LayerCfgTypeDef pLayerCfg ={0};7 C0 f  w1 D# C& ^$ ]/ v8 d
  386. $ r' q# `0 S5 A
  387.   pLayerCfg.WindowX0 = Config->X0;
    6 ]$ B; S3 s; E: m
  388.   pLayerCfg.WindowX1 = Config->X1;
    1 Y/ k  l+ k$ E5 h3 O/ d
  389.   pLayerCfg.WindowY0 = Config->Y0;6 ?0 X4 D7 t. F) Q) n
  390.   pLayerCfg.WindowY1 = Config->Y1;' i6 Z/ m3 {$ A
  391.   pLayerCfg.PixelFormat = Config->PixelFormat;7 ?: e4 U! T5 u; p( i
  392.   pLayerCfg.Alpha = LTDC_LxCACR_CONSTA;( Z8 ]& J# i4 ^* N, ~+ u9 u9 O. m! g
  393.   pLayerCfg.Alpha0 = 0;+ ~6 W6 S5 `5 E3 y# z
  394.   pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;% U3 t  V8 c6 x# @  k! J+ n
  395.   pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;6 _% G* ~0 V0 n  c7 ~: ?
  396.   pLayerCfg.FBStartAdress = Config->Address;2 i3 z; F( Z8 E/ n6 W! ?
  397.   pLayerCfg.ImageWidth = (Config->X1 - Config->X0);
    8 A& I  q+ n- t( R6 W- [8 Y) n
  398.   pLayerCfg.ImageHeight = (Config->Y1 - Config->Y0);: u- f2 D: V* ]( }0 c
  399.   pLayerCfg.Backcolor.Blue = 0;! W9 T3 L( L6 V& T
  400.   pLayerCfg.Backcolor.Green = 0;. j# J* o( v; p! U
  401.   pLayerCfg.Backcolor.Red = 0;0 J# x* [4 j/ {  R+ ]
  402.   return HAL_LTDC_ConfigLayer(hltdc, &pLayerCfg, LayerIndex);# G: ?" S; Y3 E3 o- |
  403. }/ `* S; x4 |1 h* g) F1 r1 G8 ~
  404. 3 |8 F2 p5 }: x; u' l5 N2 }
  405. /**. Y7 T& w+ H' d" O/ Y& b$ O6 _
  406.   * @brief  LTDC Clock Config for LCD DPI display.8 s% p# o, t4 n# l# ?: V* i- D& ]
  407.   * @param  hltdc  LTDC Handle" R5 J4 N! K* r" l; m0 o8 ^
  408.   *         Being __weak it can be overwritten by the application
    $ }9 D  h2 k) @( p
  409.   * @retval HAL_status" C* ?) F2 g* }$ _0 p) c# O3 u. c
  410.   */, j' D% n5 C0 u5 A7 Y
  411. __weak HAL_StatusTypeDef MX_LTDC_ClockConfig(LTDC_HandleTypeDef *hltdc)& p0 H4 P  t  z( S8 C
  412. {
    ! K9 ?% K3 L/ K) w. L
  413.   /* Prevent unused argument(s) compilation warning */. y) Y0 I8 y# K% S
  414.   UNUSED(hltdc);- A  ^) C8 r4 l- C+ Q4 K, n- h) `

  415. " V4 k" W0 i" i9 E/ A. t
  416.   HAL_StatusTypeDef   status =  HAL_OK;/ b7 A3 J# F# I% D+ O/ [
  417.   RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInitStruct = {0};( N$ L  F& G, f

  418. 4 R5 M# R- x4 R8 w+ X
  419.   /* LCD clock configuration */$ G( C4 p9 _9 k# ?. f- x4 V3 ]
  420.   /* Typical PCLK is 25 MHz so the PLL4 is configured to provide this clock */
    ) {5 [# G, y# k4 y3 H+ n* ?
  421.   /* LTDC - PLL4 */
    : h9 G: A& h5 T+ s. g
  422.   /* Configure LTDC clock to IC16 with PLL4  */# t) I3 ^9 S2 Q

  423. 3 Q4 G, T2 v3 C9 d: K* A; e2 u* Y
  424.   /* LCD clock configuration */
    % _- ^  L$ X8 ?
  425.   /* Typical PCLK is 25 MHz so the PLL4 is configured to provide this clock */4 L" }4 V% H0 [3 x- L
  426.   /* LCD clock configuration */
    4 p) h4 ^6 a# e: Q; p4 @( F  v
  427.   /* PLL3_VCO Input = HSE_VALUE/PLLM = 48 Mhz / 192 = 0.25 */% g0 a" H4 i: M" i: a
  428.   /* PLL3_VCO Output = PLL3_VCO Input * PLLN = 0.25 Mhz * 100 = 25 */& g% v9 R/ i2 b9 C; F' C% ?6 ~
  429.   /* PLLLCDCLK = PLL3_VCO Output/(PLLP1 * PLLP2) = 25/1 = 25Mhz */+ i" J$ h1 H4 H% \' o# F
  430.   /* LTDC clock frequency = PLLLCDCLK = 25 Mhz */$ T  h% p3 x4 B, T8 _

  431. 1 K: p* k8 y* }- s, a
  432.   RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC;3 T6 i% j5 f( P8 F6 ~1 E  |
  433.   RCC_PeriphCLKInitStruct.LtdcClockSelection = RCC_LTDCCLKSOURCE_IC16;
    4 d# m8 T! w3 P0 H% l4 Q; u
  434.   RCC_PeriphCLKInitStruct.ICSelection[RCC_IC16].ClockSelection = RCC_ICCLKSOURCE_PLL4;# g/ `( x2 d3 \. n3 P+ _
  435.   RCC_PeriphCLKInitStruct.ICSelection[RCC_IC16].ClockDivider = 2;
      j& A+ y4 I9 ]3 b* {
  436.   if (HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct) != HAL_OK)
    " _7 y6 A) u. U7 D  q# T
  437.   {
    9 R3 u  P  N$ p* s: L. E
  438.     status = HAL_ERROR;# p  r% M# S* x0 }. ^3 Q0 Y) r$ B& q
  439.   }
    & @! D7 |9 o" S) U! i5 @* i2 s, U2 q

  440. 2 H  ?: i6 W! ?& a8 ~/ g. ?4 c
  441.   return status;& b7 x  x  a% L, l
  442. }0 [, O- W  V" h

  443. ) u" z( @7 x& v
  444. #if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1). A( l/ o( L" k3 A; E5 P: w5 {) r2 p
  445. /**% n* H* [) t7 r6 v
  446.   * @brief Default BSP LCD Msp Callbacks
    ; K3 d8 r' O+ T  n2 g- t* T
  447.   * @param Instance BSP LCD Instance& p; W$ d3 H& f+ f/ E
  448.   * @retval BSP status- y) S1 l8 }, w. y4 y7 C4 [( v
  449.   *// m' i1 T* f" n% D9 ?' O
  450. int32_t BSP_LCD_RegisterDefaultMspCallbacks (uint32_t Instance)
    9 l( Z/ l* |2 W# Y5 j3 E
  451. {" U7 ]( [! L1 v7 r. m3 q' j
  452.   int32_t ret = BSP_ERROR_NONE;
    ! O& U9 t/ G% B
  453. 7 k( U4 }# ~. F) S
  454.   if(Instance >= LCD_INSTANCES_NBR)/ S* V3 ~* b6 Q# M2 {7 q# Q
  455.   {
    % h0 E+ g2 ^7 i% H1 u* S
  456.     ret = BSP_ERROR_WRONG_PARAM;+ q3 G. Q( I5 e7 e7 U5 G3 K( r: I
  457.   }; M: E0 P  T+ Q$ S$ T$ d+ k( l
  458.   else$ a4 T" G+ o: Y: r; Z
  459.   {
    5 `. q6 I/ i/ v6 _& }
  460.     if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPINIT_CB_ID, LTDC_MspInit) != HAL_OK)6 v$ [% }! y. o3 a2 D( u! M( C
  461.     {9 V2 m/ i/ X/ D1 C" B* d
  462.       ret = BSP_ERROR_PERIPH_FAILURE;
    ! t8 `8 r1 J6 c$ {
  463.     }# h' m0 \7 i9 [  z' a
  464.     else
      N1 s8 _, [7 O! i  ?
  465.     {* r0 A" s4 J; h  Q. N1 K
  466.       if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPDEINIT_CB_ID, LTDC_MspDeInit) != HAL_OK)
    5 F. B- b6 \+ K: F5 H6 m
  467.       {4 ~* ~1 I7 l* q- u2 H
  468.         ret = BSP_ERROR_PERIPH_FAILURE;' W% i$ |6 x( ?9 c) _. W
  469.       }7 ^+ a8 O" c% U. R
  470.     }7 G% i6 n3 Q7 H. O3 _9 `$ H5 G
  471. / V0 d2 B6 _" x# N0 E& S% l4 _2 r
  472.     Lcd_Ctx[Instance].IsMspCallbacksValid = 1;* _, R% u6 R' s! o7 ^' v+ c8 M% K7 u
  473.   }& B& k- G( I9 O) j4 f
  474. 3 G) |9 P; P; ~
  475.   return ret;" O; c: K9 M" n: E1 {+ _* ?6 z! U
  476. }8 @+ z/ t) f2 Y7 G: c

  477. . W! `! J7 b9 N) i9 w0 o
  478. /**
    $ J( r% J! |8 K) {
  479.   * @brief BSP LCD Msp Callback registering- t: z9 `* R) g0 z
  480.   * @param Instance    LCD Instance% U( P* x- T# t
  481.   * @param CallBacks   pointer to LCD MspInit/MspDeInit functions
      }. F7 B* x) F1 p( m& W$ m2 L
  482.   * @retval BSP status  z& k, z: b: B+ u5 U
  483.   */4 ~+ i1 N; o* Z* q/ `5 e
  484. int32_t BSP_LCD_RegisterMspCallbacks (uint32_t Instance, BSP_LCD_Cb_t *CallBacks)
    / y$ W6 R1 q9 ~1 Y5 |
  485. {+ d. o8 u  t( C2 X+ D
  486.   int32_t ret = BSP_ERROR_NONE;
    1 c: Q/ Q; ?/ ~- H5 S6 k' }
  487. ; g6 I" W* k) }, z. c
  488.   if(Instance >= LCD_INSTANCES_NBR)1 S5 P6 Z! k# R; I
  489.   {8 j3 C, s$ y3 x( v  E; a
  490.     ret = BSP_ERROR_WRONG_PARAM;
    3 r# D- E- g5 k" M( _4 l  T
  491.   }
    7 c( t# l$ K* ~- M7 ]& s% d
  492.   else
    ' g9 V3 i  l/ B6 R1 F' q) l" i
  493.   {
    0 D3 i! H( D  z( D& w
  494.     if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPINIT_CB_ID, CallBacks->pMspLtdcInitCb) != HAL_OK)7 g+ j6 K0 y" K( p/ Y9 [: ~
  495.     {' {- K0 T+ J; R) J# n& ]9 l
  496.       ret = BSP_ERROR_PERIPH_FAILURE;' _$ `9 L: |( L% A7 {- |
  497.     }
    * I6 t' W" g6 p: u% V- z$ H
  498.     else
    / K  H- [7 u5 Y+ _& A
  499.     {
    0 b( @1 O) a4 o1 Y3 N* G+ D$ V: u
  500.       if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPDEINIT_CB_ID, CallBacks->pMspLtdcDeInitCb) != HAL_OK)3 k2 B' B( @7 F" T0 Q4 K
  501.       {/ E- a! u9 g  \; Y8 o
  502.         ret = BSP_ERROR_PERIPH_FAILURE;
    $ v) G( Q4 i0 O# [; L# Z9 V
  503.       }
    , [2 P* N2 y& C' m
  504.     }
    & N/ y0 K4 j! @5 v

  505. . _& V" \/ U& n. h8 ^, y
  506.     Lcd_Ctx[Instance].IsMspCallbacksValid = 1;
    6 R* B3 [9 Q. Q& u! \; s1 y
  507.   }2 T! k( r: v. L/ X. I$ N% k. M; e" G

  508. 0 q% \  Z2 h* s: F6 h: v
  509.   return ret;
    . M% u; j: h8 }3 {8 }
  510. }
    / y' r0 x* C7 T! F$ W
  511. #endif /*(USE_HAL_LTDC_REGISTER_CALLBACKS == 1) */
    / J* T2 n4 v& }. m) F
  512. 8 p; d: p1 _% V" \9 r5 k
  513. /**
    & |! L' b3 N5 R. A/ R' i
  514.   * @brief  LTDC layer configuration.
    , c9 p5 {: H+ ?/ x  o0 Z
  515.   * @param  Instance   LCD instance
    8 Q+ ]& n6 [8 s
  516.   * @param  LayerIndex Layer 0 or 1
    ( ~) Y* o* `1 V5 Y
  517.   * @param  Config     Layer configuration+ t( P2 N, j2 Y. w
  518.   * @retval HAL status
    0 G$ D8 P4 S- S  i
  519.   */$ ]* J8 F/ ~! T/ a2 @" C
  520. int32_t BSP_LCD_ConfigLayer(uint32_t Instance, uint32_t LayerIndex, BSP_LCD_LayerConfig_t *Config)
    ; F; ]  J9 G  F
  521. {) W/ e6 z7 q- R0 f3 t6 b: I
  522.   int32_t ret = BSP_ERROR_NONE;. E4 ?/ g6 r2 G7 m: M9 s( p* N
  523.   if(Instance >= LCD_INSTANCES_NBR); Q& O: w" Y  X: [
  524.   {
    ; x4 J% p  X* L* U# S
  525.     ret = BSP_ERROR_WRONG_PARAM;
    6 j7 [, @% b2 v* @3 {1 K  Y* K
  526.   }% o6 q( g- m1 `# S9 X# T9 i1 n
  527.   else
    . w! N# Q/ t+ C% c' }0 b
  528.   {* y7 }* j- }' R2 F
  529.     if (Config->PixelFormat ==  LCD_PIXEL_FORMAT_RGB565)7 Z/ a8 g* x% t
  530.     {
    1 y" x+ ], v; e
  531.       Config->PixelFormat = LTDC_PIXEL_FORMAT_RGB565;$ m. [; y8 _) P/ o; J
  532.     }( o4 }( q$ L; U
  533.     else if (Config->PixelFormat ==  LCD_PIXEL_FORMAT_ARGB4444)1 f5 m0 R" D) U3 x2 _4 W7 Q* e
  534.     {
    # k& b4 [$ c; l! g
  535.       Config->PixelFormat = LTDC_PIXEL_FORMAT_ARGB4444;& H, l# m0 \, c. d; }  k
  536.     }  x- @9 ~4 A/ J# O
  537.     else if (Config->PixelFormat ==  LCD_PIXEL_FORMAT_ARGB8888)
    + G# U" C& C+ ?1 U  S6 u1 y
  538.     {* d. R$ {1 G# u: v
  539.       Config->PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888;
    . u, Z9 y: F& J1 H( w' d
  540.     }
    , q2 n& u) O% E% ~
  541.     else
    9 m$ u  S2 o4 k: ^+ Y6 r
  542.     {6 m& C4 q& G0 [" v& f
  543.       Config->PixelFormat = LTDC_PIXEL_FORMAT_RGB888;+ }" l4 f6 ^% R$ w6 G, l* M
  544.     }
      w5 q: ?9 r: g$ q( ?; L
  545.     if (MX_LTDC_ConfigLayer(&hlcd_ltdc, LayerIndex, Config) != HAL_OK)
    - g$ ~' G" Z% J4 @: l
  546.     {
      N( v0 r' |" Y1 g. q
  547.       ret = BSP_ERROR_PERIPH_FAILURE;4 e+ F. Y$ I5 _, o8 N1 e) z
  548.     }
    . R. k( a! \6 E" \3 W* D
  549.   }0 g  {4 B0 m2 i$ E6 P1 W- [
  550.   return ret;5 Y# J% `% Z1 J5 D1 F
  551. }
    $ l' R. O" x& {2 r, h' ?2 D' c3 R

  552. - s( T2 ?# G$ m; C  Q7 \$ W2 i$ W
  553. /**
    8 c' L( C9 U- N% w! h' f" k% q
  554.   * @brief  Gets the LCD Active LCD Pixel Format.
    / I  x0 \8 N! @! E8 b
  555.   * @param  Instance    LCD Instance! t  e% d* X: S5 H$ Z0 U5 s# b
  556.   * @param  PixelFormat Active LCD Pixel Format
    2 |( O+ H8 s4 v( I, N
  557.   * @retval BSP status8 }4 Y3 D2 `0 z' t4 T& w
  558.   */
    / p4 ?1 y" q- ]. t/ ^: |4 c
  559. int32_t BSP_LCD_GetPixelFormat(uint32_t Instance, uint32_t *PixelFormat)
    2 P( y! Z3 c' b4 `
  560. {
    - ?$ s7 \/ }, G1 I' {2 G- Y
  561.   int32_t ret = BSP_ERROR_NONE;7 ~7 J3 w8 N& T; v3 D
  562. 2 ~4 z& p: v  P; X
  563.   if(Instance >= LCD_INSTANCES_NBR)
    8 P6 B2 P5 E" u7 |4 _7 \
  564.   {, ?' s! t9 Y& P0 p1 F/ X3 L0 W6 f1 o
  565.     ret = BSP_ERROR_WRONG_PARAM;4 F0 A* k4 }* K& A; Y; V$ ^! U2 w
  566.   }
    6 Z. p) j' P+ w2 L3 {
  567.   else* h9 Q3 s- ~* \* v+ J
  568.   {2 \  X7 P8 a0 O+ c
  569.     /* Only RGB565 format is supported */( p1 ]0 O9 u' [
  570.     *PixelFormat =  Lcd_Ctx[Instance].PixelFormat;$ @0 [$ ]+ y$ |8 ]
  571.   }; [7 a$ F8 r- C8 [/ J# R

  572. 2 X' b3 t& O2 _3 [
  573.   return ret;
    7 p- v/ J4 p; f) F2 M6 {
  574. }" |$ _7 E& D$ b
  575.   c4 {% ^9 l( d8 j
  576. /**
    ' Z/ J' D  Q+ e& L
  577.   * @brief  Set the LCD Active Layer.
    : p1 ]5 ^8 [% G/ w2 h0 g0 O
  578.   * @param  Instance    LCD Instance* u( W, I$ U; f& ]9 s$ R
  579.   * @param  LayerIndex  LCD layer index
    . A% [, Y8 p8 [, N3 `' v
  580.   * @retval BSP status
    $ H" z. l2 H, `. ]: o, f* c
  581.   */! P  X0 v8 P% {2 w! J$ X3 L
  582. int32_t BSP_LCD_SetActiveLayer(uint32_t Instance, uint32_t LayerIndex)) C' t! ]* {6 W0 M
  583. {, }! p6 C2 x$ }5 d3 F1 E
  584.   int32_t ret = BSP_ERROR_NONE;) O% V7 I* r, u. d) `" K
  585.   LTDC_LayerCfgTypeDef *pLayerCfg;
    9 s  h. w1 b' A
  586. ) O' r& j+ e1 s, v7 W( Y
  587.   if(Instance >= LCD_INSTANCES_NBR)
    2 }+ }* p, J3 x0 L
  588.   {  d8 b6 E, X4 f0 q
  589.     ret = BSP_ERROR_WRONG_PARAM;
    : T6 [- R- e( t  l( ?2 c
  590.   }
    0 G  N. e# W0 y) q( H
  591.   else
    * x9 {$ R& |" O7 G
  592.   {
    5 w6 ^/ R& t1 L" Z% k
  593.     pLayerCfg = &hlcd_ltdc.LayerCfg[LayerIndex];- X" p$ {& T$ a. y* ?

  594. % H+ m7 {* l) [  R/ i8 m$ W+ q
  595.     Lcd_Ctx[Instance].ActiveLayer = LayerIndex;5 Q/ X8 K4 K9 l; l/ b4 v
  596.     Lcd_Ctx[Instance].XSize = pLayerCfg->ImageWidth;
    " L* `" p# t( K  J& B
  597.     Lcd_Ctx[Instance].YSize = pLayerCfg->ImageHeight;
    0 ~8 P7 i3 D* c- ^  z/ x( o
  598. , Y; f* ?& V7 }3 }4 [$ p( k" g
  599.     if (pLayerCfg->PixelFormat ==  LTDC_PIXEL_FORMAT_RGB565)
    $ b4 r% T' [6 U4 S6 E! |5 c
  600.     {8 ^  P0 Z7 Y1 O, y7 ]0 R
  601.       Lcd_Ctx[Instance].BppFactor = 2;, L9 F: Z- N) i5 f, v" w$ h7 F7 N; d
  602.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_RGB565;
    + s. H/ d' t" Y' O( [5 U( b% P) Q
  603.     }
    / _$ i. X+ Y3 Q( W( o
  604.     else if (pLayerCfg->PixelFormat ==  LTDC_PIXEL_FORMAT_ARGB4444)' ^+ x. P0 @9 L( j3 x. t* ]
  605.     {
    " v7 X9 Y! q. S8 L7 s
  606.       Lcd_Ctx[Instance].BppFactor = 2;) o4 r. U/ K4 J; @
  607.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_ARGB4444;7 ?# m( X2 H$ q& O* F: R8 |
  608.     }
    " O+ N. ^, I4 u8 k) A3 t# c
  609.     else if (pLayerCfg->PixelFormat ==  LTDC_PIXEL_FORMAT_RGB888)( u4 W" [* S$ R* a# ~  I! f
  610.     {% q# I6 [' z& x5 D6 S& k4 w. F, g
  611.       Lcd_Ctx[Instance].BppFactor = 3;: ?$ B& N6 x6 N
  612.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_RGB888;
    5 C) [( V6 K- e& b  D/ I
  613.     }
    5 h0 F  b8 V+ `( q0 ~8 k/ v+ o/ @
  614.     else/ w, d% |- P' o; C
  615.     {
    & ^+ d1 c0 R- M9 [) _
  616.       Lcd_Ctx[Instance].BppFactor = 4;
    * L0 x5 j$ u! G$ u- C
  617.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_ARGB8888;
    : ^; K$ s  d" f; |/ V
  618.     }
    ! ^3 S& a: Q! I( ~5 ?
  619.   }
    % f8 C* X6 d1 n6 M0 T& I

  620. . b; F' d2 J' p
  621.   return ret;* R. y5 P: q! O
  622. }
    0 }7 n8 z' g/ ]# T9 h: E$ t

  623. ( ]3 H0 G8 K, S* {
  624. /**
    , \7 b2 m4 w9 M% D, d
  625.   * @brief  Control the LTDC reload
    ; S* Q$ J2 l/ W
  626.   * @param  Instance    LCD Instance% h/ H# R. i7 i' B9 ^# R
  627.   * @param  ReloadType can be one of the following values
    % E! O% C( H* B. Y' K
  628.   *         - BSP_LCD_RELOAD_NONE
    7 {) g, v( h5 _6 G2 |5 E! p% H
  629.   *         - BSP_LCD_RELOAD_IMMEDIATE, y& A% a: i) N2 K, O$ G. x1 A
  630.   *         - BSP_LCD_RELOAD_VERTICAL_BLANKING
    % w3 G4 ]$ o8 |( o  p, T
  631.   * @retval BSP status
    / t) d1 x3 r6 S1 b: X/ i
  632.   */5 E$ I. D  @* {
  633. int32_t BSP_LCD_Reload(uint32_t Instance, uint32_t ReloadType): v8 b# P9 C+ _( d" U! y2 |, z  w
  634. {  S: l6 V* I1 v6 {" j# B! @4 _
  635.   int32_t ret = BSP_ERROR_NONE;
    3 w5 `# L9 m. G( U# ^! o

  636. . a* ^+ e4 }  Z' f' ]+ O
  637.   if(Instance >= LCD_INSTANCES_NBR)" _$ p; u; O3 X  }+ l
  638.   {- e1 S4 l: q  I1 a
  639.     ret = BSP_ERROR_WRONG_PARAM;
    5 n! z% d+ T7 b5 A
  640.   }! |( S  X  [/ B
  641.   else if(ReloadType == BSP_LCD_RELOAD_NONE)
    2 r2 F  f- h7 V9 x$ o
  642.   {; ]: Q4 V8 H( {% {
  643.     Lcd_Ctx[Instance].ReloadEnable = 0U;
    $ S2 D" \$ B( D" f
  644.   }9 l# Q7 v2 I8 G$ W9 e4 Y  G
  645.   else if(HAL_LTDC_Reload(&hlcd_ltdc, ReloadType) != HAL_OK)
    3 S7 V: |: ^( w3 L  I7 i
  646.   {
    ( u1 g, C, a$ G; Z- ^1 z1 D2 K
  647.     ret = BSP_ERROR_PERIPH_FAILURE;
    6 B  n8 b- u5 h+ \. V
  648.   }
      @' j8 {7 F. G) b+ O5 [( b& u
  649.   else* p: i% w: G+ M5 ?! M* ?9 u" U
  650.   {
    * x3 H: {0 r! z3 K
  651.     Lcd_Ctx[Instance].ReloadEnable = 1U;0 R# _% S! P7 b' y8 |7 s& e
  652.   }
    1 \: Q4 U2 |, c- {1 u4 g5 O, P
  653. $ N, _0 }, }8 ]3 F  M) c. S  X
  654.   return ret;4 Y5 p3 c' O* t: `$ p# j7 i
  655. }
    + S3 d/ L+ W' R! z9 Z

  656. " L& P) {2 A  E2 g
  657. /**
    ' y& P, m7 w: w' f9 a
  658.   * @brief  Sets an LCD Layer visible
    : Y8 P" f+ u3 A
  659.   * @param  Instance    LCD Instance' p( J) c! {7 v3 B+ m) F
  660.   * @param  LayerIndex  Visible Layer
    ) J# A4 x" Z8 ^( y- u+ V4 K3 x: ~
  661.   * @param  State  New state of the specified layer; y& ]3 X9 N8 N" [
  662.   *          This parameter can be one of the following values:1 Q, E+ l# V9 _1 B1 V, ]2 ^
  663.   *            @arg  ENABLE
    7 O1 O1 q( k' t3 e- d7 n0 [2 Y
  664.   *            @arg  DISABLE$ [; R- I3 ?: m) y0 K* u
  665.   * @retval BSP status
    , N# K0 ~# h* X1 f# V( X  ?
  666.   */* q' _" R7 M6 {" Z
  667. int32_t BSP_LCD_SetLayerVisible(uint32_t Instance, uint32_t LayerIndex, FunctionalState State)0 Q7 |' h& z- k0 v! m9 ~, S6 R
  668. {
    6 c, J* Y; {8 |& A* y9 S
  669.   int32_t ret = BSP_ERROR_NONE;
    , @- g1 N( u' d! \- G% B5 h
  670. / d" n  w3 D* `! l8 e+ s. i4 C
  671.   if(Instance >= LCD_INSTANCES_NBR)
    , x0 v  g; x2 q8 ~( M* X5 z  B
  672.   {
    ; ]' r+ c3 v, b0 {( W
  673.     ret = BSP_ERROR_WRONG_PARAM;
    4 u' `6 \: p. O
  674.   }
    ; V7 v9 B) e# _. s; z
  675.   else- Z# D" d/ ?1 H# Z
  676.   {
    $ w# g2 Y8 v! S
  677.     if(State == ENABLE)
    ' [! O, k7 Z0 n; p7 d
  678.     {) F0 h: `0 `; W% ]' V/ ^, `% ~* t
  679.       __HAL_LTDC_LAYER_ENABLE(&hlcd_ltdc, LayerIndex);) H4 J+ h2 j- C0 A
  680.     }5 X* R) A2 \' z/ Q/ F0 T
  681.     else
    2 F- w0 k9 c' _  x; [4 r, e
  682.     {& f6 t* u2 b& S# x, u' Q! R& M8 U
  683.       __HAL_LTDC_LAYER_DISABLE(&hlcd_ltdc, LayerIndex);" t; [" D; S' A0 i' |, u/ i
  684.     }
      |1 K' O/ i! u5 W% b
  685. ( @4 `& ~: F# S* A+ {
  686.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)' i$ B6 x$ F) ?( f" P6 C/ M
  687.     {4 a; q' k$ f- e) A
  688.       __HAL_LTDC_RELOAD_IMMEDIATE_CONFIG(&hlcd_ltdc);5 i' |# x8 E2 X% y" J! c. J; T
  689.     }; X1 ?  z- f  M, D
  690.   }4 Y. ?! Y/ w' `2 @  C- f6 h( N6 `
  691. 9 Z$ N3 _- v! \$ T2 S3 a8 S) W
  692.   return ret;4 ^$ S1 U! Y( s+ e9 K+ Z
  693. }" Y' ~) x5 _  D6 j9 \4 Z
  694. + L6 p' X1 ^- P0 k/ l5 `
  695. /**
    ) w/ D- `1 [) `- P9 w2 Z4 ^- @
  696.   * @brief  Configures the transparency.
    6 F9 V: G$ N4 F# e, h5 v8 g
  697.   * @param  Instance      LCD Instance
    ( x" K# ~4 v* }; q
  698.   * @param  LayerIndex    Layer foreground or background.
    1 V, q' E2 z: N! z3 w  Q
  699.   * @param  Transparency  Transparency
    1 Y7 K/ Q2 ~$ }+ M8 w
  700.   *           This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF. Q% q% h5 {! n* `' ~
  701.   * @retval BSP status
    : l& S8 \5 x! {
  702.   */
    * ]; T8 ?' N& ?5 k
  703. int32_t BSP_LCD_SetTransparency(uint32_t Instance, uint32_t LayerIndex, uint8_t Transparency)
    1 Q$ a5 D4 W! t" ]8 U* |2 i0 O
  704. {
    " \1 S& {# R4 ]( T& ~: {3 P1 k
  705.   int32_t ret = BSP_ERROR_NONE;, a9 J! z+ q) M! M* m" y/ n+ D$ A9 ^
  706.   P4 c8 z! T( P; `9 W6 b, d1 B2 U
  707.   if(Instance >= LCD_INSTANCES_NBR)
      \' i3 c$ ^  @# ~
  708.   {3 n* E' M" Z: ?% |
  709.     ret = BSP_ERROR_WRONG_PARAM;! |+ g% ?+ ^, y0 b7 L
  710.   }, B/ k) c- F6 c( A
  711.   else
    1 a5 m! k3 _3 d; h- ~& g, S
  712.   {% M. u" k9 h; b# e8 W1 S, x1 S4 e
  713.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)( f* P/ ^# J. h. ^6 ]
  714.     {2 O! e; h. U) |; _4 n; w' B
  715.       (void)HAL_LTDC_SetAlpha(&hlcd_ltdc, Transparency, LayerIndex);
    / _8 n! u1 G3 @. J9 L5 q
  716.     }
    ) l; f5 D. f  a: X2 W8 X% D2 m# _, {
  717.     else
    & D* R- H+ }/ m) h" Q) r3 p
  718.     {  ?- Q4 [' c1 A" Q! M9 s
  719.       (void)HAL_LTDC_SetAlpha_NoReload(&hlcd_ltdc, Transparency, LayerIndex);+ X, M; c1 h" }* n! o
  720.     }4 k7 j" i4 U7 m
  721.   }
    % X8 H# H! D9 v2 t( v" Y% k4 k) U5 ]

  722. . s, z9 o1 J. v2 S. s7 a
  723.   return ret;# u3 t9 z0 S8 T/ d3 j
  724. }
    # l# N- j. E+ c0 P# y9 _1 W
  725. 0 H0 X4 t" R, F2 _% _% Q% o: H
  726. /**
    5 v) O* `) ~5 J5 q
  727.   * @brief  Sets an LCD layer frame buffer address.' E4 F4 C; h0 }# B: N% ?; ^: g( d7 W
  728.   * @param  Instance    LCD Instance! @) K* K* d. C$ _. |: \
  729.   * @param  LayerIndex  Layer foreground or background
    5 |; i9 t- ~' S7 B' y
  730.   * @param  Address     New LCD frame buffer value
    , N( P7 j# Z& d& H3 _  ~" _$ ?
  731.   * @retval BSP status
      i# s- _2 c. G
  732.   */% S1 v0 `3 ?% h& p$ S" F2 X
  733. int32_t BSP_LCD_SetLayerAddress(uint32_t Instance, uint32_t LayerIndex, uint32_t Address)) n" r6 z, C2 t6 l! A
  734. {
    ; Q9 R7 u0 u' B% E1 X1 A) R
  735.   int32_t ret = BSP_ERROR_NONE;& y5 a1 M% _8 M& j
  736. ) W: C& x3 L+ g- x
  737.   if(Instance >= LCD_INSTANCES_NBR)
    $ }, d, w& ^, J- _/ ~# y
  738.   {
    / g7 ]; p7 B& ?) t4 V
  739.     ret = BSP_ERROR_WRONG_PARAM;
    ! o# t6 w% S  s- @
  740.   }7 j0 U+ c6 @! I, `) x3 s- z! a2 I
  741.   else
    # N( E/ q# U; m7 h8 H% j
  742.   {
    % E& V  A+ {2 M  @2 c( H6 N
  743.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    # z' ?' o% n  f5 h
  744.     {
    1 f5 T' D0 W1 O) z- `/ @! `
  745.       (void)HAL_LTDC_SetAddress(&hlcd_ltdc, Address, LayerIndex);
    + _7 |  D: d! k, d
  746.     }1 Z9 |; m5 A( B
  747.     else
    1 _, Z  J+ C) l1 N
  748.     {
    4 Z3 S5 J( T$ S! w- A. o
  749.       (void)HAL_LTDC_SetAddress_NoReload(&hlcd_ltdc, Address, LayerIndex);
    4 k* v# ^1 I7 m2 N$ L
  750.     }8 {: h7 w) o* H* Z# z0 f
  751.   }
    : z0 ^1 b' ^4 E8 I

  752. $ H" Z6 e( s4 N
  753.   return ret;% `* S7 m; `6 n' e8 q3 \$ J
  754. }
    % e  x7 s& S' G3 i0 f! I7 w5 ^2 }

  755. - |4 \7 G* ~1 j1 h2 C* R  D- @
  756. /**0 y9 f2 B" K" O( H2 p; G
  757.   * @brief  Sets display window.1 i2 Y, z0 r9 {$ g) u
  758.   * @param  Instance    LCD Instance" P5 h- k8 l3 V$ E- Y( k
  759.   * @param  LayerIndex  Layer index" K  j, q4 Q; g: O' t* D, E
  760.   * @param  Xpos   LCD X position
    ) a$ D# ~+ U; R) F4 S7 ?5 L
  761.   * @param  Ypos   LCD Y position
    ' D* G0 @; [- }1 B* O) g
  762.   * @param  Width  LCD window width2 r' \# f9 B( ?) ?/ p
  763.   * @param  Height LCD window height# T+ R# J) p" k- M& S! o% o
  764.   * @retval BSP status  @# H9 {8 O! e0 ~0 ]9 M
  765.   */
    + d: n" k% c% ^: w7 D: R% E# `
  766. int32_t BSP_LCD_SetLayerWindow(uint32_t Instance, uint16_t LayerIndex, uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)7 I' j: g7 r8 Q) X
  767. {  b2 E- w1 l3 c/ h
  768.   int32_t ret = BSP_ERROR_NONE;
    % @4 Q, s# V7 \
  769. 0 [$ ]3 T$ M0 O* J; s! E' w: Z
  770.   if(Instance >= LCD_INSTANCES_NBR)) f/ D2 Z' r" t& o9 Z0 M! A4 U
  771.   {! k" n0 }7 N8 g9 @
  772.     ret = BSP_ERROR_WRONG_PARAM;
    ' Z2 c( S4 l& E; n7 e
  773.   }
    ; H! h/ t; _+ E  B& a& @
  774.   else) {6 @3 m4 R. `9 I
  775.   {# Q3 z( F* z9 G/ r" W
  776.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
      q$ O. ~' K+ y( A) P* b) o
  777.     {
    5 z# F6 s% y( p8 h) V
  778.       /* Reconfigure the layer size  and position */
    6 Q4 @: a+ h; w2 J  K
  779.       (void)HAL_LTDC_SetWindowSize(&hlcd_ltdc, Width, Height, LayerIndex);
    ; R! O: w3 P2 i0 v0 `1 {3 ]2 J
  780.       (void)HAL_LTDC_SetWindowPosition(&hlcd_ltdc, Xpos, Ypos, LayerIndex);) [0 k5 e" k, N: H
  781.     }6 `# A  c% C" }& A
  782.     else
    3 G5 T5 X) Q7 I8 s6 h  @6 v
  783.     {
    : [9 R: _) a- }* F0 C- q6 Q
  784.       /* Reconfigure the layer size and position */* ?; c2 \" `6 H# d
  785.       (void)HAL_LTDC_SetWindowSize_NoReload(&hlcd_ltdc, Width, Height, LayerIndex);3 Q1 B! E, c4 n( l
  786.       (void)HAL_LTDC_SetWindowPosition_NoReload(&hlcd_ltdc, Xpos, Ypos, LayerIndex);4 z, H% W4 I! k- t0 E0 f" R( ^
  787.     }
    ! ?/ n# f; {& V# b4 ?2 z' f6 K* a

  788. 8 Q( O6 O7 a3 S8 g& t6 `  i5 V
  789.     Lcd_Ctx[Instance].XSize = Width;
    3 j4 h; F; K0 }) x
  790.     Lcd_Ctx[Instance].YSize = Height;5 z4 z0 s. u% G# P# U
  791.   }# z0 I' l' `; L2 \8 [* E2 V; X
  792. * o  x$ T  J& a  O( E  }
  793.   return ret;
    ! s, K: y, W) i  w3 a
  794. }
    . [# ]5 i8 O! Z8 v& H- o

  795. ) y) j/ L. C0 W* u" z
  796. /**
    : p  `" h$ w. L/ n' U# a' n1 ?2 p
  797.   * @brief  Configures and sets the color keying.
    ! M& H+ b5 \) p; ?) ?  W, o
  798.   * @param  Instance    LCD Instance) V2 A6 D4 [, F' h
  799.   * @param  LayerIndex  Layer foreground or background4 A% R( n9 o  g2 }, z
  800.   * @param  Color       Color reference% p" ?% [2 \  ?- g
  801.   * @retval BSP status
    " g% j( y7 \2 B1 F
  802.   */2 B3 O$ G/ K' ?
  803. int32_t BSP_LCD_SetColorKeying(uint32_t Instance, uint32_t LayerIndex, uint32_t Color)
    1 M* A5 e. O% Q1 s2 G
  804. {: ^  e' H4 Y+ K: L/ {+ T
  805.   int32_t ret = BSP_ERROR_NONE;+ B! M3 c7 |6 d! ]$ g  A- G
  806. 0 e4 ~1 X; q  n, c
  807.   if(Instance >= LCD_INSTANCES_NBR)
    3 s: R/ C, P8 m% u$ {) Y) T6 c
  808.   {6 T. i9 z8 b, {
  809.     ret = BSP_ERROR_WRONG_PARAM;
    1 w+ \( ^& z3 P7 Y5 P" N
  810.   }
    % D+ j; D. x/ ]/ ?
  811.   else) U4 l, C5 E/ U( o8 T
  812.   {
    ! F/ K) z3 n! P
  813.     (void)HAL_LTDC_ConfigColorKeying(&hlcd_ltdc, Color, LayerIndex);
    * j2 Q; I) R" b& D
  814.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    / H8 Z$ n* `% o
  815.     {
    : @, h: f+ O6 U0 H
  816.       /* Configure and Enable the color Keying for LCD Layer */2 O! a7 W* M3 ?, f# B
  817. 8 \0 Q  b( Y  q) d8 y( [
  818.       (void)HAL_LTDC_EnableColorKeying(&hlcd_ltdc, LayerIndex);
    4 [1 n5 [4 @% _% I4 A& l6 }5 M; W
  819.     }
    ( M2 R0 U+ a' g1 B
  820.     else* U0 X, f3 E7 k4 P0 i
  821.     {
    * r( o/ c2 w+ t  z8 E( c
  822.       /* Configure and Enable the color Keying for LCD Layer */( }9 w& \0 H2 i  j! J3 X
  823.       (void)HAL_LTDC_EnableColorKeying_NoReload(&hlcd_ltdc, LayerIndex);6 e% x  r2 J; e& ~: g; p2 l4 T
  824.     }
    . ^' N% Z) Y6 ^( \- y1 B: a: e
  825.   }- x" T) ]# h' _" `* D2 N, w
  826. 5 }4 @* w% P9 e( ]2 D/ `
  827.   return ret;3 j4 s" h/ s) v) D' ]
  828. }
    ) n1 f* p. v: l0 r, r2 d3 l$ J# ~# S
  829. 9 q0 k. Q, q' w+ C' ]9 V
  830. /**- o9 y, u1 {- a/ D. k
  831.   * @brief  Disables the color keying.
    # e" a7 c7 P1 x
  832.   * @param  Instance    LCD Instance
    ) K& }4 E# H9 S6 k
  833.   * @param  LayerIndex Layer foreground or background, n- s' I5 Y! H* ~1 J$ E1 x, t! q
  834.   * @retval BSP status7 q6 O% G( y9 y" t  X' }8 U
  835.   */
    * V9 f& h$ \$ t+ ^# p. E7 Z
  836. int32_t BSP_LCD_ResetColorKeying(uint32_t Instance, uint32_t LayerIndex)
    . O/ P  D! F9 ~! }$ P& o
  837. {
    * J& h& h/ Z8 z* [9 g
  838.   int32_t ret = BSP_ERROR_NONE;
    * j1 G$ o$ C+ C8 r
  839. ! a/ \) ^  u# y& ]4 f6 O
  840.   if(Instance >= LCD_INSTANCES_NBR)
      Q3 t& d' t2 I+ a
  841.   {
    " y7 R, U! C) {6 l  Z4 l
  842.     ret = BSP_ERROR_WRONG_PARAM;" f+ L/ b' Y8 H9 \4 O" o0 i
  843.   }/ X/ A4 w) j1 |7 n0 G# a
  844.   else6 ~* M1 X( N- q/ F$ M2 `
  845.   {5 y& `4 m0 u- ?4 x, X# u* o; l4 q
  846.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)# `& B+ F  t( j) K9 m; [
  847.     {9 T7 I! E* b! [3 i) y, G# Y
  848.       /* Disable the color Keying for LCD Layer */
    9 I7 X! k3 y0 D! Q, y# e$ l
  849.       (void)HAL_LTDC_DisableColorKeying(&hlcd_ltdc, LayerIndex);+ n* b0 d4 ~# y+ b5 j
  850.     }9 g/ t2 \$ ]7 {1 R$ t
  851.     else" {# ^2 u4 }& g% ^
  852.     {
    4 k& a3 l5 y% i0 @+ H
  853.       /* Disable the color Keying for LCD Layer */
    0 |8 R/ J' B9 z& K8 c1 [
  854.       (void)HAL_LTDC_DisableColorKeying_NoReload(&hlcd_ltdc, LayerIndex);
    9 a1 r4 A5 X! O8 p8 }
  855.     }7 q6 ]7 W& W0 P8 l
  856.   }
    ! L$ s# F+ P, }, p  c# ^

  857. 7 T1 R* S) `  I# b# r! ?
  858.   return ret;9 A5 U: i  Z8 w( q* O) t, i
  859. }
    6 k: W3 x0 p. Q3 }' t' T
  860. / {5 z; d: X8 g! \& p. O4 }
  861. /**
    1 X4 [6 t& ]' Q& d
  862.   * @brief  Gets the LCD X size.
    8 l. M. F9 m4 g: K; y2 m
  863.   * @param  Instance  LCD Instance
    2 j  h' y5 o( p
  864.   * @param  XSize     LCD width
    . b; o- U& Q; e2 l3 N; k
  865.   * @retval BSP status
    3 _4 O  N) ^/ v8 v* p5 F
  866.   */
    $ V. ~! @- r) b2 J5 x; P
  867. int32_t BSP_LCD_GetXSize(uint32_t Instance, uint32_t *XSize)6 m. P( o7 a" M7 M* L$ @
  868. {* u& q6 Q6 P$ \3 F8 ^
  869.   int32_t ret = BSP_ERROR_NONE;
    " h0 H3 y) \) ~* y" Y

  870. ' i: N5 W  ~0 ]  \2 c/ Q
  871.   if(Instance >= LCD_INSTANCES_NBR)
      c/ y+ \3 V) w: G7 ^  \
  872.   {- ~) g. c8 @/ w
  873.     ret = BSP_ERROR_WRONG_PARAM;0 n0 k# A0 Y  m( U$ `1 Q5 v
  874.   }
    6 W+ E, |9 _1 f$ V$ E' I
  875.   else. g3 g5 |% o# K9 U8 N! `. V
  876.   {% u. q. |1 D8 K8 r  [1 H
  877.     *XSize = Lcd_Ctx[Instance].XSize;) d# `7 V+ e1 ?7 D; `4 w
  878.   }- x- b( Q6 d: ~0 L7 ~

  879. 7 a$ o) C1 X9 s* R
  880.   return ret;
    + u+ ^. I% R7 ?* r1 }  Y: \' V3 u
  881. }
      y, }5 H9 X" e
  882. , J" w) G  A  v
  883. /**" a9 Y$ F% Q; n: b0 x4 I
  884.   * @brief  Gets the LCD Y size.- n: W7 |  o- d- f, b
  885.   * @param  Instance  LCD Instance
    - Y' \1 n' `2 t0 J
  886.   * @param  YSize     LCD Height0 j7 H! i6 K0 u# S8 _5 k' p- B3 F
  887.   * @retval BSP status
    ' K4 H) c, g% O9 k  A/ N# L
  888.   *// _2 P0 }7 @- b0 t9 R3 y
  889. int32_t BSP_LCD_GetYSize(uint32_t Instance, uint32_t *YSize)
    # N! {5 M9 e! L, `0 u
  890. {- e7 E: H- j) x
  891.   int32_t ret = BSP_ERROR_NONE;
    * t; e+ S- y! }3 U) d# a5 s
  892. * j9 l) w# n1 z8 x
  893.   if(Instance >= LCD_INSTANCES_NBR)
    ( w1 Y& {" ?/ n' S! [2 m3 |1 E
  894.   {& x0 H/ s! L  s# ?; e
  895.     ret = BSP_ERROR_WRONG_PARAM;4 [' R& d$ S9 ?" P& j- u, s: E
  896.   }
    0 A: D) W1 v1 v* `- L
  897.   else
    5 R% \' _5 g% {7 x) _
  898.   {
    ! V  d9 b6 S) C. W
  899.     *YSize = Lcd_Ctx[Instance].YSize;+ u! b% h+ p% V; W( P7 r
  900.   }
    6 b! U, A3 l2 H: S6 Q/ Y
  901. 2 f: c* [; w1 ]9 G- c. E/ X
  902.   return ret;' N* g' O/ {0 @
  903. }2 Z, c! }5 f2 F$ V
  904. ) m! ~4 x5 k) N( `% t
  905. /**
    3 K# x& e" O) E# M
  906.   * @brief  Switch On the display.6 Q! M2 p( H* G) X$ t: r
  907.   * @param  Instance    LCD Instance
    + J% x: l# @1 t, R3 z, ]
  908.   * @retval BSP status9 V- X7 y1 M7 U9 S1 |9 x& P/ V% V
  909.   */
    2 ]8 }( Q/ a8 A- V
  910. int32_t BSP_LCD_DisplayOn(uint32_t Instance)1 L* i% m% J/ q) g, h- R* u
  911. {5 B- G9 v& J& d& J4 H
  912.   int32_t ret = BSP_ERROR_NONE;, X7 {3 k# x4 F! R" ]4 P
  913.   GPIO_InitTypeDef gpio_init_structure = {0};0 C# ?! ?  ^! ~2 B. D  A
  914. % N/ k5 t, o. R& J% R5 c
  915.   if(Instance >= LCD_INSTANCES_NBR)
    / E+ i3 F- {+ l7 k9 t1 M
  916.   {
    3 M: ?& g) c; [( [8 [) Z# }
  917.     ret = BSP_ERROR_WRONG_PARAM;
      D4 P0 x+ d$ t
  918.   }
    1 c, N( ^. r5 R" b
  919.   else6 k0 E/ X- B! k/ E
  920.   {
    $ ?& y4 q; H8 a& Y$ F8 h8 C
  921.     __HAL_LTDC_ENABLE(&hlcd_ltdc);! ^2 h$ x1 O( k% ]" t1 ]; Z
  922.     gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP;
      t) m4 P8 q( i
  923.     gpio_init_structure.Pull = GPIO_PULLUP;" k  j4 U! e7 \4 Y* _
  924.     gpio_init_structure.Pin  = LCD_DISP_EN_PIN;/ M/ \9 w: T+ H# a3 g
  925.     HAL_GPIO_Init(LCD_DISP_EN_GPIO_PORT, &gpio_init_structure);
    , y" ?1 h9 Z! T' F

  926. ! Y1 u, x5 f' P5 b1 D  _
  927.     /* Assert LCD_DISP_EN pin */' n+ q: {7 s1 Q
  928.     HAL_GPIO_WritePin(LCD_DISP_EN_GPIO_PORT,LCD_DISP_EN_PIN, GPIO_PIN_SET);0 P- a2 a! {9 ?5 N% k# T
  929.   }
    % }6 h; y3 P6 t  x1 k; r
  930. & S4 R( a8 \. g- L3 Y. n  B
  931.   return ret;
    9 J# ]1 O( i7 t$ e6 \8 e6 A- Y8 V
  932. }8 y0 s9 B. l5 y4 R9 e
  933. ; P* n& i5 S/ _$ W/ X4 {/ o) u4 R
  934. /**
    / [% O: T' w/ C* O, a. x4 G8 t2 w
  935.   * @brief  Switch Off the display.
    " _1 p  V$ h) n+ D
  936.   * @param  Instance    LCD Instance
    9 W+ v, C% h2 D' @5 H
  937.   * @retval BSP status
    + O3 {. C% b# \! @
  938.   */
    ) l+ @; Z( H- V+ U/ X8 a4 t# V" v
  939. int32_t BSP_LCD_DisplayOff(uint32_t Instance)" H: m- i2 ?% Y  H
  940. {/ ]$ s% n) C) Q6 T. C
  941.   int32_t ret = BSP_ERROR_NONE;/ _$ B; H( w: c  [3 i! `$ r
  942.   GPIO_InitTypeDef gpio_init_structure = {0};3 L7 s6 g  a6 w$ k# F! K7 }
  943. ( M; C# D6 b5 j$ A0 b# o
  944.   if(Instance >= LCD_INSTANCES_NBR)
    & U/ I- v4 Z' d5 X4 ]) l# E
  945.   {
    5 O# S* i/ q( x1 Z; k+ Q
  946.     ret = BSP_ERROR_WRONG_PARAM;* ?9 ]5 ^* s8 z! |
  947.   }  J1 o0 K/ C- Z: x1 W$ E- e
  948.   else
    + V1 k, Q+ o- G( |, P: L9 I# H9 @
  949.   {( A$ k8 b' O6 x
  950.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;
    7 b7 T9 y6 v( ~( I* \& O7 m  X
  951.     gpio_init_structure.Pull      = GPIO_NOPULL;2 r. p7 s( v8 ]( w% {6 [+ ~& j
  952.     gpio_init_structure.Speed     = GPIO_SPEED_FREQ_MEDIUM;
    6 C: h# w2 e/ I$ N0 q
  953.     gpio_init_structure.Pin       = LCD_DISP_EN_PIN;
    ; D, W6 ]2 T: l8 w0 k( C
  954.     HAL_GPIO_Init(LCD_DISP_EN_GPIO_PORT, &gpio_init_structure);
    ) ^4 E. S! K+ e5 a* Y

  955. $ }" P; ]: c+ D  S/ P8 F4 Y, B" R
  956.     HAL_GPIO_WritePin(LCD_DISP_EN_GPIO_PORT,LCD_DISP_EN_PIN, GPIO_PIN_RESET);
    / s" {# g4 o3 e) z/ x0 h# ~1 |
  957. 0 s/ o! _. \7 R1 U; Q
  958.     __HAL_LTDC_DISABLE(&hlcd_ltdc);" _# n2 q- j* G" L
  959. : r2 F' B4 u; @( e
  960.   }
    0 L: o2 F; U+ e$ O

  961. + E4 s3 l; t" C; _8 C$ i
  962.   return ret;
    " J7 @7 e8 E& u( P# s/ [
  963. }3 U- W$ T) ?, u& Z( b- i" m
  964. ! \  j8 D& e1 Z- V6 C
  965. /**5 d" k6 u# w, W2 U$ _
  966.   * @brief  Draws a bitmap picture loaded in the internal Flash in currently active layer.
    . j0 ?7 w& p& b
  967.   * @param  Instance LCD Instance, y! Y3 d) U# f: Q+ ^+ B
  968.   * @param  Xpos Bmp X position in the LCD
    4 U* u& \( N" c8 N
  969.   * @param  Ypos Bmp Y position in the LCD- v: v: v; ^% P8 U4 L) h' ~
  970.   * @param  pBmp Pointer to Bmp picture address in the internal Flash.! i  V0 z: {: Z8 ^7 c, N0 @$ R! r
  971.   * @retval BSP status7 ]/ C- d1 G* D# v" F+ ~! B& r" [; U
  972.   */
    5 e5 f  Q& M3 H  }  w1 }4 l$ z) D
  973. int32_t BSP_LCD_DrawBitmap(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint8_t *pBmp)
    8 N) I8 J- c* D) _5 h% Y
  974. {
    ) a7 `  c% v. t
  975.   int32_t ret = BSP_ERROR_NONE;& v. f) N, h0 S
  976.   uint32_t index;4 u/ l& R, P. V( Z) E- ^
  977.   uint32_t width;0 M5 y7 j* f6 C1 ]9 K, Q& H
  978.   uint32_t height;1 w$ K) i* W+ O0 v' [8 r0 E
  979.   uint32_t bit_pixel;0 S4 r$ Q, u$ H* R% i3 Q/ S
  980.   uint32_t Address;
    & R/ T2 V+ i7 Y9 e
  981.   uint32_t input_color_mode;: S' l+ A+ \7 F
  982.   uint8_t *pbmp;
    / M( Q( W: y0 e: ]; B
  983. ' ~9 Y5 ~# s* v* M
  984.   /* Get bitmap data address offset */5 G( P4 l1 q2 F6 m8 ^
  985.   index = (uint32_t)pBmp[10] + ((uint32_t)pBmp[11] << 8) + ((uint32_t)pBmp[12] << 16)  + ((uint32_t)pBmp[13] << 24);
    7 U$ y' Q( k0 R; p/ b6 R
  986. ; g/ q8 ?6 w( E+ [6 X$ E
  987.   /* Read bitmap width */
    % I1 a0 _( ?0 R) o( M
  988.   width = (uint32_t)pBmp[18] + ((uint32_t)pBmp[19] << 8) + ((uint32_t)pBmp[20] << 16)  + ((uint32_t)pBmp[21] << 24);
    ( S( s  f7 z# U- Q8 |% E
  989. # J3 D6 J4 O% ^9 I
  990.   /* Read bitmap height */
    . a+ E) W. K8 q' X  V, i( I+ [" s
  991.   height = (uint32_t)pBmp[22] + ((uint32_t)pBmp[23] << 8) + ((uint32_t)pBmp[24] << 16)  + ((uint32_t)pBmp[25] << 24);. C5 h7 c3 u6 v% t
  992. 3 L3 e2 s, y6 X3 V; E( c# z
  993.   /* Read bit/pixel */, k& R; \2 m1 T" `+ B; W8 U
  994.   bit_pixel = (uint32_t)pBmp[28] + ((uint32_t)pBmp[29] << 8);
    # p# r- O% j9 V

  995. + w+ S8 H' |1 p  q9 S$ M. R  B
  996.   /* Set the address */
    0 L; L& h* d% M7 Q
  997.   Address = hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (((Lcd_Ctx[Instance].XSize*Ypos) + Xpos)*Lcd_Ctx[Instance].BppFactor);% D- m& Q# D8 x2 {! Z

  998. 3 e# Y5 ^& I& x: i
  999.   /* Get the layer pixel format */; }8 V5 K" N* b# k  w1 e
  1000.   if ((bit_pixel/8U) == 4U)
    : L0 L# [& K1 B. a0 F: V
  1001.   {9 c  Y' M4 h0 x1 p& [0 Y
  1002.     input_color_mode = DMA2D_INPUT_ARGB8888;
    0 ~  E) d, {6 F
  1003.   }
    ! H3 v4 X: U" w
  1004.   else if ((bit_pixel/8U) == 2U)
      W9 F* {2 K0 t6 [/ r( M# E
  1005.   {
    2 f1 `# W3 a5 x( f( d6 W6 ]& _5 B
  1006.     input_color_mode = DMA2D_INPUT_RGB565;3 [1 G# C/ W* @. P/ o+ l  L
  1007.   }9 G, i6 [/ C! U1 v  |1 E
  1008.   else
    9 D/ h  k: N" X! |- L- a
  1009.   {1 F3 {" S- e7 }/ e
  1010.     input_color_mode = DMA2D_INPUT_RGB888;: V& r8 \( O; t  [
  1011.   }
    ; f+ F. E5 ]4 L

  1012. 6 {+ {# I% L" J5 f7 v  e
  1013.   /* Bypass the bitmap header */3 v: ^4 a7 q0 c3 n, ~4 l# P1 B
  1014.   pbmp = pBmp + (index + (width * (height - 1U) * (bit_pixel/8U)));
    : e5 ?, H* U0 Y

  1015. $ \4 [6 g! d4 g
  1016.   /* Convert picture to ARGB8888 pixel format */# i/ E( s# G# L: b+ N
  1017.   for(index=0; index < height; index++)/ R+ r% p" `0 D" d/ v: w# U) G
  1018.   {
    $ k& v, p5 Y7 I. e
  1019.     /* Pixel format conversion */
    9 P$ E+ ^4 q' i& y$ L
  1020.     LL_ConvertLineToRGB(Instance, (uint32_t *)pbmp, (uint32_t *)Address, width, input_color_mode);
    0 Q1 v5 s3 G, J& s. }4 y

  1021. $ B) a  x6 V* f9 y! S) b% m, ~# B- ?
  1022.     /* Increment the source and destination buffers */' F+ \' Z" \0 H5 v
  1023.     Address+=  (Lcd_Ctx[Instance].XSize * Lcd_Ctx[Instance].BppFactor);1 W2 a% t9 s4 Q* g
  1024.     pbmp -= width*(bit_pixel/8U);
    # J( ]) L# }( X4 ~2 i% E
  1025.   }7 K1 M9 j; S) o2 [* v# {$ M& H
  1026. 9 T6 a/ e8 p* q: b$ M& S; B
  1027.   return ret;
    ( @* w4 Y/ `4 i' j
  1028. }& f. j! s9 R2 |' X1 r3 R$ N9 f- B

  1029. ' S. C/ T3 _; ]  f6 o
  1030. /**
    . m& A! W. Y: a. I4 p9 E
  1031.   * @brief  Draw a horizontal line on LCD.
      Q# d- _7 X. n. k
  1032.   * @param  Instance LCD Instance.. k5 P" R7 _: o, X' p$ q
  1033.   * @param  Xpos X position.  K# y" X; S( X( P; k( o9 m
  1034.   * @param  Ypos Y position.$ E7 \9 W* e/ y: {7 K5 F
  1035.   * @param  pData Pointer to RGB line data/ h* Q3 {8 X; a! X: J
  1036.   * @param  Width Rectangle width.
    4 D1 [- F- N  Z! }
  1037.   * @param  Height Rectangle Height.' p  ?9 m) P5 m# e
  1038.   * @retval BSP status./ Z) P1 g$ M- ^& r
  1039.   */3 s7 B" P- F  H0 X+ D
  1040. int32_t BSP_LCD_FillRGBRect(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint8_t *pData, uint32_t Width, uint32_t Height)2 {' U2 ]1 q# d0 {! ?
  1041. {' `4 z$ {+ T1 S+ N# t7 _4 C
  1042.   uint32_t i;
    " Q9 D' i# a+ g
  1043.   uint8_t *pdata = pData;% m$ ~2 y: Z% U7 B1 t

  1044.   K  ]2 v* p* H9 c4 _1 X
  1045. #if (USE_DMA2D_TO_FILL_RGB_RECT == 1)
    ! z8 j  q, s8 J6 a: l* N/ h9 d
  1046.   uint32_t  Xaddress;
    * {/ C0 j# h/ ]9 I
  1047.   for(i = 0; i < Height; i++)1 r; T# a  c. t+ Q3 ]2 u
  1048.   {) \6 d% G- d8 w0 Z
  1049.     /* Get the line address */
    ; n$ R0 B. a: l. f& b
  1050.     Xaddress = hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*(Ypos + i)) + Xpos));0 k( H1 |; c+ B. q, e" O& O
  1051. & c& @+ t  t) x9 l
  1052. #if (USE_BSP_CPU_CACHE_MAINTENANCE == 1)* E! W+ ^) S) z6 [/ ~3 D% M& H
  1053.     SCB_CleanDCache_by_Addr((uint32_t *)pdata, Lcd_Ctx[Instance].BppFactor*Lcd_Ctx[Instance].XSize);: Y& ^6 k7 _) D2 a. g0 P
  1054. #endif /* USE_BSP_CPU_CACHE_MAINTENANCE */
    1 Z5 p" }: \/ s0 V1 D

  1055. 5 |: B8 d( D- R4 M
  1056.     /* Write line */
    ; s% j. W+ V3 i6 ?
  1057.     if(Lcd_Ctx[Instance].PixelFormat == LCD_PIXEL_FORMAT_RGB565)
    . ]: P/ B* V+ m7 @5 ]+ `
  1058.     {
    * u7 W5 m  Y( \$ [6 F; L
  1059.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_RGB565);5 ?  w: ?! K- y: _, g& }0 x) n% g) f
  1060.     }
    3 Q  W9 y6 ]) J% g4 u* R" h4 c
  1061.     else if(Lcd_Ctx[Instance].PixelFormat == LCD_PIXEL_FORMAT_ARGB4444)& A! ?6 w" S1 z2 _- b6 ?8 P0 B7 A9 P
  1062.     {8 ]4 z  z. W/ _/ F$ H
  1063.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_ARGB4444);9 v6 `- e1 a* w% U" y: z3 y
  1064.     }) ^! [' {9 r" h' H; \( t
  1065.     else if(Lcd_Ctx[Instance].PixelFormat == LCD_PIXEL_FORMAT_RGB888)* h# N7 i% |4 ]4 o3 M* d
  1066.     {/ d1 P, u+ b7 R" n/ b: \) U3 ^8 a
  1067.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_RGB888);- ]: M- B5 i) i- V& p
  1068.     }! ?5 G. j3 V* |( @
  1069.     else
    1 I! ~: D  ]0 X6 A( d
  1070.     {; i* {: L. x  W0 a# b* G
  1071.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_ARGB8888);) d% I& p% C$ X
  1072.     }
    / E8 D  q9 P* t
  1073.     pdata += Lcd_Ctx[Instance].BppFactor*Width;
    : ?6 ^! Y( j  Z6 e( Y
  1074.   }/ O8 M! L, R: L* u
  1075. #else
    + ^3 I+ r, }. o" F' a9 f4 A, W+ ~
  1076.   uint32_t color;
    0 M( X+ k& C! k6 @
  1077.   uint32_t j;
    # r! d& b2 V2 ?, f  W" D0 j/ A
  1078.   for(i = 0; i < Height; i++)
    : H. Z, [* l$ z+ E5 u
  1079.   {7 h* \& B  a8 N
  1080.     for(j = 0; j < Width; j++). P! j0 d* n1 V4 ?
  1081.     {6 G$ g4 d% Z0 U: u4 s4 }
  1082.       color = (uint32_t)((uint32_t)*pdata | ((uint32_t)(*(pdata + 1U)) << 8U) | ((uint32_t)(*(pdata + 2U)) << 16U) | ((uint32_t)(*(pdata + 3U)) << 24U));$ I2 a: U; a1 B2 ^
  1083.       (void)BSP_LCD_WritePixel(Instance, Xpos + j, Ypos + i, color);: @/ n  w% w3 b: D5 b
  1084.       pdata += Lcd_Ctx[Instance].BppFactor;
    ! @% w- r* k0 f2 H$ E" ^+ L' k9 g
  1085.     }7 m5 G* X1 ^6 y5 n( a' D+ k
  1086.   }" O" b" K7 W1 S( E  y
  1087. #endif /* (USE_DMA2D_TO_FILL_RGB_RECT == 1) */
    6 |) l/ G$ l% }! z  y% b
  1088. 3 I- K% k9 Q5 e- z
  1089.   return BSP_ERROR_NONE;' b* F$ ]: B  K: @8 C" ~( ?
  1090. }  u. l  n  S1 @/ b4 Z2 }

  1091. , W7 r$ U, S4 P. B; S4 e) s2 @3 C
  1092. /*** y+ n8 g; ]2 h3 l: i+ a7 {- u
  1093.   * @brief  Draws an horizontal line in currently active layer., b" V" t* I- E: r7 p
  1094.   * @param  Instance   LCD Instance
    " P# n. p0 }2 }
  1095.   * @param  Xpos  X position
    ' G% ~' G8 F5 U2 e/ _  M" x. X3 E
  1096.   * @param  Ypos  Y position
    0 o1 K6 m" V% z' `
  1097.   * @param  Length  Line length
    : ?" n1 B$ Q/ P' z# M9 e
  1098.   * @param  Color RGB color
    : ~' B; x/ g& _6 s: D
  1099.   * @retval BSP status
    , N. U6 H  }( V4 z
  1100.   */
      i2 i& K1 K# g! I
  1101. int32_t BSP_LCD_DrawHLine(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Length, uint32_t Color)7 D4 o. ]8 e$ l9 y6 I7 G
  1102. {! W' F7 f) ?  v' K% P# Z
  1103.   uint32_t  Xaddress;
    " `/ I" h* J9 X

  1104. 9 S( C- Y: G7 @/ }' Q7 F
  1105.   /* Get the line address */9 h* s* m3 S$ A
  1106.   Xaddress = hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*Ypos) + Xpos));
    . H1 T! ]- D" \- @! i  z8 }. T

  1107. ) M1 `7 m, v- q) `
  1108.   /* Write line */
    # _6 h% X- |# W* k
  1109.   LL_FillBuffer(Instance, (uint32_t *)Xaddress, Length, 1, 0, Color);7 h7 t7 b4 _& Y3 h% W

  1110. 8 d5 H; s. M- x
  1111.   return BSP_ERROR_NONE;* _# w* U& Z$ E; D4 R+ q- A
  1112. }1 f& n( j9 k( d( ~& ]" R  g9 c' s+ ]
  1113. ; i, d# m5 \# J
  1114. /**2 l3 m8 I3 h/ h7 d$ n
  1115.   * @brief  Draws a vertical line in currently active layer.5 S  |# ~  p" r, ?/ t& L
  1116.   * @param  Instance   LCD Instance+ a& X1 {0 S) g  m9 F6 z
  1117.   * @param  Xpos  X position5 t9 Q, e3 l( ?
  1118.   * @param  Ypos  Y position
    , s9 ?" a1 `( \. k. z3 X3 E2 h
  1119.   * @param  Length  Line length7 I( e8 _$ j1 E' |# s: q% G
  1120.   * @param  Color RGB color
    ( M) ]  L$ `3 J0 Q! _. Q/ U
  1121.   * @retval BSP status
      w- `( r) V/ Y( q4 W: R& `& I/ m3 y
  1122.   *// u  C9 I. R$ ^
  1123. int32_t BSP_LCD_DrawVLine(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Length, uint32_t Color)1 r& `, m/ n: n1 @. J3 [
  1124. {4 w5 Z8 c* ^( n0 s
  1125.   uint32_t  Xaddress;
    6 ^  w9 P% @! W/ A$ S; C

  1126. % O1 j3 D& {# l9 t! j: T& j  o9 P
  1127.   /* Get the line address */
    * n7 h9 T- u% D- P. M' u* o! I2 C
  1128.   Xaddress = (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress) + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*Ypos) + Xpos));
    : d5 J' H6 k4 x/ [; s) j
  1129. 2 m  B! G0 M& z% I6 B# _) S6 K  e5 t
  1130.   /* Write line */
    ! }: q9 Y  g% @. I/ L) g
  1131.   LL_FillBuffer(Instance, (uint32_t *)Xaddress, 1, Length, (Lcd_Ctx[Instance].XSize - 1U), Color);" c3 o- _0 V! o

  1132. / s& c9 q6 A* B( X5 x" r% F
  1133.   return BSP_ERROR_NONE;
    5 x9 c$ \% y" o; }, C, H' t
  1134. }
    6 i) }( F9 k. [$ Z9 _

  1135. : v3 y* U1 h* ~' y; Q" o
  1136. /**5 j# \, }1 w8 m9 h$ `
  1137.   * @brief  Draws a full rectangle in currently active layer.
    ) w2 U: u- K- n7 M
  1138.   * @param  Instance   LCD Instance
    , I: f1 Y; n3 Y. G* h6 {
  1139.   * @param  Xpos X position
    8 c8 D: w& R# W
  1140.   * @param  Ypos Y position
    - I, M7 I6 J5 _9 G& \( @1 {* b
  1141.   * @param  Width Rectangle width
    ; ]$ }, D  j! h: ^
  1142.   * @param  Height Rectangle height
      x  N$ D# ?% A* l
  1143.   * @param  Color RGB color% n, k! X' O2 |( O* M, U& s3 @
  1144.   * @retval BSP status* E2 L$ y! Q% C
  1145.   */, o' }7 _( Z1 y7 C
  1146. int32_t BSP_LCD_FillRect(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Width, uint32_t Height, uint32_t Color)6 F6 A, h! M- f  [; n5 i  x
  1147. {/ p4 E* ^5 ~9 H- v$ w: ~  W+ x  c/ ?
  1148.   uint32_t  Xaddress;
    / f$ b$ c; ~3 _7 S4 G5 A$ \
  1149. " X# ~; b+ w7 d" a% T% n
  1150.   /* Get the rectangle start address */' d3 k0 S- Q3 v' j: i2 j7 c
  1151.   Xaddress = (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress) + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*Ypos) + Xpos));
    + J, A/ B  A3 a( p7 H

  1152.   m3 k3 \2 N9 [* F5 t; t
  1153.   /* Fill the rectangle */
    : @3 T% I' W. j  ^7 A7 ~+ @4 j9 G6 X
  1154.   LL_FillBuffer(Instance, (uint32_t *)Xaddress, Width, Height, (Lcd_Ctx[Instance].XSize - Width), Color);1 M& I. ]: S. ?' Y: q
  1155. : H6 C5 c  r: d4 X! y
  1156.   return BSP_ERROR_NONE;
    2 c( G7 j/ I: Z" X- d! A
  1157. }
      {8 Q4 M/ [3 t$ R9 p  @
  1158. ( s9 r; P' f3 ?0 S. l% D( ~
  1159. /**
    " _  s% A! F4 i/ p& C
  1160.   * @brief  Reads a LCD pixel.
    ; x. B6 ~2 W' Z' ]" n. B& @  R$ Y
  1161.   * @param  Instance    LCD Instance: K5 [- b! a2 ^1 v
  1162.   * @param  Xpos X position8 a: {* i  T9 D5 t* K1 D" f
  1163.   * @param  Ypos Y position0 r. j6 C- F8 s4 G7 j# n, M$ @( _
  1164.   * @param  Color RGB pixel color
    & ^! L6 M2 n+ i2 d; l5 R& t' q& p
  1165.   * @retval BSP status1 v) z" S  [9 _$ M
  1166.   */! v  e; \6 y/ _+ ~. Z' ~- _
  1167. int32_t BSP_LCD_ReadPixel(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t *Color)
    ) n# ]8 K# [' \# ]
  1168. {, O' j' c/ v$ t7 t
  1169.   if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888)+ u5 l+ O8 ]% _0 W
  1170.   {  c& a4 K; ]1 B
  1171.     /* Read data value from RAM memory */
    & c9 r: [: |) ^6 o6 _: k' y# T
  1172.     *Color = *(__IO uint32_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (4U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos)));
    3 _2 w1 g. U( U' N8 Z! G3 u% w. x: Q) V
  1173.   }; I3 m$ E& e6 F* I, [
  1174.   else if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB888)
    / r0 w" {9 V6 r" A0 u8 d( l
  1175.   {9 M2 ]* h9 I7 Z, k+ X
  1176.     /* Read data value from RAM memory */
    ) J9 q' r1 @: B2 ^6 w- K
  1177.     *Color = *(__IO uint32_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos)));1 x" c% r6 \5 N9 g
  1178.     *Color = CONVERTARGB88882RGB888(*Color);+ A" ]5 K; D! y1 W
  1179.   }
    $ J7 @# H( M( A0 f) Z+ f
  1180.   else /* if((hlcd_ltdc.LayerCfg[layer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565) */
    & Z, i6 D& G0 v; v; J" u5 s; l
  1181.   {1 w5 _8 i# @  b8 U# {
  1182.     /* Read data value from RAM memory */$ L7 {. j/ ]- S3 u. h5 H1 [! W
  1183.     *Color = *(__IO uint16_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (2U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos)));
    - @* R* S' y$ J" i7 Z0 A( D( g
  1184.   }
      R* z( j1 k5 T% b& J4 }9 e0 j
  1185. 1 J$ K% Z& x, n. _
  1186.   return BSP_ERROR_NONE;
    % Z3 t- z, l/ Q4 a! Y  `
  1187. }- u% B: ^7 A1 T" A- l& }

  1188. 4 s0 d+ u* f1 \/ w2 x2 x% X
  1189. /**8 `1 W$ `) w# Z: {+ s! z
  1190.   * @brief  Draws a pixel on LCD.. ?- s% ]4 Y- e1 H
  1191.   * @param  Instance    LCD Instance. H: }+ h1 t( u, v
  1192.   * @param  Xpos X position
    4 b/ I9 L+ W1 P, I- ?
  1193.   * @param  Ypos Y position
    9 f+ m- u6 F. i3 o$ \$ L
  1194.   * @param  Color Pixel color1 I( O3 |/ M9 I" Y8 h" N6 T
  1195.   * @retval BSP status" `8 K2 Y; d* G- r7 G: |
  1196.   */- k1 I& F9 W. w; }! J, D8 x$ |) y. G
  1197. int32_t BSP_LCD_WritePixel(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Color)) g  V$ @. G: ~# e& Z, l
  1198. {
    3 @2 F, h) s" @# E( }$ h9 X4 _
  1199.   if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888)4 z! ]4 m1 E2 L. f  {. v" Z
  1200.   {1 k. j- Q) k& x" ?4 n  _
  1201.     /* Write data value to RAM memory */1 U' z) ]: ]# V5 J; V$ _# \
  1202.     *(__IO uint32_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (4U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))) = Color;; ]  \2 J1 C8 }  U1 r
  1203.   }* v% s& U! d9 r. p6 D
  1204.   else if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB888)5 o& x* Q" S6 O& U" V& E
  1205.   {5 z# F% l: @; T  Y
  1206.     /* Write data value to RAM memory */
    # e0 E4 r+ ?; k7 a, ?7 r. r
  1207.     *(__IO uint8_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + ((3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))-3U)) = (uint8_t) (Color);/ w8 Q; F. _0 F7 s" e+ }
  1208.     *(__IO uint8_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + ((3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))-2U)) = (uint8_t) (Color>>8U);) X! \0 V) ]! p( W
  1209.     *(__IO uint8_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + ((3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))-1U)) = (uint8_t) (Color>>16U);2 O  i! P9 G7 @- R$ d
  1210.   }& Q8 W7 g, r+ W# H
  1211.   else
    2 o+ S  f& l9 D, W6 \- w
  1212.   {! N: v* c& U* X$ E" O6 ~7 z
  1213.     /* Write data value to RAM memory */5 Y  z2 l. y0 x2 f" x" X: z. O
  1214.     *(__IO uint16_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (2U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))) = (uint16_t)Color;
    $ b+ ~5 g1 S6 Q4 F
  1215.   }
    ! C; e  W( z  P" w7 J/ l: U1 M  V

  1216. 5 j7 Y) S' Y/ L0 N% d
  1217.   return BSP_ERROR_NONE;+ u3 v7 l' E! u4 w& ?$ U2 W
  1218. }9 O' Y1 B) {( B( q6 u0 ^

  1219. * V9 B* w/ n* ~* g3 \
  1220. /**
    $ B1 d3 K. a; t% z; b) t- I2 n
  1221.   * @}1 S, S5 K  \* a  N$ u
  1222.   */5 D" L) J" T7 [0 l8 g
  1223. , v" p% v# }) d
  1224. /** @defgroup STM32N6570_DK_LCD_Private_Functions LCD Private Functions: W; l" O2 K- ~/ W3 F* L" b& e
  1225.   * @{# `' {+ b4 c8 f5 H3 c! m1 G
  1226.   */
    . I. {# P* K7 i* S0 v
  1227. /**
    2 q. c: S+ Q- `, ~
  1228.   * @brief  Fills a buffer.
    ; s6 m- y! _4 r  O3 ?5 a1 I  c/ i$ x- t
  1229.   * @param  Instance LCD Instance2 v8 N) }7 G' |+ c9 U" W1 [
  1230.   * @param  pDst Pointer to destination buffer
    4 S9 j& ~* {, Y" a' n. t
  1231.   * @param  xSize Buffer width6 U) i# m4 \8 z' y# U! ^5 |1 n9 q: v
  1232.   * @param  ySize Buffer height! S1 K, w" Q* r3 W
  1233.   * @param  OffLine Offset
    & O  E  o' s+ J9 a8 n( P
  1234.   * @param  Color RGB color
    * _$ w. k" Z- q7 p2 O/ y
  1235.   */. y% C* \! X: l) H- i
  1236. static void LL_FillBuffer(uint32_t Instance, uint32_t *pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t Color)# m/ d. Y; p( \* {3 f+ U
  1237. {! ~( [% \5 h- G: M  I& N% `
  1238.   uint32_t output_color_mode;
      `0 X  P8 b' ?% Q( P% T! q# n4 m
  1239.   uint32_t input_color = Color;9 {& p' G* G0 C3 m# i9 i

  1240. ! k6 b/ ]; D$ C4 |  G  f
  1241.   switch(Lcd_Ctx[Instance].PixelFormat), C( p+ k; w# w& O+ K* n
  1242.   {: l; [2 I% m  R1 e) c% Z/ U6 g
  1243.   case LCD_PIXEL_FORMAT_RGB565:
    + |% q- y, @  L8 r- R; w
  1244.     output_color_mode = DMA2D_OUTPUT_RGB565; /* RGB565 */- I% e" q5 `* h* ]; `( Y- n. H
  1245.     input_color = CONVERTRGB5652ARGB8888(Color);
    # l3 E/ H+ m" _* S- Q7 T
  1246.     break;
    2 V$ c) K' t/ |3 w+ J/ s/ C" D$ P
  1247.   case LCD_PIXEL_FORMAT_ARGB4444:
    , b9 b, u0 e- ~6 K, z  ^
  1248.     output_color_mode = DMA2D_OUTPUT_ARGB4444; /* ARGB4444 */9 ~! s- a; [, R  c4 l
  1249.     input_color = CONVERTARGB44442ARGB8888(Color);
    ' p4 h' h: h( M
  1250.     break;
    2 K/ Y* v+ }1 |1 v6 e
  1251.   case LCD_PIXEL_FORMAT_RGB888:
    3 P) N% d" k* l; m% p
  1252.     output_color_mode = DMA2D_OUTPUT_RGB888; /* RGB888 */
    & f9 V* }& `7 Q$ _6 I$ h! f
  1253.     input_color = CONVERTRGB8882ARGB8888(Color);
    - j/ I4 M3 _* {$ X# b9 Y
  1254.     break;
    1 }5 V( T1 j8 Q" p* f: ?, V6 `, W8 l
  1255.   default:, p' @7 F$ [* b
  1256.     output_color_mode = DMA2D_OUTPUT_ARGB8888; /* ARGB8888 */
    9 C  h1 J6 H; A& Y& ^( v
  1257.     break;1 i5 @$ M+ T& g. `. L( w
  1258.   }# s# X+ F$ j" G" M  @& I

  1259. 9 k1 A8 m6 i! g: u: R8 g8 a
  1260.   /* Register to memory mode with ARGB8888 as color Mode */
    9 M0 ?1 N- u* w: P5 E. f3 {  s
  1261.   hlcd_dma2d.Init.Mode         = DMA2D_R2M;
    ) o2 P* |! {0 ?+ G! I$ B7 Y: ]
  1262.   hlcd_dma2d.Init.ColorMode    = output_color_mode;  Z( P8 m- D4 w
  1263.   hlcd_dma2d.Init.OutputOffset = OffLine;' }+ f9 Z" v# z: B: z( e
  1264. # P* R$ H. \! s+ R1 X( F
  1265.   hlcd_dma2d.Instance = DMA2D;
    3 L5 d" H. }" j4 F
  1266. ( V6 d  w2 x, R
  1267.   /* DMA2D Initialization */
    7 U$ T) V8 d+ i5 K) N, {
  1268.   if(HAL_DMA2D_Init(&hlcd_dma2d) == HAL_OK)$ k5 Q) w: j& N4 O! x: _) J1 z- i
  1269.   {6 N# X" o' ?# ^" Q
  1270.     if (HAL_DMA2D_Start(&hlcd_dma2d, input_color, (uint32_t)pDst, xSize, ySize) == HAL_OK): h: M; P3 h. }" Y* S
  1271.     {5 k: b: R1 f: V8 |! H) \  Z- d  G
  1272.       /* Polling For DMA transfer */
    - ]/ }) d1 K. ]& \
  1273.       (void)HAL_DMA2D_PollForTransfer(&hlcd_dma2d, 50);
    $ s- O, D) a8 e; M
  1274.     }; H$ [+ T& O: ~3 t  ?& c9 @9 K
  1275.   }
    7 p+ {* j: F7 Z8 [3 h
  1276. }) h% Z, P3 E2 s* @: d# o

  1277. ( b7 O  P3 r) }9 g3 N
  1278. /**; D% f( Q/ _. a/ K8 }
  1279.   * @brief  Converts a line to an RGB pixel format.
    ' O& s3 h- w. J# p7 `1 ~5 J4 e
  1280.   * @param  Instance LCD Instance
    . Q/ n- ]# C' B; S  L! j
  1281.   * @param  pSrc Pointer to source buffer+ F( _; j0 v& c2 S. `7 B
  1282.   * @param  pDst Output color! z& y% {3 G4 {/ i) |7 `
  1283.   * @param  xSize Buffer width
    / E% B  U8 z) m9 J
  1284.   * @param  ColorMode Input color mode+ V: O+ `+ s' l- g# {4 f' U
  1285.   */
    . z* B, z0 p( v* P8 ^4 Q7 Y
  1286. static void LL_ConvertLineToRGB(uint32_t Instance, uint32_t *pSrc, uint32_t *pDst, uint32_t xSize, uint32_t ColorMode)( `$ m- W7 [, W4 f. B. n) j
  1287. {+ _( q' p! i. H* A& {, `- ^
  1288.   uint32_t output_color_mode;
    ! Z9 V. l* ~% f8 y1 d. L

  1289. 7 V4 ]% u6 Q  B& E0 D
  1290.   switch(Lcd_Ctx[Instance].PixelFormat)
    0 S$ f  N; }2 U. f
  1291.   {
    % c8 {) g+ I0 O4 f/ w  d( {
  1292.   case LCD_PIXEL_FORMAT_RGB565:" X! V1 D4 i3 @3 A+ ~" j
  1293.     output_color_mode = DMA2D_OUTPUT_RGB565; /* RGB565 */+ [7 g) a/ P8 D7 \2 S0 o) `' d
  1294.     break;
    $ a( Y5 i, F- `  M* [; E0 Y
  1295.   case LCD_PIXEL_FORMAT_ARGB4444:
    3 f+ p% H- I$ T0 _2 M5 W
  1296.     output_color_mode = DMA2D_OUTPUT_ARGB4444; /* ARGB4444 */! f- W5 e& Z% L* M" y% p, x
  1297.     break;; F2 b8 P4 X( z/ W5 s
  1298.   case LCD_PIXEL_FORMAT_RGB888:
    9 ^6 b4 V* \5 r
  1299.     output_color_mode = DMA2D_OUTPUT_RGB888; /* RGB888 */
    & I: u. s' L3 P# V; ?7 j- F9 U
  1300.     break;
    3 Y7 m- ~' o; k" c5 ]- {! ~  O
  1301.   default:
    4 o0 D- X% g# M  c
  1302.     output_color_mode = DMA2D_OUTPUT_ARGB8888; /* ARGB8888 */: p8 @; I9 h) l; M! W
  1303.     break;! n1 n+ c9 D* ?) V  L
  1304.   }
    0 _! ~6 _% J+ b9 y' m/ J+ Z7 D
  1305. 4 V, `4 e( K7 Z6 ?
  1306.   /* Configure the DMA2D Mode, Color Mode and output offset */
    , m; F+ ]% U" H0 `+ l% h& v  D9 \
  1307.   hlcd_dma2d.Init.Mode         = DMA2D_M2M_PFC;
    # ^. L; J% Q: q0 z5 F$ [
  1308.   hlcd_dma2d.Init.ColorMode    = output_color_mode;
    : b) i& w' G2 i* J
  1309.   hlcd_dma2d.Init.OutputOffset = 0;
    + z( b; Q. v" b. {' ^, v- e
  1310. 1 D0 t" ], }* W4 g. @2 d5 K
  1311.   /* Foreground Configuration */
    9 S. U5 z4 \) P% Q9 g4 f
  1312.   hlcd_dma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
    . D3 \: H2 l1 Z
  1313.   hlcd_dma2d.LayerCfg[1].InputAlpha = 0xFF;" ?4 e/ S# k+ e( {- `/ j) I  k
  1314.   hlcd_dma2d.LayerCfg[1].InputColorMode = ColorMode;
    9 I! X% ]8 y& N) O  v; I* w
  1315.   hlcd_dma2d.LayerCfg[1].InputOffset = 0;  A, u, Y6 E; H: R1 }# X& R2 Q
  1316. % X. T& S% V  [# H9 f6 @# t
  1317.   hlcd_dma2d.Instance = DMA2D;
    $ X+ k4 I* s/ y
  1318. # J, n% J/ `% n
  1319.   /* DMA2D Initialization */
    3 d8 ~8 ~9 i2 m; p2 W+ w9 I& v
  1320.   if(HAL_DMA2D_Init(&hlcd_dma2d) == HAL_OK)
    8 J# j3 S% A9 g8 g/ V6 r- P* r
  1321.   {4 a! B& E$ P' v# ]
  1322.     if(HAL_DMA2D_ConfigLayer(&hlcd_dma2d, 1) == HAL_OK). u; n. A& O- f# @/ v
  1323.     {- U' v6 F6 j. N
  1324.       if (HAL_DMA2D_Start(&hlcd_dma2d, (uint32_t)pSrc, (uint32_t)pDst, xSize, 1) == HAL_OK)
    3 u( U/ k- y% J) S# T  Y
  1325.       {
    1 u. Y9 [+ d' ]1 f. A; ]# L
  1326.         /* Polling For DMA transfer *// o( J/ G( e8 {% H2 C
  1327.         (void)HAL_DMA2D_PollForTransfer(&hlcd_dma2d, 50);
    0 v2 V* L* v( A* o) g, u
  1328.       }
    9 e3 R* k9 T. x
  1329.     }
    ( u; N- _+ _. r
  1330.   }3 W. l9 W6 x9 u; t3 A
  1331. }
    / k0 b% {3 y" \1 B4 J4 W( o! J

  1332. " Q+ V. x2 a" L
  1333. /**: q. d1 J  C+ D2 t
  1334.   * @brief  Initialize the BSP LTDC Msp.' h7 J% I  I+ c0 ~. J
  1335.   * @param  hltdc  LTDC handle( M; R# Q- V7 r1 v: h# Q
  1336.   * @retval None# z; @4 X5 z8 S
  1337.   */! s4 g, m3 c+ C# X7 l
  1338. static void LTDC_MspInit(LTDC_HandleTypeDef *hltdc)
    $ z- Y/ u6 d. t* [& {
  1339. {
    1 G% {* H+ U4 E. Q, P
  1340.   GPIO_InitTypeDef  gpio_init_structure = {0};
    - v7 l/ [1 k* N- x" q  \8 p
  1341. ( ^& V! d$ x+ k, r# H
  1342.   if (hltdc->Instance == LTDC)
    ! G+ m' S& Q0 K) D! }
  1343.   {! H% P# u. A3 h7 l6 Y
  1344.     __HAL_RCC_LTDC_CLK_ENABLE();5 X0 Q! O4 B+ l5 Z, L0 M& C# a1 x
  1345. / x0 H1 L4 y0 k, L* V
  1346.     __HAL_RCC_LTDC_FORCE_RESET();' i0 R! u+ Q. X5 O
  1347.     __HAL_RCC_LTDC_RELEASE_RESET();
    ( Y! E" s" G& q6 a3 k  F
  1348. + C7 Q/ l) Z) \; N+ P, N, V) w/ [
  1349.     /* STM32N6570-DK MB1860A RK050HR18 */$ h) u/ b' }2 K: B/ Z6 K
  1350.     /* PG0  R0          */
    & i  a) w/ v% K+ a  g
  1351.     /* PD9  R1          */: t% D8 [0 V3 d$ g
  1352.     /* PD15 R2          */# n2 ^$ W3 s5 }! S- g, I
  1353.     /* PB4  R3          */ // JTAG1 J. b7 B6 y. ?
  1354.     /* PH4  R4          */* [! b/ M) E" k3 h8 K
  1355.     /* PA15 R5          */ // JTAG JTDI2 m1 K" i1 I' B8 c- v8 t
  1356.     /* PG11 R6          */( G* c/ u; K6 v5 G5 L& h
  1357.     /* PD8  R7          */
    , E  D$ t. x6 `+ O! A# d2 R
  1358.     /* PG12 G0          */
    2 {" L  E, _) i- t! t) W
  1359.     /* PG1  G1          */' k2 X$ v, O+ z# [9 _6 E
  1360.     /* PA1  G2          */# m* Y* o; I; N/ j1 j& Y+ Y
  1361.     /* PA0  G3          */
    ( l9 R1 x- r: q5 ]
  1362.     /* PB15 G4          */
    3 g8 m2 s% m- |  M) P7 a; ]
  1363.     /* PB12 G5          */
    & h! G) N: h6 g: b* c
  1364.     /* PB11 G6          */
    % h$ a; c7 L! P- J6 e% K
  1365.     /* PG8  G7          */
    ' y; e/ T6 x3 z6 v
  1366.     /* P15  B0          */
    % a: s5 s& M( B
  1367.     /* PA7  B1          */) q& p0 x6 D; e
  1368.     /* PB2  B2          */$ k7 T( a" A# \2 Y
  1369.     /* PG6  B3          */
    ! I  y2 r$ |; ]4 h
  1370.     /* PH3  B4          */9 ^4 b5 _& h- \2 I" T$ }* l
  1371.     /* PH6  B5          */* o! O, u" |; N( l$ U+ p8 Y9 b
  1372.     /* PA8  B6          */8 g+ ]; p+ L% ^0 m5 Y  v5 H9 w; i0 `
  1373.     /* PA2  B7          */+ G7 p0 Y5 u3 w  h6 V1 ~
  1374.     /*                  */
    9 b, r. `5 R! c) r
  1375.     /* PG13 LCD_DE      */
    ( A5 r5 x  V  f" y$ N" P
  1376.     /* PQ3  LCD_ONOFF   */
    1 h+ p, I, x  D8 _- D
  1377.     /* PB14 LCD_HSYNC   */
    1 C. h1 ~' q8 o
  1378.     /* PE11 PCD_VSYNC   */
    " i; F! s) p5 g
  1379.     /* PB13 LCD_CLK     */
    1 C* o% U* y0 u$ D" X7 Z: l
  1380.     /* PQ4  LCD_INT     */' B/ A. Q  ^' T
  1381.     /* PQ6  LCD_BL_CTRL */) [4 k7 ?; O8 y
  1382.     /* PE1  NRST        */
    % |  [4 M+ @+ o: u1 i
  1383. ; E1 {# [4 D( _# S8 J$ }2 h
  1384.     __HAL_RCC_GPIOA_CLK_ENABLE();1 x, Y4 d, L8 q% j' ]5 Y4 {
  1385.     __HAL_RCC_GPIOB_CLK_ENABLE();8 W" n& Z/ X* \6 i1 W/ l
  1386.     __HAL_RCC_GPIOD_CLK_ENABLE();
      q$ N0 Y/ h& s. @* e. j/ M
  1387.     __HAL_RCC_GPIOE_CLK_ENABLE();1 I$ J- g+ S/ G# H1 g6 w6 ?
  1388.     __HAL_RCC_GPIOG_CLK_ENABLE();
    4 z/ `7 B( O0 {% r
  1389.     __HAL_RCC_GPIOH_CLK_ENABLE();
    3 r' E' _; ]- L' h1 _) J* J% }
  1390.     __HAL_RCC_GPIOQ_CLK_ENABLE();0 T+ ?5 {5 N2 }* i# w$ B) t
  1391. # t0 g/ I! M" f5 m& r
  1392.     gpio_init_structure.Mode      = GPIO_MODE_AF_PP;
    2 [% C7 V6 n6 w. }( m+ O* U3 @
  1393.     gpio_init_structure.Pull      = GPIO_NOPULL;1 |6 J9 [) O: e) M1 ]
  1394.     gpio_init_structure.Speed     = GPIO_SPEED_FREQ_HIGH;
    ' A  F; F2 o- J% [, M8 v' }' s

  1395. 0 g, Q4 p) y* w1 \! M# B
  1396.     /* G3, G2, B7, B1, B6, R5 */9 _5 {- D/ I$ o2 B
  1397.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_15;4 n% u. C- x/ e9 v* b+ v( y/ S
  1398.     gpio_init_structure.Alternate = GPIO_AF14_LCD;/ l: A. K1 i" \' ]/ E, C( F. W
  1399.     HAL_GPIO_Init(GPIOA, &gpio_init_structure);
    ; H5 p6 h" c7 W- u8 y+ V  p
  1400. 7 J; H7 \: v( g+ O" F' ?8 M
  1401.     /* LCD_CLK, LCD_HSYNC B2, R3, G6, G5, G4 */
    + x; f$ V0 t) N* q
  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;% q5 J8 S3 h- F/ d. T) N
  1403.     gpio_init_structure.Alternate = GPIO_AF14_LCD;
    8 u! K# V& W* X" q5 ~
  1404.     HAL_GPIO_Init(GPIOB, &gpio_init_structure);
    8 J- W9 S& |/ C
  1405. 8 ^$ t( j) g; T2 }# x' o
  1406.     /* R7, R1, R2 */+ z  e& s/ Q3 a5 m/ f' P
  1407.     gpio_init_structure.Pin       = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_15;! O1 I; K; g  o1 y5 c: @8 ~5 J
  1408.     gpio_init_structure.Alternate = GPIO_AF14_LCD;
    9 m( N7 X. @; T1 w- q6 w
  1409.     HAL_GPIO_Init(GPIOD, &gpio_init_structure);
    ( M% U3 ]* w8 x2 U: o; j1 f

  1410. , `, I+ n; ~4 G
  1411.     /* LCD_VSYNC */! ^4 F) |0 ^: l2 S- @# [1 ?; a
  1412.     gpio_init_structure.Pin       = GPIO_PIN_11;( x. f) e; G1 v: m. n1 D
  1413.     gpio_init_structure.Alternate = GPIO_AF14_LCD;+ o7 w7 f. a5 J- g
  1414.     HAL_GPIO_Init(GPIOE, &gpio_init_structure);
    3 B, k/ l& W2 ]9 f
  1415. 6 S1 E4 F0 C3 c+ S
  1416.     /* R0, G1, B3, G7, R6, G0 */3 J6 B# y/ U% c5 g
  1417.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_6 | GPIO_PIN_8 | GPIO_PIN_11 | GPIO_PIN_12 ;! u- a& C, I7 W6 [0 t! h0 _
  1418.     gpio_init_structure.Alternate = GPIO_AF14_LCD;, t- J4 {: x1 I' q3 h! j% R
  1419.     HAL_GPIO_Init(GPIOG, &gpio_init_structure);
    " t: S; c2 V& @% f- r8 p

  1420. 9 `/ `: `4 C4 i  L+ V" B, u' l& z
  1421.     /* B4, R4, B5 */+ [, S( @" I* J. m/ A6 ?
  1422.     gpio_init_structure.Pin       = GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_6;
    ! L# t4 C0 P+ I' z! t; G
  1423.     gpio_init_structure.Alternate = GPIO_AF14_LCD;! J" d! L% K9 o' ~; \
  1424.     HAL_GPIO_Init(GPIOH, &gpio_init_structure);
    4 U4 j% z" T* S" H, U9 s6 p
  1425. , i( o/ D2 Q. p
  1426.     /* NRST */
    , q: L7 N* r7 G* s
  1427.     gpio_init_structure.Pin       = GPIO_PIN_1;7 V$ d" z* `2 }1 q
  1428.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;
    2 F' s9 v* A8 i1 [( L) R# I; m
  1429.     HAL_GPIO_Init(GPIOE, &gpio_init_structure);& V3 H+ t+ [/ x
  1430. & E% U/ e& l9 u8 q; r
  1431.     /* LCD_ONOFF, LCD_BL_CTRL */
    % Z1 H; i7 V$ {  ?; n4 X' F
  1432.     gpio_init_structure.Pin       = GPIO_PIN_3 | GPIO_PIN_6;) P) v; x! W1 b% ~# b* I: z2 s
  1433.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;; J6 U- `4 T8 z# W8 q! ]
  1434.     HAL_GPIO_Init(GPIOQ, &gpio_init_structure);
    0 L' p" w! l7 O% f+ ^4 u# m
  1435. 3 Y8 `' z: E8 Y: B2 z( L4 l
  1436.     /* LCD_DE */2 K! {, y- T4 o
  1437.     gpio_init_structure.Pin       = GPIO_PIN_13;
    7 }5 K1 T' X1 h% D! H, J5 G# K! ]
  1438.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;
    ) g- E6 i. e8 F9 Y
  1439.     HAL_GPIO_Init(GPIOG, &gpio_init_structure);, a2 c' Q! |! Q2 e  A( L$ N" r) C
  1440. % a  \; s  g2 m- W" O! L% _) d
  1441.     HAL_GPIO_WritePin(GPIOQ, GPIO_PIN_3, GPIO_PIN_SET); /* LCD On */ /* PQ3  LCD_ONOFF   */9 n% ^" I* _  P4 K
  1442.     HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET); /* Display Enable */ /* PG13 LCD_DE      */( U7 t( s1 I9 n
  1443.     HAL_GPIO_WritePin(GPIOQ, GPIO_PIN_6, GPIO_PIN_SET); /* 100% Brightness */ /* PQ6  LCD_BL_CTRL */
    1 x8 E% s  V  u% ]! P

  1444. ; ], a) G8 `4 Q7 b# Z( w" V4 f
  1445.   }
    * \. _) Q! G' v0 Q/ c( @
  1446. }! B2 T. Z3 `0 W1 i' _. ?
  1447. ; r6 t* l# E/ R/ b
  1448. /**, A/ L* w" V( m, b& {
  1449.   * @brief  De-Initializes the BSP LTDC Msp
    4 \4 K, J, S3 V9 ]- Y
  1450.   * @param  hltdc  LTDC handle3 t8 ?8 Z. [$ h" j5 s8 w
  1451.   * @retval None! l$ Q* g) h! O5 d) T& E
  1452.   */
    $ u( o& c+ p) T) r
  1453. static void LTDC_MspDeInit(LTDC_HandleTypeDef *hltdc)5 }+ K' X, ]. A+ W
  1454. {2 ~0 [3 e' {- `& J" X
  1455.   GPIO_InitTypeDef  gpio_init_structure;, t- M7 j$ H9 f2 N$ E
  1456. - g6 W/ d2 q, g8 g
  1457.   if(hltdc->Instance == LTDC)" L4 X6 z# ?& n3 P( I' T: Z+ o* {
  1458.   {( M+ m9 P# F6 d5 L( P/ \
  1459.     /* LTDC Pins deactivation */' A9 ]" `- |; k& g
  1460.     /* GPIOA deactivation */! K5 W' H& T6 c( m- ~* `+ V
  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;
    5 w/ k: w. z- U! O' }3 p  y8 \
  1462.     HAL_GPIO_DeInit(GPIOA, gpio_init_structure.Pin);! E2 _4 _6 s8 ~) x% T8 T5 q

  1463. , Y1 J$ K$ K" X# ^7 U
  1464.     /* GPIOB deactivation */
    0 E6 @: V# r* X
  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;' A2 o, t2 r/ Y
  1466.     HAL_GPIO_DeInit(GPIOB, gpio_init_structure.Pin);  J, C, T( [; \6 t: x- _
  1467. ) I0 }. m; I8 n; k4 P) B
  1468.     /* GPIOE deactivation */; d% [$ j) }- R3 o* f) b+ M
  1469.     gpio_init_structure.Pin       = GPIO_PIN_11 | GPIO_PIN_15;( G% z4 `6 d/ {3 w- Z
  1470.     HAL_GPIO_DeInit(GPIOE, gpio_init_structure.Pin);! X" D( k% b  o
  1471. 0 t+ n# b3 k3 k
  1472.     /* GPIOF deactivation */
    & v7 _2 m6 d- V. d, }
  1473.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_10|GPIO_PIN_11 | GPIO_PIN_9 | GPIO_PIN_7 | GPIO_PIN_15;( N9 ?; ~2 C( n; L2 A
  1474.     HAL_GPIO_DeInit(GPIOF, gpio_init_structure.Pin);
      {/ @6 R: F5 _% r
  1475. # \  E* h" {" i' [) l' o4 Z9 y# y7 ^* W
  1476.     /* GPIOG deactivation */
    + r1 T! K2 \* b0 D! y' Z5 G
  1477.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_1| GPIO_PIN_2 | GPIO_PIN_13|GPIO_PIN_14;
    $ Z7 T" M) p" Q7 b3 u5 r
  1478.     HAL_GPIO_DeInit(GPIOG, gpio_init_structure.Pin);  z$ s5 A4 x5 o" `; p

  1479. . h$ Q4 W8 q7 j4 p1 ?. _
  1480.     /** Force and let in reset state LTDC */0 F; U9 M! d% J; A/ U& k2 G1 r
  1481.     __HAL_RCC_LTDC_FORCE_RESET();
    ) X/ N# Y$ [4 ]/ O. J* M+ t+ o
  1482. , Q) h0 S9 Y) H6 |
  1483.     __HAL_RCC_LTDC_RELEASE_RESET();0 |5 V9 Y' a) R" {

  1484. 0 t( b: u% W8 T) Q# z0 l. B
  1485.     /** Disable the LTDC */
    * i/ V: X4 c1 ?- @
  1486.     __HAL_RCC_LTDC_CLK_DISABLE();* x9 @0 |. e1 Q' a7 b. L
  1487.   }
    ; _  e, @; k/ w- f
  1488. }
    ' e. G! B' e4 }- s7 ^( }
  1489. 6 `' O# N, \( F4 I4 Z/ s
  1490. /**
    * S6 f/ {5 w# _' ^, ]9 @
  1491.   * @brief  Initialize the BSP DMA2D Msp.2 ?3 k  `% H4 ~! Q2 y
  1492.   * @param  hdma2d  DMA2D handle8 k1 w; @  [7 ?7 E
  1493.   * @retval None6 p8 A, t( P9 I9 |+ a6 r3 U
  1494.   */
    9 V! W5 W/ y  e8 t' I/ ~
  1495. static void DMA2D_MspInit(DMA2D_HandleTypeDef *hdma2d)
    $ C% P! G9 ~+ W# m: |
  1496. {/ P, u  q% o3 E. C
  1497.   if(hdma2d->Instance == DMA2D)0 a; j6 ~" Y# D
  1498.   {
    0 A( d' m# M9 a7 d
  1499.     /** Enable the DMA2D clock */
    / F$ |8 @1 D8 {
  1500.     __HAL_RCC_DMA2D_CLK_ENABLE();6 [, w/ f# k* I+ l2 G

  1501.   N" h. D0 k7 z8 O; n( j+ U$ Q
  1502.     /** Toggle Sw reset of DMA2D IP */
    4 Z# y- ~  v* Y* q
  1503.     __HAL_RCC_DMA2D_FORCE_RESET();
    ! Y: E: J* N. i" U
  1504.     __HAL_RCC_DMA2D_RELEASE_RESET();
    9 K7 Q: L- b% c/ e. g
  1505.   }
    8 l3 I+ g. j$ M
  1506. }
    ) @* p3 [' {! l" V( F+ Q

  1507. " Z3 o9 h: L$ E, R- ]8 Z* x
  1508. /**) m3 B  J; ^3 u: D( L
  1509.   * @brief  De-Initializes the BSP DMA2D Msp0 k, a  Q7 w2 R9 y  ~  X- a' }
  1510.   * @param  hdma2d  DMA2D handle
    : D7 Q; o. Z6 `9 c8 T7 `
  1511.   * @retval None  n( @+ @. @0 E% E; o
  1512.   */
    ( Z4 n6 Q  U  u) ]0 c
  1513. static void DMA2D_MspDeInit(DMA2D_HandleTypeDef *hdma2d)% y5 i% @7 V; V  J' r1 j
  1514. {" v' Q& a: h& f+ v
  1515.   if(hdma2d->Instance == DMA2D): E1 X8 m; r4 {% ?
  1516.   {6 ?- T: H/ g! n$ a3 T
  1517.     /** Disable IRQ of DMA2D IP */6 ^+ c, \4 L7 d' k6 R2 s3 P* o
  1518.     HAL_NVIC_DisableIRQ(DMA2D_IRQn);
    2 `" k5 K$ e/ H0 U
  1519. ) l! r# w3 d/ \5 S8 h
  1520.     /** Force and let in reset state DMA2D */
    * M9 k( I) ?. j6 M. z" I* v
  1521.     __HAL_RCC_DMA2D_FORCE_RESET();
    5 U' I! o' G7 G6 A* |
  1522.     __HAL_RCC_DMA2D_RELEASE_RESET();9 e9 l" b, H- x6 s. A9 w; \) e

  1523. , l2 f: @7 s4 Q. B
  1524.     /** Disable the DMA2D */( Z* R- w1 N, X" g/ `6 A
  1525.     __HAL_RCC_DMA2D_CLK_DISABLE();# Q0 I/ Q" k' B! A  q. Z$ N8 o
  1526.   }
    ! N3 h0 U* ^, `7 w8 Z
  1527. }
    9 E4 _- H3 [& d% a+ s: t( |' U% I) H

  1528. 8 H  L1 }" {7 o* h$ Z% v
  1529. /**
    / G; t8 k1 u2 K( {
  1530.   * @}6 B/ Z  E" G  C$ {: i7 Z
  1531.   */9 c2 S& r; `( Y) f  {
  1532. 8 J" P8 s! e9 q  ^* [& \' Z$ x
  1533. /**
    3 V# @, \2 z7 @* A$ {0 a6 u
  1534.   * @}
    . `; B# U) g) E1 d
  1535.   */; Z5 g" e; M; o8 Y% T% {% W

  1536. # k# d3 ?# S* u1 V0 M7 A: b" Z  B/ v
  1537. /**
    / D! I/ E) q5 R- Z/ @% T5 k" c  s
  1538.   * @}
    3 K* o$ _6 I  z( S3 _# N
  1539.   */, b3 c7 B4 p5 ^  ~3 t0 A2 [) e
  1540. + d7 c# v; {5 f) Y9 g. u
  1541. /**/ P- s6 D/ U9 h
  1542.   * @}" Y' n4 z, c7 `, ~
  1543.   */9 N' c; y% {4 u0 |* V
  1544. 0 r% Z% {' k% l' G: }
复制代码
2 U3 z7 ]* w" y/ M: p1 R6 ]3 d& @

3 b( ?- ?# s  @* E; U7 @2.2、main.c: Y9 h; r- j5 ]) }/ A
  1. int main(void)% \/ i% A8 `4 r; S, J2 K
  2. {( v: Z& o& R! k
  3.   uint32_t x_size;+ Z, G0 ?/ B9 g
  4.   uint32_t y_size;1 X3 M! Q7 U# M( G3 m" \
  5.   uint16_t i,j;
    9 q+ y& l6 M6 m/ q4 z

  6. 0 K& A; ~& Q7 U+ A. J7 \
  7.   HAL_Init();
    0 a' E( N9 v" l- V
  8.   SystemClock_Config();
    0 ]& t# y3 t! ?, p: k% ~
  9.   0 n5 o' _2 p; U0 @
  10.   /* Update the RIF config for the used peripherals */4 s/ {& R, D8 H) J4 q, M( [
  11.   RIMC_MasterConfig_t RIMC_master = {0};
    ( q' p* K6 ^) f$ ]9 N% k
  12.   RIMC_master.MasterCID = RIF_CID_1;4 M+ Q7 o( t5 B( [" {, y3 j) W* I
  13.   RIMC_master.SecPriv = RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV;! `, N7 g% o  ^3 q$ i
  14.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_DCMIPP, &RIMC_master);
    : E1 @0 E6 _' x
  15.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_DMA2D, &RIMC_master);& V2 I) K& a+ v  l+ s" G
  16.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_LTDC1 , &RIMC_master);) K- p' u, E2 W9 s% o9 `+ U7 @% F  r
  17.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_LTDC2 , &RIMC_master);
    * H; [# s# o* K; F2 K
  18.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_VENC  , &RIMC_master);7 ?( h3 _6 `* T7 X1 X0 `( w! q& \9 D
  19.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_DMA2D  , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);1 F- ^* D# Y& S, r( R1 Q- T
  20.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_DCMIPP , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);1 \4 b, Y5 V" R1 U/ V
  21.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_CSI    , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);) ]8 u* V% P0 J  j. X
  22.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDC   , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
    0 f6 ?& ^$ [( k  U& ^9 z" f2 |: O" q
  23.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDCL1 , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);! {% P9 D( J3 M- h
  24.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDCL2 , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
    " L$ u% V3 j0 u

  25.   A  S9 X( o4 I& H% {$ l
  26.   BSP_LED_Init(LED_GREEN);
    9 y0 h6 b3 N2 F/ o8 t
  27.   BSP_LED_Init(LED_RED);0 @) ~% W5 k2 ~: @6 y" O
  28.   
    / _: O& J4 w6 _7 l3 ^2 Y
  29.   #if USE_COM_LOG6 O/ q6 N! `3 r. y9 U& w4 J+ P$ h
  30.   COM_InitTypeDef COM_Init;. U! X) b: I. T  N5 V
  31. - D, f  _+ _: r0 T' H1 D) @8 k
  32.   /* Initialize COM init structure */+ u7 F+ Y+ P; d9 Q! |
  33.   COM_Init.BaudRate   = 115200;, o9 _( Z2 w# F9 R
  34.   COM_Init.WordLength = COM_WORDLENGTH_8B;
    / Z1 [( L9 p( `
  35.   COM_Init.StopBits   = COM_STOPBITS_1;
    # d! L4 {+ t' K  ?9 n, G5 }
  36.   COM_Init.Parity     = COM_PARITY_NONE;  g3 o! D4 K' }# q4 [
  37.   COM_Init.HwFlowCtl  = COM_HWCONTROL_NONE;0 p+ K8 K9 T4 k, G
  38. , ]) b; z6 z( I$ `
  39.   BSP_COM_Init(COM1, &COM_Init);; ~) `& z& r. F, y) V
  40. 7 B; z# g! @; x0 ]' ?6 W* i
  41.   if (BSP_COM_SelectLogPort(COM1) != BSP_ERROR_NONE)
    6 ]7 d9 L1 h+ H7 h& ]% i3 f
  42.   {
    ; @$ j3 x* Z. u; a# H4 }! Y
  43.     Error_Handler();* X5 T( j6 P5 e4 C
  44.   }! F" _" a, s3 b; n* t
  45. #endif
    ) ]3 Z5 d# X, m$ @3 _% J, m
  46.   
    % L. ?, H7 Y. W
  47.   BSP_LCD_Init(0, LCD_ORIENTATION_LANDSCAPE);
    1 _$ ], j( C/ u: q% N0 P' `
  48.   UTIL_LCD_SetFuncDriver(&LCD_Driver);
    5 C, i/ L& o. H7 K6 E6 V: Q
  49.   UTIL_LCD_Clear(UTIL_LCD_COLOR_RED);2 {4 x/ r5 x; ~9 N+ w8 p
  50.   UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_RED);
    : ]6 Y* f# j7 n$ S
  51.   UTIL_LCD_SetBackColor(UTIL_LCD_COLOR_WHITE);7 A, J: }* |) w- d# z
  52.   UTIL_LCD_SetFont(&Font24);/ y, w, X' }; @+ r: _) N) F
  53.     c4 X: q2 E& p2 A
  54.   while (1)5 U1 {0 `+ k: h: h) }9 v
  55.   {( `  u! s! i* u3 D1 t
  56.     switch (i)3 l' \0 E# C; G$ s9 ~
  57.     {0 `6 {& A& ^3 k/ _
  58.       case 0:' A( t: C1 j6 C7 G6 I# d
  59.       {
    - B# }" A$ b3 \" ~% [0 J
  60.           UTIL_LCD_Clear(UTIL_LCD_COLOR_WHITE);
    5 @1 h: X) j# C$ W
  61.           break;4 j6 Z2 u" M$ h9 H
  62.       }( [0 k2 @) ?0 ?3 q0 X
  63.       case 1:
    + d$ a! o! v0 y# @. I
  64.       {& R( x* e0 r- t# q* S) M3 P
  65.           UTIL_LCD_Clear(UTIL_LCD_COLOR_RED);
    ; j, i* g6 Z/ z2 z! a" ~% L
  66.           break;
    7 ?/ E8 f, z* p: n. q* ~% N) [1 |5 W
  67.       }
    0 j8 f3 h3 ?( A* `9 A. {2 [0 w
  68.       case 2:
    5 l5 D4 Y# d9 V$ v* F
  69.       {
    + c- Z7 ^5 `: g) G4 v
  70.           UTIL_LCD_Clear(UTIL_LCD_COLOR_GREEN);
    3 z3 b( k* p. C7 |7 P$ M. o
  71.           break;% _: H. i7 r* ~; Q
  72.       }
    & R) U6 F& h! R, X
  73.       case 3:
    - L0 @% K3 h. z+ E2 A/ ^8 P' ]: G9 o3 M
  74.       {
    % r# i; q/ S- W! L& i/ [2 S
  75.           UTIL_LCD_Clear(UTIL_LCD_COLOR_BLUE);+ ~; ~1 W4 c7 Z: W8 H; z) u4 N
  76.           break;9 n) @, v" I1 E" r5 k; Y
  77.       }
    3 g& x( p& l9 E5 A% ?; D1 h$ [' \
  78.       case 4:" g( Q$ k, O+ }: }6 i
  79.       {
    / v: o$ s& G* v* g+ l
  80.           UTIL_LCD_Clear(UTIL_LCD_COLOR_MAGENTA);
    & ?$ q; N; F) d) {# b* }
  81.           break;
    0 q$ g+ S. w2 K' a# A  \
  82.       }
    0 O# ^' n! i" u
  83.       case 5:
    5 g5 _, R7 ^' C: M- W8 j
  84.       {' X6 g: D! d/ k# F- R
  85.           UTIL_LCD_Clear(UTIL_LCD_COLOR_YELLOW);6 Z+ N7 O+ f( {* y9 a. a
  86.           break;
    * a' C' V: }9 K
  87.       }8 Z( ~! x( r2 k: D  }
  88.     }+ T% ?, f  |- ^. _" _0 c3 C
  89.     ; Z# p" \& [) Z" {
  90.     if(i==6)8 T7 d$ x* [, q& B
  91.     {
    9 R# |) W# U, d5 E0 a
  92.       i=0;
    8 B$ ]& y; b% G: F2 X8 S
  93.     }
      n# w- y. `/ t# Q( n
  94.     else' m6 W! r" m! i# N
  95.     {# t* u$ a  n4 J. Z2 b* O: G
  96.       i++;
      U/ V7 e- ~; k0 A7 _
  97.     }- }- W% g  z3 c0 F& o4 c% \. \
  98.     UTIL_LCD_DisplayStringAt(10, 50, (uint8_t *)"STM32N6570 BOARD LCD TEST!", LEFT_MODE);
    0 s, n+ f+ X* x- Q
  99.     BSP_LED_On(LED1);
    ! |3 d0 l. q6 E0 m. k3 U
  100.     HAL_Delay(500);& V, w; ?$ f  S( N7 e: U0 ?3 _
  101.     BSP_LED_Off(LED1);/ C6 B: Q  H7 ]7 v8 E
  102.     HAL_Delay(500);
    ' [& a+ i' R5 n- i, }1 N: F1 I
  103.   }
    # I* R0 \' H0 o+ v6 q8 X8 V$ J
  104. }
复制代码
" H! g) r8 x7 z) U4 [

/ U$ g7 i  Z- c" k, ?; V8 h1 }4 N' l" B* ]
  N, o' D5 ?' q1 N* e) Y
三、结果
; I0 p% E5 i  m
  f( {* l$ j3 |$ M

! t; D  _( D+ S' N& L6 M2 `5 Z下载程序到开发板,运行开发板屏幕显示如下:
" Z) v0 c3 f2 D& x lcd.gif & V$ L" a) v1 Q. I7 L' A
( [8 B7 q' m) R9 R) q4 q

) G$ z$ b! z1 o# p6 O5 T

9 Q) K9 `' q6 v# X: P  S. D
0 O6 Q5 @4 ?6 ]1 Y* K2 u5 x
收藏 评论0 发布时间:2025-2-18 15:02

举报

0个回答

所属标签

相似分享

官网相关资源

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