1 /**
2   ******************************************************************************
3   * @file    stm32wbxx_hal_lcd.c
4   * @author  MCD Application Team
5   * @brief   LCD Controller HAL module driver.
6   *          This file provides firmware functions to manage the following
7   *          functionalities of the LCD Controller (LCD) peripheral:
8   *           + Initialization/de-initialization methods
9   *           + I/O operation methods
10   *           + Peripheral State methods
11   *
12   ******************************************************************************
13   * @attention
14   *
15   * Copyright (c) 2019 STMicroelectronics.
16   * All rights reserved.
17   *
18   * This software is licensed under terms that can be found in the LICENSE file
19   * in the root directory of this software component.
20   * If no LICENSE file comes with this software, it is provided AS-IS.
21   *
22   ******************************************************************************
23   @verbatim
24   ==============================================================================
25                         ##### How to use this driver #####
26   ==============================================================================
27       [..] The LCD HAL driver can be used as follows:
28 
29       (#) Declare a LCD_HandleTypeDef handle structure.
30 
31       -@- The frequency generator allows you to achieve various LCD frame rates
32           starting from an LCD input clock frequency (LCDCLK) which can vary
33           from 32 kHz up to 1 MHz.
34 
35       (#) Initialize the LCD low level resources by implementing the HAL_LCD_MspInit() API:
36 
37           (++) Enable the LCDCLK (same as RTCCLK): to configure the RTCCLK/LCDCLK, proceed as follows:
38                (+++) Use RCC function HAL_RCCEx_PeriphCLKConfig in indicating RCC_PERIPHCLK_LCD and
39                   selected clock source (HSE, LSI or LSE)
40 
41           (++) LCD pins configuration:
42               (+++) Enable the clock for the LCD GPIOs.
43               (+++) Configure these LCD pins as alternate function no-pull.
44           (++) Enable the LCD interface clock.
45 
46 
47       (#) Program the Prescaler, Divider, Blink mode, Blink Frequency Duty, Bias,
48           Voltage Source, Dead Time, Pulse On Duration, Contrast, High drive and Multiplexer
49           Segment in the Init structure of the LCD handle.
50 
51       (#) Initialize the LCD registers by calling the HAL_LCD_Init() API.
52 
53       -@- The HAL_LCD_Init() API configures also the low level Hardware GPIO, CLOCK, ...etc)
54           by calling the customized HAL_LCD_MspInit() API.
55       -@- After calling the HAL_LCD_Init() the LCD RAM memory is cleared
56 
57       (#) Optionally you can update the LCD configuration using these macros:
58               (++) LCD High Drive using the __HAL_LCD_HIGHDRIVER_ENABLE() and __HAL_LCD_HIGHDRIVER_DISABLE() macros
59               (++) Voltage output buffer using __HAL_LCD_VOLTAGE_BUFFER_ENABLE() and __HAL_LCD_VOLTAGE_BUFFER_DISABLE() macros
60               (++) LCD Pulse ON Duration using the __HAL_LCD_PULSEONDURATION_CONFIG() macro
61               (++) LCD Dead Time using the __HAL_LCD_DEADTIME_CONFIG() macro
62               (++) The LCD Blink mode and frequency using the __HAL_LCD_BLINK_CONFIG() macro
63               (++) The LCD Contrast using the __HAL_LCD_CONTRAST_CONFIG() macro
64 
65       (#) Write to the LCD RAM memory using the HAL_LCD_Write() API, this API can be called
66           more time to update the different LCD RAM registers before calling
67           HAL_LCD_UpdateDisplayRequest() API.
68 
69       (#) The HAL_LCD_Clear() API can be used to clear the LCD RAM memory.
70 
71       (#) When LCD RAM memory is updated enable the update display request using
72           the HAL_LCD_UpdateDisplayRequest() API.
73 
74       [..] LCD and low power modes:
75            (#) The LCD remain active during Sleep, Low Power run, Low Power Sleep and
76                STOP modes.
77 
78   @endverbatim
79   ******************************************************************************
80   */
81 
82 /* Includes ------------------------------------------------------------------*/
83 #include "stm32wbxx_hal.h"
84 
85 
86 /** @addtogroup STM32WBxx_HAL_Driver
87   * @{
88   */
89 
90 #ifdef HAL_LCD_MODULE_ENABLED
91 
92 #if defined (LCD)
93 
94 /** @defgroup LCD LCD
95   * @brief LCD HAL module driver
96   * @{
97   */
98 
99 /* Private typedef -----------------------------------------------------------*/
100 /* Private define ------------------------------------------------------------*/
101 /** @defgroup LCD_Private_Defines LCD Private Defines
102   * @{
103   */
104 
105 #define LCD_TIMEOUT_VALUE             1000U
106 
107 /**
108   * @}
109   */
110 
111 /* Private macro -------------------------------------------------------------*/
112 /* Private variables ---------------------------------------------------------*/
113 /* Private function prototypes -----------------------------------------------*/
114 /* Exported functions --------------------------------------------------------*/
115 
116 /** @defgroup LCD_Exported_Functions LCD Exported Functions
117   * @{
118   */
119 
120 /** @defgroup LCD_Exported_Functions_Group1 Initialization/de-initialization methods
121   *  @brief    Initialization and Configuration functions
122   *
123 @verbatim
124 ===============================================================================
125             ##### Initialization and Configuration functions #####
126  ===============================================================================
127     [..]
128 
129 @endverbatim
130   * @{
131   */
132 
133 /**
134   * @brief  Initialize the LCD peripheral according to the specified parameters
135   *         in the LCD_InitStruct and initialize the associated handle.
136   * @note   This function can be used only when the LCD is disabled.
137   * @param hlcd LCD handle
138   * @retval None
139   */
HAL_LCD_Init(LCD_HandleTypeDef * hlcd)140 HAL_StatusTypeDef HAL_LCD_Init(LCD_HandleTypeDef *hlcd)
141 {
142   uint32_t tickstart;
143   uint32_t counter;
144   HAL_StatusTypeDef status;
145 
146   /* Check the LCD handle allocation */
147   if (hlcd == NULL)
148   {
149     return HAL_ERROR;
150   }
151 
152   /* Check function parameters */
153   assert_param(IS_LCD_ALL_INSTANCE(hlcd->Instance));
154   assert_param(IS_LCD_PRESCALER(hlcd->Init.Prescaler));
155   assert_param(IS_LCD_DIVIDER(hlcd->Init.Divider));
156   assert_param(IS_LCD_DUTY(hlcd->Init.Duty));
157   assert_param(IS_LCD_BIAS(hlcd->Init.Bias));
158   assert_param(IS_LCD_VOLTAGE_SOURCE(hlcd->Init.VoltageSource));
159   assert_param(IS_LCD_PULSE_ON_DURATION(hlcd->Init.PulseOnDuration));
160   assert_param(IS_LCD_HIGH_DRIVE(hlcd->Init.HighDrive));
161   assert_param(IS_LCD_DEAD_TIME(hlcd->Init.DeadTime));
162   assert_param(IS_LCD_CONTRAST(hlcd->Init.Contrast));
163   assert_param(IS_LCD_BLINK_FREQUENCY(hlcd->Init.BlinkFrequency));
164   assert_param(IS_LCD_BLINK_MODE(hlcd->Init.BlinkMode));
165   assert_param(IS_LCD_MUX_SEGMENT(hlcd->Init.MuxSegment));
166 
167   if (hlcd->State == HAL_LCD_STATE_RESET)
168   {
169     /* Allocate lock resource and initialize it */
170     hlcd->Lock = HAL_UNLOCKED;
171 
172     /* Initialize the low level hardware (MSP) */
173     HAL_LCD_MspInit(hlcd);
174   }
175 
176   hlcd->State = HAL_LCD_STATE_BUSY;
177 
178   /* Disable the peripheral */
179   __HAL_LCD_DISABLE(hlcd);
180 
181   /* Clear the LCD_RAM registers and enable the display request by setting the UDR bit
182      in the LCD_SR register */
183   for (counter = LCD_RAM_REGISTER0; counter <= LCD_RAM_REGISTER7; counter++)
184   {
185     hlcd->Instance->RAM[counter] = 0;
186   }
187   /* Enable the display request */
188   /* hlcd->Instance->SR |= LCD_SR_UDR */
189   /* Configure the LCD Prescaler, Divider, Blink mode and Blink Frequency:
190      Set PS[3:0] bits according to hlcd->Init.Prescaler value
191      Set DIV[3:0] bits according to hlcd->Init.Divider value
192      Set BLINK[1:0] bits according to hlcd->Init.BlinkMode value
193      Set BLINKF[2:0] bits according to hlcd->Init.BlinkFrequency value
194      Set DEAD[2:0] bits according to hlcd->Init.DeadTime value
195      Set PON[2:0] bits according to hlcd->Init.PulseOnDuration value
196      Set CC[2:0] bits according to hlcd->Init.Contrast value
197      Set HD bit according to hlcd->Init.HighDrive value */
198   MODIFY_REG(hlcd->Instance->FCR, \
199              (LCD_FCR_PS | LCD_FCR_DIV | LCD_FCR_BLINK | LCD_FCR_BLINKF | \
200               LCD_FCR_DEAD | LCD_FCR_PON | LCD_FCR_CC | LCD_FCR_HD), \
201              (hlcd->Init.Prescaler | hlcd->Init.Divider | hlcd->Init.BlinkMode | hlcd->Init.BlinkFrequency | \
202               hlcd->Init.DeadTime | hlcd->Init.PulseOnDuration | hlcd->Init.Contrast | hlcd->Init.HighDrive));
203 
204   /* Wait until LCD Frame Control Register Synchronization flag (FCRSF) is set in the LCD_SR register
205      This bit is set by hardware each time the LCD_FCR register is updated in the LCDCLK
206      domain. It is cleared by hardware when writing to the LCD_FCR register.*/
207   status = LCD_WaitForSynchro(hlcd);
208   if (status != HAL_OK)
209   {
210     return status;
211   }
212 
213   /* Configure the LCD Duty, Bias, Voltage Source, Dead Time, Pulse On Duration and Contrast:
214      Set DUTY[2:0] bits according to hlcd->Init.Duty value
215      Set BIAS[1:0] bits according to hlcd->Init.Bias value
216      Set VSEL bit according to hlcd->Init.VoltageSource value
217      Set MUX_SEG bit according to hlcd->Init.MuxSegment value */
218   MODIFY_REG(hlcd->Instance->CR, \
219              (LCD_CR_DUTY | LCD_CR_BIAS | LCD_CR_VSEL | LCD_CR_MUX_SEG), \
220              (hlcd->Init.Duty | hlcd->Init.Bias | hlcd->Init.VoltageSource | hlcd->Init.MuxSegment));
221 
222   /* Enable the peripheral */
223   __HAL_LCD_ENABLE(hlcd);
224 
225   /* Get timeout */
226   tickstart = HAL_GetTick();
227 
228   /* Wait Until the LCD is enabled */
229   while (__HAL_LCD_GET_FLAG(hlcd, LCD_FLAG_ENS) == RESET)
230   {
231     if ((HAL_GetTick() - tickstart) > LCD_TIMEOUT_VALUE)
232     {
233       hlcd->ErrorCode = HAL_LCD_ERROR_ENS;
234       return HAL_TIMEOUT;
235     }
236   }
237 
238   /* Get timeout */
239   tickstart = HAL_GetTick();
240 
241   /*!< Wait Until the LCD Booster is ready */
242   while (__HAL_LCD_GET_FLAG(hlcd, LCD_FLAG_RDY) == RESET)
243   {
244     if ((HAL_GetTick() - tickstart) > LCD_TIMEOUT_VALUE)
245     {
246       hlcd->ErrorCode = HAL_LCD_ERROR_RDY;
247       return HAL_TIMEOUT;
248     }
249   }
250 
251   /* Initialize the LCD state */
252   hlcd->ErrorCode = HAL_LCD_ERROR_NONE;
253   hlcd->State = HAL_LCD_STATE_READY;
254 
255   return status;
256 }
257 
258 /**
259   * @brief  DeInitialize the LCD peripheral.
260   * @param hlcd LCD handle
261   * @retval HAL status
262   */
HAL_LCD_DeInit(LCD_HandleTypeDef * hlcd)263 HAL_StatusTypeDef HAL_LCD_DeInit(LCD_HandleTypeDef *hlcd)
264 {
265   /* Check the LCD handle allocation */
266   if (hlcd == NULL)
267   {
268     return HAL_ERROR;
269   }
270 
271   /* Check the parameters */
272   assert_param(IS_LCD_ALL_INSTANCE(hlcd->Instance));
273 
274   hlcd->State = HAL_LCD_STATE_BUSY;
275 
276   /* DeInit the low level hardware */
277   HAL_LCD_MspDeInit(hlcd);
278 
279   hlcd->ErrorCode = HAL_LCD_ERROR_NONE;
280   hlcd->State = HAL_LCD_STATE_RESET;
281 
282   /* Release Lock */
283   __HAL_UNLOCK(hlcd);
284 
285   return HAL_OK;
286 }
287 
288 /**
289   * @brief  DeInitialize the LCD MSP.
290   * @param hlcd LCD handle
291   * @retval None
292   */
HAL_LCD_MspDeInit(LCD_HandleTypeDef * hlcd)293 __weak void HAL_LCD_MspDeInit(LCD_HandleTypeDef *hlcd)
294 {
295   /* Prevent unused argument(s) compilation warning */
296   UNUSED(hlcd);
297 
298   /* NOTE: This function should not be modified, when the callback is needed,
299            the HAL_LCD_MspDeInit it to be implemented in the user file
300    */
301 }
302 
303 /**
304   * @brief  Initialize the LCD MSP.
305   * @param hlcd LCD handle
306   * @retval None
307   */
HAL_LCD_MspInit(LCD_HandleTypeDef * hlcd)308 __weak void HAL_LCD_MspInit(LCD_HandleTypeDef *hlcd)
309 {
310   /* Prevent unused argument(s) compilation warning */
311   UNUSED(hlcd);
312 
313   /* NOTE: This function should not be modified, when the callback is needed,
314            the HAL_LCD_MspInit is to be implemented in the user file
315    */
316 }
317 
318 /**
319   * @}
320   */
321 
322 /** @defgroup LCD_Exported_Functions_Group2 IO operation methods
323   *  @brief LCD RAM functions
324   *
325 @verbatim
326  ===============================================================================
327                       ##### IO operation functions #####
328  ===============================================================================
329  [..] Using its double buffer memory the LCD controller ensures the coherency of the
330  displayed information without having to use interrupts to control LCD_RAM
331  modification.
332 
333  [..] The application software can access the first buffer level (LCD_RAM) through
334  the APB interface. Once it has modified the LCD_RAM using the HAL_LCD_Write() API,
335  it sets the UDR flag in the LCD_SR register using the HAL_LCD_UpdateDisplayRequest() API.
336 
337  [..] This UDR flag (update display request) requests the updated information to be
338  moved into the second buffer level (LCD_DISPLAY).
339 
340  [..] This operation is done synchronously with the frame (at the beginning of the
341  next frame), until the update is completed, the LCD_RAM is write protected and
342  the UDR flag stays high.
343 
344  [..] Once the update is completed another flag (UDD - Update Display Done) is set and
345  generates an interrupt if the UDDIE bit in the LCD_FCR register is set.
346  The time it takes to update LCD_DISPLAY is, in the worst case, one odd and one
347  even frame.
348 
349  [..] The update will not occur (UDR = 1 and UDD = 0) until the display is
350  enabled (LCDEN = 1).
351 
352 @endverbatim
353   * @{
354   */
355 
356 /**
357   * @brief  Write a word in the specific LCD RAM.
358   * @param hlcd LCD handle
359   * @param RAMRegisterIndex specifies the LCD RAM Register.
360   *   This parameter can be one of the following values:
361   *     @arg LCD_RAM_REGISTER0: LCD RAM Register 0
362   *     @arg LCD_RAM_REGISTER1: LCD RAM Register 1
363   *     @arg LCD_RAM_REGISTER2: LCD RAM Register 2
364   *     @arg LCD_RAM_REGISTER3: LCD RAM Register 3
365   *     @arg LCD_RAM_REGISTER4: LCD RAM Register 4
366   *     @arg LCD_RAM_REGISTER5: LCD RAM Register 5
367   *     @arg LCD_RAM_REGISTER6: LCD RAM Register 6
368   *     @arg LCD_RAM_REGISTER7: LCD RAM Register 7
369   *     @arg LCD_RAM_REGISTER8: LCD RAM Register 8
370   *     @arg LCD_RAM_REGISTER9: LCD RAM Register 9
371   *     @arg LCD_RAM_REGISTER10: LCD RAM Register 10
372   *     @arg LCD_RAM_REGISTER11: LCD RAM Register 11
373   *     @arg LCD_RAM_REGISTER12: LCD RAM Register 12
374   *     @arg LCD_RAM_REGISTER13: LCD RAM Register 13
375   *     @arg LCD_RAM_REGISTER14: LCD RAM Register 14
376   *     @arg LCD_RAM_REGISTER15: LCD RAM Register 15
377   * @param RAMRegisterMask specifies the LCD RAM Register Data Mask.
378   * @param Data specifies LCD Data Value to be written.
379   * @retval None
380   */
HAL_LCD_Write(LCD_HandleTypeDef * hlcd,uint32_t RAMRegisterIndex,uint32_t RAMRegisterMask,uint32_t Data)381 HAL_StatusTypeDef HAL_LCD_Write(LCD_HandleTypeDef *hlcd, uint32_t RAMRegisterIndex, uint32_t RAMRegisterMask, uint32_t Data)
382 {
383   uint32_t tickstart;
384   HAL_LCD_StateTypeDef state = hlcd->State;
385 
386   if ((state == HAL_LCD_STATE_READY) || (state == HAL_LCD_STATE_BUSY))
387   {
388     /* Check the parameters */
389     assert_param(IS_LCD_RAM_REGISTER(RAMRegisterIndex));
390 
391     if (hlcd->State == HAL_LCD_STATE_READY)
392     {
393       /* Process Locked */
394       __HAL_LOCK(hlcd);
395       hlcd->State = HAL_LCD_STATE_BUSY;
396 
397       /* Get timeout */
398       tickstart = HAL_GetTick();
399 
400       /*!< Wait Until the LCD is ready */
401       while (__HAL_LCD_GET_FLAG(hlcd, LCD_FLAG_UDR) != RESET)
402       {
403         if ((HAL_GetTick() - tickstart) > LCD_TIMEOUT_VALUE)
404         {
405           hlcd->ErrorCode = HAL_LCD_ERROR_UDR;
406 
407           /* Process Unlocked */
408           __HAL_UNLOCK(hlcd);
409 
410           return HAL_TIMEOUT;
411         }
412       }
413     }
414 
415     /* Copy the new Data bytes to LCD RAM register */
416     MODIFY_REG(hlcd->Instance->RAM[RAMRegisterIndex], ~(RAMRegisterMask), Data);
417 
418     return HAL_OK;
419   }
420   else
421   {
422     return HAL_ERROR;
423   }
424 }
425 
426 /**
427   * @brief Clear the LCD RAM registers.
428   * @param hlcd LCD handle
429   * @retval None
430   */
HAL_LCD_Clear(LCD_HandleTypeDef * hlcd)431 HAL_StatusTypeDef HAL_LCD_Clear(LCD_HandleTypeDef *hlcd)
432 {
433   uint32_t tickstart;
434   uint32_t counter;
435   HAL_StatusTypeDef status = HAL_ERROR;
436   HAL_LCD_StateTypeDef state = hlcd->State;
437 
438   if ((state == HAL_LCD_STATE_READY) || (state == HAL_LCD_STATE_BUSY))
439   {
440     /* Process Locked */
441     __HAL_LOCK(hlcd);
442 
443     hlcd->State = HAL_LCD_STATE_BUSY;
444 
445     /* Get timeout */
446     tickstart = HAL_GetTick();
447 
448     /*!< Wait Until the LCD is ready */
449     while (__HAL_LCD_GET_FLAG(hlcd, LCD_FLAG_UDR) != RESET)
450     {
451       if ((HAL_GetTick() - tickstart) > LCD_TIMEOUT_VALUE)
452       {
453         hlcd->ErrorCode = HAL_LCD_ERROR_UDR;
454 
455         /* Process Unlocked */
456         __HAL_UNLOCK(hlcd);
457 
458         return HAL_TIMEOUT;
459       }
460     }
461     /* Clear the LCD_RAM registers */
462     for (counter = LCD_RAM_REGISTER0; counter <= LCD_RAM_REGISTER15; counter++)
463     {
464       hlcd->Instance->RAM[counter] = 0;
465     }
466 
467     /* Update the LCD display */
468     status = HAL_LCD_UpdateDisplayRequest(hlcd);
469   }
470   return status;
471 }
472 
473 /**
474   * @brief  Enable the Update Display Request.
475   * @param hlcd LCD handle
476   * @note   Each time software modifies the LCD_RAM it must set the UDR bit to
477   *         transfer the updated data to the second level buffer.
478   *         The UDR bit stays set until the end of the update and during this
479   *         time the LCD_RAM is write protected.
480   * @note   When the display is disabled, the update is performed for all
481   *         LCD_DISPLAY locations.
482   *         When the display is enabled, the update is performed only for locations
483   *         for which commons are active (depending on DUTY). For example if
484   *         DUTY = 1/2, only the LCD_DISPLAY of COM0 and COM1 will be updated.
485   * @retval None
486   */
HAL_LCD_UpdateDisplayRequest(LCD_HandleTypeDef * hlcd)487 HAL_StatusTypeDef HAL_LCD_UpdateDisplayRequest(LCD_HandleTypeDef *hlcd)
488 {
489   uint32_t tickstart;
490 
491   /* Clear the Update Display Done flag before starting the update display request */
492   __HAL_LCD_CLEAR_FLAG(hlcd, LCD_FLAG_UDD);
493 
494   /* Enable the display request */
495   hlcd->Instance->SR |= LCD_SR_UDR;
496 
497   /* Get timeout */
498   tickstart = HAL_GetTick();
499 
500   /*!< Wait Until the LCD display is done */
501   while (__HAL_LCD_GET_FLAG(hlcd, LCD_FLAG_UDD) == RESET)
502   {
503     if ((HAL_GetTick() - tickstart) > LCD_TIMEOUT_VALUE)
504     {
505       hlcd->ErrorCode = HAL_LCD_ERROR_UDD;
506 
507       /* Process Unlocked */
508       __HAL_UNLOCK(hlcd);
509 
510       return HAL_TIMEOUT;
511     }
512   }
513 
514   hlcd->State = HAL_LCD_STATE_READY;
515 
516   /* Process Unlocked */
517   __HAL_UNLOCK(hlcd);
518 
519   return HAL_OK;
520 }
521 
522 /**
523   * @}
524   */
525 
526 /** @defgroup LCD_Exported_Functions_Group3 Peripheral State methods
527   *  @brief   LCD State functions
528   *
529 @verbatim
530  ===============================================================================
531                       ##### Peripheral State functions #####
532  ===============================================================================
533     [..]
534      This subsection provides a set of functions allowing to control the LCD:
535       (+) HAL_LCD_GetState() API can be helpful to check in run-time the state of the LCD peripheral State.
536       (+) HAL_LCD_GetError() API to return the LCD error code.
537 @endverbatim
538   * @{
539   */
540 
541 /**
542   * @brief Return the LCD handle state.
543   * @param hlcd LCD handle
544   * @retval HAL state
545   */
HAL_LCD_GetState(LCD_HandleTypeDef * hlcd)546 HAL_LCD_StateTypeDef HAL_LCD_GetState(LCD_HandleTypeDef *hlcd)
547 {
548   /* Return LCD handle state */
549   return hlcd->State;
550 }
551 
552 /**
553   * @brief Return the LCD error code.
554   * @param hlcd LCD handle
555   * @retval LCD Error Code
556   */
HAL_LCD_GetError(LCD_HandleTypeDef * hlcd)557 uint32_t HAL_LCD_GetError(LCD_HandleTypeDef *hlcd)
558 {
559   return hlcd->ErrorCode;
560 }
561 
562 /**
563   * @}
564   */
565 
566 /**
567   * @}
568   */
569 
570 /** @defgroup LCD_Private_Functions LCD Private Functions
571   * @{
572   */
573 
574 /**
575   * @brief  Wait until the LCD FCR register is synchronized in the LCDCLK domain.
576   *   This function must be called after any write operation to LCD_FCR register.
577   * @retval None
578   */
LCD_WaitForSynchro(LCD_HandleTypeDef * hlcd)579 HAL_StatusTypeDef LCD_WaitForSynchro(LCD_HandleTypeDef *hlcd)
580 {
581   uint32_t tickstart;
582 
583   /* Get timeout */
584   tickstart = HAL_GetTick();
585 
586   /* Loop until FCRSF flag is set */
587   while (__HAL_LCD_GET_FLAG(hlcd, LCD_FLAG_FCRSF) == RESET)
588   {
589     if ((HAL_GetTick() - tickstart) > LCD_TIMEOUT_VALUE)
590     {
591       hlcd->ErrorCode = HAL_LCD_ERROR_FCRSF;
592       return HAL_TIMEOUT;
593     }
594   }
595 
596   return HAL_OK;
597 }
598 
599 /**
600   * @}
601   */
602 
603 /**
604   * @}
605   */
606 
607 #endif /* LCD */
608 
609 #endif /* HAL_LCD_MODULE_ENABLED */
610 
611 /**
612   * @}
613   */
614