1  /**
2    ******************************************************************************
3    * @file    stm32f4xx_ltdc.c
4    * @author  MCD Application Team
5    * @version V1.5.1
6    * @date    22-May-2015
7    * @brief   This file provides firmware functions to manage the following
8    *          functionalities of the LTDC controller (LTDC) peripheral:
9    *           + Initialization and configuration
10    *           + Interrupts and flags management
11    *
12    *  @verbatim
13  
14   ===============================================================================
15                        ##### How to use this driver #####
16   ===============================================================================
17      [..]
18          (#) Enable LTDC clock using
19              RCC_APB2PeriphResetCmd(RCC_APB2Periph_LTDC, ENABLE) function.
20          (#) Configures LTDC
21            (++) Configure the required Pixel clock following the panel datasheet
22            (++) Configure the Synchronous timings: VSYNC, HSYNC, Vertical and
23                Horizontal back proch, active data area and the front proch
24                timings
25            (++) Configure the synchronous signals and clock polarity in the
26                LTDC_GCR register
27          (#) Configures Layer1/2 parameters
28            (++) The Layer window horizontal and vertical position in the LTDC_LxWHPCR and
29                 LTDC_WVPCR registers. The layer window must be in the active data area.
30            (++) The pixel input format in the LTDC_LxPFCR register
31            (++) The color frame buffer start address in the LTDC_LxCFBAR register
32            (++) The line length and pitch of the color frame buffer in the
33                 LTDC_LxCFBLR register
34            (++) The number of lines of the color frame buffer in
35                 the LTDC_LxCFBLNR register
36            (++) if needed, load the CLUT with the RGB values and the address
37                 in the LTDC_LxCLUTWR register
38            (++) If needed, configure the default color and the blending factors
39                 respectively in the LTDC_LxDCCR and LTDC_LxBFCR registers
40  
41            (++) If needed, Dithering and color keying can be enabled respectively
42                 in the LTDC_GCR and LTDC_LxCKCR registers. It can be also enabled
43                 on the fly.
44          (#) Enable Layer1/2 and if needed the CLUT in the LTDC_LxCR register
45  
46          (#) Reload the shadow registers to active register through
47              the LTDC_SRCR register.
48            -@- All layer parameters can be modified on the fly except the CLUT.
49                The new configuration has to be either reloaded immediately
50                or during vertical blanking period by configuring the LTDC_SRCR register.
51          (#) Call the LTDC_Cmd() to enable the LTDC controller.
52  
53      @endverbatim
54  
55    ******************************************************************************
56    * @attention
57    *
58    * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
59    *
60    * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
61    * You may not use this file except in compliance with the License.
62    * You may obtain a copy of the License at:
63    *
64    *        http://www.st.com/software_license_agreement_liberty_v2
65    *
66    * Unless required by applicable law or agreed to in writing, software
67    * distributed under the License is distributed on an "AS IS" BASIS,
68    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
69    * See the License for the specific language governing permissions and
70    * limitations under the License.
71    *
72    ******************************************************************************
73    */
74  
75  /* Includes ------------------------------------------------------------------*/
76  #include "stm32f4xx_ltdc.h"
77  #include "stm32f4xx_rcc.h"
78  
79  /** @addtogroup STM32F4xx_StdPeriph_Driver
80    * @{
81    */
82  
83  /** @defgroup LTDC
84    * @brief LTDC driver modules
85    * @{
86    */
87  
88  /* Private typedef -----------------------------------------------------------*/
89  /* Private define ------------------------------------------------------------*/
90  /* Private macro -------------------------------------------------------------*/
91  /* Private variables ---------------------------------------------------------*/
92  /* Private function prototypes -----------------------------------------------*/
93  /* Private functions ---------------------------------------------------------*/
94  
95  #define GCR_MASK                     ((uint32_t)0x0FFE888F)  /* LTDC GCR Mask */
96  
97  
98  /** @defgroup LTDC_Private_Functions
99    * @{
100    */
101  
102  /** @defgroup LTDC_Group1 Initialization and Configuration functions
103   *  @brief   Initialization and Configuration functions
104   *
105  @verbatim
106   ===============================================================================
107              ##### Initialization and Configuration functions #####
108   ===============================================================================
109      [..]  This section provides functions allowing to:
110        (+) Initialize and configure the LTDC
111        (+) Enable or Disable Dither
112        (+) Define the position of the line interrupt
113        (+) reload layers registers with new parameters
114        (+) Initialize and configure layer1 and layer2
115        (+) Set and configure the color keying functionality
116        (+) Configure and Enables or disables CLUT
117  
118  @endverbatim
119    * @{
120    */
121  
122  /**
123    * @brief  Deinitializes the LTDC peripheral registers to their default reset
124    *         values.
125    * @param  None
126    * @retval None
127    */
128  
LTDC_DeInit(void)129  void LTDC_DeInit(void)
130  {
131    /* Enable LTDC reset state */
132    RCC_APB2PeriphResetCmd(RCC_APB2Periph_LTDC, ENABLE);
133    /* Release LTDC from reset state */
134    RCC_APB2PeriphResetCmd(RCC_APB2Periph_LTDC, DISABLE);
135  }
136  
137  /**
138    * @brief  Initializes the LTDC peripheral according to the specified parameters
139    *         in the LTDC_InitStruct.
140    * @note   This function can be used only when the LTDC is disabled.
141    * @param  LTDC_InitStruct: pointer to a LTDC_InitTypeDef structure that contains
142    *         the configuration information for the specified LTDC peripheral.
143    * @retval None
144    */
145  
LTDC_Init(LTDC_InitTypeDef * LTDC_InitStruct)146  void LTDC_Init(LTDC_InitTypeDef* LTDC_InitStruct)
147  {
148    uint32_t horizontalsync = 0;
149    uint32_t accumulatedHBP = 0;
150    uint32_t accumulatedactiveW = 0;
151    uint32_t totalwidth = 0;
152    uint32_t backgreen = 0;
153    uint32_t backred = 0;
154  
155    /* Check function parameters */
156    assert_param(IS_LTDC_HSYNC(LTDC_InitStruct->LTDC_HorizontalSync));
157    assert_param(IS_LTDC_VSYNC(LTDC_InitStruct->LTDC_VerticalSync));
158    assert_param(IS_LTDC_AHBP(LTDC_InitStruct->LTDC_AccumulatedHBP));
159    assert_param(IS_LTDC_AVBP(LTDC_InitStruct->LTDC_AccumulatedVBP));
160    assert_param(IS_LTDC_AAH(LTDC_InitStruct->LTDC_AccumulatedActiveH));
161    assert_param(IS_LTDC_AAW(LTDC_InitStruct->LTDC_AccumulatedActiveW));
162    assert_param(IS_LTDC_TOTALH(LTDC_InitStruct->LTDC_TotalHeigh));
163    assert_param(IS_LTDC_TOTALW(LTDC_InitStruct->LTDC_TotalWidth));
164    assert_param(IS_LTDC_HSPOL(LTDC_InitStruct->LTDC_HSPolarity));
165    assert_param(IS_LTDC_VSPOL(LTDC_InitStruct->LTDC_VSPolarity));
166    assert_param(IS_LTDC_DEPOL(LTDC_InitStruct->LTDC_DEPolarity));
167    assert_param(IS_LTDC_PCPOL(LTDC_InitStruct->LTDC_PCPolarity));
168    assert_param(IS_LTDC_BackBlueValue(LTDC_InitStruct->LTDC_BackgroundBlueValue));
169    assert_param(IS_LTDC_BackGreenValue(LTDC_InitStruct->LTDC_BackgroundGreenValue));
170    assert_param(IS_LTDC_BackRedValue(LTDC_InitStruct->LTDC_BackgroundRedValue));
171  
172    /* Sets Synchronization size */
173    LTDC->SSCR &= ~(LTDC_SSCR_VSH | LTDC_SSCR_HSW);
174    horizontalsync = (LTDC_InitStruct->LTDC_HorizontalSync << 16);
175    LTDC->SSCR |= (horizontalsync | LTDC_InitStruct->LTDC_VerticalSync);
176  
177    /* Sets Accumulated Back porch */
178    LTDC->BPCR &= ~(LTDC_BPCR_AVBP | LTDC_BPCR_AHBP);
179    accumulatedHBP = (LTDC_InitStruct->LTDC_AccumulatedHBP << 16);
180    LTDC->BPCR |= (accumulatedHBP | LTDC_InitStruct->LTDC_AccumulatedVBP);
181  
182    /* Sets Accumulated Active Width */
183    LTDC->AWCR &= ~(LTDC_AWCR_AAH | LTDC_AWCR_AAW);
184    accumulatedactiveW = (LTDC_InitStruct->LTDC_AccumulatedActiveW << 16);
185    LTDC->AWCR |= (accumulatedactiveW | LTDC_InitStruct->LTDC_AccumulatedActiveH);
186  
187    /* Sets Total Width */
188    LTDC->TWCR &= ~(LTDC_TWCR_TOTALH | LTDC_TWCR_TOTALW);
189    totalwidth = (LTDC_InitStruct->LTDC_TotalWidth << 16);
190    LTDC->TWCR |= (totalwidth | LTDC_InitStruct->LTDC_TotalHeigh);
191  
192    LTDC->GCR &= (uint32_t)GCR_MASK;
193    LTDC->GCR |=  (uint32_t)(LTDC_InitStruct->LTDC_HSPolarity | LTDC_InitStruct->LTDC_VSPolarity | \
194                             LTDC_InitStruct->LTDC_DEPolarity | LTDC_InitStruct->LTDC_PCPolarity);
195  
196    /* sets the background color value */
197    backgreen = (LTDC_InitStruct->LTDC_BackgroundGreenValue << 8);
198    backred = (LTDC_InitStruct->LTDC_BackgroundRedValue << 16);
199  
200    LTDC->BCCR &= ~(LTDC_BCCR_BCBLUE | LTDC_BCCR_BCGREEN | LTDC_BCCR_BCRED);
201    LTDC->BCCR |= (backred | backgreen | LTDC_InitStruct->LTDC_BackgroundBlueValue);
202  }
203  
204  /**
205    * @brief  Fills each LTDC_InitStruct member with its default value.
206    * @param  LTDC_InitStruct: pointer to a LTDC_InitTypeDef structure which will
207    *         be initialized.
208    * @retval None
209    */
210  
LTDC_StructInit(LTDC_InitTypeDef * LTDC_InitStruct)211  void LTDC_StructInit(LTDC_InitTypeDef* LTDC_InitStruct)
212  {
213    /*--------------- Reset LTDC init structure parameters values ----------------*/
214    LTDC_InitStruct->LTDC_HSPolarity = LTDC_HSPolarity_AL;      /*!< Initialize the LTDC_HSPolarity member */
215    LTDC_InitStruct->LTDC_VSPolarity = LTDC_VSPolarity_AL;      /*!< Initialize the LTDC_VSPolarity member */
216    LTDC_InitStruct->LTDC_DEPolarity = LTDC_DEPolarity_AL;      /*!< Initialize the LTDC_DEPolarity member */
217    LTDC_InitStruct->LTDC_PCPolarity = LTDC_PCPolarity_IPC;     /*!< Initialize the LTDC_PCPolarity member */
218    LTDC_InitStruct->LTDC_HorizontalSync = 0x00;                /*!< Initialize the LTDC_HorizontalSync member */
219    LTDC_InitStruct->LTDC_VerticalSync = 0x00;                  /*!< Initialize the LTDC_VerticalSync member */
220    LTDC_InitStruct->LTDC_AccumulatedHBP = 0x00;                /*!< Initialize the LTDC_AccumulatedHBP member */
221    LTDC_InitStruct->LTDC_AccumulatedVBP = 0x00;                /*!< Initialize the LTDC_AccumulatedVBP member */
222    LTDC_InitStruct->LTDC_AccumulatedActiveW = 0x00;            /*!< Initialize the LTDC_AccumulatedActiveW member */
223    LTDC_InitStruct->LTDC_AccumulatedActiveH = 0x00;            /*!< Initialize the LTDC_AccumulatedActiveH member */
224    LTDC_InitStruct->LTDC_TotalWidth = 0x00;                    /*!< Initialize the LTDC_TotalWidth member */
225    LTDC_InitStruct->LTDC_TotalHeigh = 0x00;                    /*!< Initialize the LTDC_TotalHeigh member */
226    LTDC_InitStruct->LTDC_BackgroundRedValue = 0x00;            /*!< Initialize the LTDC_BackgroundRedValue member */
227    LTDC_InitStruct->LTDC_BackgroundGreenValue = 0x00;          /*!< Initialize the LTDC_BackgroundGreenValue member */
228    LTDC_InitStruct->LTDC_BackgroundBlueValue = 0x00;           /*!< Initialize the LTDC_BackgroundBlueValue member */
229  }
230  
231  /**
232    * @brief  Enables or disables the LTDC Controller.
233    * @param  NewState: new state of the LTDC peripheral.
234    *   This parameter can be: ENABLE or DISABLE.
235    * @retval None
236    */
237  
LTDC_Cmd(FunctionalState NewState)238  void LTDC_Cmd(FunctionalState NewState)
239  {
240    /* Check the parameters */
241    assert_param(IS_FUNCTIONAL_STATE(NewState));
242  
243    if (NewState != DISABLE)
244    {
245      /* Enable LTDC by setting LTDCEN bit */
246      LTDC->GCR |= (uint32_t)LTDC_GCR_LTDCEN;
247    }
248    else
249    {
250      /* Disable LTDC by clearing LTDCEN bit */
251      LTDC->GCR &= ~(uint32_t)LTDC_GCR_LTDCEN;
252    }
253  }
254  
255  /**
256    * @brief  Enables or disables Dither.
257    * @param  NewState: new state of the Dither.
258    *   This parameter can be: ENABLE or DISABLE.
259    * @retval None
260    */
261  
LTDC_DitherCmd(FunctionalState NewState)262  void LTDC_DitherCmd(FunctionalState NewState)
263  {
264    /* Check the parameters */
265    assert_param(IS_FUNCTIONAL_STATE(NewState));
266  
267    if (NewState != DISABLE)
268    {
269      /* Enable Dither by setting DTEN bit */
270      LTDC->GCR |= (uint32_t)LTDC_GCR_DTEN;
271    }
272    else
273    {
274      /* Disable Dither by clearing DTEN bit */
275      LTDC->GCR &= ~(uint32_t)LTDC_GCR_DTEN;
276    }
277  }
278  
279  /**
280    * @brief  Get the dither RGB width.
281    * @param  LTDC_RGB_InitStruct: pointer to a LTDC_RGBTypeDef structure that contains
282    *         the Dither RGB width.
283    * @retval None
284    */
285  
LTDC_GetRGBWidth(void)286  LTDC_RGBTypeDef LTDC_GetRGBWidth(void)
287  {
288    LTDC_RGBTypeDef LTDC_RGB_InitStruct;
289  
290    LTDC->GCR &= (uint32_t)GCR_MASK;
291  
292    LTDC_RGB_InitStruct.LTDC_BlueWidth = (uint32_t)((LTDC->GCR >> 4) & 0x7);
293    LTDC_RGB_InitStruct.LTDC_GreenWidth = (uint32_t)((LTDC->GCR >> 8) & 0x7);
294    LTDC_RGB_InitStruct.LTDC_RedWidth = (uint32_t)((LTDC->GCR >> 12) & 0x7);
295  
296    return LTDC_RGB_InitStruct;
297  }
298  
299  /**
300    * @brief  Fills each LTDC_RGBStruct member with its default value.
301    * @param  LTDC_RGB_InitStruct: pointer to a LTDC_RGBTypeDef structure which will
302    *         be initialized.
303    * @retval None
304    */
305  
LTDC_RGBStructInit(LTDC_RGBTypeDef * LTDC_RGB_InitStruct)306  void LTDC_RGBStructInit(LTDC_RGBTypeDef* LTDC_RGB_InitStruct)
307  {
308    LTDC_RGB_InitStruct->LTDC_BlueWidth = 0x02;
309    LTDC_RGB_InitStruct->LTDC_GreenWidth = 0x02;
310    LTDC_RGB_InitStruct->LTDC_RedWidth = 0x02;
311  }
312  
313  
314  /**
315    * @brief  Define the position of the line interrupt .
316    * @param  LTDC_LIPositionConfig: Line Interrupt Position.
317    * @retval None
318    */
319  
LTDC_LIPConfig(uint32_t LTDC_LIPositionConfig)320  void LTDC_LIPConfig(uint32_t LTDC_LIPositionConfig)
321  {
322    /* Check the parameters */
323    assert_param(IS_LTDC_LIPOS(LTDC_LIPositionConfig));
324  
325    /* Sets the Line Interrupt position */
326    LTDC->LIPCR = (uint32_t)LTDC_LIPositionConfig;
327  }
328  
329  /**
330    * @brief  reload layers registers with new parameters
331    * @param  LTDC_Reload: specifies the type of reload.
332    *   This parameter can be one of the following values:
333    *     @arg LTDC_IMReload: Vertical blanking reload.
334    *     @arg LTDC_VBReload: Immediate reload.
335    * @retval None
336    */
337  
LTDC_ReloadConfig(uint32_t LTDC_Reload)338  void LTDC_ReloadConfig(uint32_t LTDC_Reload)
339  {
340    /* Check the parameters */
341    assert_param(IS_LTDC_RELOAD(LTDC_Reload));
342  
343    /* Sets the Reload type */
344    LTDC->SRCR = (uint32_t)LTDC_Reload;
345  }
346  
347  
348  /**
349    * @brief  Initializes the LTDC Layer according to the specified parameters
350    *         in the LTDC_LayerStruct.
351    * @note   This function can be used only when the LTDC is disabled.
352    * @param  LTDC_layerx: Select the layer to be configured, this parameter can be
353    *         one of the following values: LTDC_Layer1, LTDC_Layer2
354    * @param  LTDC_LayerStruct: pointer to a LTDC_LayerTypeDef structure that contains
355    *         the configuration information for the specified LTDC peripheral.
356    * @retval None
357    */
358  
LTDC_LayerInit(LTDC_Layer_TypeDef * LTDC_Layerx,LTDC_Layer_InitTypeDef * LTDC_Layer_InitStruct)359  void LTDC_LayerInit(LTDC_Layer_TypeDef* LTDC_Layerx, LTDC_Layer_InitTypeDef* LTDC_Layer_InitStruct)
360  {
361  
362    uint32_t whsppos = 0;
363    uint32_t wvsppos = 0;
364    uint32_t dcgreen = 0;
365    uint32_t dcred = 0;
366    uint32_t dcalpha = 0;
367    uint32_t cfbp = 0;
368  
369  /* Check the parameters */
370    assert_param(IS_LTDC_Pixelformat(LTDC_Layer_InitStruct->LTDC_PixelFormat));
371    assert_param(IS_LTDC_BlendingFactor1(LTDC_Layer_InitStruct->LTDC_BlendingFactor_1));
372    assert_param(IS_LTDC_BlendingFactor2(LTDC_Layer_InitStruct->LTDC_BlendingFactor_2));
373    assert_param(IS_LTDC_HCONFIGST(LTDC_Layer_InitStruct->LTDC_HorizontalStart));
374    assert_param(IS_LTDC_HCONFIGSP(LTDC_Layer_InitStruct->LTDC_HorizontalStop));
375    assert_param(IS_LTDC_VCONFIGST(LTDC_Layer_InitStruct->LTDC_VerticalStart));
376    assert_param(IS_LTDC_VCONFIGSP(LTDC_Layer_InitStruct->LTDC_VerticalStop));
377    assert_param(IS_LTDC_DEFAULTCOLOR(LTDC_Layer_InitStruct->LTDC_DefaultColorBlue));
378    assert_param(IS_LTDC_DEFAULTCOLOR(LTDC_Layer_InitStruct->LTDC_DefaultColorGreen));
379    assert_param(IS_LTDC_DEFAULTCOLOR(LTDC_Layer_InitStruct->LTDC_DefaultColorRed));
380    assert_param(IS_LTDC_DEFAULTCOLOR(LTDC_Layer_InitStruct->LTDC_DefaultColorAlpha));
381    assert_param(IS_LTDC_CFBP(LTDC_Layer_InitStruct->LTDC_CFBPitch));
382    assert_param(IS_LTDC_CFBLL(LTDC_Layer_InitStruct->LTDC_CFBLineLength));
383    assert_param(IS_LTDC_CFBLNBR(LTDC_Layer_InitStruct->LTDC_CFBLineNumber));
384  
385    /* Configures the horizontal start and stop position */
386    whsppos = LTDC_Layer_InitStruct->LTDC_HorizontalStop << 16;
387    LTDC_Layerx->WHPCR &= ~(LTDC_LxWHPCR_WHSTPOS | LTDC_LxWHPCR_WHSPPOS);
388    LTDC_Layerx->WHPCR = (LTDC_Layer_InitStruct->LTDC_HorizontalStart | whsppos);
389  
390    /* Configures the vertical start and stop position */
391    wvsppos = LTDC_Layer_InitStruct->LTDC_VerticalStop << 16;
392    LTDC_Layerx->WVPCR &= ~(LTDC_LxWVPCR_WVSTPOS | LTDC_LxWVPCR_WVSPPOS);
393    LTDC_Layerx->WVPCR  = (LTDC_Layer_InitStruct->LTDC_VerticalStart | wvsppos);
394  
395    /* Specifies the pixel format */
396    LTDC_Layerx->PFCR &= ~(LTDC_LxPFCR_PF);
397    LTDC_Layerx->PFCR = (LTDC_Layer_InitStruct->LTDC_PixelFormat);
398  
399    /* Configures the default color values */
400    dcgreen = (LTDC_Layer_InitStruct->LTDC_DefaultColorGreen << 8);
401    dcred = (LTDC_Layer_InitStruct->LTDC_DefaultColorRed << 16);
402    dcalpha = (LTDC_Layer_InitStruct->LTDC_DefaultColorAlpha << 24);
403    LTDC_Layerx->DCCR &=  ~(LTDC_LxDCCR_DCBLUE | LTDC_LxDCCR_DCGREEN | LTDC_LxDCCR_DCRED | LTDC_LxDCCR_DCALPHA);
404    LTDC_Layerx->DCCR = (LTDC_Layer_InitStruct->LTDC_DefaultColorBlue | dcgreen | \
405                          dcred | dcalpha);
406  
407    /* Specifies the constant alpha value */
408    LTDC_Layerx->CACR &= ~(LTDC_LxCACR_CONSTA);
409    LTDC_Layerx->CACR = (LTDC_Layer_InitStruct->LTDC_ConstantAlpha);
410  
411    /* Specifies the blending factors */
412    LTDC_Layerx->BFCR &= ~(LTDC_LxBFCR_BF2 | LTDC_LxBFCR_BF1);
413    LTDC_Layerx->BFCR = (LTDC_Layer_InitStruct->LTDC_BlendingFactor_1 | LTDC_Layer_InitStruct->LTDC_BlendingFactor_2);
414  
415    /* Configures the color frame buffer start address */
416    LTDC_Layerx->CFBAR &= ~(LTDC_LxCFBAR_CFBADD);
417    LTDC_Layerx->CFBAR = (LTDC_Layer_InitStruct->LTDC_CFBStartAdress);
418  
419    /* Configures the color frame buffer pitch in byte */
420    cfbp = (LTDC_Layer_InitStruct->LTDC_CFBPitch << 16);
421    LTDC_Layerx->CFBLR  &= ~(LTDC_LxCFBLR_CFBLL | LTDC_LxCFBLR_CFBP);
422    LTDC_Layerx->CFBLR  = (LTDC_Layer_InitStruct->LTDC_CFBLineLength | cfbp);
423  
424    /* Configures the frame buffer line number */
425    LTDC_Layerx->CFBLNR  &= ~(LTDC_LxCFBLNR_CFBLNBR);
426    LTDC_Layerx->CFBLNR  = (LTDC_Layer_InitStruct->LTDC_CFBLineNumber);
427  
428  }
429  
430  /**
431    * @brief  Fills each LTDC_Layer_InitStruct member with its default value.
432    * @param  LTDC_Layer_InitStruct: pointer to a LTDC_LayerTypeDef structure which will
433    *         be initialized.
434    * @retval None
435    */
436  
LTDC_LayerStructInit(LTDC_Layer_InitTypeDef * LTDC_Layer_InitStruct)437  void LTDC_LayerStructInit(LTDC_Layer_InitTypeDef * LTDC_Layer_InitStruct)
438  {
439    /*--------------- Reset Layer structure parameters values -------------------*/
440  
441    /*!< Initialize the horizontal limit member */
442    LTDC_Layer_InitStruct->LTDC_HorizontalStart = 0x00;
443    LTDC_Layer_InitStruct->LTDC_HorizontalStop = 0x00;
444  
445    /*!< Initialize the vertical limit member */
446    LTDC_Layer_InitStruct->LTDC_VerticalStart = 0x00;
447    LTDC_Layer_InitStruct->LTDC_VerticalStop = 0x00;
448  
449    /*!< Initialize the pixel format member */
450    LTDC_Layer_InitStruct->LTDC_PixelFormat = LTDC_Pixelformat_ARGB8888;
451  
452    /*!< Initialize the constant alpha value */
453    LTDC_Layer_InitStruct->LTDC_ConstantAlpha = 0xFF;
454  
455    /*!< Initialize the default color values */
456    LTDC_Layer_InitStruct->LTDC_DefaultColorBlue = 0x00;
457    LTDC_Layer_InitStruct->LTDC_DefaultColorGreen = 0x00;
458    LTDC_Layer_InitStruct->LTDC_DefaultColorRed = 0x00;
459    LTDC_Layer_InitStruct->LTDC_DefaultColorAlpha = 0x00;
460  
461    /*!< Initialize the blending factors */
462    LTDC_Layer_InitStruct->LTDC_BlendingFactor_1 = LTDC_BlendingFactor1_PAxCA;
463    LTDC_Layer_InitStruct->LTDC_BlendingFactor_2 = LTDC_BlendingFactor2_PAxCA;
464  
465    /*!< Initialize the frame buffer start address */
466    LTDC_Layer_InitStruct->LTDC_CFBStartAdress = 0x00;
467  
468    /*!< Initialize the frame buffer pitch and line length */
469    LTDC_Layer_InitStruct->LTDC_CFBLineLength = 0x00;
470    LTDC_Layer_InitStruct->LTDC_CFBPitch = 0x00;
471  
472    /*!< Initialize the frame buffer line number */
473    LTDC_Layer_InitStruct->LTDC_CFBLineNumber = 0x00;
474  }
475  
476  
477  /**
478    * @brief  Enables or disables the LTDC_Layer Controller.
479    * @param  LTDC_layerx: Select the layer to be configured, this parameter can be
480    *         one of the following values: LTDC_Layer1, LTDC_Layer2
481    * @param  NewState: new state of the LTDC_Layer peripheral.
482    *   This parameter can be: ENABLE or DISABLE.
483    * @retval None
484    */
485  
LTDC_LayerCmd(LTDC_Layer_TypeDef * LTDC_Layerx,FunctionalState NewState)486  void LTDC_LayerCmd(LTDC_Layer_TypeDef* LTDC_Layerx, FunctionalState NewState)
487  {
488    /* Check the parameters */
489    assert_param(IS_FUNCTIONAL_STATE(NewState));
490  
491    if (NewState != DISABLE)
492    {
493      /* Enable LTDC_Layer by setting LEN bit */
494      LTDC_Layerx->CR |= (uint32_t)LTDC_LxCR_LEN;
495    }
496    else
497    {
498      /* Disable LTDC_Layer by clearing LEN bit */
499      LTDC_Layerx->CR &= ~(uint32_t)LTDC_LxCR_LEN;
500    }
501  }
502  
503  
504  /**
505    * @brief  Get the current position.
506    * @param  LTDC_Pos_InitStruct: pointer to a LTDC_PosTypeDef structure that contains
507    *         the current position.
508    * @retval None
509    */
510  
LTDC_GetPosStatus(void)511  LTDC_PosTypeDef LTDC_GetPosStatus(void)
512  {
513    LTDC_PosTypeDef LTDC_Pos_InitStruct;
514  
515    LTDC->CPSR &= ~(LTDC_CPSR_CYPOS | LTDC_CPSR_CXPOS);
516  
517    LTDC_Pos_InitStruct.LTDC_POSX = (uint32_t)(LTDC->CPSR >> 16);
518    LTDC_Pos_InitStruct.LTDC_POSY = (uint32_t)(LTDC->CPSR & 0xFFFF);
519  
520    return LTDC_Pos_InitStruct;
521  }
522  
523  /**
524    * @brief  Fills each LTDC_Pos_InitStruct member with its default value.
525    * @param  LTDC_Pos_InitStruct: pointer to a LTDC_PosTypeDef structure which will
526    *         be initialized.
527    * @retval None
528    */
529  
LTDC_PosStructInit(LTDC_PosTypeDef * LTDC_Pos_InitStruct)530  void LTDC_PosStructInit(LTDC_PosTypeDef* LTDC_Pos_InitStruct)
531  {
532    LTDC_Pos_InitStruct->LTDC_POSX = 0x00;
533    LTDC_Pos_InitStruct->LTDC_POSY = 0x00;
534  }
535  
536  /**
537    * @brief  Checks whether the specified LTDC's flag is set or not.
538    * @param  LTDC_CD: specifies the flag to check.
539    *   This parameter can be one of the following values:
540    *     @arg LTDC_CD_VDES: vertical data enable current status.
541    *     @arg LTDC_CD_HDES: horizontal data enable current status.
542    *     @arg LTDC_CD_VSYNC:  Vertical Synchronization current status.
543    *     @arg LTDC_CD_HSYNC:  Horizontal Synchronization current status.
544    * @retval The new state of LTDC_CD (SET or RESET).
545    */
546  
LTDC_GetCDStatus(uint32_t LTDC_CD)547  FlagStatus LTDC_GetCDStatus(uint32_t LTDC_CD)
548  {
549    FlagStatus bitstatus;
550  
551    /* Check the parameters */
552    assert_param(IS_LTDC_GET_CD(LTDC_CD));
553  
554    if ((LTDC->CDSR & LTDC_CD) != (uint32_t)RESET)
555    {
556      bitstatus = SET;
557    }
558    else
559    {
560      bitstatus = RESET;
561    }
562    return bitstatus;
563  }
564  
565  /**
566    * @brief  Set and configure the color keying.
567    * @param  LTDC_colorkeying_InitStruct: pointer to a LTDC_ColorKeying_InitTypeDef
568    *         structure that contains the color keying configuration.
569    * @param  LTDC_layerx: Select the layer to be configured, this parameter can be
570    *         one of the following values: LTDC_Layer1, LTDC_Layer2
571    * @retval None
572    */
573  
LTDC_ColorKeyingConfig(LTDC_Layer_TypeDef * LTDC_Layerx,LTDC_ColorKeying_InitTypeDef * LTDC_colorkeying_InitStruct,FunctionalState NewState)574  void LTDC_ColorKeyingConfig(LTDC_Layer_TypeDef* LTDC_Layerx, LTDC_ColorKeying_InitTypeDef* LTDC_colorkeying_InitStruct, FunctionalState NewState)
575  {
576    uint32_t ckgreen = 0;
577    uint32_t ckred = 0;
578  
579    /* Check the parameters */
580    assert_param(IS_FUNCTIONAL_STATE(NewState));
581    assert_param(IS_LTDC_CKEYING(LTDC_colorkeying_InitStruct->LTDC_ColorKeyBlue));
582    assert_param(IS_LTDC_CKEYING(LTDC_colorkeying_InitStruct->LTDC_ColorKeyGreen));
583    assert_param(IS_LTDC_CKEYING(LTDC_colorkeying_InitStruct->LTDC_ColorKeyRed));
584  
585    if (NewState != DISABLE)
586    {
587      /* Enable LTDC color keying by setting COLKEN bit */
588      LTDC_Layerx->CR |= (uint32_t)LTDC_LxCR_COLKEN;
589  
590      /* Sets the color keying values */
591      ckgreen = (LTDC_colorkeying_InitStruct->LTDC_ColorKeyGreen << 8);
592      ckred = (LTDC_colorkeying_InitStruct->LTDC_ColorKeyRed << 16);
593      LTDC_Layerx->CKCR  &= ~(LTDC_LxCKCR_CKBLUE | LTDC_LxCKCR_CKGREEN | LTDC_LxCKCR_CKRED);
594      LTDC_Layerx->CKCR |= (LTDC_colorkeying_InitStruct->LTDC_ColorKeyBlue | ckgreen | ckred);
595    }
596    else
597    {
598      /* Disable LTDC color keying by clearing COLKEN bit */
599      LTDC_Layerx->CR &= ~(uint32_t)LTDC_LxCR_COLKEN;
600    }
601  
602    /* Reload shadow register */
603    LTDC->SRCR = LTDC_IMReload;
604  }
605  
606  /**
607    * @brief  Fills each LTDC_colorkeying_InitStruct member with its default value.
608    * @param  LTDC_colorkeying_InitStruct: pointer to a LTDC_ColorKeying_InitTypeDef structure which will
609    *         be initialized.
610    * @retval None
611    */
612  
LTDC_ColorKeyingStructInit(LTDC_ColorKeying_InitTypeDef * LTDC_colorkeying_InitStruct)613  void LTDC_ColorKeyingStructInit(LTDC_ColorKeying_InitTypeDef* LTDC_colorkeying_InitStruct)
614  {
615    /*!< Initialize the color keying values */
616    LTDC_colorkeying_InitStruct->LTDC_ColorKeyBlue = 0x00;
617    LTDC_colorkeying_InitStruct->LTDC_ColorKeyGreen = 0x00;
618    LTDC_colorkeying_InitStruct->LTDC_ColorKeyRed = 0x00;
619  }
620  
621  
622  /**
623    * @brief  Enables or disables CLUT.
624    * @param  NewState: new state of CLUT.
625    * @param  LTDC_layerx: Select the layer to be configured, this parameter can be
626    *         one of the following values: LTDC_Layer1, LTDC_Layer2
627    *   This parameter can be: ENABLE or DISABLE.
628    * @retval None
629    */
630  
LTDC_CLUTCmd(LTDC_Layer_TypeDef * LTDC_Layerx,FunctionalState NewState)631  void LTDC_CLUTCmd(LTDC_Layer_TypeDef* LTDC_Layerx, FunctionalState NewState)
632  {
633    /* Check the parameters */
634    assert_param(IS_FUNCTIONAL_STATE(NewState));
635  
636    if (NewState != DISABLE)
637    {
638      /* Enable CLUT by setting CLUTEN bit */
639      LTDC_Layerx->CR |= (uint32_t)LTDC_LxCR_CLUTEN;
640    }
641    else
642    {
643      /* Disable CLUT by clearing CLUTEN bit */
644      LTDC_Layerx->CR &= ~(uint32_t)LTDC_LxCR_CLUTEN;
645    }
646  
647    /* Reload shadow register */
648    LTDC->SRCR = LTDC_IMReload;
649  }
650  
651  /**
652    * @brief  configure the CLUT.
653    * @param  LTDC_CLUT_InitStruct: pointer to a LTDC_CLUT_InitTypeDef structure that contains
654    *         the CLUT configuration.
655    * @param  LTDC_layerx: Select the layer to be configured, this parameter can be
656    *         one of the following values: LTDC_Layer1, LTDC_Layer2
657    * @retval None
658    */
659  
LTDC_CLUTInit(LTDC_Layer_TypeDef * LTDC_Layerx,LTDC_CLUT_InitTypeDef * LTDC_CLUT_InitStruct)660  void LTDC_CLUTInit(LTDC_Layer_TypeDef* LTDC_Layerx, LTDC_CLUT_InitTypeDef* LTDC_CLUT_InitStruct)
661  {
662    uint32_t green = 0;
663    uint32_t red = 0;
664    uint32_t clutadd = 0;
665  
666    /* Check the parameters */
667    assert_param(IS_LTDC_CLUTWR(LTDC_CLUT_InitStruct->LTDC_CLUTAdress));
668    assert_param(IS_LTDC_CLUTWR(LTDC_CLUT_InitStruct->LTDC_RedValue));
669    assert_param(IS_LTDC_CLUTWR(LTDC_CLUT_InitStruct->LTDC_GreenValue));
670    assert_param(IS_LTDC_CLUTWR(LTDC_CLUT_InitStruct->LTDC_BlueValue));
671  
672    /* Specifies the CLUT address and RGB value */
673    green = (LTDC_CLUT_InitStruct->LTDC_GreenValue << 8);
674    red = (LTDC_CLUT_InitStruct->LTDC_RedValue << 16);
675    clutadd = (LTDC_CLUT_InitStruct->LTDC_CLUTAdress << 24);
676    LTDC_Layerx->CLUTWR  = (clutadd | LTDC_CLUT_InitStruct->LTDC_BlueValue | \
677                                green | red);
678  }
679  
680  /**
681    * @brief  Fills each LTDC_CLUT_InitStruct member with its default value.
682    * @param  LTDC_CLUT_InitStruct: pointer to a LTDC_CLUT_InitTypeDef structure which will
683    *         be initialized.
684    * @retval None
685    */
686  
LTDC_CLUTStructInit(LTDC_CLUT_InitTypeDef * LTDC_CLUT_InitStruct)687  void LTDC_CLUTStructInit(LTDC_CLUT_InitTypeDef* LTDC_CLUT_InitStruct)
688  {
689    /*!< Initialize the CLUT address and RGB values */
690    LTDC_CLUT_InitStruct->LTDC_CLUTAdress = 0x00;
691    LTDC_CLUT_InitStruct->LTDC_BlueValue = 0x00;
692    LTDC_CLUT_InitStruct->LTDC_GreenValue = 0x00;
693    LTDC_CLUT_InitStruct->LTDC_RedValue = 0x00;
694  }
695  
696  
697  /**
698    * @brief  reconfigure the layer position.
699    * @param  OffsetX: horizontal offset from start active width .
700    * @param  OffsetY: vertical offset from start active height.
701    * @param  LTDC_layerx: Select the layer to be configured, this parameter can be
702    *         one of the following values: LTDC_Layer1, LTDC_Layer2
703    * @retval Reload of the shadow registers values must be applied after layer
704    *         position reconfiguration.
705    */
706  
LTDC_LayerPosition(LTDC_Layer_TypeDef * LTDC_Layerx,uint16_t OffsetX,uint16_t OffsetY)707  void LTDC_LayerPosition(LTDC_Layer_TypeDef* LTDC_Layerx, uint16_t OffsetX, uint16_t OffsetY)
708  {
709  
710    uint32_t tempreg, temp;
711    uint32_t horizontal_start;
712    uint32_t horizontal_stop;
713    uint32_t vertical_start;
714    uint32_t vertical_stop;
715  
716    LTDC_Layerx->WHPCR &= ~(LTDC_LxWHPCR_WHSTPOS | LTDC_LxWHPCR_WHSPPOS);
717    LTDC_Layerx->WVPCR &= ~(LTDC_LxWVPCR_WVSTPOS | LTDC_LxWVPCR_WVSPPOS);
718  
719    /* Reconfigures the horizontal and vertical start position */
720    tempreg = LTDC->BPCR;
721    horizontal_start = (tempreg >> 16) + 1 + OffsetX;
722    vertical_start = (tempreg & 0xFFFF) + 1 + OffsetY;
723  
724    /* Reconfigures the horizontal and vertical stop position */
725    /* Get the number of byte per pixel */
726  
727    tempreg = LTDC_Layerx->PFCR;
728  
729    if (tempreg == LTDC_Pixelformat_ARGB8888)
730    {
731      temp = 4;
732    }
733    else if (tempreg == LTDC_Pixelformat_RGB888)
734    {
735      temp = 3;
736    }
737    else if ((tempreg == LTDC_Pixelformat_ARGB4444) ||
738            (tempreg == LTDC_Pixelformat_RGB565)    ||
739            (tempreg == LTDC_Pixelformat_ARGB1555)  ||
740            (tempreg == LTDC_Pixelformat_AL88))
741    {
742      temp = 2;
743    }
744    else
745    {
746      temp = 1;
747    }
748  
749    tempreg = LTDC_Layerx->CFBLR;
750    horizontal_stop = (((tempreg & 0x1FFF) - 3)/temp) + horizontal_start - 1;
751  
752    tempreg = LTDC_Layerx->CFBLNR;
753    vertical_stop = (tempreg & 0x7FF) + vertical_start - 1;
754  
755    LTDC_Layerx->WHPCR = horizontal_start | (horizontal_stop << 16);
756    LTDC_Layerx->WVPCR = vertical_start | (vertical_stop << 16);
757  }
758  
759  /**
760    * @brief  reconfigure constant alpha.
761    * @param  ConstantAlpha: constant alpha value.
762    * @param  LTDC_layerx: Select the layer to be configured, this parameter can be
763    *         one of the following values: LTDC_Layer1, LTDC_Layer2
764    * @retval Reload of the shadow registers values must be applied after constant
765    *         alpha reconfiguration.
766    */
767  
LTDC_LayerAlpha(LTDC_Layer_TypeDef * LTDC_Layerx,uint8_t ConstantAlpha)768  void LTDC_LayerAlpha(LTDC_Layer_TypeDef* LTDC_Layerx, uint8_t ConstantAlpha)
769  {
770    /* reconfigure the constant alpha value */
771    LTDC_Layerx->CACR = ConstantAlpha;
772  }
773  
774  /**
775    * @brief  reconfigure layer address.
776    * @param  Address: The color frame buffer start address.
777    * @param  LTDC_layerx: Select the layer to be configured, this parameter can be
778    *         one of the following values: LTDC_Layer1, LTDC_Layer2
779    * @retval Reload of the shadow registers values must be applied after layer
780    *         address reconfiguration.
781    */
782  
LTDC_LayerAddress(LTDC_Layer_TypeDef * LTDC_Layerx,uint32_t Address)783  void LTDC_LayerAddress(LTDC_Layer_TypeDef* LTDC_Layerx, uint32_t Address)
784  {
785    /* Reconfigures the color frame buffer start address */
786    LTDC_Layerx->CFBAR = Address;
787  }
788  
789  /**
790    * @brief  reconfigure layer size.
791    * @param  Width: layer window width.
792    * @param  Height: layer window height.
793    * @param  LTDC_layerx: Select the layer to be configured, this parameter can be
794    *         one of the following values: LTDC_Layer1, LTDC_Layer2
795    * @retval Reload of the shadow registers values must be applied after layer
796    *         size reconfiguration.
797    */
798  
LTDC_LayerSize(LTDC_Layer_TypeDef * LTDC_Layerx,uint32_t Width,uint32_t Height)799  void LTDC_LayerSize(LTDC_Layer_TypeDef* LTDC_Layerx, uint32_t Width, uint32_t Height)
800  {
801  
802    uint8_t temp;
803    uint32_t tempreg;
804    uint32_t horizontal_start;
805    uint32_t horizontal_stop;
806    uint32_t vertical_start;
807    uint32_t vertical_stop;
808  
809    tempreg = LTDC_Layerx->PFCR;
810  
811    if (tempreg == LTDC_Pixelformat_ARGB8888)
812    {
813      temp = 4;
814    }
815    else if (tempreg == LTDC_Pixelformat_RGB888)
816    {
817      temp = 3;
818    }
819    else if ((tempreg == LTDC_Pixelformat_ARGB4444) || \
820            (tempreg == LTDC_Pixelformat_RGB565)    || \
821            (tempreg == LTDC_Pixelformat_ARGB1555)  || \
822            (tempreg == LTDC_Pixelformat_AL88))
823    {
824      temp = 2;
825    }
826    else
827    {
828      temp = 1;
829    }
830  
831    /* update horizontal and vertical stop */
832    tempreg = LTDC_Layerx->WHPCR;
833    horizontal_start = (tempreg & 0x1FFF);
834    horizontal_stop = Width + horizontal_start - 1;
835  
836    tempreg = LTDC_Layerx->WVPCR;
837    vertical_start = (tempreg & 0x1FFF);
838    vertical_stop = Height + vertical_start - 1;
839  
840    LTDC_Layerx->WHPCR = horizontal_start | (horizontal_stop << 16);
841    LTDC_Layerx->WVPCR = vertical_start | (vertical_stop << 16);
842  
843    /* Reconfigures the color frame buffer pitch in byte */
844    LTDC_Layerx->CFBLR  = ((Width * temp) << 16) | ((Width * temp) + 3);
845  
846    /* Reconfigures the frame buffer line number */
847    LTDC_Layerx->CFBLNR  = Height;
848  
849  }
850  
851  /**
852    * @brief  reconfigure layer pixel format.
853    * @param  PixelFormat: reconfigure the pixel format, this parameter can be
854    *         one of the following values:@ref LTDC_Pixelformat.
855    * @param  LTDC_layerx: Select the layer to be configured, this parameter can be
856    *         one of the following values: LTDC_Layer1, LTDC_Layer2
857    * @retval Reload of the shadow registers values must be applied after layer
858    *         pixel format reconfiguration.
859    */
860  
LTDC_LayerPixelFormat(LTDC_Layer_TypeDef * LTDC_Layerx,uint32_t PixelFormat)861  void LTDC_LayerPixelFormat(LTDC_Layer_TypeDef* LTDC_Layerx, uint32_t PixelFormat)
862  {
863  
864    uint8_t temp;
865    uint32_t tempreg;
866  
867    tempreg = LTDC_Layerx->PFCR;
868  
869    if (tempreg == LTDC_Pixelformat_ARGB8888)
870    {
871      temp = 4;
872    }
873    else if (tempreg == LTDC_Pixelformat_RGB888)
874    {
875      temp = 3;
876    }
877    else if ((tempreg == LTDC_Pixelformat_ARGB4444) || \
878            (tempreg == LTDC_Pixelformat_RGB565)    || \
879            (tempreg == LTDC_Pixelformat_ARGB1555)  || \
880            (tempreg == LTDC_Pixelformat_AL88))
881    {
882      temp = 2;
883    }
884    else
885    {
886      temp = 1;
887    }
888  
889    tempreg = (LTDC_Layerx->CFBLR >> 16);
890    tempreg = (tempreg / temp);
891  
892    if (PixelFormat == LTDC_Pixelformat_ARGB8888)
893    {
894      temp = 4;
895    }
896    else if (PixelFormat == LTDC_Pixelformat_RGB888)
897    {
898      temp = 3;
899    }
900    else if ((PixelFormat == LTDC_Pixelformat_ARGB4444) || \
901            (PixelFormat == LTDC_Pixelformat_RGB565)    || \
902            (PixelFormat == LTDC_Pixelformat_ARGB1555)  || \
903            (PixelFormat == LTDC_Pixelformat_AL88))
904    {
905      temp = 2;
906    }
907    else
908    {
909      temp = 1;
910    }
911  
912    /* Reconfigures the color frame buffer pitch in byte */
913    LTDC_Layerx->CFBLR  = ((tempreg * temp) << 16) | ((tempreg * temp) + 3);
914  
915    /* Reconfigures the color frame buffer start address */
916    LTDC_Layerx->PFCR = PixelFormat;
917  
918  }
919  
920  /**
921    * @}
922    */
923  
924  /** @defgroup LTDC_Group2 Interrupts and flags management functions
925   *  @brief   Interrupts and flags management functions
926   *
927  @verbatim
928   ===============================================================================
929              ##### Interrupts and flags management functions #####
930   ===============================================================================
931  
932      [..] This section provides functions allowing to configure the LTDC Interrupts
933           and to get the status and clear flags and Interrupts pending bits.
934  
935      [..] The LTDC provides 4 Interrupts sources and 4 Flags
936  
937      *** Flags ***
938      =============
939      [..]
940        (+) LTDC_FLAG_LI:   Line Interrupt flag.
941        (+) LTDC_FLAG_FU:   FIFO Underrun Interrupt flag.
942        (+) LTDC_FLAG_TERR: Transfer Error Interrupt flag.
943        (+) LTDC_FLAG_RR:   Register Reload interrupt flag.
944  
945      *** Interrupts ***
946      ==================
947      [..]
948        (+) LTDC_IT_LI: Line Interrupt is generated when a programmed line
949                        is reached. The line interrupt position is programmed in
950                        the LTDC_LIPR register.
951        (+) LTDC_IT_FU: FIFO Underrun interrupt is generated when a pixel is requested
952                        from an empty layer FIFO
953        (+) LTDC_IT_TERR: Transfer Error interrupt is generated when an AHB bus
954                          error occurs during data transfer.
955        (+) LTDC_IT_RR: Register Reload interrupt is generated when the shadow
956                        registers reload was performed during the vertical blanking
957                        period.
958  
959  @endverbatim
960    * @{
961    */
962  
963  /**
964    * @brief  Enables or disables the specified LTDC's interrupts.
965    * @param  LTDC_IT: specifies the LTDC interrupts sources to be enabled or disabled.
966    *   This parameter can be any combination of the following values:
967    *     @arg LTDC_IT_LI: Line Interrupt Enable.
968    *     @arg LTDC_IT_FU: FIFO Underrun Interrupt Enable.
969    *     @arg LTDC_IT_TERR: Transfer Error Interrupt Enable.
970    *     @arg LTDC_IT_RR: Register Reload interrupt enable.
971    * @param NewState: new state of the specified LTDC interrupts.
972    *   This parameter can be: ENABLE or DISABLE.
973    * @retval None
974    */
LTDC_ITConfig(uint32_t LTDC_IT,FunctionalState NewState)975  void LTDC_ITConfig(uint32_t LTDC_IT, FunctionalState NewState)
976  {
977    /* Check the parameters */
978    assert_param(IS_LTDC_IT(LTDC_IT));
979    assert_param(IS_FUNCTIONAL_STATE(NewState));
980  
981    if (NewState != DISABLE)
982    {
983      LTDC->IER |= LTDC_IT;
984    }
985    else
986    {
987      LTDC->IER &= (uint32_t)~LTDC_IT;
988    }
989  }
990  
991  /**
992    * @brief  Checks whether the specified LTDC's flag is set or not.
993    * @param  LTDC_FLAG: specifies the flag to check.
994    *   This parameter can be one of the following values:
995    *     @arg LTDC_FLAG_LI:    Line Interrupt flag.
996    *     @arg LTDC_FLAG_FU:   FIFO Underrun Interrupt flag.
997    *     @arg LTDC_FLAG_TERR: Transfer Error Interrupt flag.
998    *     @arg LTDC_FLAG_RR:   Register Reload interrupt flag.
999    * @retval The new state of LTDC_FLAG (SET or RESET).
1000    */
LTDC_GetFlagStatus(uint32_t LTDC_FLAG)1001  FlagStatus LTDC_GetFlagStatus(uint32_t LTDC_FLAG)
1002  {
1003    FlagStatus bitstatus = RESET;
1004  
1005    /* Check the parameters */
1006    assert_param(IS_LTDC_FLAG(LTDC_FLAG));
1007  
1008    if ((LTDC->ISR & LTDC_FLAG) != (uint32_t)RESET)
1009    {
1010      bitstatus = SET;
1011    }
1012    else
1013    {
1014      bitstatus = RESET;
1015    }
1016    return bitstatus;
1017  }
1018  
1019  /**
1020    * @brief  Clears the LTDC's pending flags.
1021    * @param  LTDC_FLAG: specifies the flag to clear.
1022    *   This parameter can be any combination of the following values:
1023    *     @arg LTDC_FLAG_LI:    Line Interrupt flag.
1024    *     @arg LTDC_FLAG_FU:   FIFO Underrun Interrupt flag.
1025    *     @arg LTDC_FLAG_TERR: Transfer Error Interrupt flag.
1026    *     @arg LTDC_FLAG_RR:   Register Reload interrupt flag.
1027    * @retval None
1028    */
LTDC_ClearFlag(uint32_t LTDC_FLAG)1029  void LTDC_ClearFlag(uint32_t LTDC_FLAG)
1030  {
1031    /* Check the parameters */
1032    assert_param(IS_LTDC_FLAG(LTDC_FLAG));
1033  
1034    /* Clear the corresponding LTDC flag */
1035    LTDC->ICR = (uint32_t)LTDC_FLAG;
1036  }
1037  
1038  /**
1039    * @brief  Checks whether the specified LTDC's interrupt has occurred or not.
1040    * @param  LTDC_IT: specifies the LTDC interrupts sources to check.
1041    *   This parameter can be one of the following values:
1042    *     @arg LTDC_IT_LI:    Line Interrupt Enable.
1043    *     @arg LTDC_IT_FU:   FIFO Underrun Interrupt Enable.
1044    *     @arg LTDC_IT_TERR: Transfer Error Interrupt Enable.
1045    *     @arg LTDC_IT_RR:   Register Reload interrupt Enable.
1046    * @retval The new state of the LTDC_IT (SET or RESET).
1047    */
LTDC_GetITStatus(uint32_t LTDC_IT)1048  ITStatus LTDC_GetITStatus(uint32_t LTDC_IT)
1049  {
1050    ITStatus bitstatus = RESET;
1051  
1052    /* Check the parameters */
1053    assert_param(IS_LTDC_IT(LTDC_IT));
1054  
1055    if ((LTDC->ISR & LTDC_IT) != (uint32_t)RESET)
1056    {
1057      bitstatus = SET;
1058    }
1059    else
1060    {
1061      bitstatus = RESET;
1062    }
1063  
1064    if (((LTDC->IER & LTDC_IT) != (uint32_t)RESET) && (bitstatus != (uint32_t)RESET))
1065    {
1066      bitstatus = SET;
1067    }
1068    else
1069    {
1070      bitstatus = RESET;
1071    }
1072    return bitstatus;
1073  }
1074  
1075  
1076  /**
1077    * @brief  Clears the LTDC's interrupt pending bits.
1078    * @param  LTDC_IT: specifies the interrupt pending bit to clear.
1079    *   This parameter can be any combination of the following values:
1080    *     @arg LTDC_IT_LIE:    Line Interrupt.
1081    *     @arg LTDC_IT_FUIE:   FIFO Underrun Interrupt.
1082    *     @arg LTDC_IT_TERRIE: Transfer Error Interrupt.
1083    *     @arg LTDC_IT_RRIE:   Register Reload interrupt.
1084    * @retval None
1085    */
LTDC_ClearITPendingBit(uint32_t LTDC_IT)1086  void LTDC_ClearITPendingBit(uint32_t LTDC_IT)
1087  {
1088    /* Check the parameters */
1089    assert_param(IS_LTDC_IT(LTDC_IT));
1090  
1091    /* Clear the corresponding LTDC Interrupt */
1092    LTDC->ICR = (uint32_t)LTDC_IT;
1093  }
1094  /**
1095    * @}
1096    */
1097  
1098  /**
1099    * @}
1100    */
1101  
1102  /**
1103    * @}
1104    */
1105  
1106  /**
1107    * @}
1108    */
1109  
1110  /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
1111