Subversion Repositories DashDisplay

Rev

Rev 56 | Details | Compare with Previous | Last modification | View Log | RSS feed

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