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

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

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

5 H, i& T+ [. o) m5 I7 e5 p( t$ q$ @( U7 Q- L4 P
+ |- r% S) h0 ^
一、硬件部分: y" i! v8 }5 X1 J
1.1、LCD显示屏硬件接口部分电路
' A6 n7 V. X9 R1 N% J. O$ ~1 E lcd.png $ ^& L- G* S- W/ k5 X( R& K

0 @7 ~( y$ @, f: [, }
# y$ R" Z7 x- Q( ^2 F" w( s4 Y8 A% Y! R3 S
$ {. p0 _. C4 o5 j5 T

. k. ?' E/ _( ~9 d2 ]4 N) V& O1.2、LTDC显示内部框图' C: w' N0 O9 t2 f9 v- N2 d
LTDC可驱动24位的RGB显示屏,内部有两个显示层
( D* A+ `" K- O* u; r' d: c% o! j 002.png
/ A: h+ B6 W3 M* p

+ E: c/ j4 m8 [/ G! U, k
% z; u+ [$ N/ F& J- Y
* X; k) p) S6 d( p+ ^5 ^
二、配置LTDC
- i5 U! X# K4 f7 ?0 Z6 C$ x2 w; ]; |" I
2.1、屏幕的参数设置
1 M6 Q' i) m- i; P 003.png
; s, o1 I8 r- G. |+ T
; f8 T6 A. D3 _

/ C% H) F) j! {4 i: F2.2、层参数设置
, G/ S) _* x1 b* h7 u 004.png
& S( J  e8 t3 P8 x

( |6 j! F/ k- W! q& t9 h& r% n: S+ H6 D' ?& J6 E3 a

6 k& \$ s0 i5 F% f2.3、LTDC引脚设置7 l, j3 P+ Q0 _5 Z; N  H0 v: t6 a
005.png 5 m3 r" H) o# F" H! |9 t( k
4 J" n: }! T- `

( g' v; i! ^/ q

: R/ |* K+ j1 T1 f' m三、程序部分
/ m8 R- Z7 W& W% W/ F* b. `  f4 d8 a' l* d( \4 E3 }) g/ |8 e
3.1、在项目中添加LCD驱动程序
) h5 r9 P! g8 l4 V使用官方BSP中的LCD驱动程序
9 s/ a" [% Z9 B- C& l8 w5 |stm32n6570_discovery_lcd.c
. F$ s7 l- e; H* o, `
0 u# {5 {7 o$ t. S8 `/ _% o
  1. /**
    7 p4 ]$ L! i/ x7 e1 o
  2.   ******************************************************************************
    $ _& i! {. r5 K
  3.   * @file    stm32n6570_discovery_lcd.c1 x- O/ p8 s/ ~# m& ]# z
  4.   * @author  MCD Application Team% ?, D/ d1 I/ @9 Y! d' `% d
  5.   * @brief   This file includes the driver for Liquid Crystal Display (LCD) module
    1 K& S: ]! Q9 s" B7 x2 A6 }0 _
  6.   *          mounted on STM32N6570_DK board.
      t% t* O- d& o5 n
  7.   ******************************************************************************
    1 {7 o8 a. o/ L% e9 k9 [
  8.   * @attention! o5 S* }9 |0 ^+ {: }, F
  9.   *
    % U$ }1 {$ h- T# [
  10.   * Copyright (c) 2022 STMicroelectronics./ h+ h7 q! t$ t  ?% ]9 N7 N5 |
  11.   * All rights reserved.
    * K/ m" r( [6 p
  12.   *# i  J# W$ Y" B
  13.   * This software is licensed under terms that can be found in the LICENSE file
    2 E/ i4 l! `( B' S
  14.   * in the root directory of this software component.
    8 B: u+ y% M; v. K, I' _6 g
  15.   * If no LICENSE file comes with this software, it is provided AS-IS.
    ( f$ h" ]5 ?. m/ k8 B
  16.   *9 N* W0 E  E/ z% B
  17.   ******************************************************************************
    1 T9 e8 t  C- x( r; {: w  h
  18.   @verbatim
    ; z9 F) Y9 Y+ c5 h# U
  19.   How To use this driver:+ a' c) S% {9 g9 W" x% a7 ]7 \9 {
  20.   --------------------------
    / @: K2 F$ `# r
  21.    - This driver is used to drive directly a LCD TFT using the LTDC controller.
    * {' i4 V- q8 t
  22.    - This driver uses the adequate timing and setting for the RK050HR18 LCD component8 I# X7 }& {) H

  23. ( |/ Y+ H/ t8 G* s% w" I7 l# s
  24.   Driver description:  f5 M" j7 I" L; c
  25.   ---------------------9 T# |( g# k! `. g; K3 w
  26.    + Initialization steps:  P5 L7 o+ L2 ~1 G
  27.      o Initialize the LCD in default mode using the BSP_LCD_Init() function with the
    $ C8 P6 ~6 b* q5 ?2 o" m. J
  28.        following settings:
    ( r1 {; a7 _2 a/ P' {; i; k8 C# {
  29.         - Pixelformat : LCD_PIXEL_FORMAT_RGB888
    " u( V! K/ Z* q9 l$ h8 ~, i$ F' m7 P
  30.         - Orientation : LCD_ORIENTATION_LANDSCAPE.* ?5 ]" {  ?' I0 J; ]7 X
  31.         - Width       : LCD_DEFAULT_WIDTH (800)) O. {$ S, |5 b/ D0 C+ ~
  32.         - Height      : LCD_DEFAULT_HEIGHT(480)
    % k3 c2 V4 b* h) \
  33.        The default LTDC layer configured is layer 0.7 ]* ^& H* g. @3 I
  34.        BSP_LCD_Init() includes LTDC, LTDC Layer and clock configurations by calling:
    / c$ G6 Z3 z7 g# f. d' c. i& @
  35.         - MX_LTDC_ClockConfig()1 Q& `1 \4 N6 h( B4 t
  36.         - MX_LTDC_Init()
    # t* t; L+ P9 O8 t- Q6 V# _
  37.         - MX_LTDC_ConfigLayer()
    0 T; e8 X; }/ @0 o2 X
  38. 9 x  N" P: `" f0 ~+ Q
  39.      o Initialize the LCD with required parameters using the BSP_LCD_InitEx() function.
    . l5 i7 x& `' G  q

  40. ! C* m- l4 m0 i6 E
  41.      o Select the LCD layer to be used using the BSP_LCD_SelectLayer() function.+ Y" T5 |+ X6 c, W* R3 v' c
  42.      o Enable the LCD display using the BSP_LCD_DisplayOn() function.9 l& J$ }. x9 C- o+ e/ Q
  43.      o Disable the LCD display using the BSP_LCD_DisplayOff() function.) i8 W+ K8 e$ j8 u3 i( T
  44.      o Write a pixel to the LCD memory using the BSP_LCD_WritePixel() function.0 `" D& b* F; u5 t* \* ]
  45.      o Read a pixel from the LCD memory using the BSP_LCD_ReadPixel() function.& M3 M& ~4 P: S- i. ^' j
  46.      o Draw an horizontal line using the BSP_LCD_DrawHLine() function.
    . r% Z( U+ E: ^5 I& Z% q1 z
  47.      o Draw a vertical line using the BSP_LCD_DrawVLine() function.6 R1 P( R5 n7 [) b$ y6 [: f$ k5 [# ~; G# T
  48.      o Draw a bitmap image using the BSP_LCD_DrawBitmap() function.
    6 n5 n# {# ^3 }! j

  49. & a9 p3 X8 m7 a7 ~' L* W' u
  50.    + Options2 z' l* t+ t! Z7 G6 R6 e$ N4 w
  51.      o Configure the LTDC reload mode by calling BSP_LCD_Reload(). By default, the
    8 k! H3 o+ |1 T. ?4 N
  52.        reload mode is set to BSP_LCD_RELOAD_IMMEDIATE then LTDC is reloaded immediately.
    : q7 m- ^- @& [
  53.        To control the reload mode:' [, Y6 w4 J4 X# R' b
  54.          - Call BSP_LCD_Reload() with ReloadType parameter set to BSP_LCD_RELOAD_NONE+ J- K3 E& Q0 e) {0 r
  55.          - Configure LTDC (color keying, transparency ..)& Q) D( \& {7 V6 |
  56.          - Call BSP_LCD_Reload() with ReloadType parameter set to BSP_LCD_RELOAD_IMMEDIATE
    ; ]% v2 I# _! F0 D
  57.            for immediate reload or BSP_LCD_RELOAD_VERTICAL_BLANKING for LTDC reload# d) G* M6 O) K. w  O3 z0 _
  58.            in the next vertical blanking7 n, _8 F3 J7 ~" C3 `
  59.      o Configure LTDC layers using BSP_LCD_ConfigLayer()7 \& u* I6 y7 p1 E2 ?
  60.      o Control layer visibility using BSP_LCD_SetLayerVisible()
    * y4 z0 W9 ]4 \
  61.      o Configure and enable the color keying functionality using the
    ) i/ W, r8 I1 ~4 I4 B8 j
  62.        BSP_LCD_SetColorKeying() function.
    , M7 b4 I9 Z( Z6 I0 ?% e
  63.      o Disable the color keying functionality using the BSP_LCD_ResetColorKeying() function.8 Z0 q: \2 w" X
  64.      o Modify on the fly the transparency and/or the frame buffer address
    0 [- h9 A+ _) o
  65.        using the following functions:, s. M+ f5 J: N: O1 e2 F& h' X
  66.        - BSP_LCD_SetTransparency()) f$ D. C: w8 u" N' C! I. M
  67.        - BSP_LCD_SetLayerAddress()
    $ {& I  e$ j9 a
  68. 3 E/ M& C6 v0 n+ q) z
  69.    + Display on LCD0 `  L! d! k' n" I
  70.      o To draw and fill a basic shapes (dot, line, rectangle, circle, ellipse, .. bitmap)
    . O8 l" R0 }% N, W( W
  71.        on LCD and display text, utility basic_gui.c/.h must be called. Once the LCD is initialized,! Y/ N$ {( z. f2 w
  72.        user should call GUI_SetFuncDriver() API to link board LCD drivers to BASIC GUI LCD drivers.8 g- @3 U) ?. s. F4 Q2 P# o
  73.        The basic gui services, defined in basic_gui utility, are ready for use.* o6 T; m+ R3 E1 S* M- e! M
  74. 9 S3 @$ T" J  c( w' M5 C" u
  75.   Note:
      L3 Q9 n6 j7 N8 s& S  y9 j7 p( Q
  76.   --------
    # B2 {. j8 A( D, M- U
  77.     Regarding the "Instance" parameter, needed for all functions, it is used to select- H5 {9 P4 v" i0 Y9 O
  78.     an LCD instance. On the STM32N6570 Discovery board, there's one instance. Then, this: u  m: @; l; ^. ^. ?% S  h& g5 C) \
  79.     parameter should be 0.! O2 J8 g" u) H6 W0 G7 Y# ^6 u9 S( F
  80. . g  W4 x/ `: @+ x
  81.   @endverbatim2 A, f) l  |1 k* w0 r) b
  82.   ******************************************************************************
    9 N" V3 E7 k: t5 r: _: J' x, f
  83.   */5 k; T, W; h4 D: L+ H/ i$ e# U2 P2 o
  84. - U8 \' e8 N$ T+ w! N7 Q5 d2 B2 ^
  85. /* Includes ------------------------------------------------------------------*/
    4 G' \7 j/ W7 f9 X. g
  86. #include "stm32n6570_discovery_lcd.h"
    " u3 ]' U2 u, g5 U& w$ p

  87. 9 A+ E" x* N' V" R- i6 n
  88. /** @addtogroup BSP. V  A4 y/ {- c3 S4 N2 Q# ]# M
  89.   * @{0 v: e" s/ r0 w. m7 C+ @
  90.   *// Y& N3 V6 r+ u% ^& c
  91. 8 Q/ e2 I0 |6 ^& T4 e& \! k* ~
  92. /** @addtogroup STM32N6570_DK2 g. @$ z# i% z! D
  93.   * @{$ L' t7 ~1 P1 B' S, y! k8 f& W
  94.   */
    , c9 d8 J, g( H8 F
  95. ! t* p, t+ Z& Z5 Y+ |
  96. /** @defgroup STM32N6570_DK_LCD LCD( t; c3 M$ o9 i7 B4 S0 G( ]
  97.   * @{
    * t9 t& v+ a3 x/ i1 v* Q% f6 ^! {0 S
  98.   */" ^% U6 o/ l) s) I9 U6 t9 n, R
  99. * L7 m3 J7 M% D& G0 u. C
  100. /** @defgroup STM32N6570_DK_LCD_Private_Variables LCD Private Variables
    ; O; n5 M2 h/ F! O" z0 w/ x3 Y. f
  101.   * @{
    2 g; |) u5 r" E& |, J
  102.   */, {0 d5 J2 A) Z/ S0 G) G3 U& ^
  103. ! n9 ?0 R: F1 l5 w
  104. /**
    & e* }; a, t4 ?. M( G; H
  105.   * @}
    : R* B' G8 I- B* r3 D( A8 i
  106.   */
    $ A/ I/ r8 M5 l' t8 X% X
  107. " M2 _1 f) @$ z. Y/ C0 }
  108. /** @defgroup STM32N6570_DK_LCD_Private_TypesDefinitions LCD Private TypesDefinitions
    2 v# X# I8 K- _6 O' F
  109.   * @{
    / Q( ^) }" r+ N2 s3 T  b
  110.   */
    2 B  n& N; d1 X( v
  111. const LCD_UTILS_Drv_t LCD_Driver =# f0 v) P2 y. E7 L/ K
  112. {
    & y' C/ d) c: B
  113.   BSP_LCD_DrawBitmap,! T) z5 M4 y8 k# Q1 A
  114.   BSP_LCD_FillRGBRect,; z7 @$ Q( r, Z: X
  115.   BSP_LCD_DrawHLine,
    * s" t" W" U( \; S! v8 i
  116.   BSP_LCD_DrawVLine,0 G5 d3 {; l" l) f6 x
  117.   BSP_LCD_FillRect,
    7 R5 Q4 z! o$ x5 ]: Z5 v6 Z
  118.   BSP_LCD_ReadPixel,- `6 y+ @8 r/ n) e8 I8 \
  119.   BSP_LCD_WritePixel,
    0 ~% R3 [7 V2 h
  120.   BSP_LCD_GetXSize,, T8 Q" B+ y/ G+ J
  121.   BSP_LCD_GetYSize," z' u/ L8 M8 B3 v
  122.   BSP_LCD_SetActiveLayer,8 F0 U# z5 [7 K8 U
  123.   BSP_LCD_GetPixelFormat
    2 D9 O; p2 I2 H3 L2 z: W* v
  124. };
    ; }7 J  A& O0 d- g; Y2 j

  125. 5 N* U; J) _. A
  126. /**1 r" A* [7 S' Q
  127.   * @}
    / `2 R1 ^$ ~, J2 Z4 g  S5 F! x  |! P
  128.   */
    2 S( y, \! @# c4 |" M- `

  129. * {* R% o- I# S9 W% o1 d, k: q
  130. /** @defgroup STM32N6570_DK_LCD_Exported_Variables LCD Exported Variables9 q2 ~0 a3 a& d8 B1 i- l$ n
  131.   * @{
    2 s$ }, o7 Y' i! Z6 }, r2 U
  132.   */$ U- d/ j, D" r- {
  133. DMA2D_HandleTypeDef hlcd_dma2d;
    - Z' _7 \: Z, ~/ U% }, m4 G5 y
  134. LTDC_HandleTypeDef  hlcd_ltdc;6 r$ i8 y# V$ @
  135. BSP_LCD_Ctx_t       Lcd_Ctx[LCD_INSTANCES_NBR];3 g9 m4 I# D5 g8 A% |( d* o
  136. /*** x  ~: z0 X+ L, M
  137.   * @}( `: }3 n7 S/ e
  138.   */
    , p7 e0 U4 I  f1 F; }1 [8 H
  139. / {& g  b/ F+ _5 P
  140. /** @defgroup STM32N6570_DK_LCD_Private_FunctionPrototypes LCD Private FunctionPrototypes5 Z" l5 K- g5 u4 {
  141.   * @{
    , L' k1 V- Y0 p' A: a" m
  142.   */! j2 r* X4 M0 O8 a1 @
  143. ) v) k0 r7 s, D& m% Z
  144. static void LTDC_MspInit(LTDC_HandleTypeDef *hltdc);0 K: C3 M, x9 \- p2 q" z; E
  145. static void LTDC_MspDeInit(LTDC_HandleTypeDef *hltdc);" A; G: G; m, Y6 \7 e/ v* g
  146. static void DMA2D_MspInit(DMA2D_HandleTypeDef *hdma2d);
    5 T  W& g3 N* I
  147. static void DMA2D_MspDeInit(DMA2D_HandleTypeDef *hdma2d);2 h8 r+ X. B/ x( Y! S; }
  148. static void LL_FillBuffer(uint32_t Instance, uint32_t *pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t Color);2 B, n+ o4 u( G0 Y1 t. x( N0 I' C
  149. static void LL_ConvertLineToRGB(uint32_t Instance, uint32_t *pSrc, uint32_t *pDst, uint32_t xSize, uint32_t ColorMode);
    8 G4 e0 j, a5 U1 O" L0 Q0 w
  150. /**
    * r' h7 Q: B, {' ~' o
  151.   * @}; R$ I- I7 {6 k$ D, r
  152.   */
    " G6 q- w, o( {$ @& o/ t
  153. /** @defgroup STM32N6570_DK_LCD_Private_Macros  Private Macros
    . x5 b/ B; Z/ X$ g
  154.   * @{) w! o8 ]' L5 J7 z  [
  155.   */
    2 E  m2 A/ G7 F& q; U3 ~4 _, s- Y
  156. #define CONVERTRGB5652ARGB8888(Color)((((((((Color) >> (11U)) & 0x1FU) * 527U) + 23U) >> (6U)) << (16U)) |\$ k6 e5 u& m7 T3 K
  157.                                      (((((((Color) >> (5U)) & 0x3FU) * 259U) + 33U) >> (6U)) << (8U)) |\  A' K* B" n, T9 V0 y
  158.                                      (((((Color) & 0x1FU) * 527U) + 23U) >> (6U)) | (0xFF000000U))8 `: t/ b2 B: v/ K9 p9 Y& V4 [

  159. 5 h( U' a& W) f" h. a
  160. #define CONVERTARGB44442ARGB8888(Color)((((((Color) >> 12U) & 0xFU) * 17U) << 24U) |\
    5 `2 D) l& }6 v$ K( ?9 G  S4 z0 [. Q
  161.                                         (((((Color) >>  8U) & 0xFU) * 17U) << 16U) |\% a8 O* O9 g; j; q* q1 U
  162.                                         (((((Color) >>  4U) & 0xFU) * 17U) << 8U) |\
    ( }$ ~% I4 |0 V+ a1 n5 f: n  s
  163.                                         (((((Color) >>  0U) & 0xFU) * 17U) << 0U))
    . Z( e! m( b" z( \
  164. 2 Q, }% A* _' n/ g7 x3 k
  165. #define CONVERTRGB8882ARGB8888(Color)((Color) | 0xFF000000U)
    , Y4 ?+ M' }/ P. ~; e* G# m. }
  166. . C9 k% Q" @% K. T1 W
  167. #define CONVERTARGB88882RGB888(Color)((Color) & 0x00FFFFFFU)* N. V& A/ e/ U# d8 P" U
  168. - S) u% T/ X4 V; V, A% Q3 m* g
  169. /**
    , c- I$ z  ]+ v5 H6 }( C$ n" s/ b
  170.   * @}
    * B/ x- z5 m: i8 J% a7 g
  171.   */
    - K8 ~! ^( w3 s% }2 v

  172. , j, v" Z& U+ z: c- A# f
  173. /** @defgroup STM32N6570_DK_LCD_Exported_Functions LCD Exported Functions
    ' [. k' ]. ]2 J0 @( L
  174.   * @{8 P/ u% k3 S% y) A) c- z# U; c
  175.   */" s4 Q9 q8 E& |3 s# L' H. X
  176. /**; {& A4 b1 H6 `' }& ]3 @
  177.   * @brief  Initializes the LCD in default mode." Z  [" S, ~1 H' U' b
  178.   * @param  Instance    LCD Instance
    5 A8 F2 P2 o: H  e5 R
  179.   * @param  Orientation LCD_ORIENTATION_LANDSCAPE
    ! t: o% S; m. q5 p/ f
  180.   * @retval BSP status8 j  m, F! W0 k+ N
  181.   */4 T; @. Q: V: U& A+ I7 `5 h1 U

  182.   W( F7 l; N; v* A1 P
  183. int32_t BSP_LCD_Init(uint32_t Instance, uint32_t Orientation): E$ ]$ t, h3 D
  184. {
    3 q$ `# c$ J/ `: y! A5 ]
  185.   return BSP_LCD_InitEx(Instance, Orientation, LCD_PIXEL_FORMAT_RGB565, LCD_DEFAULT_WIDTH, LCD_DEFAULT_HEIGHT);
    6 c' L. @4 H# B- x
  186. }3 S" y4 }. e; l( x; {

  187. $ {& F" U" I5 [; T' e" F2 a
  188. /**
    / {# K& @' Q' o) s( x) ?. u
  189.   * @brief  Initializes the LCD.
    ( y5 J/ }$ k3 |
  190.   * @param  Instance    LCD Instance
    , Q1 {4 H! `3 ~
  191.   * @param  Orientation LCD_ORIENTATION_LANDSCAPE
    & f2 m4 \1 R; H  {2 v& h
  192.   * @param  PixelFormat LCD_PIXEL_FORMAT_RGB565, LCD_PIXEL_FORMAT_ARGB4444, LCD_PIXEL_FORMAT_ARGB8888
    ; b! T( z3 U6 e
  193.   *                     or LCD_PIXEL_FORMAT_RGB8886 |& y: _0 B$ y5 @6 F/ h& O# j
  194.   * @param  Width       Display width2 h% y' v; d" i2 {- J/ \$ k
  195.   * @param  Height      Display height0 H5 l: `) w# ^7 T) l0 j9 z6 }
  196.   * @retval BSP status
    ; S& @' l# z4 {* R7 Q6 A
  197.   */
    ! X7 O2 I! f9 @" a9 b. F+ g1 Y6 ~7 p
  198. int32_t BSP_LCD_InitEx(uint32_t Instance, uint32_t Orientation, uint32_t PixelFormat, uint32_t Width, uint32_t Height)
    9 u% p9 c, Y: t! F8 i) d+ s
  199. {
    % h- J: f9 w1 X4 [
  200.   int32_t ret = BSP_ERROR_NONE;3 A, J: K" T8 L3 P* u2 X1 R
  201.   uint32_t ltdc_pixel_format;
    5 R5 O* r7 ~6 k. P
  202.   MX_LTDC_LayerConfig_t config = {0};' x+ X0 h, W) e% e! ?

  203. % z8 {) R  G3 n! R; x
  204.   if ((Orientation > LCD_ORIENTATION_LANDSCAPE) || (Instance >= LCD_INSTANCES_NBR) || \2 q# d$ L5 F# k0 P+ X4 T/ u* f4 y
  205.      ((PixelFormat != LCD_PIXEL_FORMAT_RGB565) && (PixelFormat != LCD_PIXEL_FORMAT_RGB888) && \# B* t3 B7 E% l7 I, C! R; N
  206.       (PixelFormat != LCD_PIXEL_FORMAT_ARGB8888) &&  (PixelFormat != LCD_PIXEL_FORMAT_ARGB4444)))
    7 d4 L+ e9 O: S  a
  207.   {
    % a1 T; R1 |" N% i
  208.     ret = BSP_ERROR_WRONG_PARAM;
    8 X' o$ Y! U$ F$ C8 }  }
  209.   }
    8 s, V; i0 G/ u' b4 u% x; X
  210.   else
    3 m1 W6 h; ?  J
  211.   {% w! M/ m' P6 {. W
  212.     if (PixelFormat == LCD_PIXEL_FORMAT_RGB565)
    # j, z0 T( n2 x4 q6 L' {
  213.     {
    $ S" s: o5 c* m0 M" H6 q' F" {- I
  214.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_RGB565;# M" R: ~% _. r7 v
  215.       Lcd_Ctx[Instance].BppFactor = 2U;
    ' {9 Z; J6 G/ Q4 ~
  216.     }! A& U  O7 Z0 J
  217.     else if  (PixelFormat == LCD_PIXEL_FORMAT_RGB888)4 M  k8 G* ]! X2 s7 @9 c
  218.     {3 d* I; |: o$ L$ |0 M# L
  219.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_RGB888;+ Q' b1 Z* {- D; X3 n
  220.       Lcd_Ctx[Instance].BppFactor = 3U;3 \! M1 X' [! h# q- {1 Y2 m& N
  221.     }
    + X0 h0 p- ]3 I
  222.     else if  (PixelFormat == LCD_PIXEL_FORMAT_ARGB4444)
    ) y  [- l' g' H$ x. T1 {3 `
  223.     {
    * p) K& n. \: m- P
  224.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_ARGB4444;: G- Z6 m6 E3 S7 c* O
  225.       Lcd_Ctx[Instance].BppFactor = 2U;
    * x# h  r) y0 g: p3 P' @( Z
  226.     }
    ' l7 f! H  _4 \1 B( w$ c. o! i
  227.     else /* LCD_PIXEL_FORMAT_ARGB8888 *// |' ^# v" f# R% x8 V
  228.     {
    + `, M& s! y( q
  229.       ltdc_pixel_format = LTDC_PIXEL_FORMAT_ARGB8888;3 r& c1 k& L. Z  t) f1 e; d* Y" U
  230.       Lcd_Ctx[Instance].BppFactor = 4U;
    & |# W( t4 d( i- @1 c/ _" e6 v* O
  231.     }
    : N2 D' B* Y: Z

  232. $ B% k7 @, r+ Z" s
  233.     /* Store pixel format, xsize and ysize information *// {  Y& D/ K2 |
  234.     Lcd_Ctx[Instance].PixelFormat = PixelFormat;. m! O# R. V6 r% T- a
  235.     Lcd_Ctx[Instance].XSize  = Width;
    * q: H0 e% x* k3 y9 T
  236.     Lcd_Ctx[Instance].YSize  = Height;. E6 B; S  R9 o, D- p
  237. / |/ h3 x3 n6 L2 j. e- D
  238.     /* Initializes peripherals instance value */
    + K" N0 k, Z7 H$ U3 u* V. F: q4 R
  239.     hlcd_ltdc.Instance = LTDC;
    . h: Q' ?% E2 C1 r+ K& M
  240.     hlcd_dma2d.Instance = DMA2D;
    " I" t% v2 X$ m" i+ W8 X
  241. 0 l( C, I( f' g7 E/ B/ A4 c# x4 j
  242.     /* MSP initialization */
      Y4 L# F! o" f( G" X8 Z* G6 [3 \4 `
  243. #if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1)" B, L0 Y1 K6 x% ~7 [: X
  244.     /* Register the LTDC MSP Callbacks */7 y( V) V2 `- d$ r9 b+ g5 j* P
  245.     if (Lcd_Ctx[Instance].IsMspCallbacksValid == 0U)6 y/ [8 k# M0 p6 d* h) J7 F& Y
  246.     {8 h2 ~6 u, T* c! |7 x+ C/ O) b/ S
  247.       if (BSP_LCD_RegisterDefaultMspCallbacks(0) != BSP_ERROR_NONE)
    $ ?' [  N4 f# A1 g1 i* {
  248.       {
    . g4 g6 X0 D3 S( {- O% F
  249.         return BSP_ERROR_PERIPH_FAILURE;
    1 p# F! N' x- l6 ^' j
  250.       }1 f$ V/ z0 a; ^% ^$ Z
  251.     }
    % M6 s, |- k0 q& s* s+ t# Q
  252. #else+ x7 G$ c6 b/ p9 k
  253.     LTDC_MspInit(&hlcd_ltdc);
    4 X" M( c7 B5 T. T
  254. #endif /* (USE_HAL_LTDC_REGISTER_CALLBACKS == 1) */
    - K8 ^! w  F8 f

  255. 8 ]1 {/ k9 q' M5 }. u- b
  256.     DMA2D_MspInit(&hlcd_dma2d);
    4 ^" V5 i6 y, f; _: q/ M

  257. 7 H/ A4 j* p8 U  I! W; h% w3 S
  258.     if (MX_LTDC_ClockConfig(&hlcd_ltdc) != HAL_OK)
    & }  w9 A6 r# c2 e! y5 o
  259.     {
    ! ^( k+ {, C6 x
  260.       ret = BSP_ERROR_PERIPH_FAILURE;$ Q4 S- E6 {9 h4 N: {  R
  261.     }
    / U, a4 S$ r5 ~" ~
  262.     else
    ! U" J& i9 s2 H# U' ^, P
  263.     {0 V) v# ?' l! r* Y% }) h. e
  264.       if (MX_LTDC_Init(&hlcd_ltdc, Width, Height) != HAL_OK)$ o  G* c+ O$ h" b  k* |+ u
  265.       {
    / h4 f. Z6 G' M4 ^* P! X) H8 V
  266.         ret = BSP_ERROR_PERIPH_FAILURE;
    . Z! p9 c+ v. z4 H" {4 t
  267.       }
    3 @: M5 Q8 X( ]$ D' R# {3 o% ^
  268.     }5 Z9 N* Z. R% J8 v4 `8 s+ r

  269. 1 e* J" ^1 J- Z9 @0 c) P
  270.     if (ret == BSP_ERROR_NONE)+ E" e5 M9 ?3 ^
  271.     {
    % ?' ~- r$ `* o8 l6 s
  272. #if defined(DATA_IN_ExtRAM); H, R6 U- p* j( o- z& @, g
  273.       /* Before configuring LTDC layer, ensure XSPI RAM is initialized */
    $ R4 h- P7 S1 A: n3 D
  274.       /* Initialize the XSPI RAM */
    % v! I' m& w* i: i$ z9 V
  275.       if (BSP_XSPI_RAM_Init(0) != BSP_ERROR_NONE)
    ( m7 w2 `- {% D/ P
  276.       {
    ' G) s3 r5 B; u, D# k2 ]9 b2 P2 c
  277.         ret = BSP_ERROR_NO_INIT;
    % J: U* X% R1 m; Z# x  J( z. @) Y
  278.       }. ]9 g2 n: U& K
  279.       else if (BSP_XSPI_RAM_EnableMemoryMappedMode(0) != BSP_ERROR_NONE)8 i. I) {, S5 X0 r  V3 h9 k4 U8 n
  280.       {
    * C' |' ^8 h/ p& u
  281.         ret = BSP_ERROR_PERIPH_FAILURE;
    ; o5 Q1 Y! l' B
  282.       }
    / g5 N$ a" v# Y' i: i, R
  283.       else3 M4 C& o. x( d: }* p
  284.       {
    % U) L  j: L% ^4 C% I: }; }
  285. #endif /* DATA_IN_ExtRAM */
    ! I* s- q+ T% h: P: w1 [/ {8 {
  286.         /* Configure default LTDC Layer 0. This configuration can be override by calling' s- e: C/ H  w7 P
  287.         BSP_LCD_ConfigLayer() at application level */9 q2 y1 x3 X9 e0 e, c3 A2 G
  288.         config.X0          = 0;3 e$ |+ f% U. W0 ]! |7 O: O
  289.         config.X1          = Width;7 R8 q/ N9 r, ~2 }1 h" Z
  290.         config.Y0          = 0;( V! `! \5 {! ~& B
  291.         config.Y1          = Height;% J' \0 I2 X5 G% }$ k5 _3 S9 f
  292.         config.PixelFormat = ltdc_pixel_format;3 e: Z& {$ H7 }$ L
  293.         config.Address     = LCD_LAYER_0_ADDRESS;
    ' d3 }& I! d* J' V) h5 t* K/ i

  294. 0 ]5 a4 B+ d1 G
  295.         if (MX_LTDC_ConfigLayer(&hlcd_ltdc, 0, &config) != HAL_OK), U+ j+ C9 V5 g8 V. L
  296.         {! o' Y2 H! m* ]6 c( W0 l. o5 \
  297.           ret = BSP_ERROR_PERIPH_FAILURE;* S- q) z- w! d% Y
  298.         }
    3 P+ K  F! f4 w2 s. c
  299. + C4 R/ x; w, v4 [- v/ |: B
  300.         /* By default the reload is activated and executed immediately */( h' H! }  p& S$ ~
  301.         Lcd_Ctx[Instance].ReloadEnable = 1U;; ^, k; W" X1 w- P' k1 M+ s* A8 H
  302. #if defined(DATA_IN_ExtRAM)/ K- P6 g0 b9 h1 p' |3 {
  303.       }
    + y$ K9 v  _% S% g8 k. W
  304. #endif /* DATA_IN_ExtRAM */* Z2 M5 s, k/ K3 b0 |8 q1 I  I; `
  305.     }- e% H( n5 M. z8 l( K9 M1 c
  306.   }9 P. P/ Z" S* j- d( l

  307. # J9 h' B% T* r% q6 F
  308.   return ret;
    : J' [, q$ w' U8 a
  309. }: \6 F* |. N8 W/ k3 c  x6 q
  310. + L# W5 ]4 t7 ?6 ]
  311. /**
    . {$ s, K" G( u6 e
  312.   * @brief  De-Initializes the LCD resources.2 M* M! C; ~8 q* e
  313.   * @param  Instance    LCD Instance, ]. y& c& f" e8 v& N
  314.   * @retval BSP status: @9 k/ d# M. |; Q6 m3 W7 Q0 E  \$ f
  315.   */
    : g1 P0 L1 q& ]2 H
  316. int32_t BSP_LCD_DeInit(uint32_t Instance): h) |. M8 j8 ^7 M# S- X
  317. {9 W" {/ w. Z9 k+ D( |2 R: K
  318.   int32_t ret = BSP_ERROR_NONE;7 [: O4 p8 \6 }, G$ W$ @* ~

  319. ! }, u2 a4 D% C
  320.   if(Instance >= LCD_INSTANCES_NBR)( C, E7 o9 K! S5 d2 _
  321.   {" r8 k: I& H( ?$ ?7 C7 e, C1 U
  322.     ret = BSP_ERROR_WRONG_PARAM;3 Y# }7 [" Q) k: y- p/ S
  323.   }  [! ]) e+ H7 X2 N' K
  324.   else
    / E4 r7 M* L0 }! b% X
  325.   {
    : h2 \) R3 @' V6 d' |
  326. #if (USE_HAL_LTDC_REGISTER_CALLBACKS == 0)! B0 B4 N# ^4 d" S: _
  327.     LTDC_MspDeInit(&hlcd_ltdc);
    ; {- w  W5 P8 C! H( v
  328. #endif /* (USE_HAL_LTDC_REGISTER_CALLBACKS == 0) */
    + e4 k. V8 L6 }% l: \6 s4 M

  329. : L) T; f" R1 f6 p
  330.     (void)HAL_LTDC_DeInit(&hlcd_ltdc);3 J$ Y  @% {6 S5 W' f( ?
  331.     if(HAL_DMA2D_DeInit(&hlcd_dma2d) != HAL_OK)
    ' H" G% h/ o. M8 l3 W" j3 C
  332.     {
    ' x7 X) o0 m5 @; \
  333.       ret = BSP_ERROR_PERIPH_FAILURE;7 ~) L8 w! I# m
  334.     }
    5 V5 h5 L! P3 F$ C9 A, }4 S
  335.     else/ m( e) S! X" n" W/ Y
  336.     {/ z+ v+ s  H+ R7 Q3 U! O! {
  337.       DMA2D_MspDeInit(&hlcd_dma2d);
    - {* `5 }/ B3 L( ^7 T# k0 d
  338.       Lcd_Ctx[Instance].IsMspCallbacksValid = 0;0 M6 F; f0 x+ ^
  339.     }
    ' T  L( ?9 q4 w9 [- p
  340.   }
    6 J! {0 V7 e) R  N$ u

  341. ! |+ u* i+ o, E: j* u/ W" [
  342.   return ret;3 `( e1 A6 m0 D. t& l, [; D3 @
  343. }+ {. t, P; `7 s; x7 o* G/ W

  344. ! q4 A. u% y/ x' D/ _
  345. /**
    ! ~7 E& w* s" Z$ G
  346.   * @brief  Initializes the LTDC.
    # n7 Z: {, r" w( _* f8 ^- G3 p1 R
  347.   * @param  hltdc  LTDC handle. k% o7 E% L5 U/ j5 L) u4 `0 B
  348.   * @param  Width  LTDC width
    : o! k6 L  s  p
  349.   * @param  Height LTDC height1 ?5 [' s, v! M; r2 I
  350.   * @retval HAL status; H: M* D5 R% r; ^5 W
  351.   */
    8 h( ?: o% z+ h, D3 }3 ]1 p8 c
  352. __weak HAL_StatusTypeDef MX_LTDC_Init(LTDC_HandleTypeDef *hltdc, uint32_t Width, uint32_t Height)* q8 R, n3 Y9 ?' [
  353. {
    / b+ M2 t/ o& H/ y" f, W" }
  354.   hltdc->Instance = LTDC;
    7 m& h8 p5 x3 k& ~* m
  355.   hltdc->Init.HSPolarity = LTDC_HSPOLARITY_AL;
    3 [5 N% N; Q; g0 a. c
  356.   hltdc->Init.VSPolarity = LTDC_VSPOLARITY_AL;
    * I6 L2 A/ T. C$ e
  357.   hltdc->Init.DEPolarity = LTDC_DEPOLARITY_AL;4 {; q6 l% G* l, r4 o2 W; E1 n
  358.   hltdc->Init.PCPolarity = LTDC_PCPOLARITY_IPC;5 W% |2 E" a" B: I

  359. 2 ^$ ?) u% Z0 Y" r0 |0 q" c; C
  360.   hltdc->Init.HorizontalSync     = (uint32_t)RK050HR18_HSYNC - 1U;
    7 p  G: E$ q6 P+ S* q; I6 b* b6 i
  361.   hltdc->Init.AccumulatedHBP     = (uint32_t)RK050HR18_HSYNC + (uint32_t)RK050HR18_HBP - 1U;
    - A: R$ _- d) T+ `& }
  362.   hltdc->Init.AccumulatedActiveW = (uint32_t)RK050HR18_HSYNC + Width + (uint32_t)RK050HR18_HBP -1U;
    . g6 G5 c, y; N: F) F
  363.   hltdc->Init.TotalWidth         = (uint32_t)RK050HR18_HSYNC + Width + (uint32_t)RK050HR18_HBP + RK050HR18_HFP - 1U;2 h5 A' i% F. o/ w) E5 F9 B
  364.   hltdc->Init.VerticalSync       = (uint32_t)RK050HR18_VSYNC - 1U;
    ) S( ~1 s$ K% X0 g! O7 e
  365.   hltdc->Init.AccumulatedVBP     = (uint32_t)RK050HR18_VSYNC + (uint32_t)RK050HR18_VBP - 1U;7 N' N/ I+ x, b" Q% W; _
  366.   hltdc->Init.AccumulatedActiveH = (uint32_t)RK050HR18_VSYNC + Height + (uint32_t)RK050HR18_VBP -1U;2 Y* X5 S5 Z5 G& [( S) I5 \$ J
  367.   hltdc->Init.TotalHeigh         = (uint32_t)RK050HR18_VSYNC + Height + (uint32_t)RK050HR18_VBP + RK050HR18_VFP - 1U;
    ' h1 K( @" N# n8 u
  368. 0 {- U+ ~" z2 D- |' c( h( P/ _
  369.   hltdc->Init.Backcolor.Blue  = 0x0;
    % J9 q7 n* ~/ n* ^* [: K$ d
  370.   hltdc->Init.Backcolor.Green = 0x0;
    " A5 V4 J9 H; Q0 c- B
  371.   hltdc->Init.Backcolor.Red   = 0x0;- [* N5 Q$ b! ]7 q
  372. 0 t$ m3 ]  R' y# N8 ~6 y( @2 G: U
  373.   return HAL_LTDC_Init(hltdc);
    ) {# b" |( m5 w. [4 ^. O# Q
  374. }& o7 r; Y- V: u" ?% I

  375. ! d* ~) z3 k) o7 L
  376. /**
    - S; q# V" m: Y9 N* Z% m' J
  377.   * @brief  MX LTDC layer configuration.
    # T7 f9 V. k5 M6 g
  378.   * @param  hltdc      LTDC handle2 q0 z( s( L7 j1 c, w, E% o/ u9 e
  379.   * @param  LayerIndex Layer 0 or 1
    * w3 R/ }* y) W0 M  ~
  380.   * @param  Config     Layer configuration
    + a  b* `( T! b7 G8 Z
  381.   * @retval HAL status+ w# l/ d. {( ~. T/ d
  382.   */( B- Y5 T% m6 R3 i8 m
  383. __weak HAL_StatusTypeDef MX_LTDC_ConfigLayer(LTDC_HandleTypeDef *hltdc, uint32_t LayerIndex, MX_LTDC_LayerConfig_t *Config)
    & A. Y( \8 p9 n: ^) x$ w" L( O
  384. {
    : G( n' E' O' {9 i
  385.   LTDC_LayerCfgTypeDef pLayerCfg ={0};
    # O) a/ V' F0 L' E& \

  386. ! J: u  P* T% O/ A6 s: w6 o7 ?9 L
  387.   pLayerCfg.WindowX0 = Config->X0;
    7 ^/ R, f4 m( f8 e3 |0 f8 b5 ~
  388.   pLayerCfg.WindowX1 = Config->X1;
    & a* V  y2 L( \0 O, }, \8 |' j1 }: Q
  389.   pLayerCfg.WindowY0 = Config->Y0;
    , F7 X1 ?% `5 l7 j- s
  390.   pLayerCfg.WindowY1 = Config->Y1;# u+ Q+ {8 I; d
  391.   pLayerCfg.PixelFormat = Config->PixelFormat;7 U7 q- Z5 G% v! H* T* N2 K3 C5 p) j
  392.   pLayerCfg.Alpha = LTDC_LxCACR_CONSTA;& z6 ]' L" s) W) m# K: y; |
  393.   pLayerCfg.Alpha0 = 0;
    7 F$ L7 j- H0 ~7 E) i
  394.   pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;7 C7 k* a) U3 }' J( [6 Z8 X
  395.   pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;
    3 g* v3 F( ?, }4 d
  396.   pLayerCfg.FBStartAdress = Config->Address;: }: _( B; v  ?) f2 s) Z
  397.   pLayerCfg.ImageWidth = (Config->X1 - Config->X0);
    ! W* ~2 \' f: ^: H
  398.   pLayerCfg.ImageHeight = (Config->Y1 - Config->Y0);3 U7 x6 S2 m- n  t  V
  399.   pLayerCfg.Backcolor.Blue = 0;& ?0 C3 U3 L: u
  400.   pLayerCfg.Backcolor.Green = 0;. L5 v+ O( N7 t8 g' Z
  401.   pLayerCfg.Backcolor.Red = 0;$ ?' q8 i6 Y! H& @2 `! x
  402.   return HAL_LTDC_ConfigLayer(hltdc, &pLayerCfg, LayerIndex);
      F* B* I( h2 O; a. o
  403. }" K9 P3 e$ \6 d& v

  404. : j$ w% \% M# D) `
  405. /**
    , C2 H& R1 j& J  J0 [7 L2 A& }! C6 L
  406.   * @brief  LTDC Clock Config for LCD DPI display.. z7 x& P& d. T" Z. H# D
  407.   * @param  hltdc  LTDC Handle) ?4 S" w# w5 m! a) ?4 a
  408.   *         Being __weak it can be overwritten by the application
    : Y9 z6 f. B* [# \& D+ Y
  409.   * @retval HAL_status9 {8 I1 B7 I, g, U$ Z
  410.   */7 b0 ^4 g. L$ y/ i3 m
  411. __weak HAL_StatusTypeDef MX_LTDC_ClockConfig(LTDC_HandleTypeDef *hltdc)
    # r/ t* R( |/ F% J7 v. I* m. \
  412. {7 ]# W. {% T4 L0 T# \& z
  413.   /* Prevent unused argument(s) compilation warning */
    7 ^- K' q8 Y2 d
  414.   UNUSED(hltdc);& C& I% E$ \6 a( {
  415. * f7 F9 i4 w* T# {
  416.   HAL_StatusTypeDef   status =  HAL_OK;
      x" s: U+ v" p; `
  417.   RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInitStruct = {0};
    # x3 l% }0 ], y. L% z

  418. % L( w& i$ f8 j, w
  419.   /* LCD clock configuration */, K9 C4 V& }  d4 `: F: {
  420.   /* Typical PCLK is 25 MHz so the PLL4 is configured to provide this clock */
    ( f4 F/ t2 E* p: s; G* w& ]
  421.   /* LTDC - PLL4 */# w3 g1 x7 ?. y8 u
  422.   /* Configure LTDC clock to IC16 with PLL4  */
    8 Y8 W3 N: A; p5 x9 k; ?3 B% ]+ P

  423. / @) N7 v, W8 q2 B
  424.   /* LCD clock configuration */0 P- O; ^1 z4 b$ I
  425.   /* Typical PCLK is 25 MHz so the PLL4 is configured to provide this clock */, M7 ^  E* {0 k" c" s6 M
  426.   /* LCD clock configuration */) F0 U( E6 ?) M
  427.   /* PLL3_VCO Input = HSE_VALUE/PLLM = 48 Mhz / 192 = 0.25 */
    & C  L/ @4 q1 _
  428.   /* PLL3_VCO Output = PLL3_VCO Input * PLLN = 0.25 Mhz * 100 = 25 */  k0 r9 y; D% s6 `
  429.   /* PLLLCDCLK = PLL3_VCO Output/(PLLP1 * PLLP2) = 25/1 = 25Mhz */
    4 [( @4 y0 A$ ?) a4 H' ^: g$ x
  430.   /* LTDC clock frequency = PLLLCDCLK = 25 Mhz */
    2 f' R, d8 l4 H3 U6 l$ T* l
  431. # q7 ]6 ^; k( I5 C
  432.   RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC;: X9 l; M) P- E6 M' j3 z" K
  433.   RCC_PeriphCLKInitStruct.LtdcClockSelection = RCC_LTDCCLKSOURCE_IC16;
    " S6 v6 q$ K2 o0 f, Z7 `0 R
  434.   RCC_PeriphCLKInitStruct.ICSelection[RCC_IC16].ClockSelection = RCC_ICCLKSOURCE_PLL4;
    & g/ u1 \& W  s% T0 H
  435.   RCC_PeriphCLKInitStruct.ICSelection[RCC_IC16].ClockDivider = 2;% W1 Q: t% {% [" g9 E! a
  436.   if (HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct) != HAL_OK)
    . q6 Y* y* \6 N# d5 H* G( \
  437.   {) _$ ]- w! x! G; |1 t
  438.     status = HAL_ERROR;
    % Y1 ^- w* H9 Y
  439.   }9 ^, K$ Q+ _/ }; }$ ~
  440. ) G( ~) y1 |% l
  441.   return status;2 V# {' z8 ]8 E+ a
  442. }
    ' W! y) J3 e, F2 H; S
  443. , [0 C6 P. \1 W2 {+ l
  444. #if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1); d& l$ f3 k; H, `# a1 h6 {- t! O  U
  445. /**( T. ~1 K% a- u' ^, A
  446.   * @brief Default BSP LCD Msp Callbacks! E9 Q. ]; O" Z$ Q
  447.   * @param Instance BSP LCD Instance
    0 n3 [, v# t; z
  448.   * @retval BSP status
    / h, _# q; T8 ]1 f4 Q& \. T4 r. n3 ?
  449.   */
    / U" `# e1 C  ?" q
  450. int32_t BSP_LCD_RegisterDefaultMspCallbacks (uint32_t Instance). L  s$ I, G# s& c
  451. {' [7 E! b% H& F/ A" b! {
  452.   int32_t ret = BSP_ERROR_NONE;
    8 d- V  N  I$ Q, V, {3 ~

  453. 2 i* j# z; i! l' M
  454.   if(Instance >= LCD_INSTANCES_NBR)/ m5 c# `8 p2 g6 ^4 W6 f
  455.   {7 o4 q1 y( }, {" l& Z
  456.     ret = BSP_ERROR_WRONG_PARAM;
    8 K6 F3 R) M- ]5 m3 k1 ]) m
  457.   }. Z+ I2 m) L6 ]& y, }5 }9 `
  458.   else3 H0 w- r9 C$ y. d8 L- {3 s
  459.   {" ?4 [4 d2 k/ o/ k8 D2 ?3 z7 q' z
  460.     if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPINIT_CB_ID, LTDC_MspInit) != HAL_OK)& K" [, U- A9 V' V
  461.     {
    8 N5 Y4 a% Q! c( A% _& m
  462.       ret = BSP_ERROR_PERIPH_FAILURE;% I5 c, y, D: x: a3 m( b1 b
  463.     }
    5 J) T% L3 U$ S  i# C/ }
  464.     else
    0 b  S" W# x" F/ ]
  465.     {3 T( P: H1 E8 z$ J3 e2 T" \( I
  466.       if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPDEINIT_CB_ID, LTDC_MspDeInit) != HAL_OK)
    6 O5 e/ \& \! ]+ a* [$ v6 ?
  467.       {
    & N/ _7 \  F2 Y1 w
  468.         ret = BSP_ERROR_PERIPH_FAILURE;
    ( a8 [) p' f* U) C/ s$ D& H
  469.       }
    , c) i/ M+ U; g4 Z
  470.     }
    , D1 e  G& L3 m$ _1 U
  471. " w2 x* j! D" D6 h  g
  472.     Lcd_Ctx[Instance].IsMspCallbacksValid = 1;
    : H0 e; y* L- {0 w5 v
  473.   }
    4 g0 C6 |( [% d$ _2 I9 e1 @% K

  474. # d7 c& V2 h+ J4 c3 F1 `3 |
  475.   return ret;, P/ L' Q+ J1 k
  476. }9 z. E/ \% A# l' I+ _- U

  477. 1 W3 r" {; Y8 c2 d
  478. /**+ r4 c. [8 S6 v' J% h; E  m
  479.   * @brief BSP LCD Msp Callback registering6 h& X5 a3 j$ L  @, B/ }% [3 r
  480.   * @param Instance    LCD Instance0 f2 E9 z  ?) d# `
  481.   * @param CallBacks   pointer to LCD MspInit/MspDeInit functions
    0 _2 m( a; |( E* R. M
  482.   * @retval BSP status
    % _' Y9 S6 S5 u
  483.   */
    2 j+ U, p% `, K. u* O; @2 n
  484. int32_t BSP_LCD_RegisterMspCallbacks (uint32_t Instance, BSP_LCD_Cb_t *CallBacks)
    ! u4 j% F0 F# F8 @
  485. {
    / k3 M% V2 w2 B; _
  486.   int32_t ret = BSP_ERROR_NONE;9 ]) h/ A& n' u4 T& \
  487. : u; A& ]" Q6 ]4 @/ h" l. K
  488.   if(Instance >= LCD_INSTANCES_NBR)
    6 r; |  w0 E( Z0 w& u. T
  489.   {
    . |2 ^' {- u4 F3 ]
  490.     ret = BSP_ERROR_WRONG_PARAM;
    ( a* D4 c4 x7 o
  491.   }
    4 x6 I/ [( y; J$ I! T) G  U# p
  492.   else9 \& C" R1 C$ F2 d! y# E
  493.   {- I7 e; l( v& F' ?/ M( b$ B
  494.     if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPINIT_CB_ID, CallBacks->pMspLtdcInitCb) != HAL_OK)  n& ^5 m# j2 P) `5 @; Y4 |! s
  495.     {
    . t1 b$ j" {: f% K
  496.       ret = BSP_ERROR_PERIPH_FAILURE;4 W; ~6 P/ b  k4 q3 |8 Z% W$ k' C
  497.     }) G6 |7 X2 L( t4 M& M- o
  498.     else- g( E' V/ P  ]" s) l  h
  499.     {* R& X5 ^3 X! ^5 }9 M+ ~
  500.       if(HAL_LTDC_RegisterCallback(&hlcd_ltdc, HAL_LTDC_MSPDEINIT_CB_ID, CallBacks->pMspLtdcDeInitCb) != HAL_OK)
    2 |! b, F5 d# h; W: Y
  501.       {7 u2 {# ~$ w3 M
  502.         ret = BSP_ERROR_PERIPH_FAILURE;$ K1 d* h' |5 Y. C4 u; ]' K) z
  503.       }! z3 p4 f1 g3 m: |9 J: P0 H3 W9 d
  504.     }: C- Z' i+ o. y; W7 b
  505. 7 Y* ]' }* s1 A. f- u
  506.     Lcd_Ctx[Instance].IsMspCallbacksValid = 1;
    5 G1 A/ ^  Q: k# f2 p
  507.   }" x; `5 x' i1 f7 @
  508. 0 `7 X- o6 U/ }8 ~& |3 b; ^
  509.   return ret;9 r' D6 P5 Q2 K# n1 Q5 v
  510. }0 L, A+ k" K9 k) I
  511. #endif /*(USE_HAL_LTDC_REGISTER_CALLBACKS == 1) */
    2 {% @! n, X) Z4 O, r
  512. - S& _. z6 j6 C* ~2 B. a* h" X+ h: Q
  513. /**5 w; B3 e4 S6 T: v- r7 S
  514.   * @brief  LTDC layer configuration.: T* U5 ~. ?0 Z4 ?1 T
  515.   * @param  Instance   LCD instance0 d, T8 A2 c) `) ?  C0 }
  516.   * @param  LayerIndex Layer 0 or 1
    ; H6 _6 g8 k$ ?1 n6 ?
  517.   * @param  Config     Layer configuration+ d- A  |: ^7 y4 u; x
  518.   * @retval HAL status! B- _- P+ ]3 k! s2 O
  519.   */; b% Y  e0 W2 H
  520. int32_t BSP_LCD_ConfigLayer(uint32_t Instance, uint32_t LayerIndex, BSP_LCD_LayerConfig_t *Config)
    ) l- [2 [& @/ R, u$ G
  521. {
    & l3 ?6 F) V: S7 x
  522.   int32_t ret = BSP_ERROR_NONE;1 B5 f/ d  g8 c
  523.   if(Instance >= LCD_INSTANCES_NBR)
      o. ^0 e: s+ P" U
  524.   {: ^) {* K( F9 [$ A3 ^$ ~
  525.     ret = BSP_ERROR_WRONG_PARAM;
    # S/ S  N5 Z) }
  526.   }3 S& C8 U$ s: N% I! F  P% J: c- |
  527.   else- _5 S$ v9 l' @2 h1 E4 D& [
  528.   {6 r8 u% s/ d( x' u/ u$ m0 u$ n
  529.     if (Config->PixelFormat ==  LCD_PIXEL_FORMAT_RGB565)$ O( A2 O+ V2 ?4 `- d- E4 r
  530.     {# @1 Q. F) N3 G2 e+ u8 N% J( O
  531.       Config->PixelFormat = LTDC_PIXEL_FORMAT_RGB565;
    0 x7 W* F8 @$ M& ]
  532.     }, B- P" c& E/ k" Q5 p3 E! C
  533.     else if (Config->PixelFormat ==  LCD_PIXEL_FORMAT_ARGB4444)- d+ U& w+ q( z; M4 K: N9 @
  534.     {$ a/ ~+ R% b! J) L! w$ B( h
  535.       Config->PixelFormat = LTDC_PIXEL_FORMAT_ARGB4444;5 ?% K- Y8 O% b, z2 p% ]
  536.     }
    ) v6 H' q# d- P* X; F  X4 L' a
  537.     else if (Config->PixelFormat ==  LCD_PIXEL_FORMAT_ARGB8888)
    0 _7 V8 `  f8 b! a
  538.     {) S# ?: y" ~, ^! Z' I7 g
  539.       Config->PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888;( h6 n; h5 G- q( a& p) a: V
  540.     }
    ; y$ f3 Q6 |7 p% D
  541.     else' j& n7 h" V; V+ ~6 w, b) K/ N
  542.     {$ m. @8 M5 s: s. K
  543.       Config->PixelFormat = LTDC_PIXEL_FORMAT_RGB888;
    ; R; z8 r5 L, S, W. y. Q
  544.     }. M; \, ]0 K( q5 N7 @- k; k8 X
  545.     if (MX_LTDC_ConfigLayer(&hlcd_ltdc, LayerIndex, Config) != HAL_OK)1 u" X8 Z' R% J4 `+ |- _! S+ ?
  546.     {
    + O% ^2 ^6 ~* p9 x2 L
  547.       ret = BSP_ERROR_PERIPH_FAILURE;
    & S# {0 T. p/ J. `& C
  548.     }
    6 b  v2 c: a1 x8 j2 n: r
  549.   }
    8 h6 v! C* W) F, b$ o
  550.   return ret;* u  G! b* b9 W# f
  551. }
    % Y4 ^  e2 ^1 d/ {
  552. & ^  ]+ K% ^/ i' |
  553. /**
    % K) |3 ~9 ^# l2 G% ^! o1 ?! |
  554.   * @brief  Gets the LCD Active LCD Pixel Format.! v- o  R: i' \/ P- v: c; P
  555.   * @param  Instance    LCD Instance  D) A. K8 x' G4 P
  556.   * @param  PixelFormat Active LCD Pixel Format
    / `8 G4 K$ z3 P# t, s9 J; j
  557.   * @retval BSP status. K3 p6 j0 A8 C% z; b, ?
  558.   */
    * e5 O) Q% a3 q0 V6 M1 U
  559. int32_t BSP_LCD_GetPixelFormat(uint32_t Instance, uint32_t *PixelFormat)
    + \' s6 x& j! I. _
  560. {% h' z/ u- O5 L* o. E- k! A$ `
  561.   int32_t ret = BSP_ERROR_NONE;, h6 {* r( q- y3 d, o* t

  562. - k+ b$ h4 \) ?3 M0 l1 V
  563.   if(Instance >= LCD_INSTANCES_NBR)
    ; A# k. N2 [0 Y( I/ N
  564.   {
    4 t8 \5 h0 G/ i4 Y" E/ w' k# r
  565.     ret = BSP_ERROR_WRONG_PARAM;; u6 n1 w$ m' J- {" J
  566.   }
    9 K4 H. q2 B4 j& K: E
  567.   else6 j" N, ^1 K, e  ~. M
  568.   {
    6 A" }1 k# q, b! d) Y
  569.     /* Only RGB565 format is supported */
    $ e/ j5 O* Y6 @
  570.     *PixelFormat =  Lcd_Ctx[Instance].PixelFormat;
    * l6 ^+ T. g; P, ^5 a7 h' _4 L
  571.   }
    2 q5 f5 u$ C2 o" W5 x( j
  572.   F) d) Y, {& V4 x3 g
  573.   return ret;/ J) F9 Z) ]; ?, ~, M+ _# U& s, X
  574. }
    6 U. w+ ~" n5 ]* w. j4 m8 k- T

  575. 5 Y8 |! J8 l9 S! ?
  576. /**% ]3 l5 D8 o, `( p2 |
  577.   * @brief  Set the LCD Active Layer.
      z7 m: O/ n8 i6 S' ^  U" ~  A8 u
  578.   * @param  Instance    LCD Instance
    # s, `+ C( w" J+ I
  579.   * @param  LayerIndex  LCD layer index
    . W8 \: B3 |  \2 N2 Q
  580.   * @retval BSP status
    ' ~6 A: q1 H; i5 w" k
  581.   */8 ?, m) y! u  z. _; m! Z
  582. int32_t BSP_LCD_SetActiveLayer(uint32_t Instance, uint32_t LayerIndex)
    # w7 ~8 W. D! a9 J) A0 W2 G: k
  583. {
    : b( h( I" u* g& [' W+ q# ]/ Y$ _
  584.   int32_t ret = BSP_ERROR_NONE;  \8 y% j9 N9 Q
  585.   LTDC_LayerCfgTypeDef *pLayerCfg;
    5 Y! `6 o& r/ ^/ X! e, F' @

  586. . I/ |4 x% @1 [: d
  587.   if(Instance >= LCD_INSTANCES_NBR). G) g  N9 z7 @" O
  588.   {' i- a: }) s( u) H
  589.     ret = BSP_ERROR_WRONG_PARAM;4 P/ Y- g9 s; K" E+ W$ G6 m
  590.   }( R% |2 G* A, B
  591.   else7 b! x2 e8 ]. X5 |; N0 d) u
  592.   {' r+ {; s* R0 A& {6 G4 w
  593.     pLayerCfg = &hlcd_ltdc.LayerCfg[LayerIndex];
    7 B# }6 N% v& P9 A; u# [% E% y0 c

  594. % A, v* j. \3 j/ ]+ o4 L1 J
  595.     Lcd_Ctx[Instance].ActiveLayer = LayerIndex;( N' A) a: w0 V- e7 \
  596.     Lcd_Ctx[Instance].XSize = pLayerCfg->ImageWidth;
    5 b# \! N& v- O( Z  r+ p
  597.     Lcd_Ctx[Instance].YSize = pLayerCfg->ImageHeight;
    1 e: h1 j; R: S9 L# K3 H

  598. ' h# c3 D9 O6 n+ L) c, O- k" `
  599.     if (pLayerCfg->PixelFormat ==  LTDC_PIXEL_FORMAT_RGB565)( r! b$ V/ I* I1 G
  600.     {
    ! q2 B+ `4 j% }' K4 r
  601.       Lcd_Ctx[Instance].BppFactor = 2;
    # q- K. Y6 T1 |. N1 }7 `5 C1 ^. U+ v
  602.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_RGB565;* \5 y: {# p, l( E
  603.     }
    4 V. ]" Y: U  i' n- R( j8 J
  604.     else if (pLayerCfg->PixelFormat ==  LTDC_PIXEL_FORMAT_ARGB4444)
    / ?( P. t) e' m. {
  605.     {- ?3 O$ W8 m& D1 h9 l) p/ R, \
  606.       Lcd_Ctx[Instance].BppFactor = 2;3 I# r  k) F  O& {$ G
  607.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_ARGB4444;
    9 W$ S7 ?7 }$ y& H
  608.     }
    8 }& ^9 d# R/ x% u$ ]' ?
  609.     else if (pLayerCfg->PixelFormat ==  LTDC_PIXEL_FORMAT_RGB888)
    $ M  D' W7 R! d" d1 [' k# G
  610.     {6 b9 n2 ~% E( Q* i5 Z
  611.       Lcd_Ctx[Instance].BppFactor = 3;4 ?5 L$ Q/ c2 |" I. u5 P% W
  612.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_RGB888;5 s! N9 N" y$ O; X
  613.     }
    " h, J* j! q  v* _  Y$ {
  614.     else
    " i' A1 B& i/ R
  615.     {
    ( E/ V- T% ^5 Z# i( l
  616.       Lcd_Ctx[Instance].BppFactor = 4;* a" m4 X) U9 d
  617.       Lcd_Ctx[Instance].PixelFormat = LCD_PIXEL_FORMAT_ARGB8888;, H8 L; Y% o/ P3 ^; T* o+ a
  618.     }
    & n% p- ^: U( _# I4 Q+ e
  619.   }) }; V2 T0 D$ W/ }, S, z

  620. 6 n. {$ Y2 B& Z' b+ B
  621.   return ret;
    8 p3 a, @! W1 k4 O( c; k0 \
  622. }4 X. k/ S- g3 A1 j

  623. 7 G+ Q8 R3 L+ T6 z6 R
  624. /**4 Q: L2 y8 Y8 Q" ?, F& {1 B& b
  625.   * @brief  Control the LTDC reload
    5 W( n) g2 s, S6 m% l/ g! b/ ^" H/ m
  626.   * @param  Instance    LCD Instance1 X+ r3 i* P1 s9 i
  627.   * @param  ReloadType can be one of the following values
    - L+ X& o8 x- P: I3 B0 \
  628.   *         - BSP_LCD_RELOAD_NONE/ ^  q! t1 M( E: y
  629.   *         - BSP_LCD_RELOAD_IMMEDIATE
    0 x3 N: z' f7 F6 `! z" ]
  630.   *         - BSP_LCD_RELOAD_VERTICAL_BLANKING) {, w6 r* [& W' U5 Z! u
  631.   * @retval BSP status' I% G  r1 Z; n
  632.   */( f( Z# Q6 U5 k. v* W# T
  633. int32_t BSP_LCD_Reload(uint32_t Instance, uint32_t ReloadType)' S/ Y1 }, F: {2 ~5 k+ f! R
  634. {0 d4 J6 s0 h4 e- U# ^4 ^3 I5 ^
  635.   int32_t ret = BSP_ERROR_NONE;
    + ]/ L5 j4 F. H

  636. $ |; d* @( O) K/ `
  637.   if(Instance >= LCD_INSTANCES_NBR)4 S  Y% m% J# B( `& d
  638.   {# s8 g/ ~4 D/ t% s9 q
  639.     ret = BSP_ERROR_WRONG_PARAM;" a* r: d: ^4 D
  640.   }# X1 V# i; o9 l3 ?; d( _- u" k+ b
  641.   else if(ReloadType == BSP_LCD_RELOAD_NONE)+ \7 ^; T2 H) _& k/ f8 {3 A
  642.   {
    0 E4 h8 y2 J& C* Z4 I
  643.     Lcd_Ctx[Instance].ReloadEnable = 0U;0 e5 V$ v& J, a: P% s
  644.   }
    5 Q; B) U; a# z! k* F
  645.   else if(HAL_LTDC_Reload(&hlcd_ltdc, ReloadType) != HAL_OK)* ^3 |/ e% U( K  v& t3 {
  646.   {
    ; {* t( q0 [6 U& V, S  I
  647.     ret = BSP_ERROR_PERIPH_FAILURE;
      Z1 H( z1 t& Z" c) F7 G
  648.   }
      ^( O: V' n8 c* b; ~; {# t+ g
  649.   else
    : Q8 n$ U: f! I0 y( m4 N
  650.   {! [1 M4 F- O9 I$ Y' ]" z
  651.     Lcd_Ctx[Instance].ReloadEnable = 1U;6 W. L; |4 y  ~/ X( ^; k
  652.   }/ Q" \# ]+ _+ V8 U- G7 M3 ^, E
  653. + }$ O5 e# j  P1 `5 k
  654.   return ret;
    3 b& b, s3 I; d: f
  655. }
    + M4 _( r& `! p9 i4 C" N

  656. 1 u$ `% Z, X1 g: W" _
  657. /**
    % f9 t! |) o. _5 o  k4 m8 z
  658.   * @brief  Sets an LCD Layer visible
      q- _( @0 {4 V! ^9 j1 E8 y
  659.   * @param  Instance    LCD Instance; W1 h5 O7 M3 h3 z. D$ b& s$ x' G
  660.   * @param  LayerIndex  Visible Layer
    $ o$ z& R- Y3 b% o2 R; T
  661.   * @param  State  New state of the specified layer4 E$ q. v. z) h( \( j
  662.   *          This parameter can be one of the following values:& V2 l( X9 p* m* F6 T" x
  663.   *            @arg  ENABLE2 R) P7 z- d' r
  664.   *            @arg  DISABLE! |- ?* x6 X8 r& l; j
  665.   * @retval BSP status
    " B: O, J5 F8 M" \+ x# y
  666.   */
    3 @# U: K) A( u/ C
  667. int32_t BSP_LCD_SetLayerVisible(uint32_t Instance, uint32_t LayerIndex, FunctionalState State)+ I( R2 l0 }0 t. w$ S& g  F
  668. {4 ]- U0 @8 o; Y9 K
  669.   int32_t ret = BSP_ERROR_NONE;" E& h+ R$ E6 }2 h$ U

  670. 7 M. g# L4 x* x' M1 `1 C
  671.   if(Instance >= LCD_INSTANCES_NBR). Y5 t. x4 J, n
  672.   {
    0 I  r) b4 c) C! p& P, j. ?
  673.     ret = BSP_ERROR_WRONG_PARAM;
    # ^9 W4 P/ O  m9 A
  674.   }! S9 x9 u1 M' d) y4 S5 j5 f
  675.   else
    ; v! N9 w6 O8 ^7 {
  676.   {
    / q$ Q' r6 E+ p/ O% a
  677.     if(State == ENABLE)7 v* G6 G7 I! r5 C! Y1 l3 c8 l+ E- O
  678.     {
    $ z. }, f8 [5 S; |. F9 f, y
  679.       __HAL_LTDC_LAYER_ENABLE(&hlcd_ltdc, LayerIndex);4 A  c( I, \0 J0 M) u/ G
  680.     }
    3 Z' q% Q; q. B
  681.     else
    6 m$ r) [1 Y% p) k$ w9 L, e
  682.     {
    , y: @6 N7 M& [  H7 W+ Z* T
  683.       __HAL_LTDC_LAYER_DISABLE(&hlcd_ltdc, LayerIndex);2 L& C/ |/ F- d+ _7 {0 E( N& |
  684.     }' J& A7 v8 d5 b1 y- V

  685. 3 [& x; q4 a; W. a
  686.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    % F& d" L9 r  @  q( L
  687.     {* N" {& c% M( k3 g6 q
  688.       __HAL_LTDC_RELOAD_IMMEDIATE_CONFIG(&hlcd_ltdc);
    4 r0 L% y2 ^# ?" @$ r
  689.     }
    6 ]" I8 i) e8 S- `
  690.   }+ a; e- b5 c/ ~! v) H( l2 `
  691. : n' G, S8 t1 Z7 M' M
  692.   return ret;
    , ]  \9 h" T4 E0 N; d8 b* V+ w" i
  693. }* G7 n" g2 h2 d7 J# p) I# _

  694. ' _, y6 Z# Q' L. K: J" @, l  ~
  695. /**( C- P  B" X( i" V
  696.   * @brief  Configures the transparency.
    * d7 l! N7 z: ~
  697.   * @param  Instance      LCD Instance
    5 f& |. {* @7 u7 j( x
  698.   * @param  LayerIndex    Layer foreground or background.
    5 J9 X* n& ]. V/ [* A
  699.   * @param  Transparency  Transparency  E: c8 g6 Y. Z% K  A6 O
  700.   *           This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF9 k, a6 @4 W) R. L4 v' h
  701.   * @retval BSP status
    ( U: f: R0 ?0 W2 C$ ?* ]
  702.   */0 o3 P8 M0 d+ X' M0 F: W# C0 F
  703. int32_t BSP_LCD_SetTransparency(uint32_t Instance, uint32_t LayerIndex, uint8_t Transparency), v) G, U9 }) s! n
  704. {& H9 @- V1 f  T9 C+ N! t
  705.   int32_t ret = BSP_ERROR_NONE;
    $ g, R- r0 j6 h6 |( a6 y

  706. 0 ^( r4 g8 i7 E
  707.   if(Instance >= LCD_INSTANCES_NBR)
    9 N5 e. d% j& \4 |& F- Z# o3 Y$ C* B4 l
  708.   {( D0 v% ~4 ]$ ?% k* {& ~  h; z
  709.     ret = BSP_ERROR_WRONG_PARAM;" Q  P: O' R8 f+ j  ]) x
  710.   }( o- P2 r* T5 I
  711.   else9 }8 ]  j/ z& Q2 t) f; P8 D7 Y7 c
  712.   {4 l0 q6 b( Q/ ?8 ]! s+ M/ l
  713.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    8 f* x( N- T6 ^5 w: S/ j. A  |7 W# a7 k
  714.     {
    ' i. H* m8 r! I' w
  715.       (void)HAL_LTDC_SetAlpha(&hlcd_ltdc, Transparency, LayerIndex);( ]7 h8 p; [. C1 J' n7 D" e
  716.     }
    8 B5 Q5 E- a: \! @3 U( ~/ i
  717.     else1 ]3 z% |2 }+ D3 Q5 j
  718.     {( U0 g4 ]3 A  _' i
  719.       (void)HAL_LTDC_SetAlpha_NoReload(&hlcd_ltdc, Transparency, LayerIndex);
    2 [3 C& \' u2 ?
  720.     }& d( M6 p% _$ `9 D$ ~# Y% j
  721.   }9 k3 ~9 A) q# T8 `$ w% G# ^
  722. 0 n% E4 U6 A! ~6 N8 w+ z
  723.   return ret;" E5 ]9 T( a( g1 z
  724. }7 Y7 v' [& i, ~0 G% J1 [" V

  725. & o3 i+ {. U4 @: R, \/ E7 g
  726. /**
    6 F0 s# V( G9 R0 }5 f; r
  727.   * @brief  Sets an LCD layer frame buffer address.  L$ E( E  j& b, o( [1 c1 J, c
  728.   * @param  Instance    LCD Instance. }* `2 O. B+ z0 e$ T6 u
  729.   * @param  LayerIndex  Layer foreground or background
    ) f  U8 ]2 z& w1 M
  730.   * @param  Address     New LCD frame buffer value4 N2 U5 T/ k  |3 E7 d; }
  731.   * @retval BSP status
    + v4 n9 U5 E. k/ `; W$ h
  732.   */* g* W" N8 c  g2 x5 ]
  733. int32_t BSP_LCD_SetLayerAddress(uint32_t Instance, uint32_t LayerIndex, uint32_t Address)3 x$ U" @; N' w7 Y: u% |0 d( m
  734. {* W$ j: w4 r! b+ T- `+ e
  735.   int32_t ret = BSP_ERROR_NONE;
    % F" k" ^2 C  f5 i; ?. T& \
  736. % y$ O- X- z* x+ a& Q
  737.   if(Instance >= LCD_INSTANCES_NBR)
    9 L* X; C& m! r7 R7 K: M7 p; M: {- k
  738.   {
    * Z6 v  h, ]! `( H* C
  739.     ret = BSP_ERROR_WRONG_PARAM;5 O$ s5 I* c" R/ {
  740.   }9 t0 W- t& ^4 _- {
  741.   else
    6 x) I* J0 ?$ |# s$ H
  742.   {
    # H" y0 K3 b& |# |5 x4 v7 L
  743.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)+ @9 C8 P" L: I
  744.     {6 |* w, e3 y) T/ u( a
  745.       (void)HAL_LTDC_SetAddress(&hlcd_ltdc, Address, LayerIndex);: o' k% X3 u# q6 C: m& G3 d
  746.     }
    9 H% \% x* D, K% Z
  747.     else/ K8 w% V$ R% ^, S; Q( s
  748.     {8 f: \. Y' E- j: m. l
  749.       (void)HAL_LTDC_SetAddress_NoReload(&hlcd_ltdc, Address, LayerIndex);
    ! [! t; j# O, |% W) [
  750.     }
    # y4 H9 s: O/ \; _5 u$ c1 u) E
  751.   }6 f: [% i$ @' ^5 z' m6 i

  752. ' @7 a' X& u' J1 s: F
  753.   return ret;
    0 y7 k4 a; ?, F! O5 Z
  754. }, K$ Q/ m. s+ o2 x: v+ D$ D1 U0 h4 S

  755. . |" [7 v8 X( T, Y& i; B# @# R, v2 k
  756. /**
    , r1 _& I1 Y& j  v+ z, i& q
  757.   * @brief  Sets display window.8 h4 `, _- Z- i. a! q" y( \
  758.   * @param  Instance    LCD Instance/ g+ H/ J. {; B$ u
  759.   * @param  LayerIndex  Layer index
    5 B$ D1 M. v9 N; ^' t+ N
  760.   * @param  Xpos   LCD X position0 h: d+ ~. [( j9 X. m
  761.   * @param  Ypos   LCD Y position. @* O( |- w# |! `) [
  762.   * @param  Width  LCD window width4 y. S8 m: E7 n$ c
  763.   * @param  Height LCD window height3 Y( l; ^. {+ F# ~! P
  764.   * @retval BSP status9 X' C* i" d7 x  o- ?
  765.   */
    ! v! Q! v4 m2 b. e2 `0 R
  766. int32_t BSP_LCD_SetLayerWindow(uint32_t Instance, uint16_t LayerIndex, uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)$ R! J/ n# \7 Z0 _" a+ z$ s$ ~
  767. {
    , N, w( Q" G; T2 v! p" B
  768.   int32_t ret = BSP_ERROR_NONE;) B& q# P4 E: T# o! \

  769. : ]9 l, g. F3 o5 N/ H
  770.   if(Instance >= LCD_INSTANCES_NBR)
    1 k; e- J0 o2 Q, f) [
  771.   {0 j; V6 S, f. I# W) ?
  772.     ret = BSP_ERROR_WRONG_PARAM;
    5 K$ D+ I8 x9 x! D+ q  c  [
  773.   }
    : @7 o$ v8 D/ K5 d
  774.   else7 Z) X' p1 V7 g2 \# W
  775.   {
    . A* y' U0 _4 G
  776.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)! F3 F! }; R2 X( y
  777.     {% x( y. z/ j- F+ s" @
  778.       /* Reconfigure the layer size  and position *// |+ j! N; _( ^1 `! n# k0 E1 S
  779.       (void)HAL_LTDC_SetWindowSize(&hlcd_ltdc, Width, Height, LayerIndex);; V: G$ ^! W4 S
  780.       (void)HAL_LTDC_SetWindowPosition(&hlcd_ltdc, Xpos, Ypos, LayerIndex);
    # D, v+ Q3 k3 P! h- y4 S/ O
  781.     }( I  [' Z, w* t2 o6 o
  782.     else
    ; O  H( c- v% U
  783.     {
    3 \" K& Q9 q) p& C" n
  784.       /* Reconfigure the layer size and position */+ g# t' @& W' U5 r& `" C
  785.       (void)HAL_LTDC_SetWindowSize_NoReload(&hlcd_ltdc, Width, Height, LayerIndex);
    : K' K( I: @  s. v0 N( P% \; N
  786.       (void)HAL_LTDC_SetWindowPosition_NoReload(&hlcd_ltdc, Xpos, Ypos, LayerIndex);
    & \; v$ T% {1 Z+ q9 j& N/ Y  {
  787.     }
    4 `0 {# N. x2 v; b7 d+ A$ ~
  788. ( N, h. C5 W7 }+ G5 F2 |$ `
  789.     Lcd_Ctx[Instance].XSize = Width;* \3 m; l  C9 s: M0 J% t
  790.     Lcd_Ctx[Instance].YSize = Height;
    5 T' [/ _) M' i  ~! X
  791.   }4 `. K+ K* ~' c7 k

  792. % ?+ D, C- o5 P6 ?' t0 n
  793.   return ret;, _$ Z( R8 _6 d8 x' [9 h
  794. }
    4 ]  U) }9 e. ?4 q

  795. . b0 \7 s2 o2 X* `
  796. /**
      }: _; g3 Y* O& I$ ^, E
  797.   * @brief  Configures and sets the color keying.
      s8 |% z) i) A$ y$ E1 Z6 O, X
  798.   * @param  Instance    LCD Instance: |3 a2 S' a" ^& t5 l" s2 J# l* M
  799.   * @param  LayerIndex  Layer foreground or background  a- M- g/ m& D& Q5 c
  800.   * @param  Color       Color reference! q$ A3 a4 X. R. \4 e% l6 C; X' H& b
  801.   * @retval BSP status
    / n$ J2 Z  f  j$ V
  802.   */: ~& E  [7 |9 [) w& _# Y* G4 ^
  803. int32_t BSP_LCD_SetColorKeying(uint32_t Instance, uint32_t LayerIndex, uint32_t Color)& V5 g4 `, n3 R* Y. Y7 D. ?
  804. {
    / A2 [3 g' U( r; V$ t
  805.   int32_t ret = BSP_ERROR_NONE;
    # `0 v2 h: L* }- m
  806. 2 w% K! q6 f+ r. u
  807.   if(Instance >= LCD_INSTANCES_NBR)
    6 ^/ _# h. o, e% w; b
  808.   {
    , t8 x7 p2 W* ]9 m6 _
  809.     ret = BSP_ERROR_WRONG_PARAM;
    ; u1 u) ?2 Z5 i
  810.   }% N. f0 D  Z1 ?7 G
  811.   else
    7 o  B5 ?: _. ?8 W- t2 a
  812.   {
    3 Q; D5 G: [' {) A& K4 H$ {
  813.     (void)HAL_LTDC_ConfigColorKeying(&hlcd_ltdc, Color, LayerIndex);
    / V4 ]  E0 K. @
  814.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)+ U) F6 d* `' L4 c1 L
  815.     {
    8 m2 B8 ]! o) N/ c' e5 o8 m% c4 l
  816.       /* Configure and Enable the color Keying for LCD Layer */
    5 q% O4 K$ w, ~3 ?' t) h
  817. 5 G! ?+ g: a- Y; x5 ?
  818.       (void)HAL_LTDC_EnableColorKeying(&hlcd_ltdc, LayerIndex);
    $ d: u; M( {! F* K1 r
  819.     }
    4 Z  {  H2 Z" @$ e2 e: g+ _
  820.     else3 q! s: a, X- I* A0 X5 F
  821.     {
    - U8 r. i: L, z* `
  822.       /* Configure and Enable the color Keying for LCD Layer */0 q8 ?4 \. J3 W0 e1 D
  823.       (void)HAL_LTDC_EnableColorKeying_NoReload(&hlcd_ltdc, LayerIndex);8 w! F& K: n, }7 L; r0 b8 \
  824.     }+ r* I6 {! C& g+ @
  825.   }
    ' z" s2 H$ c3 T2 [

  826. / M2 p, n- a& l! w" h# [
  827.   return ret;
    4 A8 q; G8 G1 ~  p; P  H
  828. }+ u5 B9 U/ Q& U" i

  829. ) \) w: b9 a/ j1 }4 R+ E7 v
  830. /**3 I: ~8 \$ I" K
  831.   * @brief  Disables the color keying.9 g5 {9 W. I! X5 w: q
  832.   * @param  Instance    LCD Instance6 l2 }1 [2 O7 k# K; L
  833.   * @param  LayerIndex Layer foreground or background
    2 o- d  b1 v6 Z9 B: w+ U1 b( q
  834.   * @retval BSP status; n- ~/ z; [( T0 t: Q8 H" l
  835.   */# v3 h: y/ n. A" k
  836. int32_t BSP_LCD_ResetColorKeying(uint32_t Instance, uint32_t LayerIndex)' O; |: D2 E" W, k
  837. {  `' a9 f' V1 o0 G! g
  838.   int32_t ret = BSP_ERROR_NONE;
    9 |$ S% s' f7 [: r0 }6 f
  839. & B% G2 V- q4 p% m& _
  840.   if(Instance >= LCD_INSTANCES_NBR)
    0 m+ Z, l& g& B- s( L5 F* Q7 K  h8 p
  841.   {
    ' X- @- y! w# J* i
  842.     ret = BSP_ERROR_WRONG_PARAM;1 q" N: [& u1 j# a- P) I1 |
  843.   }
    9 S* q2 `! ?; A9 a" ]- W  e4 L
  844.   else! c- ?1 v' c5 a9 f4 L, m6 d$ C
  845.   {9 ~9 v! P% I0 P8 @! W" h! i
  846.     if(Lcd_Ctx[Instance].ReloadEnable == 1U)
    & C# o# u8 {0 t# }( K8 b
  847.     {3 V4 x) c/ V/ Q- h$ i5 n- S
  848.       /* Disable the color Keying for LCD Layer */
    1 B( V2 \% f1 e7 ?
  849.       (void)HAL_LTDC_DisableColorKeying(&hlcd_ltdc, LayerIndex);
    * p9 i$ O2 T/ h0 P. Q
  850.     }
    ) ^/ G3 n) l* t& c5 \
  851.     else; T" l3 e6 O9 m' C) H/ n$ I, _
  852.     {- W) F) B7 {& Y# }# s) L: v2 U1 ~1 c
  853.       /* Disable the color Keying for LCD Layer */; D+ h2 a. P+ k1 u
  854.       (void)HAL_LTDC_DisableColorKeying_NoReload(&hlcd_ltdc, LayerIndex);
    ) u# A. I1 l. Y! ~9 e8 k: `2 X
  855.     }1 K  G' d1 l4 k% t4 K0 i' ^
  856.   }  Q- ?3 n4 ^, Q. k

  857. # x1 j3 n; v) P# a+ j5 a6 V
  858.   return ret;! z3 t: n! P& u6 n9 K9 \, V
  859. }9 \6 q. Q% u3 R6 o3 c) j

  860. - g, Q: ~1 Z4 C$ G6 H6 Z- j
  861. /**
    3 L) I5 D9 K* I: j4 X4 M* [& y% U
  862.   * @brief  Gets the LCD X size., Y: i# w4 `5 b' H9 f. N- K- t
  863.   * @param  Instance  LCD Instance+ k/ ]! z* A, N: c2 f
  864.   * @param  XSize     LCD width
    4 H$ J+ T) X) \; c6 k# W3 v  W% b
  865.   * @retval BSP status. ]8 [( s5 @  p5 T
  866.   */* q8 V3 [. K  e. d( _  u
  867. int32_t BSP_LCD_GetXSize(uint32_t Instance, uint32_t *XSize)
    $ s5 h! c3 B8 ]& z
  868. {+ T4 e' D8 C9 h( j" c  e) U2 _
  869.   int32_t ret = BSP_ERROR_NONE;; |/ t0 d; i) z6 \

  870. 0 C& K& m) C( E/ L
  871.   if(Instance >= LCD_INSTANCES_NBR)
    9 I, H: Z/ U, |  E0 Z8 m- [
  872.   {+ ?8 z) t$ j3 t% z- r* Z/ T$ F
  873.     ret = BSP_ERROR_WRONG_PARAM;+ E. |6 w: D- P% ]! C
  874.   }
    5 c/ [" K9 ~3 y' z
  875.   else% U1 t  O0 Q1 I8 K
  876.   {7 z4 U. f9 u4 s0 x) l
  877.     *XSize = Lcd_Ctx[Instance].XSize;
    7 c1 ]5 i! [/ ~6 o$ ^  s
  878.   }% i/ I3 @0 C  j
  879. : ?, O' Q7 F' {
  880.   return ret;$ X  J% z5 M, O2 ^6 _/ a# N
  881. }
    4 V: J7 M' c+ a( z) y0 R1 {- Q$ c# j& n
  882. 0 z: e! X6 A; f/ W9 H8 y4 L+ r
  883. /**
    ( Q& T5 M: n7 w1 d
  884.   * @brief  Gets the LCD Y size.$ ]8 ~: o1 b2 e/ C' M" N- f9 J' H5 u2 N
  885.   * @param  Instance  LCD Instance2 W% Q  u+ t' k, p/ i1 D5 e( K9 i: y) @
  886.   * @param  YSize     LCD Height
    5 J( R  x  P; n- ]  _
  887.   * @retval BSP status
    + F/ U" y, p) w- m- \
  888.   */( |  G; s5 L* O; e. f
  889. int32_t BSP_LCD_GetYSize(uint32_t Instance, uint32_t *YSize)
      m0 r( Q" J; u- X
  890. {, @. ]0 `0 D! B/ h% F+ b
  891.   int32_t ret = BSP_ERROR_NONE;
    7 y: M+ S& X9 T6 T
  892. 7 V, f. f. A0 \) z
  893.   if(Instance >= LCD_INSTANCES_NBR)/ f* t- Q' M1 h9 B
  894.   {* r' S- y" u3 d; i6 y
  895.     ret = BSP_ERROR_WRONG_PARAM;
    * n/ o2 W& W; N3 `
  896.   }/ q4 q$ g2 h" N7 L, A% T
  897.   else! n- {' d# r0 X8 G
  898.   {$ ?$ V" Q* k% s) N
  899.     *YSize = Lcd_Ctx[Instance].YSize;. |5 W5 ^1 U% c, ~, I8 W
  900.   }# K$ U' T& A- ?
  901. + u4 j$ f! m8 T+ |- V2 s8 P
  902.   return ret;
    8 |2 ?1 `, y# e
  903. }( ]+ S! N9 f: e8 u
  904. $ P. V3 M! I& a# n+ b- h5 a; M
  905. /**
    6 G  o& f' R. A) p
  906.   * @brief  Switch On the display.
    : V( Z$ B/ ^3 z1 t' o3 C
  907.   * @param  Instance    LCD Instance3 q6 R  a8 o( H5 B
  908.   * @retval BSP status
    " H" A, n2 }# K# B0 Q
  909.   */" u! i( p$ m: I  q4 @! }
  910. int32_t BSP_LCD_DisplayOn(uint32_t Instance)6 `4 P4 M) [7 [. c* x
  911. {
    : u! j2 \/ N2 K% P
  912.   int32_t ret = BSP_ERROR_NONE;
    ( G  j1 t3 |) a( J
  913.   GPIO_InitTypeDef gpio_init_structure = {0};
    : {* c9 T: B0 |2 W" P) P# n! r5 X

  914. 6 f2 [3 p$ L/ `0 c! z* i4 Z
  915.   if(Instance >= LCD_INSTANCES_NBR)  ^* x" w$ Z8 {  E. Y
  916.   {
    ( V4 o( \! j2 v3 H7 C: H+ G
  917.     ret = BSP_ERROR_WRONG_PARAM;/ k* X. @/ ?0 [! c
  918.   }7 i3 ?; K; n& A
  919.   else' e; I4 i3 Q1 p+ f" ]7 D" l
  920.   {7 R; t0 ~, n, g3 {1 L
  921.     __HAL_LTDC_ENABLE(&hlcd_ltdc);
    5 P5 _; M% H' _5 I* g6 X
  922.     gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP;
    ! a. G" K& y0 m; e4 j3 {0 q* p
  923.     gpio_init_structure.Pull = GPIO_PULLUP;# p4 N& }4 Q+ P
  924.     gpio_init_structure.Pin  = LCD_DISP_EN_PIN;5 j8 l% C  w$ L( A1 x
  925.     HAL_GPIO_Init(LCD_DISP_EN_GPIO_PORT, &gpio_init_structure);
    : W/ b* x, b5 l) G% _" F. m

  926. : _4 d6 c+ _. V7 w2 Z- i
  927.     /* Assert LCD_DISP_EN pin */& B& Z. L6 z+ u* h: O/ h
  928.     HAL_GPIO_WritePin(LCD_DISP_EN_GPIO_PORT,LCD_DISP_EN_PIN, GPIO_PIN_SET);
    1 l( b6 O- ?% U* @* m
  929.   }5 x. n6 [6 R9 ]1 u

  930. 1 j- @1 _" `$ I
  931.   return ret;
    ( G( _% @3 z, y/ g% w
  932. }
    : o: E2 ?3 Y1 @) O8 \4 ?

  933. 6 O0 N7 q6 O1 Z- L5 L- C- u
  934. /**, G2 @. Q2 j5 b0 w2 b2 E: r
  935.   * @brief  Switch Off the display.: H' F1 Y% J9 z, M5 G& c! i8 _
  936.   * @param  Instance    LCD Instance
    ! {- U& u- M4 R2 C/ _% e
  937.   * @retval BSP status" Y. j+ Y8 q+ w7 o3 B9 S/ y& Y
  938.   */& L* ^7 U+ R7 T" X
  939. int32_t BSP_LCD_DisplayOff(uint32_t Instance)
      F2 Y5 d- H: I# g1 Q4 ?
  940. {
    . Y& z: \5 i: f1 d$ _& R
  941.   int32_t ret = BSP_ERROR_NONE;
    * M. h' e1 B; j' e: a' x
  942.   GPIO_InitTypeDef gpio_init_structure = {0};
    7 c# L! x) b% T" p6 x2 h! ~/ @
  943. " x/ f' ^7 o. ^& n' ~$ X, f. F6 @  w. }
  944.   if(Instance >= LCD_INSTANCES_NBR)9 m/ @( S: T6 Y8 O1 v
  945.   {
    2 D( n# V9 d6 q; c
  946.     ret = BSP_ERROR_WRONG_PARAM;
    ! H" [! T( a( W4 N- B
  947.   }  F& V# X! j% {& R0 }! ^. L
  948.   else
    7 }4 w" b, K* L1 Q$ c* s2 u: U+ ]
  949.   {" z4 A: i; h' u- \/ d7 M; O
  950.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;3 P8 d$ H" I" B
  951.     gpio_init_structure.Pull      = GPIO_NOPULL;6 j& p  x  j" L7 ~& l$ d9 M' G: ^! Q7 p
  952.     gpio_init_structure.Speed     = GPIO_SPEED_FREQ_MEDIUM;) I3 l7 e5 {% P& \4 d- k
  953.     gpio_init_structure.Pin       = LCD_DISP_EN_PIN;
    $ _6 C3 a1 n& M, Z1 H/ }; z" x
  954.     HAL_GPIO_Init(LCD_DISP_EN_GPIO_PORT, &gpio_init_structure);- y+ C9 m* L8 U/ Z" g. r' r# ~7 S7 h& o

  955. ' A; f. ~5 p+ I1 [" P
  956.     HAL_GPIO_WritePin(LCD_DISP_EN_GPIO_PORT,LCD_DISP_EN_PIN, GPIO_PIN_RESET);* r$ E2 l7 m0 t8 r& r
  957. , U  f( C5 q8 d
  958.     __HAL_LTDC_DISABLE(&hlcd_ltdc);7 @8 a. p+ d% S0 q6 X
  959. 2 \5 Y4 T0 }3 N5 l
  960.   }7 q2 F& ?9 {  ?9 h0 T; N$ P6 R7 z# \

  961. 6 H8 R4 g( A0 `
  962.   return ret;, E, o( k/ C7 t) N2 O0 i
  963. }5 l: M8 T; T' h4 F, e* {7 [
  964. ' Q  f0 _, j, P, G9 r3 C
  965. /*** x$ _( i! l* A7 v# r1 i& ?
  966.   * @brief  Draws a bitmap picture loaded in the internal Flash in currently active layer.
    6 J' z" R( K$ m) r
  967.   * @param  Instance LCD Instance
    $ h9 s& H6 W9 Z- ^: R
  968.   * @param  Xpos Bmp X position in the LCD
    9 \; ~* y9 F5 q+ q' }7 D
  969.   * @param  Ypos Bmp Y position in the LCD: _: z2 g% o7 M! h; E6 @/ k( W1 [
  970.   * @param  pBmp Pointer to Bmp picture address in the internal Flash.
    . w2 F' Y8 U, ]$ Y; R: ]
  971.   * @retval BSP status5 {3 V4 i: k6 R& J3 j
  972.   */
    $ W8 \( B  b& G* q/ C
  973. int32_t BSP_LCD_DrawBitmap(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint8_t *pBmp)* w+ B' A9 Y9 i8 e6 G6 u+ q9 R: Z
  974. {
    0 A( L) F- t+ H$ i% s
  975.   int32_t ret = BSP_ERROR_NONE;
    ( F9 J  l  q) i" X+ }# z
  976.   uint32_t index;$ x8 h; g' q0 K* p) y
  977.   uint32_t width;
    * l( d4 e. P) f- \# ~  @: L
  978.   uint32_t height;; \: K, r1 ^; [; v2 g3 x3 _  O
  979.   uint32_t bit_pixel;
    1 ~% x1 f$ |/ U/ ?, j! t0 B
  980.   uint32_t Address;
    5 p. H) q' j! W% h7 Z
  981.   uint32_t input_color_mode;' w4 [# u6 D0 U5 j
  982.   uint8_t *pbmp;
    7 D4 k3 U% k% b& B# |, c- P, f

  983. ; G! t- q( R' i
  984.   /* Get bitmap data address offset */
    $ v5 |2 h% @- m0 }7 d( J$ ~
  985.   index = (uint32_t)pBmp[10] + ((uint32_t)pBmp[11] << 8) + ((uint32_t)pBmp[12] << 16)  + ((uint32_t)pBmp[13] << 24);
    & |! q/ O" x0 {5 G* w" s2 J+ k
  986. ' y  I! }& `5 f, H. o* L) R' v) q
  987.   /* Read bitmap width */
    , m. |! p2 g1 r3 u" q& \5 ]  u
  988.   width = (uint32_t)pBmp[18] + ((uint32_t)pBmp[19] << 8) + ((uint32_t)pBmp[20] << 16)  + ((uint32_t)pBmp[21] << 24);
    * S! i8 |, E3 m( E9 a) O" V

  989. / [9 {5 p' f( R. U" M
  990.   /* Read bitmap height */9 `7 a: v. P' B9 e: V
  991.   height = (uint32_t)pBmp[22] + ((uint32_t)pBmp[23] << 8) + ((uint32_t)pBmp[24] << 16)  + ((uint32_t)pBmp[25] << 24);
    9 S, f% s0 P; D# F

  992. * Q* w9 I3 Q0 C( |) e( o  g0 M
  993.   /* Read bit/pixel */
    0 C7 L: p& {- L6 W; k1 r2 X/ e
  994.   bit_pixel = (uint32_t)pBmp[28] + ((uint32_t)pBmp[29] << 8);$ t8 i" D. c2 y# @
  995. " E) N8 l9 P7 N0 e$ u
  996.   /* Set the address */5 F8 x( ?  s; Q7 @) d
  997.   Address = hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (((Lcd_Ctx[Instance].XSize*Ypos) + Xpos)*Lcd_Ctx[Instance].BppFactor);! s, N; C' d1 f, X/ m) z+ \
  998. % {( x7 B7 k3 Y  X, n
  999.   /* Get the layer pixel format */
    5 i; W  a4 K' l
  1000.   if ((bit_pixel/8U) == 4U)# H  C/ m8 e) E' `( }+ k
  1001.   {; w+ r6 ~/ }+ @% i, m5 ^8 B
  1002.     input_color_mode = DMA2D_INPUT_ARGB8888;
    3 |6 T% F! l$ H! N" v2 A
  1003.   }
    1 s( s5 Y3 W0 e5 D) y! q
  1004.   else if ((bit_pixel/8U) == 2U)5 o! `. w9 X: l7 A, m0 Y, a
  1005.   {
    * e: I/ E5 E. i. ]7 ^& }
  1006.     input_color_mode = DMA2D_INPUT_RGB565;
    " m) ]1 ^5 W5 s! h
  1007.   }; b' L6 i* u9 U. v4 e/ L
  1008.   else4 l( W& v+ C+ Q: R% R
  1009.   {$ y6 f  V6 v+ C" `2 ]1 J
  1010.     input_color_mode = DMA2D_INPUT_RGB888;
    " M# O# c4 k3 x0 d
  1011.   }% Q7 f( G# C( Q8 b1 X& ^
  1012. + E! X4 j8 |9 I& l. ?' e% O
  1013.   /* Bypass the bitmap header */$ I- ?8 s, ?2 x8 R% c6 w
  1014.   pbmp = pBmp + (index + (width * (height - 1U) * (bit_pixel/8U)));
    4 Y- R" `5 B0 ~: S# {6 g
  1015. 5 }+ f* s9 b1 |, g2 c/ H9 Q
  1016.   /* Convert picture to ARGB8888 pixel format */  M) U' k8 @6 z8 ~6 L' q- e0 h
  1017.   for(index=0; index < height; index++)
    : F" u8 K6 R+ ?% f& \3 ~) N- n0 ]
  1018.   {
    # z3 N# m% J! w9 R
  1019.     /* Pixel format conversion */  K) ?( {# x4 U  x
  1020.     LL_ConvertLineToRGB(Instance, (uint32_t *)pbmp, (uint32_t *)Address, width, input_color_mode);! a) w$ N7 H! O- a2 M
  1021. 7 B' ^5 W3 u! U
  1022.     /* Increment the source and destination buffers */: {/ k- {! _& |  g5 e
  1023.     Address+=  (Lcd_Ctx[Instance].XSize * Lcd_Ctx[Instance].BppFactor);) e( j( ]" r( a- z' P: w
  1024.     pbmp -= width*(bit_pixel/8U);: _5 q8 W5 _/ X. B
  1025.   }8 x  _# P3 ]: [6 ^( u' l9 i+ P; {0 i, E; l
  1026. 3 P( A+ o+ y- [2 z; H
  1027.   return ret;
    ) ]+ _; F" c6 ?- @/ L
  1028. }
    3 j5 C( J9 W" @8 Z2 S

  1029. 9 H) l4 U$ c2 L" D" B
  1030. /**; L9 l+ o4 O  {7 j- b3 W# \
  1031.   * @brief  Draw a horizontal line on LCD.
    / S7 J8 P2 [$ z# c
  1032.   * @param  Instance LCD Instance.
    ' V* s% \; T+ S7 e
  1033.   * @param  Xpos X position.
    : K8 q6 W5 e0 B
  1034.   * @param  Ypos Y position.2 B+ H0 V6 O2 l" P; P; b& q+ s1 {
  1035.   * @param  pData Pointer to RGB line data) b# I" T1 t1 D/ {0 }; H
  1036.   * @param  Width Rectangle width.7 a5 L. K1 S: w% K; |2 ?
  1037.   * @param  Height Rectangle Height.
    0 y" X; H9 B5 d5 p& }# `; w* K
  1038.   * @retval BSP status.8 d. [( A, L* y9 @, @. t( [3 g4 M3 m
  1039.   */7 p7 u* n: L% ]- u/ k. C
  1040. int32_t BSP_LCD_FillRGBRect(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint8_t *pData, uint32_t Width, uint32_t Height)
    " r$ _: \+ a. v5 D% G7 r
  1041. {3 \" S. n: m8 o
  1042.   uint32_t i;6 V5 S4 `; a) X$ Y9 g/ ^
  1043.   uint8_t *pdata = pData;
    + z5 C- [/ }4 A" L5 y2 B
  1044. - h0 L1 }8 ?7 A  P8 i) |- s
  1045. #if (USE_DMA2D_TO_FILL_RGB_RECT == 1)
    5 w+ y+ z$ Q" G, f0 [  g- y; n1 `
  1046.   uint32_t  Xaddress;3 q; C& C  \) I" h5 @6 a3 `
  1047.   for(i = 0; i < Height; i++)/ I: z( g: M8 t% K- x. R! ]
  1048.   {1 Q& q) a5 b8 N7 X# O2 r* }
  1049.     /* Get the line address */2 `4 Z: e/ }! Z; e$ i9 o6 F
  1050.     Xaddress = hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*(Ypos + i)) + Xpos));, C/ v: L0 x; @, f/ s
  1051. ' A9 N0 u: h' q6 Q, b: |( l( U
  1052. #if (USE_BSP_CPU_CACHE_MAINTENANCE == 1)
      |% |' m4 P% p) v' m/ ^
  1053.     SCB_CleanDCache_by_Addr((uint32_t *)pdata, Lcd_Ctx[Instance].BppFactor*Lcd_Ctx[Instance].XSize);
    6 ?" {/ {1 _5 L2 a0 k
  1054. #endif /* USE_BSP_CPU_CACHE_MAINTENANCE */
      ]/ ]; o0 |8 R4 z) ~% f. _3 ]" T
  1055. - R" p/ J! {: o( ~7 b' L
  1056.     /* Write line */$ T4 K2 [0 \1 ^! m, [
  1057.     if(Lcd_Ctx[Instance].PixelFormat == LCD_PIXEL_FORMAT_RGB565)5 y0 Q0 D* v$ N. f# N
  1058.     {1 U, e& {1 g- j
  1059.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_RGB565);4 G" ^' x. v, |( n$ g7 [' N
  1060.     }' L1 _% c: @; j3 z: _
  1061.     else if(Lcd_Ctx[Instance].PixelFormat == LCD_PIXEL_FORMAT_ARGB4444)1 s2 t* K6 ?% a2 t! Z% v) p
  1062.     {( [3 R/ r9 v( k0 l3 o
  1063.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_ARGB4444);2 e( O+ M9 d5 z0 y, {" G' p
  1064.     }" P( W' I" x1 ]7 g" r5 m% `
  1065.     else if(Lcd_Ctx[Instance].PixelFormat == LCD_PIXEL_FORMAT_RGB888)" {7 ~, H. X7 K( ?- [; L9 F1 M( G) C
  1066.     {9 f  @/ C- ]) f2 H* j0 Y
  1067.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_RGB888);
    ! |8 z& L7 C2 J" H
  1068.     }
    ; J: Y7 E7 m( ?. h& d
  1069.     else
    4 K6 q# Q  @/ r, f
  1070.     {
    4 \+ j5 X7 ~  |1 M5 R# N
  1071.       LL_ConvertLineToRGB(Instance, (uint32_t *)pdata, (uint32_t *)Xaddress, Width, DMA2D_INPUT_ARGB8888);
    ) S7 E/ p* E$ E! z/ l
  1072.     }6 l5 s$ k! _" K
  1073.     pdata += Lcd_Ctx[Instance].BppFactor*Width;: z. R4 ^2 K' g8 d: ], v- Y
  1074.   }/ v0 o0 V! K" J9 N+ d
  1075. #else# p( f3 I6 y2 K: x6 A  g( I' ~+ j
  1076.   uint32_t color;( L) r2 i8 u+ G6 p/ U7 `! }: f
  1077.   uint32_t j;
    7 K0 \. B5 d( O2 n! P% H# n
  1078.   for(i = 0; i < Height; i++)7 L3 m# u  _- @) e0 M& e6 i1 |0 G
  1079.   {' A1 ~! C" e, f2 g+ W
  1080.     for(j = 0; j < Width; j++)
    & H0 B3 n) t+ E, m- O0 n
  1081.     {
      H' h* K$ R! _6 {8 E
  1082.       color = (uint32_t)((uint32_t)*pdata | ((uint32_t)(*(pdata + 1U)) << 8U) | ((uint32_t)(*(pdata + 2U)) << 16U) | ((uint32_t)(*(pdata + 3U)) << 24U));' q9 m; g  W0 g4 Z9 S  C" N. `
  1083.       (void)BSP_LCD_WritePixel(Instance, Xpos + j, Ypos + i, color);; A6 r' Z' T( i, S# v! n" c3 \
  1084.       pdata += Lcd_Ctx[Instance].BppFactor;
    + ]8 `( N4 {  v! O/ s
  1085.     }
    0 ^0 b; _4 z4 E) \
  1086.   }
    $ B- h1 H$ f7 M# A  u
  1087. #endif /* (USE_DMA2D_TO_FILL_RGB_RECT == 1) */
    / `  e# f" U7 r' u

  1088. . {4 r; T( G7 e9 i
  1089.   return BSP_ERROR_NONE;
    5 b- m5 V! o! W$ k3 `
  1090. }
    ; _0 p1 S, V. V& w2 Y" Y

  1091. # i' F- G/ _+ r) |
  1092. /**
    5 S& {  l7 i/ Y. i0 n
  1093.   * @brief  Draws an horizontal line in currently active layer.# u9 o; d8 V6 q9 Z
  1094.   * @param  Instance   LCD Instance( z3 K# n3 X+ c* i7 B
  1095.   * @param  Xpos  X position
    : |- p$ s% j! U! b* {) b, S2 t
  1096.   * @param  Ypos  Y position" Z) h4 ~  G! o! _: I. l
  1097.   * @param  Length  Line length
    3 W) c5 F, M0 u' P4 ~, Z5 X
  1098.   * @param  Color RGB color
    + O. u* e5 c* h
  1099.   * @retval BSP status
    ( A% x4 q( |+ P. v
  1100.   */
    0 L1 y2 z5 L) x- G
  1101. int32_t BSP_LCD_DrawHLine(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Length, uint32_t Color)8 X: ~. O* x( S' `5 `* A7 q! ?" t
  1102. {
    * I3 E& W5 m: W- V  ]
  1103.   uint32_t  Xaddress;$ L1 A; F- k/ N0 j1 u3 t7 q" @

  1104. ( ^% n. d1 ]! U# P) `- i2 Z
  1105.   /* Get the line address */
    % f6 N4 U# i& P" \
  1106.   Xaddress = hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*Ypos) + Xpos));
    * j2 t6 t# G  ?' G; h1 f, y3 K

  1107.   _$ B& y2 s3 q4 o- V7 ^* G
  1108.   /* Write line *// \" B, t% z0 G! N: h# o6 f1 k
  1109.   LL_FillBuffer(Instance, (uint32_t *)Xaddress, Length, 1, 0, Color);
    2 C. l7 Q9 l' H% e0 L
  1110. 5 ^; z$ ~/ c. r; i7 a
  1111.   return BSP_ERROR_NONE;* B# X. I- B/ y3 L( o9 H
  1112. }
    5 J; ]4 R; G: l" i, H/ l$ ?
  1113. . ]! Y6 T1 j7 m* V
  1114. /**( r5 P- C3 ~/ f
  1115.   * @brief  Draws a vertical line in currently active layer.& P+ Z! z) w1 n3 l2 t: |
  1116.   * @param  Instance   LCD Instance
    2 X! U- D. l4 G8 p' q& I2 L
  1117.   * @param  Xpos  X position1 k3 R( B  `: M+ u/ p' V. l
  1118.   * @param  Ypos  Y position) j. F7 _7 B2 h, L! u( f6 O
  1119.   * @param  Length  Line length8 i& X0 K( H; N/ m0 B8 e( L
  1120.   * @param  Color RGB color
    3 w2 U2 h, Q% S+ C8 O5 l
  1121.   * @retval BSP status  d2 C, l( Q7 n5 \
  1122.   */7 d8 |$ w# j9 I/ ?/ O& c" B
  1123. int32_t BSP_LCD_DrawVLine(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Length, uint32_t Color)6 K. k  F9 F0 {, {
  1124. {
    9 k( [+ ?) L+ V- D5 {
  1125.   uint32_t  Xaddress;
    # f3 g/ U2 D3 V9 T" K
  1126. , J& ]9 q2 `" P- E. U# i
  1127.   /* Get the line address */* `/ i- s/ C0 t3 w
  1128.   Xaddress = (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress) + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*Ypos) + Xpos));( }- Z3 z6 l0 q. C4 S
  1129. ) t6 k. g, H; C! Q
  1130.   /* Write line */
    % Z' P8 B/ L! i& H
  1131.   LL_FillBuffer(Instance, (uint32_t *)Xaddress, 1, Length, (Lcd_Ctx[Instance].XSize - 1U), Color);9 I5 s0 o& W" V

  1132. 3 t) t$ v$ a0 H
  1133.   return BSP_ERROR_NONE;4 T: \6 T' ?; _8 O6 z+ v/ z
  1134. }  y$ }7 c# a" @' h( ]9 S7 R) [: E" G3 Y

  1135. : `6 [. Y3 s; x/ c
  1136. /**) O' [5 j5 j# }
  1137.   * @brief  Draws a full rectangle in currently active layer.
    ) _) L7 w- Q2 }$ G& `
  1138.   * @param  Instance   LCD Instance" m5 t9 p" X9 Y# j) v, y7 G" w& F
  1139.   * @param  Xpos X position
    ' f0 O7 z+ N( z0 C, t) J/ F$ i8 \
  1140.   * @param  Ypos Y position
    % ]1 ]7 s0 Z  A5 X9 Y
  1141.   * @param  Width Rectangle width" Y# ]* Q2 u+ y$ X
  1142.   * @param  Height Rectangle height
    2 F! j4 k- X: q0 B/ i/ w, r8 l
  1143.   * @param  Color RGB color  d$ p$ k" C; C$ ~4 d. I
  1144.   * @retval BSP status3 _4 e0 d2 Z# F* V* U3 S
  1145.   */
    8 z6 V+ v- n! ~4 Q/ s
  1146. int32_t BSP_LCD_FillRect(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Width, uint32_t Height, uint32_t Color)
    # [) G+ I" B4 B  o. G0 B# h- R
  1147. {: J. C7 U1 S) |
  1148.   uint32_t  Xaddress;/ q3 F$ L4 q) ?" ~$ t
  1149. $ R5 V0 l2 H: n
  1150.   /* Get the rectangle start address */
    6 c3 M( P# m" H3 c3 N
  1151.   Xaddress = (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress) + (Lcd_Ctx[Instance].BppFactor*((Lcd_Ctx[Instance].XSize*Ypos) + Xpos));
    & d4 l* y$ i+ A7 s
  1152. 2 {1 O% z- a1 N$ o+ [; X5 r
  1153.   /* Fill the rectangle */
    % c6 M3 n  K$ R$ m7 j& H( e
  1154.   LL_FillBuffer(Instance, (uint32_t *)Xaddress, Width, Height, (Lcd_Ctx[Instance].XSize - Width), Color);7 x$ s  |* _$ D. X  D# \
  1155. # z9 S# W- _% z3 f0 o! k
  1156.   return BSP_ERROR_NONE;1 O- V2 s& w" Q0 E6 ~  Z
  1157. }
    / r: \. g9 s+ ~, `; `

  1158. / y0 Q; W: t* u' ]: X: K/ M
  1159. /**! b( Y3 s8 ]+ P- R1 w' \% y6 Q: j8 @
  1160.   * @brief  Reads a LCD pixel.0 E" o7 _9 ~5 o0 `4 W! x) c
  1161.   * @param  Instance    LCD Instance
    ) N7 u* b$ K- I- G" i2 e
  1162.   * @param  Xpos X position+ x  Y3 T; {3 ^8 Q. `" w
  1163.   * @param  Ypos Y position5 u+ U3 B6 |$ d. _9 O' D
  1164.   * @param  Color RGB pixel color# n0 z9 M$ n4 V5 s: Z. E5 Z- |
  1165.   * @retval BSP status
    6 S2 D% t0 W- @9 f2 e0 C% W+ C: s
  1166.   */) {8 x( l# o& ]- G8 h) V4 Q# A
  1167. int32_t BSP_LCD_ReadPixel(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t *Color)
    ) m0 ~7 Y1 ~' ~5 A1 b$ J
  1168. {$ |4 F; Z$ W# y$ ^1 n# D1 v( O
  1169.   if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888)
    . R+ z: H& F) R" y+ l: r- l
  1170.   {
    2 {$ g; ?6 Z( ~/ T# d& f) R
  1171.     /* Read data value from RAM memory */- B1 [; e' V0 M! p4 K( e* _/ p
  1172.     *Color = *(__IO uint32_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (4U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos)));6 J8 b: A1 s! s3 Q8 O; l
  1173.   }
    % j* k6 E, N  [4 G; ~5 n
  1174.   else if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB888)
    7 T, j5 J- w. Y& }/ M2 l5 ?  ^
  1175.   {
    0 k# L: i, a0 O$ a+ q  w' P
  1176.     /* Read data value from RAM memory */5 o* B7 h5 h1 @  t/ G% O
  1177.     *Color = *(__IO uint32_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos)));
    & \3 R$ W& i) u4 s( V3 h2 n
  1178.     *Color = CONVERTARGB88882RGB888(*Color);
    3 Z( t. L% D4 s2 v+ V0 j
  1179.   }- ~" c7 N, U! h
  1180.   else /* if((hlcd_ltdc.LayerCfg[layer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565) */
    ; u2 G2 \9 `6 y5 U% W
  1181.   {2 o/ x* l6 w2 {9 O
  1182.     /* Read data value from RAM memory */
    2 k, ~6 [' h4 ?9 r% s
  1183.     *Color = *(__IO uint16_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (2U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos)));
    / \# o) m0 M- o( O8 N/ ~& U
  1184.   }
    4 d2 J, t5 o6 J( @$ N* j0 D7 _" r
  1185. % o6 A. @! P& m7 j% {
  1186.   return BSP_ERROR_NONE;- E; b3 `2 H8 b) F- j2 ]: t* a
  1187. }4 v; K8 x. l4 ?3 u% i5 [: S" p
  1188. 8 n3 `, O- _- O1 ]3 v1 N
  1189. /**5 z: s8 f. R/ u! ~* q6 c) K
  1190.   * @brief  Draws a pixel on LCD.4 ~+ m$ ^% @. L$ \. X; B
  1191.   * @param  Instance    LCD Instance" Z5 J+ h8 P8 q- Z7 }, S
  1192.   * @param  Xpos X position: k$ p9 u0 l( a3 q$ l$ @+ w) {
  1193.   * @param  Ypos Y position
    7 I& U( y( \  q, G: p: R
  1194.   * @param  Color Pixel color6 F9 N$ \2 K- R5 A" ~0 w
  1195.   * @retval BSP status( ^  n* P7 P6 j+ V, z; U
  1196.   */
    7 O2 x% k8 z$ o% k' A# `! b! [( P% N( I
  1197. int32_t BSP_LCD_WritePixel(uint32_t Instance, uint32_t Xpos, uint32_t Ypos, uint32_t Color)
    : Q( u4 h3 d/ n8 R5 S
  1198. {
    * T3 x1 Y  V8 ~6 U) D: m
  1199.   if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888)
    % D2 ?& [. I3 e
  1200.   {
    ! j' n" U- n5 N( E. u" B
  1201.     /* Write data value to RAM memory */
    + o  c& l- z8 x. h) b
  1202.     *(__IO uint32_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (4U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))) = Color;0 @- U" @: u. x2 _7 l3 L  x: X' l
  1203.   }1 B/ e8 }4 Q( d$ I- ]! y
  1204.   else if(hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB888)$ ?: U8 `' z: L0 G/ K
  1205.   {: s9 C' f1 K, s* B" @
  1206.     /* Write data value to RAM memory */( j6 K, n' ^% B3 n0 f# S3 a
  1207.     *(__IO uint8_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + ((3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))-3U)) = (uint8_t) (Color);
    3 V# Q7 p% |+ V4 S6 s
  1208.     *(__IO uint8_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + ((3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))-2U)) = (uint8_t) (Color>>8U);) ?, L7 f$ F, B+ k2 P& N$ `
  1209.     *(__IO uint8_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + ((3U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))-1U)) = (uint8_t) (Color>>16U);& f! O) q% ]& a5 l7 u
  1210.   }; }, h" L2 W8 }3 e5 f  o$ @
  1211.   else
    2 n. s5 O% q0 p/ w) q; V/ q- d0 U
  1212.   {8 F- _* G% o, c. r: b; {1 Q
  1213.     /* Write data value to RAM memory */
    4 l& c! G/ N. F/ }
  1214.     *(__IO uint16_t*) (hlcd_ltdc.LayerCfg[Lcd_Ctx[Instance].ActiveLayer].FBStartAdress + (2U*((Ypos*Lcd_Ctx[Instance].XSize) + Xpos))) = (uint16_t)Color;
    * n& g# H; o; l+ ^
  1215.   }
    ' ?& Z& C$ G* q1 C+ q
  1216. - j9 v  C1 C5 Q
  1217.   return BSP_ERROR_NONE;5 X% N/ O+ X& l/ m
  1218. }- m6 k6 |# I) L: Y
  1219. 8 |8 s3 q. F' t" a" J
  1220. /**( L; K$ x$ Y+ S& z0 C
  1221.   * @}6 T' T5 D. i! j
  1222.   */4 t7 {$ \- F" F" }! S( y

  1223. % e9 s* j: S1 m5 S+ V: v- I
  1224. /** @defgroup STM32N6570_DK_LCD_Private_Functions LCD Private Functions
    + w$ Q) I4 S( y4 F' G
  1225.   * @{- i4 e7 S5 F# W8 @" C1 `( r, B
  1226.   */5 E* d, I- g* Q+ [
  1227. /**
    9 W! }, V' H0 @; A$ @- L
  1228.   * @brief  Fills a buffer.
    6 u, o' f( q& q" G3 }: d: X5 H
  1229.   * @param  Instance LCD Instance. o* H0 V( E5 ]
  1230.   * @param  pDst Pointer to destination buffer
    6 c) x8 W; ^8 A+ F% P
  1231.   * @param  xSize Buffer width
    ' r6 C) w! V& ^, X
  1232.   * @param  ySize Buffer height
    8 y( W3 ^2 N; {, }7 b0 `
  1233.   * @param  OffLine Offset
    - z# ^! m+ e8 Z- }+ g
  1234.   * @param  Color RGB color
    6 D) {: F+ @$ g: v5 j
  1235.   */
    ; Q% Y; G+ Q1 P0 X, c/ T
  1236. static void LL_FillBuffer(uint32_t Instance, uint32_t *pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t Color)
    1 w. Y* R* r/ f' {; ~4 ]7 j
  1237. {
    ; O% W9 L* U/ x, i) O
  1238.   uint32_t output_color_mode;
    ! [; a, I0 I4 |% w9 H
  1239.   uint32_t input_color = Color;9 Z# t) [& T( D+ n6 f& K+ g

  1240. 0 w: E% c$ d- C) O3 e7 s
  1241.   switch(Lcd_Ctx[Instance].PixelFormat)
    0 c% L, ~2 O( G3 Z+ i6 u5 N
  1242.   {0 v! _) w9 W7 Z; e( h
  1243.   case LCD_PIXEL_FORMAT_RGB565:
      j% L0 T. E- n# {5 c) o3 j
  1244.     output_color_mode = DMA2D_OUTPUT_RGB565; /* RGB565 */
    ; ]! r/ r) D) e! m, Q
  1245.     input_color = CONVERTRGB5652ARGB8888(Color);
    & |( X% X" ~- }( |
  1246.     break;( \; E! `  T! b  F! W2 U7 j/ Z( _
  1247.   case LCD_PIXEL_FORMAT_ARGB4444:
    : }1 d. |5 ]) U5 V" [% D. P
  1248.     output_color_mode = DMA2D_OUTPUT_ARGB4444; /* ARGB4444 */
    5 j0 B! P, f0 F0 K4 W: c$ V
  1249.     input_color = CONVERTARGB44442ARGB8888(Color);1 J: g$ S! v8 j* b0 r0 p
  1250.     break;
    . ?- a% ]& M( T% |( O! y; q. l- V
  1251.   case LCD_PIXEL_FORMAT_RGB888:
    9 @. u) ^( g9 e
  1252.     output_color_mode = DMA2D_OUTPUT_RGB888; /* RGB888 */& V4 z2 D) a3 C3 S9 j+ L0 ?( Y
  1253.     input_color = CONVERTRGB8882ARGB8888(Color);
    4 d6 n5 s$ `) m& x
  1254.     break;
    2 b7 d* l( ?9 M8 h3 p
  1255.   default:( p# v  j$ B3 P! j! \8 `
  1256.     output_color_mode = DMA2D_OUTPUT_ARGB8888; /* ARGB8888 */& }3 q$ P1 V6 a* p& V6 }, ^
  1257.     break;
    1 ]4 X/ C" g3 l' V
  1258.   }
    ; r, l& z' q4 _! m+ U
  1259. . Y6 `0 {/ o2 T" E- n0 n
  1260.   /* Register to memory mode with ARGB8888 as color Mode *// t' F( l3 y  |3 w! a0 h  P6 K
  1261.   hlcd_dma2d.Init.Mode         = DMA2D_R2M;5 m9 q7 Y+ \- `# S: _. _* [( Y
  1262.   hlcd_dma2d.Init.ColorMode    = output_color_mode;
    1 W+ d9 ?7 e6 n
  1263.   hlcd_dma2d.Init.OutputOffset = OffLine;
    : L' @' u) [6 m2 B8 k  E

  1264. 2 o0 N: x' n0 C& K
  1265.   hlcd_dma2d.Instance = DMA2D;
    & q4 B% R  ~/ i: Y) ?9 {

  1266. 4 y4 _4 r& ~5 N( o2 ^
  1267.   /* DMA2D Initialization */4 @* F- x- X' y; a1 u
  1268.   if(HAL_DMA2D_Init(&hlcd_dma2d) == HAL_OK)1 m( {& e2 H. x. C1 W" o  |
  1269.   {
    / ~# A, ?1 Q0 Z! c( U; }  V  |
  1270.     if (HAL_DMA2D_Start(&hlcd_dma2d, input_color, (uint32_t)pDst, xSize, ySize) == HAL_OK)# A5 T, R) Z1 Y3 S0 O% X
  1271.     {, V0 N2 \  w4 _; T( q$ d8 x7 t
  1272.       /* Polling For DMA transfer */! c( G4 S6 W+ ^& |0 c( b
  1273.       (void)HAL_DMA2D_PollForTransfer(&hlcd_dma2d, 50);
    ) {. v6 K0 _" u* t  s/ s' K% `
  1274.     }
    ) s* d2 R: o3 o- |8 V5 O
  1275.   }
    ) G8 \7 n$ S7 m! s! @" l
  1276. }: G! Q; d( g5 w/ @3 f3 L

  1277. ; e5 W. ~+ l- T- |4 B/ @$ r% k
  1278. /**
    % s% b: u) o- e/ I2 J* C  M
  1279.   * @brief  Converts a line to an RGB pixel format.# n1 `) U& t0 I: d
  1280.   * @param  Instance LCD Instance
    / V) w0 O' G) t' d
  1281.   * @param  pSrc Pointer to source buffer
    + n/ y6 D! `2 {1 x. K8 m
  1282.   * @param  pDst Output color
    $ t; Z9 u8 Y" y% w
  1283.   * @param  xSize Buffer width
    4 h3 h, b2 N# H( O+ h  O& Y
  1284.   * @param  ColorMode Input color mode! A6 l+ M- [- z1 J" s
  1285.   */0 {5 y8 {* c. y! _1 i5 {" k
  1286. static void LL_ConvertLineToRGB(uint32_t Instance, uint32_t *pSrc, uint32_t *pDst, uint32_t xSize, uint32_t ColorMode)
    ) i/ n0 c3 f5 e& f4 [* @
  1287. {  u6 k; T7 r( p8 ^8 g
  1288.   uint32_t output_color_mode;+ O  A: h+ V2 g) w( x2 k
  1289. $ u$ t- p6 c! R8 t$ @  u: y
  1290.   switch(Lcd_Ctx[Instance].PixelFormat); c4 c1 P+ ~: q$ ?  u
  1291.   {3 X+ c0 V: A* a# E- E, ?1 l: {
  1292.   case LCD_PIXEL_FORMAT_RGB565:4 F5 y! Z5 d) b6 P0 \: s2 v( ~" ^( y
  1293.     output_color_mode = DMA2D_OUTPUT_RGB565; /* RGB565 */
    + w7 Z4 h4 j5 R/ J' L- s
  1294.     break;
    , w4 J* \& O. r
  1295.   case LCD_PIXEL_FORMAT_ARGB4444:# J! r  j7 X1 G8 ~! b0 s0 l# |
  1296.     output_color_mode = DMA2D_OUTPUT_ARGB4444; /* ARGB4444 */! C  j) R! a8 C* w% [, ~
  1297.     break;
    . B; U0 P8 P1 H% a+ B" Z9 u
  1298.   case LCD_PIXEL_FORMAT_RGB888:$ D$ O) T7 o8 t" h# f0 Q6 D
  1299.     output_color_mode = DMA2D_OUTPUT_RGB888; /* RGB888 */2 E+ N% O& k+ l5 E+ C/ I9 L4 G& f: C+ z
  1300.     break;
    : A4 q/ h7 M8 M+ V- a6 E/ W
  1301.   default:
    + o4 m* N! h1 w5 t  b: s
  1302.     output_color_mode = DMA2D_OUTPUT_ARGB8888; /* ARGB8888 */
    . u' t8 {  }' x, E$ I# @0 @
  1303.     break;  |( I# D1 B- \8 q
  1304.   }5 ^, D) {4 ^, l. I
  1305. ) [+ ?" [7 M  t
  1306.   /* Configure the DMA2D Mode, Color Mode and output offset */
    ' N+ x" ~) g6 V$ C7 c
  1307.   hlcd_dma2d.Init.Mode         = DMA2D_M2M_PFC;
    1 Z  g4 ^' l9 Y4 F  ]
  1308.   hlcd_dma2d.Init.ColorMode    = output_color_mode;0 x& e$ |6 G/ P
  1309.   hlcd_dma2d.Init.OutputOffset = 0;
    ; u- R" G. f( g6 j' L( N3 L
  1310. 3 \1 t3 j; ]9 N4 ], D. V
  1311.   /* Foreground Configuration */
    " L: Z( Z1 j4 R; L
  1312.   hlcd_dma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;
    3 D6 C3 d- @, T; ]
  1313.   hlcd_dma2d.LayerCfg[1].InputAlpha = 0xFF;
    8 J0 g9 n/ T. }
  1314.   hlcd_dma2d.LayerCfg[1].InputColorMode = ColorMode;
    ! Y  m, s  ^3 M, C# R
  1315.   hlcd_dma2d.LayerCfg[1].InputOffset = 0;, k6 d( {1 A2 F+ e1 q4 g1 N
  1316. . U' j; d. B* N2 l5 t/ n; y
  1317.   hlcd_dma2d.Instance = DMA2D;
    % f4 E  g% ?$ k1 f8 B5 w

  1318. + f" G* b- m9 s0 B
  1319.   /* DMA2D Initialization */: J- l& [0 T1 e6 n2 a8 A
  1320.   if(HAL_DMA2D_Init(&hlcd_dma2d) == HAL_OK)0 f9 J# ~6 m, t7 x6 A
  1321.   {
    - S9 R! x. T0 ^9 y5 L
  1322.     if(HAL_DMA2D_ConfigLayer(&hlcd_dma2d, 1) == HAL_OK)' C: O7 j6 t# L) P
  1323.     {
    2 O2 T  }. `$ G( G1 S+ k' `7 m
  1324.       if (HAL_DMA2D_Start(&hlcd_dma2d, (uint32_t)pSrc, (uint32_t)pDst, xSize, 1) == HAL_OK)
    : a6 T- c4 D, ~+ F- W+ I5 V
  1325.       {8 W' f/ a% P0 F$ P4 Z
  1326.         /* Polling For DMA transfer */
    5 R# X- o7 I* E* a7 o9 T; L
  1327.         (void)HAL_DMA2D_PollForTransfer(&hlcd_dma2d, 50);
    1 |2 u/ m2 u* M8 X9 M1 F. {# U
  1328.       }, B# b- B. |' Y( t: k& t
  1329.     }3 z4 {' m" y% d. M
  1330.   }8 X) p- d+ C; N( I: ?
  1331. }
    $ W5 ?" Y/ x6 J. ~2 {3 @) k3 N

  1332. ( M! ?) K" X9 ^+ {, ~0 h) l' F
  1333. /**9 \+ g7 Y( {8 O
  1334.   * @brief  Initialize the BSP LTDC Msp.8 f. Q0 [2 R- m8 g8 }, l$ U
  1335.   * @param  hltdc  LTDC handle
    $ ]3 C7 j* m; O0 G, ~" Q
  1336.   * @retval None& j+ F9 k5 o% D9 G) C
  1337.   */
    ) J* t7 C) F- ], v0 n9 g  P2 ?* q' w
  1338. static void LTDC_MspInit(LTDC_HandleTypeDef *hltdc)0 i1 m$ g, O  y) f& [! y
  1339. {
    + H. H  t+ |: G8 V5 s* G8 ?
  1340.   GPIO_InitTypeDef  gpio_init_structure = {0};2 ]* R) K" Q- X9 r. {7 s
  1341. & M- a. q$ N! {) t, s3 d, c
  1342.   if (hltdc->Instance == LTDC)
    / x" @0 B8 s1 P
  1343.   {
    % n9 x5 E  N" }  l
  1344.     __HAL_RCC_LTDC_CLK_ENABLE();& l& b4 M  w' V9 @8 e
  1345. 2 v! v$ T/ J3 v6 \/ ?
  1346.     __HAL_RCC_LTDC_FORCE_RESET();
    , o5 ?1 U  c3 H
  1347.     __HAL_RCC_LTDC_RELEASE_RESET();7 E1 v! E/ u; M( P3 j
  1348. ; ~. Y2 \: l$ D$ ]3 J9 t
  1349.     /* STM32N6570-DK MB1860A RK050HR18 */6 d+ O' R2 b' U5 H
  1350.     /* PG0  R0          */
    4 \; p# i% s  P- u
  1351.     /* PD9  R1          */% B+ J# g. N! m0 V- J: q
  1352.     /* PD15 R2          */
    5 w( B9 \! N) X' f7 N7 u8 W% S
  1353.     /* PB4  R3          */ // JTAG
    9 N9 C6 X! D; h$ a( l6 v; q
  1354.     /* PH4  R4          */
    1 Z& F3 D" z8 P$ C
  1355.     /* PA15 R5          */ // JTAG JTDI
    , m. m% ?+ D! x8 O) _; G! X! b
  1356.     /* PG11 R6          */4 v3 p2 ?, C/ b4 L1 D( r3 W: {* `
  1357.     /* PD8  R7          */
    ) `8 s# b' |+ }: U; F  e7 N
  1358.     /* PG12 G0          */' M) p" _4 b4 R/ @* ?5 B
  1359.     /* PG1  G1          */
    / F! v, r9 @+ N; q- {! R
  1360.     /* PA1  G2          *// L' f1 W5 V. B: _4 X/ H) p4 M
  1361.     /* PA0  G3          */
    * g# Y6 b! {. i4 h, J1 e
  1362.     /* PB15 G4          */1 v6 i8 |8 ]- ^$ c  A
  1363.     /* PB12 G5          */$ G+ J: R# K  ~7 B3 z
  1364.     /* PB11 G6          */
    % R+ e  r$ U7 G: B: |# W+ M* f* I# ^+ d
  1365.     /* PG8  G7          */
    * e) z; d7 B4 t  Y
  1366.     /* P15  B0          */) ^0 R( y9 D5 h# C6 x2 I1 v. g' M
  1367.     /* PA7  B1          */+ S, ~: g) e0 {. e/ M. c+ l
  1368.     /* PB2  B2          */
    , U+ A$ N! ]- U7 [! e
  1369.     /* PG6  B3          */
    : V5 h6 y& y8 T) @
  1370.     /* PH3  B4          */& P9 E4 u' R  p* q  V- p
  1371.     /* PH6  B5          */
    7 ?& t3 [( t' }- l0 z/ }/ E3 k) j
  1372.     /* PA8  B6          */
    # V5 F' a. [2 \* n8 m" _3 |( v/ C  u
  1373.     /* PA2  B7          */& }9 Z- K5 r) J2 z2 r
  1374.     /*                  */0 d4 b+ }4 r1 F, r8 o' G  a8 f
  1375.     /* PG13 LCD_DE      */2 Q  a3 R; ?4 L' t0 \* L4 b) H0 F
  1376.     /* PQ3  LCD_ONOFF   */4 b! M0 _0 v$ r& b& a4 R% h
  1377.     /* PB14 LCD_HSYNC   */! A7 Q9 V5 i% C* ^1 f
  1378.     /* PE11 PCD_VSYNC   */! w% q7 h: E) _( Q% e) {7 T6 _0 d
  1379.     /* PB13 LCD_CLK     */6 r" u/ T% ^' n8 ]" O4 r8 |: ^
  1380.     /* PQ4  LCD_INT     */% K/ v" J3 a  E  Y' |
  1381.     /* PQ6  LCD_BL_CTRL */
    0 x) E" D2 W0 P  n
  1382.     /* PE1  NRST        */  o1 U  R5 q9 B, h% t

  1383.   i3 u( t3 m% _- y1 I
  1384.     __HAL_RCC_GPIOA_CLK_ENABLE();& ~7 a0 u! r' i3 @1 O& I
  1385.     __HAL_RCC_GPIOB_CLK_ENABLE();; I+ l6 h" Q5 ?. L+ k; F
  1386.     __HAL_RCC_GPIOD_CLK_ENABLE();" K2 @7 K9 u- q* A
  1387.     __HAL_RCC_GPIOE_CLK_ENABLE();
    0 y* l, x. W' T; f
  1388.     __HAL_RCC_GPIOG_CLK_ENABLE();! N) W8 l( ]% o/ w
  1389.     __HAL_RCC_GPIOH_CLK_ENABLE();
    ' A- m) H! |0 B
  1390.     __HAL_RCC_GPIOQ_CLK_ENABLE();
    - W9 ~  a# q4 N/ f

  1391. ) k3 |  T( ^4 i: T, p; |1 v4 K
  1392.     gpio_init_structure.Mode      = GPIO_MODE_AF_PP;
    8 x1 P7 R1 o, \+ T# R  {
  1393.     gpio_init_structure.Pull      = GPIO_NOPULL;
    * I: `. e( S# E7 _
  1394.     gpio_init_structure.Speed     = GPIO_SPEED_FREQ_HIGH;, E& R# y/ V4 [5 o- j4 |  _

  1395. 9 `2 N* t( `: q3 I3 m
  1396.     /* G3, G2, B7, B1, B6, R5 */
    5 V5 k4 Z0 n9 X; K4 q
  1397.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_15;6 D! P4 d1 W0 W5 N" A7 i
  1398.     gpio_init_structure.Alternate = GPIO_AF14_LCD;! y) h& d7 _" t2 b4 I4 i) d
  1399.     HAL_GPIO_Init(GPIOA, &gpio_init_structure);2 W( j) q( o) Y! i# W

  1400. , E) Z" u$ P1 u& u* G9 \, e
  1401.     /* LCD_CLK, LCD_HSYNC B2, R3, G6, G5, G4 */2 r& z( Z1 O+ W) z$ ]8 u* E$ S
  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;. |. j7 m0 v+ D: c5 k
  1403.     gpio_init_structure.Alternate = GPIO_AF14_LCD;' k  m- g: w# o# ]2 `( |5 A* U
  1404.     HAL_GPIO_Init(GPIOB, &gpio_init_structure);
    ; A2 c: S/ f; ]5 G2 W# d( s  s& o

  1405. 2 [: h0 g* G0 }3 ?3 r
  1406.     /* R7, R1, R2 */
    : y. U! x, e0 |/ g
  1407.     gpio_init_structure.Pin       = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_15;
    9 b: i4 k# w/ t9 g
  1408.     gpio_init_structure.Alternate = GPIO_AF14_LCD;/ }, I. s  c- m9 e. x: o; g. M  d
  1409.     HAL_GPIO_Init(GPIOD, &gpio_init_structure);6 J7 e0 L" u3 r3 @9 \

  1410. ( {' s$ j+ ^, R
  1411.     /* LCD_VSYNC */
    8 t/ f4 D5 E& Q: M
  1412.     gpio_init_structure.Pin       = GPIO_PIN_11;/ j4 Q. `/ u9 M% q3 ?. z
  1413.     gpio_init_structure.Alternate = GPIO_AF14_LCD;
    - u0 v4 I' E8 i5 l9 r, j5 V+ `
  1414.     HAL_GPIO_Init(GPIOE, &gpio_init_structure);
    # n. D* E9 S, Q1 C# Q, V

  1415. ! t* [0 B* W& A! V6 c/ e1 ^
  1416.     /* R0, G1, B3, G7, R6, G0 */
    , w6 |  V$ a, _9 K, m
  1417.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_6 | GPIO_PIN_8 | GPIO_PIN_11 | GPIO_PIN_12 ;# F9 o( ^1 j% }( @- O
  1418.     gpio_init_structure.Alternate = GPIO_AF14_LCD;9 q, _' k7 _1 R& i; W; z
  1419.     HAL_GPIO_Init(GPIOG, &gpio_init_structure);
      l$ x3 U4 U4 y9 r! _, L
  1420. 1 C+ ~' R5 ?, M9 f- C3 c! n
  1421.     /* B4, R4, B5 */% z# E% x( C- R% [
  1422.     gpio_init_structure.Pin       = GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_6;
    / N  Q! [3 G- I( W9 I, p* |
  1423.     gpio_init_structure.Alternate = GPIO_AF14_LCD;
    6 H, L% H+ h3 ], j
  1424.     HAL_GPIO_Init(GPIOH, &gpio_init_structure);7 W$ ]  A# M4 u' l0 ?. V

  1425. ! Z, S2 _- R9 i1 q$ x
  1426.     /* NRST */
    8 U8 |1 z0 ^" a- C$ i) s
  1427.     gpio_init_structure.Pin       = GPIO_PIN_1;5 N8 }2 p8 q7 y0 X
  1428.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;
    . H8 k7 k4 b+ m3 Y; [9 ]
  1429.     HAL_GPIO_Init(GPIOE, &gpio_init_structure);
    : P- B8 Z$ g& n9 V

  1430. . T( K9 d% b! I
  1431.     /* LCD_ONOFF, LCD_BL_CTRL */
    * d4 F; Z" D" l6 a
  1432.     gpio_init_structure.Pin       = GPIO_PIN_3 | GPIO_PIN_6;
    4 n, |' ]* D2 r6 r
  1433.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;
    1 {" [/ ], @& f! P) E  s
  1434.     HAL_GPIO_Init(GPIOQ, &gpio_init_structure);
    2 C5 D6 u, W/ l1 w: w9 K
  1435. - b* m8 a* l- \2 m% y
  1436.     /* LCD_DE */& V! |# S/ A) D+ q: k6 q5 U
  1437.     gpio_init_structure.Pin       = GPIO_PIN_13;# B% @5 Z6 c, U
  1438.     gpio_init_structure.Mode      = GPIO_MODE_OUTPUT_PP;9 g! Y0 y  x* S+ y' P
  1439.     HAL_GPIO_Init(GPIOG, &gpio_init_structure);
    6 u. [! l6 G  ]  D6 [

  1440. ; I; S! R2 d' h" g
  1441.     HAL_GPIO_WritePin(GPIOQ, GPIO_PIN_3, GPIO_PIN_SET); /* LCD On */ /* PQ3  LCD_ONOFF   */
    ) Z3 v9 ]( U, U/ F& O
  1442.     HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET); /* Display Enable */ /* PG13 LCD_DE      */. }3 O/ e# W! h" W
  1443.     HAL_GPIO_WritePin(GPIOQ, GPIO_PIN_6, GPIO_PIN_SET); /* 100% Brightness */ /* PQ6  LCD_BL_CTRL */5 f1 y9 C( w- ~5 ^5 O$ m. K

  1444.   x/ ]/ d& i6 B: D; r# \# f
  1445.   }9 ]/ o) k9 ~: Y/ v0 v3 w& w
  1446. }
    ( Q# [; [6 y3 Q2 G% C: z, M! @
  1447. 8 p5 c* D) y, \8 ^. g
  1448. /**" O4 O$ T8 f. S( v
  1449.   * @brief  De-Initializes the BSP LTDC Msp
    1 }2 t! j( \" [: s
  1450.   * @param  hltdc  LTDC handle3 @# p) S. n) W: D3 E/ ~
  1451.   * @retval None
    & b$ }0 |0 R8 c+ r. Z+ i9 p
  1452.   */+ K( J; o7 i. U  d2 A7 h
  1453. static void LTDC_MspDeInit(LTDC_HandleTypeDef *hltdc)( j- S2 R- N% @( Q8 P2 O2 l
  1454. {
    * J( @5 o& o) R$ |# P
  1455.   GPIO_InitTypeDef  gpio_init_structure;( B1 E0 a* D2 z8 f$ ~2 B& [& _
  1456. ; u' P! j. v. u: h& O% U
  1457.   if(hltdc->Instance == LTDC). s3 F1 D* u) D
  1458.   {5 G4 n  T! a% I
  1459.     /* LTDC Pins deactivation */
    # f, ?, u$ S" n, B2 V* R1 _/ O
  1460.     /* GPIOA deactivation */
    ; G; B5 o. j/ r- [. 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;
    " ]; ~- Y; _1 A! d
  1462.     HAL_GPIO_DeInit(GPIOA, gpio_init_structure.Pin);0 Q3 @" {- ~) w

  1463. 5 n- q9 y* s$ q  M3 M7 U
  1464.     /* GPIOB deactivation */5 L. O! C: _- G
  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;
    % ~8 s# g- e& e, t9 O$ }( j7 `
  1466.     HAL_GPIO_DeInit(GPIOB, gpio_init_structure.Pin);
    0 I& x% F# A. R8 r9 Q: z& c7 [* q' a
  1467. 8 N; V# [+ A- E8 [" e( s& r
  1468.     /* GPIOE deactivation */( s2 r3 r7 [2 @& a- b
  1469.     gpio_init_structure.Pin       = GPIO_PIN_11 | GPIO_PIN_15;9 u9 @  t, f- D
  1470.     HAL_GPIO_DeInit(GPIOE, gpio_init_structure.Pin);8 \* ]$ a( m4 e( D3 t+ G
  1471. 1 F0 @: m# L* \1 Q
  1472.     /* GPIOF deactivation */4 o! x) L0 _+ J* U' a. T' \
  1473.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_10|GPIO_PIN_11 | GPIO_PIN_9 | GPIO_PIN_7 | GPIO_PIN_15;5 n7 ~) m3 R( |8 I) W
  1474.     HAL_GPIO_DeInit(GPIOF, gpio_init_structure.Pin);
    1 m6 Q) `5 x0 Y  q+ i" i( {

  1475. 8 a5 I, x* Y0 S* ?5 ^& W
  1476.     /* GPIOG deactivation */+ D( @: d' z$ M' t$ Y8 Y/ Z8 \
  1477.     gpio_init_structure.Pin       = GPIO_PIN_0 | GPIO_PIN_1| GPIO_PIN_2 | GPIO_PIN_13|GPIO_PIN_14;
    8 }% h) J( o9 \( p- l' u
  1478.     HAL_GPIO_DeInit(GPIOG, gpio_init_structure.Pin);
    ; V" u7 A7 \1 W7 a2 V: m' }

  1479. & D0 e( L1 N6 g. a! x. M
  1480.     /** Force and let in reset state LTDC */* {3 m+ o- [& T1 t- D- ?8 K0 O
  1481.     __HAL_RCC_LTDC_FORCE_RESET();& t: F0 R2 H- q& ^

  1482. , ^* r- r3 S. _" D$ B7 s
  1483.     __HAL_RCC_LTDC_RELEASE_RESET();# s* v1 F: L  M" S. q, C% f

  1484. 0 K% H8 Z. o; D+ a; W8 L0 }% w
  1485.     /** Disable the LTDC */, l2 T: x1 J- Z& V7 X& h- l
  1486.     __HAL_RCC_LTDC_CLK_DISABLE();  B4 Z* O7 ~+ Y
  1487.   }
    ) Y; x% b9 ]. n. v$ f$ A
  1488. }  |- d, K+ T8 z  \, `
  1489. ) N7 e* M4 _4 Y2 a
  1490. /**
    : {' b( o* D( Q7 I) h
  1491.   * @brief  Initialize the BSP DMA2D Msp.9 Q( O. o. o- J4 F$ ^+ E
  1492.   * @param  hdma2d  DMA2D handle( x3 C1 L/ U, g& Y7 }% }0 x. b
  1493.   * @retval None
    9 V7 D; V* Z) x
  1494.   */( s' m  v3 _- f7 }
  1495. static void DMA2D_MspInit(DMA2D_HandleTypeDef *hdma2d)$ c5 `5 f: }. [# M# f0 I
  1496. {/ r' d# T' L, X5 l, q
  1497.   if(hdma2d->Instance == DMA2D)& ?) |2 Y  e/ Y6 ^1 m/ r
  1498.   {
    % w3 ]  `$ j' S; P0 T+ Z5 }
  1499.     /** Enable the DMA2D clock */
    ; G7 h/ g2 w7 i# F% U: C& W3 {
  1500.     __HAL_RCC_DMA2D_CLK_ENABLE();
    + V5 |! z# ~! Z  @
  1501. 4 ~9 P' }: V$ m4 O$ U9 f; P- m
  1502.     /** Toggle Sw reset of DMA2D IP */* ?2 |0 P  R% W  }
  1503.     __HAL_RCC_DMA2D_FORCE_RESET();' m' I9 p7 Y* n/ q
  1504.     __HAL_RCC_DMA2D_RELEASE_RESET();8 n% N; G" J" B5 a* F) I) N! I
  1505.   }
    & ]8 G, T% |/ e
  1506. }
    0 l' K, D; ^: Q% u0 G/ x

  1507. 3 \  K7 I; d$ S/ X
  1508. /**
    3 s2 X" t( ?9 N$ }
  1509.   * @brief  De-Initializes the BSP DMA2D Msp
    + w  C; N6 A7 I8 H$ |5 K/ ]. I
  1510.   * @param  hdma2d  DMA2D handle
    ) F7 d  p: g9 K6 c3 u
  1511.   * @retval None7 y( r$ N8 e+ r9 F$ Y: W/ ^
  1512.   */- |" Z+ C9 c5 L' i# P
  1513. static void DMA2D_MspDeInit(DMA2D_HandleTypeDef *hdma2d)
    ; k- r3 ?4 L; }
  1514. {4 I7 y' ?& @1 y4 }1 N5 u: A2 G1 i
  1515.   if(hdma2d->Instance == DMA2D)% k, `0 W5 w7 E2 U. O, h& z: ?
  1516.   {2 k  i# o8 k$ u& y
  1517.     /** Disable IRQ of DMA2D IP */, }# ~. O5 A, Q5 M$ M$ x
  1518.     HAL_NVIC_DisableIRQ(DMA2D_IRQn);
    / ~: z) L+ h+ G- P) Z' H! b8 n

  1519. / }& k% ?) j2 l( j
  1520.     /** Force and let in reset state DMA2D */. [" s, R: _% g: t% T
  1521.     __HAL_RCC_DMA2D_FORCE_RESET();
    - F! |  p5 x1 H
  1522.     __HAL_RCC_DMA2D_RELEASE_RESET();  |9 h! `' ~9 L" p& E7 P% O

  1523. 8 Q( n$ n9 P' S5 W
  1524.     /** Disable the DMA2D */
    8 h4 c: B% ^' O" S! L( i
  1525.     __HAL_RCC_DMA2D_CLK_DISABLE();# d/ d  C/ a1 `7 C3 Y8 R  \
  1526.   }
    ! @% Z- }6 ]7 F0 b  n% C
  1527. }
    3 [3 _1 y+ M1 w+ W3 ?" A  w
  1528. 6 Q8 ^& M0 C& |7 W2 I# I  W% Q/ ]
  1529. /**- i, W$ x% }/ i( k6 F! f' B2 b9 ?
  1530.   * @}
    - r7 P& X4 ^# K: Q
  1531.   */& T1 o2 A: m8 b* p, L" ~
  1532. : {1 J: {$ g' ?" Z
  1533. /**
    ! H! E$ P* b3 C/ `
  1534.   * @}
    3 O6 U4 p6 Z, F
  1535.   */
    6 L& ^$ l9 f- a

  1536. , f3 l3 X  g4 |. G% ~" c
  1537. /**0 `) T1 A3 W, N9 K& Z5 V+ m
  1538.   * @}/ J7 _0 f2 W3 q+ Q, w
  1539.   */* _' x/ \, s. b6 b) _0 s
  1540. ) L: a" H7 I  H4 X5 M
  1541. /**. N4 ?7 V6 I4 X, l. p" B/ K9 x
  1542.   * @}7 Q; \7 U0 I! i2 U
  1543.   */, I' A6 i/ f9 K; M
  1544. 1 h4 x! D% v7 M2 y+ I4 a/ _
复制代码

8 i3 _" D# \4 M) J' F
& J4 C+ y" Z$ J1 g& S
2.2、main.c$ I8 h+ E# l! b# n
  1. int main(void)/ J; P% {/ U. a& |" }% V9 g
  2. {; s6 ~4 h1 u4 k- q, K7 J
  3.   uint32_t x_size;3 s) d8 I1 u# Z+ q
  4.   uint32_t y_size;( s) }4 h' x' p5 P6 t# C& d
  5.   uint16_t i,j;' F7 |8 [* m( r; x2 V- v! W3 R

  6. ( ]; N6 e  R/ n9 W& R8 Q
  7.   HAL_Init();
    - |, V; z& A6 x! o7 M
  8.   SystemClock_Config();8 c1 K. T, r$ p9 H
  9.   
    , B5 P; A' U. F) ~
  10.   /* Update the RIF config for the used peripherals */
    - f6 r- r6 l9 N4 [' \- m8 k* k
  11.   RIMC_MasterConfig_t RIMC_master = {0};
    0 b9 E% m$ G' L# ^1 C& \
  12.   RIMC_master.MasterCID = RIF_CID_1;
    7 @' @* P+ Y4 `+ m, F+ ?
  13.   RIMC_master.SecPriv = RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV;( u5 U; |7 r2 D6 i
  14.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_DCMIPP, &RIMC_master);
    0 u6 h' Y$ Q9 Y( S
  15.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_DMA2D, &RIMC_master);
    : ?2 U% h+ |; e( n) M- m( P
  16.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_LTDC1 , &RIMC_master);
    , g3 i1 f# g% B/ y1 N6 z" K# j
  17.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_LTDC2 , &RIMC_master);
    . k) C. g3 Q' x8 T
  18.   HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_VENC  , &RIMC_master);
    8 o( O; j3 W& h: d7 k: [7 L
  19.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_DMA2D  , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);" K9 t3 c2 R1 \- [' }' Q+ E
  20.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_DCMIPP , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);) X" }: ^$ w/ w: l5 j. P
  21.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_CSI    , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);9 [% s8 d" R+ y% }/ v
  22.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDC   , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);2 b6 u7 k& _1 o. Q6 v
  23.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDCL1 , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);
    & ^( O1 ]' H) B1 N2 M! s
  24.   HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_LTDCL2 , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);! _' J9 B% Y2 X/ g: n6 S

  25. % Z$ z, C; t' L* A/ [
  26.   BSP_LED_Init(LED_GREEN);# H  W  i, }9 P1 m
  27.   BSP_LED_Init(LED_RED);
    $ c7 X8 W' b: ]3 `% ]8 J( J: q
  28.   
    ; c# b$ P  B, b, b- C" e7 E
  29.   #if USE_COM_LOG4 p# i! h9 L6 v4 D
  30.   COM_InitTypeDef COM_Init;9 v; D6 X( b5 x$ e4 V; {, ]
  31. % `" G0 ^$ v/ Y! v, n& D+ r" R
  32.   /* Initialize COM init structure */* N$ b$ [* Q- |6 k' v) a$ C
  33.   COM_Init.BaudRate   = 115200;; A* b1 ^3 i8 s* \2 _
  34.   COM_Init.WordLength = COM_WORDLENGTH_8B;
    9 V6 ?/ q* A9 Y! z: i" @/ W
  35.   COM_Init.StopBits   = COM_STOPBITS_1;7 ]1 U! h  v4 [/ t) n. n
  36.   COM_Init.Parity     = COM_PARITY_NONE;  P+ ]1 D! y9 ?# s
  37.   COM_Init.HwFlowCtl  = COM_HWCONTROL_NONE;; i1 M/ \: a" [9 r7 |

  38. & C9 Q2 h/ _. z8 \7 x
  39.   BSP_COM_Init(COM1, &COM_Init);3 x6 [/ d) ]. p

  40.   B5 [6 S5 a1 |- {2 l5 X
  41.   if (BSP_COM_SelectLogPort(COM1) != BSP_ERROR_NONE)$ W# ]' {9 W8 z8 L: P/ C, C; Z
  42.   {9 l: m) @  w0 h% \
  43.     Error_Handler();) g$ }( Z1 r" ?! g
  44.   }
    / Y, x8 F# V- x3 p+ Z  x% k
  45. #endif
    ; x3 @5 s0 Q. a! `( T: y6 o  A
  46.   8 H, b% ^% X% z6 d! k) C  g' s4 O7 h
  47.   BSP_LCD_Init(0, LCD_ORIENTATION_LANDSCAPE);- t7 O5 Y5 l) x1 a8 b# W
  48.   UTIL_LCD_SetFuncDriver(&LCD_Driver);/ Y0 @# p4 i+ S; u( U$ C
  49.   UTIL_LCD_Clear(UTIL_LCD_COLOR_RED);
    . \9 y2 N$ V/ S  W2 N! X* ]
  50.   UTIL_LCD_SetTextColor(UTIL_LCD_COLOR_RED);
    , s0 ?" k& t" k4 E
  51.   UTIL_LCD_SetBackColor(UTIL_LCD_COLOR_WHITE);! F! h  W: X% o' y5 C3 K$ m
  52.   UTIL_LCD_SetFont(&Font24);* r% V* ~) I3 Z& k7 d# u5 o9 t
  53.   4 T# Q- @( ]( |, D9 O6 Y
  54.   while (1)% u& n( O; l; e/ Z
  55.   {! X) c- o9 z/ p: G- Y& i  T
  56.     switch (i): R7 q8 D& j0 h, B* J5 M
  57.     {
    9 X, n$ ^9 U4 z- n% C
  58.       case 0:8 c: S# `- G7 k' T0 }3 h3 p
  59.       {8 _: t6 N" R6 D: A+ i1 `
  60.           UTIL_LCD_Clear(UTIL_LCD_COLOR_WHITE);( A3 J, Q7 K- y7 [
  61.           break;3 a# ?; f8 i5 u" Q
  62.       }
    , N# @# T4 L# o" X! \* e$ m
  63.       case 1:5 a$ j$ ]4 ^( i" z2 C2 _
  64.       {
    ) ]+ n& W$ C1 [) c
  65.           UTIL_LCD_Clear(UTIL_LCD_COLOR_RED);. m# O3 W" t8 b) d5 f
  66.           break;
    ) i+ p/ O0 _0 q- V, v6 c
  67.       }, j+ T* @% T& \/ h6 ]
  68.       case 2:- F. X# g9 _5 A2 ]; z# n0 W
  69.       {
    # D" I. j8 `1 _! Q4 X
  70.           UTIL_LCD_Clear(UTIL_LCD_COLOR_GREEN);
    4 J4 [" [% \1 r. q+ M
  71.           break;2 g5 M; [4 c1 s9 A! L4 x& v
  72.       }
    2 L) l$ r4 [8 f
  73.       case 3:
    6 p. }1 C! z; R9 e( s
  74.       {
    1 Y% A6 d9 W! q% }* K$ ?2 W$ c$ F
  75.           UTIL_LCD_Clear(UTIL_LCD_COLOR_BLUE);
    / r# w, i0 n- K2 ?, G
  76.           break;# G  `4 k7 |% |: L/ {
  77.       }0 G& n2 I- E  M% R" t( D6 G! N6 s: u
  78.       case 4:
    * P4 c! T  ]# h0 E6 F
  79.       {- R8 O+ V$ P* w8 k& K9 E+ o6 A# Q
  80.           UTIL_LCD_Clear(UTIL_LCD_COLOR_MAGENTA);
    & \* }% d) t8 t" [
  81.           break;+ X- h6 `$ W: T5 Y5 H
  82.       }6 n+ S2 {5 o9 @* E' o, T
  83.       case 5:
    7 o- |6 y1 K9 S$ @( O( y3 m2 r0 r6 p
  84.       {- v8 v. F: Q  ^' b$ m5 m
  85.           UTIL_LCD_Clear(UTIL_LCD_COLOR_YELLOW);
    2 p) i. M  g5 @9 q
  86.           break;. j7 Y" \9 X! m. [6 Y6 O
  87.       }
    8 W' g4 K# {  c2 {* o- {: P0 e6 {
  88.     }
    2 ^4 }. P! E7 N6 A6 Y
  89.     ( R$ l% u9 s+ |3 E+ f# G* N% x
  90.     if(i==6)6 S' m& C' n2 h* j$ p( Y
  91.     {# a# E% d$ M) l+ E
  92.       i=0;* u) m. Z) x* \3 y. L
  93.     }5 j/ v  _; J9 f* ?7 q( ]% Y$ k
  94.     else/ e7 t$ [) F2 |8 Q7 S5 j
  95.     {3 ?9 v. J& {0 G2 v
  96.       i++;
    2 J; a8 G$ [& f! |
  97.     }
    " R, b9 S; H8 j" ?
  98.     UTIL_LCD_DisplayStringAt(10, 50, (uint8_t *)"STM32N6570 BOARD LCD TEST!", LEFT_MODE);
    / D/ ]3 {4 E% v( j' Z! d8 O
  99.     BSP_LED_On(LED1);
    6 `8 J' J# t; g
  100.     HAL_Delay(500);
    , ]. z5 _% i, `9 T' P' a, f/ y% f
  101.     BSP_LED_Off(LED1);4 u3 V  X0 b4 p' R
  102.     HAL_Delay(500);5 A7 c2 s/ H1 @; I
  103.   }6 _& w2 h1 I' o& q( Y: f7 t. U+ i
  104. }
复制代码

8 h# `$ P- N; X% q5 z) p! C5 m& u" }2 F+ [0 a: a0 t" w
6 {6 B% _. V) f! [; z
( K: a9 y% |2 p3 O
三、结果9 O" z7 q7 b) W5 x7 @

3 h8 w' ]" n8 W8 i. n/ L7 ~( S
" f* D! o/ U  r! l+ k2 ^0 c% G
下载程序到开发板,运行开发板屏幕显示如下:
0 b1 ~1 j. H: W. Q5 { lcd.gif
4 |" I% C) W( g# S% u9 W% T

) n! r8 A# B# }# h  ]
4 D3 s; X& z% m- m1 I

8 {+ r$ a- ^2 a1 |1 P2 a0 P) N4 E
收藏 评论0 发布时间:2025-2-18 15:02

举报

0个回答

所属标签

相似分享

官网相关资源

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