STM32F4xx HAL Documentation
Hardware Abstraction Layer for STM32F4 familiy
Loading...
Searching...
No Matches
stm32f4xx_hal_ltdc.c
Go to the documentation of this file.
1
162/* Includes ------------------------------------------------------------------*/
163#include "stm32f4xx_hal.h"
164
169#ifdef HAL_LTDC_MODULE_ENABLED
170
171#if defined (LTDC)
172
179/* Private typedef -----------------------------------------------------------*/
180/* Private define ------------------------------------------------------------*/
184#define LTDC_TIMEOUT_VALUE ((uint32_t)100U) /* 100ms */
188/* Private macro -------------------------------------------------------------*/
189/* Private variables ---------------------------------------------------------*/
190/* Private function prototypes -----------------------------------------------*/
191static void LTDC_SetConfig(LTDC_HandleTypeDef *hltdc, LTDC_LayerCfgTypeDef *pLayerCfg, uint32_t LayerIdx);
192/* Private functions ---------------------------------------------------------*/
193
220{
221 uint32_t tmp;
222 uint32_t tmp1;
223
224 /* Check the LTDC peripheral state */
225 if (hltdc == NULL)
226 {
227 return HAL_ERROR;
228 }
229
230 /* Check function parameters */
231 assert_param(IS_LTDC_ALL_INSTANCE(hltdc->Instance));
244
245#if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1)
246 if (hltdc->State == HAL_LTDC_STATE_RESET)
247 {
248 /* Allocate lock resource and initialize it */
249 hltdc->Lock = HAL_UNLOCKED;
250
251 /* Reset the LTDC callback to the legacy weak callbacks */
252 hltdc->LineEventCallback = HAL_LTDC_LineEventCallback; /* Legacy weak LineEventCallback */
253 hltdc->ReloadEventCallback = HAL_LTDC_ReloadEventCallback; /* Legacy weak ReloadEventCallback */
254 hltdc->ErrorCallback = HAL_LTDC_ErrorCallback; /* Legacy weak ErrorCallback */
255
256 if (hltdc->MspInitCallback == NULL)
257 {
258 hltdc->MspInitCallback = HAL_LTDC_MspInit;
259 }
260 /* Init the low level hardware */
261 hltdc->MspInitCallback(hltdc);
262 }
263#else
264 if (hltdc->State == HAL_LTDC_STATE_RESET)
265 {
266 /* Allocate lock resource and initialize it */
267 hltdc->Lock = HAL_UNLOCKED;
268 /* Init the low level hardware */
269 HAL_LTDC_MspInit(hltdc);
270 }
271#endif /* USE_HAL_LTDC_REGISTER_CALLBACKS */
272
273 /* Change LTDC peripheral state */
274 hltdc->State = HAL_LTDC_STATE_BUSY;
275
276 /* Configure the HS, VS, DE and PC polarity */
277 hltdc->Instance->GCR &= ~(LTDC_GCR_HSPOL | LTDC_GCR_VSPOL | LTDC_GCR_DEPOL | LTDC_GCR_PCPOL);
278 hltdc->Instance->GCR |= (uint32_t)(hltdc->Init.HSPolarity | hltdc->Init.VSPolarity | \
279 hltdc->Init.DEPolarity | hltdc->Init.PCPolarity);
280
281 /* Set Synchronization size */
282 hltdc->Instance->SSCR &= ~(LTDC_SSCR_VSH | LTDC_SSCR_HSW);
283 tmp = (hltdc->Init.HorizontalSync << 16U);
284 hltdc->Instance->SSCR |= (tmp | hltdc->Init.VerticalSync);
285
286 /* Set Accumulated Back porch */
287 hltdc->Instance->BPCR &= ~(LTDC_BPCR_AVBP | LTDC_BPCR_AHBP);
288 tmp = (hltdc->Init.AccumulatedHBP << 16U);
289 hltdc->Instance->BPCR |= (tmp | hltdc->Init.AccumulatedVBP);
290
291 /* Set Accumulated Active Width */
292 hltdc->Instance->AWCR &= ~(LTDC_AWCR_AAH | LTDC_AWCR_AAW);
293 tmp = (hltdc->Init.AccumulatedActiveW << 16U);
294 hltdc->Instance->AWCR |= (tmp | hltdc->Init.AccumulatedActiveH);
295
296 /* Set Total Width */
297 hltdc->Instance->TWCR &= ~(LTDC_TWCR_TOTALH | LTDC_TWCR_TOTALW);
298 tmp = (hltdc->Init.TotalWidth << 16U);
299 hltdc->Instance->TWCR |= (tmp | hltdc->Init.TotalHeigh);
300
301 /* Set the background color value */
302 tmp = ((uint32_t)(hltdc->Init.Backcolor.Green) << 8U);
303 tmp1 = ((uint32_t)(hltdc->Init.Backcolor.Red) << 16U);
304 hltdc->Instance->BCCR &= ~(LTDC_BCCR_BCBLUE | LTDC_BCCR_BCGREEN | LTDC_BCCR_BCRED);
305 hltdc->Instance->BCCR |= (tmp1 | tmp | hltdc->Init.Backcolor.Blue);
306
307 /* Enable the Transfer Error and FIFO underrun interrupts */
309
310 /* Enable LTDC by setting LTDCEN bit */
311 __HAL_LTDC_ENABLE(hltdc);
312
313 /* Initialize the error code */
315
316 /* Initialize the LTDC state*/
318
319 return HAL_OK;
320}
321
330{
331 uint32_t tickstart;
332
333 /* Check the LTDC peripheral state */
334 if (hltdc == NULL)
335 {
336 return HAL_ERROR;
337 }
338
339 /* Check function parameters */
340 assert_param(IS_LTDC_ALL_INSTANCE(hltdc->Instance));
341
342 /* Disable LTDC Layer 1 */
344
345#if defined(LTDC_Layer2_BASE)
346 /* Disable LTDC Layer 2 */
348#endif /* LTDC_Layer2_BASE */
349
350 /* Reload during vertical blanking period */
352
353 /* Get tick */
354 tickstart = HAL_GetTick();
355
356 /* Wait for VSYNC Interrupt */
357 while (READ_BIT(hltdc->Instance->CDSR, LTDC_CDSR_VSYNCS) == 0U)
358 {
359 /* Check for the Timeout */
360 if ((HAL_GetTick() - tickstart) > LTDC_TIMEOUT_VALUE)
361 {
362 break;
363 }
364 }
365
366 /* Disable LTDC */
367 __HAL_LTDC_DISABLE(hltdc);
368
369#if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1)
370 if (hltdc->MspDeInitCallback == NULL)
371 {
372 hltdc->MspDeInitCallback = HAL_LTDC_MspDeInit;
373 }
374 /* DeInit the low level hardware */
375 hltdc->MspDeInitCallback(hltdc);
376#else
377 /* DeInit the low level hardware */
378 HAL_LTDC_MspDeInit(hltdc);
379#endif /* USE_HAL_LTDC_REGISTER_CALLBACKS */
380
381 /* Initialize the error code */
383
384 /* Initialize the LTDC state*/
386
387 /* Release Lock */
388 __HAL_UNLOCK(hltdc);
389
390 return HAL_OK;
391}
392
400{
401 /* Prevent unused argument(s) compilation warning */
402 UNUSED(hltdc);
403
404 /* NOTE : This function should not be modified, when the callback is needed,
405 the HAL_LTDC_MspInit could be implemented in the user file
406 */
407}
408
416{
417 /* Prevent unused argument(s) compilation warning */
418 UNUSED(hltdc);
419
420 /* NOTE : This function should not be modified, when the callback is needed,
421 the HAL_LTDC_MspDeInit could be implemented in the user file
422 */
423}
424
425#if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1)
440HAL_StatusTypeDef HAL_LTDC_RegisterCallback(LTDC_HandleTypeDef *hltdc, HAL_LTDC_CallbackIDTypeDef CallbackID,
441 pLTDC_CallbackTypeDef pCallback)
442{
443 HAL_StatusTypeDef status = HAL_OK;
444
445 if (pCallback == NULL)
446 {
447 /* Update the error code */
448 hltdc->ErrorCode |= HAL_LTDC_ERROR_INVALID_CALLBACK;
449
450 return HAL_ERROR;
451 }
452 /* Process locked */
453 __HAL_LOCK(hltdc);
454
455 if (hltdc->State == HAL_LTDC_STATE_READY)
456 {
457 switch (CallbackID)
458 {
459 case HAL_LTDC_LINE_EVENT_CB_ID :
460 hltdc->LineEventCallback = pCallback;
461 break;
462
463 case HAL_LTDC_RELOAD_EVENT_CB_ID :
464 hltdc->ReloadEventCallback = pCallback;
465 break;
466
467 case HAL_LTDC_ERROR_CB_ID :
468 hltdc->ErrorCallback = pCallback;
469 break;
470
471 case HAL_LTDC_MSPINIT_CB_ID :
472 hltdc->MspInitCallback = pCallback;
473 break;
474
475 case HAL_LTDC_MSPDEINIT_CB_ID :
476 hltdc->MspDeInitCallback = pCallback;
477 break;
478
479 default :
480 /* Update the error code */
481 hltdc->ErrorCode |= HAL_LTDC_ERROR_INVALID_CALLBACK;
482 /* Return error status */
483 status = HAL_ERROR;
484 break;
485 }
486 }
487 else if (hltdc->State == HAL_LTDC_STATE_RESET)
488 {
489 switch (CallbackID)
490 {
491 case HAL_LTDC_MSPINIT_CB_ID :
492 hltdc->MspInitCallback = pCallback;
493 break;
494
495 case HAL_LTDC_MSPDEINIT_CB_ID :
496 hltdc->MspDeInitCallback = pCallback;
497 break;
498
499 default :
500 /* Update the error code */
501 hltdc->ErrorCode |= HAL_LTDC_ERROR_INVALID_CALLBACK;
502 /* Return error status */
503 status = HAL_ERROR;
504 break;
505 }
506 }
507 else
508 {
509 /* Update the error code */
510 hltdc->ErrorCode |= HAL_LTDC_ERROR_INVALID_CALLBACK;
511 /* Return error status */
512 status = HAL_ERROR;
513 }
514
515 /* Release Lock */
516 __HAL_UNLOCK(hltdc);
517
518 return status;
519}
520
534HAL_StatusTypeDef HAL_LTDC_UnRegisterCallback(LTDC_HandleTypeDef *hltdc, HAL_LTDC_CallbackIDTypeDef CallbackID)
535{
536 HAL_StatusTypeDef status = HAL_OK;
537
538 /* Process locked */
539 __HAL_LOCK(hltdc);
540
541 if (hltdc->State == HAL_LTDC_STATE_READY)
542 {
543 switch (CallbackID)
544 {
545 case HAL_LTDC_LINE_EVENT_CB_ID :
546 hltdc->LineEventCallback = HAL_LTDC_LineEventCallback; /* Legacy weak LineEventCallback */
547 break;
548
549 case HAL_LTDC_RELOAD_EVENT_CB_ID :
550 hltdc->ReloadEventCallback = HAL_LTDC_ReloadEventCallback; /* Legacy weak ReloadEventCallback */
551 break;
552
553 case HAL_LTDC_ERROR_CB_ID :
554 hltdc->ErrorCallback = HAL_LTDC_ErrorCallback; /* Legacy weak ErrorCallback */
555 break;
556
557 case HAL_LTDC_MSPINIT_CB_ID :
558 hltdc->MspInitCallback = HAL_LTDC_MspInit; /* Legcay weak MspInit Callback */
559 break;
560
561 case HAL_LTDC_MSPDEINIT_CB_ID :
562 hltdc->MspDeInitCallback = HAL_LTDC_MspDeInit; /* Legcay weak MspDeInit Callback */
563 break;
564
565 default :
566 /* Update the error code */
567 hltdc->ErrorCode |= HAL_LTDC_ERROR_INVALID_CALLBACK;
568 /* Return error status */
569 status = HAL_ERROR;
570 break;
571 }
572 }
573 else if (hltdc->State == HAL_LTDC_STATE_RESET)
574 {
575 switch (CallbackID)
576 {
577 case HAL_LTDC_MSPINIT_CB_ID :
578 hltdc->MspInitCallback = HAL_LTDC_MspInit; /* Legcay weak MspInit Callback */
579 break;
580
581 case HAL_LTDC_MSPDEINIT_CB_ID :
582 hltdc->MspDeInitCallback = HAL_LTDC_MspDeInit; /* Legcay weak MspDeInit Callback */
583 break;
584
585 default :
586 /* Update the error code */
587 hltdc->ErrorCode |= HAL_LTDC_ERROR_INVALID_CALLBACK;
588 /* Return error status */
589 status = HAL_ERROR;
590 break;
591 }
592 }
593 else
594 {
595 /* Update the error code */
596 hltdc->ErrorCode |= HAL_LTDC_ERROR_INVALID_CALLBACK;
597 /* Return error status */
598 status = HAL_ERROR;
599 }
600
601 /* Release Lock */
602 __HAL_UNLOCK(hltdc);
603
604 return status;
605}
606#endif /* USE_HAL_LTDC_REGISTER_CALLBACKS */
607
632{
633 uint32_t isrflags = READ_REG(hltdc->Instance->ISR);
634 uint32_t itsources = READ_REG(hltdc->Instance->IER);
635
636 /* Transfer Error Interrupt management ***************************************/
637 if (((isrflags & LTDC_ISR_TERRIF) != 0U) && ((itsources & LTDC_IER_TERRIE) != 0U))
638 {
639 /* Disable the transfer Error interrupt */
641
642 /* Clear the transfer error flag */
644
645 /* Update error code */
647
648 /* Change LTDC state */
650
651 /* Process unlocked */
652 __HAL_UNLOCK(hltdc);
653
654 /* Transfer error Callback */
655#if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1)
656 /*Call registered error callback*/
657 hltdc->ErrorCallback(hltdc);
658#else
659 /* Call legacy error callback*/
661#endif /* USE_HAL_LTDC_REGISTER_CALLBACKS */
662 }
663
664 /* FIFO underrun Interrupt management ***************************************/
665 if (((isrflags & LTDC_ISR_FUIF) != 0U) && ((itsources & LTDC_IER_FUIE) != 0U))
666 {
667 /* Disable the FIFO underrun interrupt */
669
670 /* Clear the FIFO underrun flag */
672
673 /* Update error code */
675
676 /* Change LTDC state */
678
679 /* Process unlocked */
680 __HAL_UNLOCK(hltdc);
681
682 /* Transfer error Callback */
683#if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1)
684 /*Call registered error callback*/
685 hltdc->ErrorCallback(hltdc);
686#else
687 /* Call legacy error callback*/
689#endif /* USE_HAL_LTDC_REGISTER_CALLBACKS */
690 }
691
692 /* Line Interrupt management ************************************************/
693 if (((isrflags & LTDC_ISR_LIF) != 0U) && ((itsources & LTDC_IER_LIE) != 0U))
694 {
695 /* Disable the Line interrupt */
697
698 /* Clear the Line interrupt flag */
700
701 /* Change LTDC state */
703
704 /* Process unlocked */
705 __HAL_UNLOCK(hltdc);
706
707 /* Line interrupt Callback */
708#if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1)
709 /*Call registered Line Event callback */
710 hltdc->LineEventCallback(hltdc);
711#else
712 /*Call Legacy Line Event callback */
714#endif /* USE_HAL_LTDC_REGISTER_CALLBACKS */
715 }
716
717 /* Register reload Interrupt management ***************************************/
718 if (((isrflags & LTDC_ISR_RRIF) != 0U) && ((itsources & LTDC_IER_RRIE) != 0U))
719 {
720 /* Disable the register reload interrupt */
722
723 /* Clear the register reload flag */
725
726 /* Change LTDC state */
728
729 /* Process unlocked */
730 __HAL_UNLOCK(hltdc);
731
732 /* Reload interrupt Callback */
733#if (USE_HAL_LTDC_REGISTER_CALLBACKS == 1)
734 /*Call registered reload Event callback */
735 hltdc->ReloadEventCallback(hltdc);
736#else
737 /*Call Legacy Reload Event callback */
739#endif /* USE_HAL_LTDC_REGISTER_CALLBACKS */
740 }
741}
742
750{
751 /* Prevent unused argument(s) compilation warning */
752 UNUSED(hltdc);
753
754 /* NOTE : This function should not be modified, when the callback is needed,
755 the HAL_LTDC_ErrorCallback could be implemented in the user file
756 */
757}
758
766{
767 /* Prevent unused argument(s) compilation warning */
768 UNUSED(hltdc);
769
770 /* NOTE : This function should not be modified, when the callback is needed,
771 the HAL_LTDC_LineEventCallback could be implemented in the user file
772 */
773}
774
782{
783 /* Prevent unused argument(s) compilation warning */
784 UNUSED(hltdc);
785
786 /* NOTE : This function should not be modified, when the callback is needed,
787 the HAL_LTDC_ReloadEvenCallback could be implemented in the user file
788 */
789}
790
832{
833 /* Check the parameters */
834 assert_param(IS_LTDC_LAYER(LayerIdx));
840 assert_param(IS_LTDC_ALPHA(pLayerCfg->Alpha));
841 assert_param(IS_LTDC_ALPHA(pLayerCfg->Alpha0));
846
847 /* Process locked */
848 __HAL_LOCK(hltdc);
849
850 /* Change LTDC peripheral state */
851 hltdc->State = HAL_LTDC_STATE_BUSY;
852
853 /* Copy new layer configuration into handle structure */
854 hltdc->LayerCfg[LayerIdx] = *pLayerCfg;
855
856 /* Configure the LTDC Layer */
857 LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx);
858
859 /* Set the Immediate Reload type */
860 hltdc->Instance->SRCR = LTDC_SRCR_IMR;
861
862 /* Initialize the LTDC state*/
864
865 /* Process unlocked */
866 __HAL_UNLOCK(hltdc);
867
868 return HAL_OK;
869}
870
881HAL_StatusTypeDef HAL_LTDC_ConfigColorKeying(LTDC_HandleTypeDef *hltdc, uint32_t RGBValue, uint32_t LayerIdx)
882{
883 /* Check the parameters */
884 assert_param(IS_LTDC_LAYER(LayerIdx));
885
886 /* Process locked */
887 __HAL_LOCK(hltdc);
888
889 /* Change LTDC peripheral state */
890 hltdc->State = HAL_LTDC_STATE_BUSY;
891
892 /* Configure the default color values */
893 LTDC_LAYER(hltdc, LayerIdx)->CKCR &= ~(LTDC_LxCKCR_CKBLUE | LTDC_LxCKCR_CKGREEN | LTDC_LxCKCR_CKRED);
894 LTDC_LAYER(hltdc, LayerIdx)->CKCR = RGBValue;
895
896 /* Set the Immediate Reload type */
897 hltdc->Instance->SRCR = LTDC_SRCR_IMR;
898
899 /* Change the LTDC state*/
901
902 /* Process unlocked */
903 __HAL_UNLOCK(hltdc);
904
905 return HAL_OK;
906}
907
919HAL_StatusTypeDef HAL_LTDC_ConfigCLUT(LTDC_HandleTypeDef *hltdc, uint32_t *pCLUT, uint32_t CLUTSize, uint32_t LayerIdx)
920{
921 uint32_t tmp;
922 uint32_t counter;
923 uint32_t *pcolorlut = pCLUT;
924 /* Check the parameters */
925 assert_param(IS_LTDC_LAYER(LayerIdx));
926
927 /* Process locked */
928 __HAL_LOCK(hltdc);
929
930 /* Change LTDC peripheral state */
931 hltdc->State = HAL_LTDC_STATE_BUSY;
932
933 for (counter = 0U; (counter < CLUTSize); counter++)
934 {
935 if (hltdc->LayerCfg[LayerIdx].PixelFormat == LTDC_PIXEL_FORMAT_AL44)
936 {
937 tmp = (((counter + (16U * counter)) << 24U) | ((uint32_t)(*pcolorlut) & 0xFFU) | \
938 ((uint32_t)(*pcolorlut) & 0xFF00U) | ((uint32_t)(*pcolorlut) & 0xFF0000U));
939 }
940 else
941 {
942 tmp = ((counter << 24U) | ((uint32_t)(*pcolorlut) & 0xFFU) | \
943 ((uint32_t)(*pcolorlut) & 0xFF00U) | ((uint32_t)(*pcolorlut) & 0xFF0000U));
944 }
945
946 pcolorlut++;
947
948 /* Specifies the C-LUT address and RGB value */
949 LTDC_LAYER(hltdc, LayerIdx)->CLUTWR = tmp;
950 }
951
952 /* Change the LTDC state*/
954
955 /* Process unlocked */
956 __HAL_UNLOCK(hltdc);
957
958 return HAL_OK;
959}
960
971{
972 /* Check the parameters */
973 assert_param(IS_LTDC_LAYER(LayerIdx));
974
975 /* Process locked */
976 __HAL_LOCK(hltdc);
977
978 /* Change LTDC peripheral state */
979 hltdc->State = HAL_LTDC_STATE_BUSY;
980
981 /* Enable LTDC color keying by setting COLKEN bit */
982 LTDC_LAYER(hltdc, LayerIdx)->CR |= (uint32_t)LTDC_LxCR_COLKEN;
983
984 /* Set the Immediate Reload type */
985 hltdc->Instance->SRCR = LTDC_SRCR_IMR;
986
987 /* Change the LTDC state*/
989
990 /* Process unlocked */
991 __HAL_UNLOCK(hltdc);
992
993 return HAL_OK;
994}
995
1006{
1007 /* Check the parameters */
1008 assert_param(IS_LTDC_LAYER(LayerIdx));
1009
1010 /* Process locked */
1011 __HAL_LOCK(hltdc);
1012
1013 /* Change LTDC peripheral state */
1014 hltdc->State = HAL_LTDC_STATE_BUSY;
1015
1016 /* Disable LTDC color keying by setting COLKEN bit */
1017 LTDC_LAYER(hltdc, LayerIdx)->CR &= ~(uint32_t)LTDC_LxCR_COLKEN;
1018
1019 /* Set the Immediate Reload type */
1020 hltdc->Instance->SRCR = LTDC_SRCR_IMR;
1021
1022 /* Change the LTDC state*/
1023 hltdc->State = HAL_LTDC_STATE_READY;
1024
1025 /* Process unlocked */
1026 __HAL_UNLOCK(hltdc);
1027
1028 return HAL_OK;
1029}
1030
1041{
1042 /* Check the parameters */
1043 assert_param(IS_LTDC_LAYER(LayerIdx));
1044
1045 /* Process locked */
1046 __HAL_LOCK(hltdc);
1047
1048 /* Change LTDC peripheral state */
1049 hltdc->State = HAL_LTDC_STATE_BUSY;
1050
1051 /* Enable LTDC color lookup table by setting CLUTEN bit */
1052 LTDC_LAYER(hltdc, LayerIdx)->CR |= (uint32_t)LTDC_LxCR_CLUTEN;
1053
1054 /* Set the Immediate Reload type */
1055 hltdc->Instance->SRCR = LTDC_SRCR_IMR;
1056
1057 /* Change the LTDC state*/
1058 hltdc->State = HAL_LTDC_STATE_READY;
1059
1060 /* Process unlocked */
1061 __HAL_UNLOCK(hltdc);
1062
1063 return HAL_OK;
1064}
1065
1076{
1077 /* Check the parameters */
1078 assert_param(IS_LTDC_LAYER(LayerIdx));
1079
1080 /* Process locked */
1081 __HAL_LOCK(hltdc);
1082
1083 /* Change LTDC peripheral state */
1084 hltdc->State = HAL_LTDC_STATE_BUSY;
1085
1086 /* Disable LTDC color lookup table by setting CLUTEN bit */
1087 LTDC_LAYER(hltdc, LayerIdx)->CR &= ~(uint32_t)LTDC_LxCR_CLUTEN;
1088
1089 /* Set the Immediate Reload type */
1090 hltdc->Instance->SRCR = LTDC_SRCR_IMR;
1091
1092 /* Change the LTDC state*/
1093 hltdc->State = HAL_LTDC_STATE_READY;
1094
1095 /* Process unlocked */
1096 __HAL_UNLOCK(hltdc);
1097
1098 return HAL_OK;
1099}
1100
1109{
1110 /* Process locked */
1111 __HAL_LOCK(hltdc);
1112
1113 /* Change LTDC peripheral state */
1114 hltdc->State = HAL_LTDC_STATE_BUSY;
1115
1116 /* Enable Dither by setting DTEN bit */
1117 LTDC->GCR |= (uint32_t)LTDC_GCR_DEN;
1118
1119 /* Change the LTDC state*/
1120 hltdc->State = HAL_LTDC_STATE_READY;
1121
1122 /* Process unlocked */
1123 __HAL_UNLOCK(hltdc);
1124
1125 return HAL_OK;
1126}
1127
1136{
1137 /* Process locked */
1138 __HAL_LOCK(hltdc);
1139
1140 /* Change LTDC peripheral state */
1141 hltdc->State = HAL_LTDC_STATE_BUSY;
1142
1143 /* Disable Dither by setting DTEN bit */
1144 LTDC->GCR &= ~(uint32_t)LTDC_GCR_DEN;
1145
1146 /* Change the LTDC state*/
1147 hltdc->State = HAL_LTDC_STATE_READY;
1148
1149 /* Process unlocked */
1150 __HAL_UNLOCK(hltdc);
1151
1152 return HAL_OK;
1153}
1154
1166HAL_StatusTypeDef HAL_LTDC_SetWindowSize(LTDC_HandleTypeDef *hltdc, uint32_t XSize, uint32_t YSize, uint32_t LayerIdx)
1167{
1168 LTDC_LayerCfgTypeDef *pLayerCfg;
1169
1170 /* Check the parameters (Layers parameters)*/
1171 assert_param(IS_LTDC_LAYER(LayerIdx));
1174
1175 /* Process locked */
1176 __HAL_LOCK(hltdc);
1177
1178 /* Change LTDC peripheral state */
1179 hltdc->State = HAL_LTDC_STATE_BUSY;
1180
1181 /* Get layer configuration from handle structure */
1182 pLayerCfg = &hltdc->LayerCfg[LayerIdx];
1183
1184 /* update horizontal stop */
1185 pLayerCfg->WindowX1 = XSize + pLayerCfg->WindowX0;
1186
1187 /* update vertical stop */
1188 pLayerCfg->WindowY1 = YSize + pLayerCfg->WindowY0;
1189
1190 /* Reconfigures the color frame buffer pitch in byte */
1191 pLayerCfg->ImageWidth = XSize;
1192
1193 /* Reconfigures the frame buffer line number */
1194 pLayerCfg->ImageHeight = YSize;
1195
1196 /* Set LTDC parameters */
1197 LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx);
1198
1199 /* Set the Immediate Reload type */
1200 hltdc->Instance->SRCR = LTDC_SRCR_IMR;
1201
1202 /* Change the LTDC state*/
1203 hltdc->State = HAL_LTDC_STATE_READY;
1204
1205 /* Process unlocked */
1206 __HAL_UNLOCK(hltdc);
1207
1208 return HAL_OK;
1209}
1210
1222HAL_StatusTypeDef HAL_LTDC_SetWindowPosition(LTDC_HandleTypeDef *hltdc, uint32_t X0, uint32_t Y0, uint32_t LayerIdx)
1223{
1224 LTDC_LayerCfgTypeDef *pLayerCfg;
1225
1226 /* Check the parameters */
1227 assert_param(IS_LTDC_LAYER(LayerIdx));
1230
1231 /* Process locked */
1232 __HAL_LOCK(hltdc);
1233
1234 /* Change LTDC peripheral state */
1235 hltdc->State = HAL_LTDC_STATE_BUSY;
1236
1237 /* Get layer configuration from handle structure */
1238 pLayerCfg = &hltdc->LayerCfg[LayerIdx];
1239
1240 /* update horizontal start/stop */
1241 pLayerCfg->WindowX0 = X0;
1242 pLayerCfg->WindowX1 = X0 + pLayerCfg->ImageWidth;
1243
1244 /* update vertical start/stop */
1245 pLayerCfg->WindowY0 = Y0;
1246 pLayerCfg->WindowY1 = Y0 + pLayerCfg->ImageHeight;
1247
1248 /* Set LTDC parameters */
1249 LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx);
1250
1251 /* Set the Immediate Reload type */
1252 hltdc->Instance->SRCR = LTDC_SRCR_IMR;
1253
1254 /* Change the LTDC state*/
1255 hltdc->State = HAL_LTDC_STATE_READY;
1256
1257 /* Process unlocked */
1258 __HAL_UNLOCK(hltdc);
1259
1260 return HAL_OK;
1261}
1262
1273HAL_StatusTypeDef HAL_LTDC_SetPixelFormat(LTDC_HandleTypeDef *hltdc, uint32_t Pixelformat, uint32_t LayerIdx)
1274{
1275 LTDC_LayerCfgTypeDef *pLayerCfg;
1276
1277 /* Check the parameters */
1278 assert_param(IS_LTDC_PIXEL_FORMAT(Pixelformat));
1279 assert_param(IS_LTDC_LAYER(LayerIdx));
1280
1281 /* Process locked */
1282 __HAL_LOCK(hltdc);
1283
1284 /* Change LTDC peripheral state */
1285 hltdc->State = HAL_LTDC_STATE_BUSY;
1286
1287 /* Get layer configuration from handle structure */
1288 pLayerCfg = &hltdc->LayerCfg[LayerIdx];
1289
1290 /* Reconfigure the pixel format */
1291 pLayerCfg->PixelFormat = Pixelformat;
1292
1293 /* Set LTDC parameters */
1294 LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx);
1295
1296 /* Set the Immediate Reload type */
1297 hltdc->Instance->SRCR = LTDC_SRCR_IMR;
1298
1299 /* Change the LTDC state*/
1300 hltdc->State = HAL_LTDC_STATE_READY;
1301
1302 /* Process unlocked */
1303 __HAL_UNLOCK(hltdc);
1304
1305 return HAL_OK;
1306}
1307
1318HAL_StatusTypeDef HAL_LTDC_SetAlpha(LTDC_HandleTypeDef *hltdc, uint32_t Alpha, uint32_t LayerIdx)
1319{
1320 LTDC_LayerCfgTypeDef *pLayerCfg;
1321
1322 /* Check the parameters */
1324 assert_param(IS_LTDC_LAYER(LayerIdx));
1325
1326 /* Process locked */
1327 __HAL_LOCK(hltdc);
1328
1329 /* Change LTDC peripheral state */
1330 hltdc->State = HAL_LTDC_STATE_BUSY;
1331
1332 /* Get layer configuration from handle structure */
1333 pLayerCfg = &hltdc->LayerCfg[LayerIdx];
1334
1335 /* Reconfigure the Alpha value */
1336 pLayerCfg->Alpha = Alpha;
1337
1338 /* Set LTDC parameters */
1339 LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx);
1340
1341 /* Set the Immediate Reload type */
1342 hltdc->Instance->SRCR = LTDC_SRCR_IMR;
1343
1344 /* Change the LTDC state*/
1345 hltdc->State = HAL_LTDC_STATE_READY;
1346
1347 /* Process unlocked */
1348 __HAL_UNLOCK(hltdc);
1349
1350 return HAL_OK;
1351}
1362HAL_StatusTypeDef HAL_LTDC_SetAddress(LTDC_HandleTypeDef *hltdc, uint32_t Address, uint32_t LayerIdx)
1363{
1364 LTDC_LayerCfgTypeDef *pLayerCfg;
1365
1366 /* Check the parameters */
1367 assert_param(IS_LTDC_LAYER(LayerIdx));
1368
1369 /* Process locked */
1370 __HAL_LOCK(hltdc);
1371
1372 /* Change LTDC peripheral state */
1373 hltdc->State = HAL_LTDC_STATE_BUSY;
1374
1375 /* Get layer configuration from handle structure */
1376 pLayerCfg = &hltdc->LayerCfg[LayerIdx];
1377
1378 /* Reconfigure the Address */
1379 pLayerCfg->FBStartAdress = Address;
1380
1381 /* Set LTDC parameters */
1382 LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx);
1383
1384 /* Set the Immediate Reload type */
1385 hltdc->Instance->SRCR = LTDC_SRCR_IMR;
1386
1387 /* Change the LTDC state*/
1388 hltdc->State = HAL_LTDC_STATE_READY;
1389
1390 /* Process unlocked */
1391 __HAL_UNLOCK(hltdc);
1392
1393 return HAL_OK;
1394}
1395
1411HAL_StatusTypeDef HAL_LTDC_SetPitch(LTDC_HandleTypeDef *hltdc, uint32_t LinePitchInPixels, uint32_t LayerIdx)
1412{
1413 uint32_t tmp;
1414 uint32_t pitchUpdate;
1415 uint32_t pixelFormat;
1416
1417 /* Check the parameters */
1418 assert_param(IS_LTDC_LAYER(LayerIdx));
1419
1420 /* Process locked */
1421 __HAL_LOCK(hltdc);
1422
1423 /* Change LTDC peripheral state */
1424 hltdc->State = HAL_LTDC_STATE_BUSY;
1425
1426 /* get LayerIdx used pixel format */
1427 pixelFormat = hltdc->LayerCfg[LayerIdx].PixelFormat;
1428
1429 if (pixelFormat == LTDC_PIXEL_FORMAT_ARGB8888)
1430 {
1431 tmp = 4U;
1432 }
1433 else if (pixelFormat == LTDC_PIXEL_FORMAT_RGB888)
1434 {
1435 tmp = 3U;
1436 }
1437 else if ((pixelFormat == LTDC_PIXEL_FORMAT_ARGB4444) || \
1438 (pixelFormat == LTDC_PIXEL_FORMAT_RGB565) || \
1439 (pixelFormat == LTDC_PIXEL_FORMAT_ARGB1555) || \
1440 (pixelFormat == LTDC_PIXEL_FORMAT_AL88))
1441 {
1442 tmp = 2U;
1443 }
1444 else
1445 {
1446 tmp = 1U;
1447 }
1448
1449 pitchUpdate = ((LinePitchInPixels * tmp) << 16U);
1450
1451 /* Clear previously set standard pitch */
1452 LTDC_LAYER(hltdc, LayerIdx)->CFBLR &= ~LTDC_LxCFBLR_CFBP;
1453
1454 /* Set the Reload type as immediate update of LTDC pitch configured above */
1455 LTDC->SRCR |= LTDC_SRCR_IMR;
1456
1457 /* Set new line pitch value */
1458 LTDC_LAYER(hltdc, LayerIdx)->CFBLR |= pitchUpdate;
1459
1460 /* Set the Reload type as immediate update of LTDC pitch configured above */
1461 LTDC->SRCR |= LTDC_SRCR_IMR;
1462
1463 /* Change the LTDC state*/
1464 hltdc->State = HAL_LTDC_STATE_READY;
1465
1466 /* Process unlocked */
1467 __HAL_UNLOCK(hltdc);
1468
1469 return HAL_OK;
1470}
1471
1481{
1482 /* Check the parameters */
1484
1485 /* Process locked */
1486 __HAL_LOCK(hltdc);
1487
1488 /* Change LTDC peripheral state */
1489 hltdc->State = HAL_LTDC_STATE_BUSY;
1490
1491 /* Disable the Line interrupt */
1493
1494 /* Set the Line Interrupt position */
1495 LTDC->LIPCR = (uint32_t)Line;
1496
1497 /* Enable the Line interrupt */
1499
1500 /* Change the LTDC state*/
1501 hltdc->State = HAL_LTDC_STATE_READY;
1502
1503 /* Process unlocked */
1504 __HAL_UNLOCK(hltdc);
1505
1506 return HAL_OK;
1507}
1508
1520{
1521 /* Check the parameters */
1522 assert_param(IS_LTDC_RELOAD(ReloadType));
1523
1524 /* Process locked */
1525 __HAL_LOCK(hltdc);
1526
1527 /* Change LTDC peripheral state */
1528 hltdc->State = HAL_LTDC_STATE_BUSY;
1529
1530 /* Enable the Reload interrupt */
1532
1533 /* Apply Reload type */
1534 hltdc->Instance->SRCR = ReloadType;
1535
1536 /* Change the LTDC state*/
1537 hltdc->State = HAL_LTDC_STATE_READY;
1538
1539 /* Process unlocked */
1540 __HAL_UNLOCK(hltdc);
1541
1542 return HAL_OK;
1543}
1544
1559 uint32_t LayerIdx)
1560{
1561 /* Check the parameters */
1562 assert_param(IS_LTDC_LAYER(LayerIdx));
1568 assert_param(IS_LTDC_ALPHA(pLayerCfg->Alpha));
1569 assert_param(IS_LTDC_ALPHA(pLayerCfg->Alpha0));
1574
1575 /* Process locked */
1576 __HAL_LOCK(hltdc);
1577
1578 /* Change LTDC peripheral state */
1579 hltdc->State = HAL_LTDC_STATE_BUSY;
1580
1581 /* Copy new layer configuration into handle structure */
1582 hltdc->LayerCfg[LayerIdx] = *pLayerCfg;
1583
1584 /* Configure the LTDC Layer */
1585 LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx);
1586
1587 /* Initialize the LTDC state*/
1588 hltdc->State = HAL_LTDC_STATE_READY;
1589
1590 /* Process unlocked */
1591 __HAL_UNLOCK(hltdc);
1592
1593 return HAL_OK;
1594}
1595
1609 uint32_t LayerIdx)
1610{
1611 LTDC_LayerCfgTypeDef *pLayerCfg;
1612
1613 /* Check the parameters (Layers parameters)*/
1614 assert_param(IS_LTDC_LAYER(LayerIdx));
1617
1618 /* Process locked */
1619 __HAL_LOCK(hltdc);
1620
1621 /* Change LTDC peripheral state */
1622 hltdc->State = HAL_LTDC_STATE_BUSY;
1623
1624 /* Get layer configuration from handle structure */
1625 pLayerCfg = &hltdc->LayerCfg[LayerIdx];
1626
1627 /* update horizontal stop */
1628 pLayerCfg->WindowX1 = XSize + pLayerCfg->WindowX0;
1629
1630 /* update vertical stop */
1631 pLayerCfg->WindowY1 = YSize + pLayerCfg->WindowY0;
1632
1633 /* Reconfigures the color frame buffer pitch in byte */
1634 pLayerCfg->ImageWidth = XSize;
1635
1636 /* Reconfigures the frame buffer line number */
1637 pLayerCfg->ImageHeight = YSize;
1638
1639 /* Set LTDC parameters */
1640 LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx);
1641
1642 /* Change the LTDC state*/
1643 hltdc->State = HAL_LTDC_STATE_READY;
1644
1645 /* Process unlocked */
1646 __HAL_UNLOCK(hltdc);
1647
1648 return HAL_OK;
1649}
1650
1664 uint32_t LayerIdx)
1665{
1666 LTDC_LayerCfgTypeDef *pLayerCfg;
1667
1668 /* Check the parameters */
1669 assert_param(IS_LTDC_LAYER(LayerIdx));
1672
1673 /* Process locked */
1674 __HAL_LOCK(hltdc);
1675
1676 /* Change LTDC peripheral state */
1677 hltdc->State = HAL_LTDC_STATE_BUSY;
1678
1679 /* Get layer configuration from handle structure */
1680 pLayerCfg = &hltdc->LayerCfg[LayerIdx];
1681
1682 /* update horizontal start/stop */
1683 pLayerCfg->WindowX0 = X0;
1684 pLayerCfg->WindowX1 = X0 + pLayerCfg->ImageWidth;
1685
1686 /* update vertical start/stop */
1687 pLayerCfg->WindowY0 = Y0;
1688 pLayerCfg->WindowY1 = Y0 + pLayerCfg->ImageHeight;
1689
1690 /* Set LTDC parameters */
1691 LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx);
1692
1693 /* Change the LTDC state*/
1694 hltdc->State = HAL_LTDC_STATE_READY;
1695
1696 /* Process unlocked */
1697 __HAL_UNLOCK(hltdc);
1698
1699 return HAL_OK;
1700}
1701
1713HAL_StatusTypeDef HAL_LTDC_SetPixelFormat_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t Pixelformat, uint32_t LayerIdx)
1714{
1715 LTDC_LayerCfgTypeDef *pLayerCfg;
1716
1717 /* Check the parameters */
1718 assert_param(IS_LTDC_PIXEL_FORMAT(Pixelformat));
1719 assert_param(IS_LTDC_LAYER(LayerIdx));
1720
1721 /* Process locked */
1722 __HAL_LOCK(hltdc);
1723
1724 /* Change LTDC peripheral state */
1725 hltdc->State = HAL_LTDC_STATE_BUSY;
1726
1727 /* Get layer configuration from handle structure */
1728 pLayerCfg = &hltdc->LayerCfg[LayerIdx];
1729
1730 /* Reconfigure the pixel format */
1731 pLayerCfg->PixelFormat = Pixelformat;
1732
1733 /* Set LTDC parameters */
1734 LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx);
1735
1736 /* Change the LTDC state*/
1737 hltdc->State = HAL_LTDC_STATE_READY;
1738
1739 /* Process unlocked */
1740 __HAL_UNLOCK(hltdc);
1741
1742 return HAL_OK;
1743}
1744
1756HAL_StatusTypeDef HAL_LTDC_SetAlpha_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t Alpha, uint32_t LayerIdx)
1757{
1758 LTDC_LayerCfgTypeDef *pLayerCfg;
1759
1760 /* Check the parameters */
1762 assert_param(IS_LTDC_LAYER(LayerIdx));
1763
1764 /* Process locked */
1765 __HAL_LOCK(hltdc);
1766
1767 /* Change LTDC peripheral state */
1768 hltdc->State = HAL_LTDC_STATE_BUSY;
1769
1770 /* Get layer configuration from handle structure */
1771 pLayerCfg = &hltdc->LayerCfg[LayerIdx];
1772
1773 /* Reconfigure the Alpha value */
1774 pLayerCfg->Alpha = Alpha;
1775
1776 /* Set LTDC parameters */
1777 LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx);
1778
1779 /* Change the LTDC state*/
1780 hltdc->State = HAL_LTDC_STATE_READY;
1781
1782 /* Process unlocked */
1783 __HAL_UNLOCK(hltdc);
1784
1785 return HAL_OK;
1786}
1787
1799HAL_StatusTypeDef HAL_LTDC_SetAddress_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t Address, uint32_t LayerIdx)
1800{
1801 LTDC_LayerCfgTypeDef *pLayerCfg;
1802
1803 /* Check the parameters */
1804 assert_param(IS_LTDC_LAYER(LayerIdx));
1805
1806 /* Process locked */
1807 __HAL_LOCK(hltdc);
1808
1809 /* Change LTDC peripheral state */
1810 hltdc->State = HAL_LTDC_STATE_BUSY;
1811
1812 /* Get layer configuration from handle structure */
1813 pLayerCfg = &hltdc->LayerCfg[LayerIdx];
1814
1815 /* Reconfigure the Address */
1816 pLayerCfg->FBStartAdress = Address;
1817
1818 /* Set LTDC parameters */
1819 LTDC_SetConfig(hltdc, pLayerCfg, LayerIdx);
1820
1821 /* Change the LTDC state*/
1822 hltdc->State = HAL_LTDC_STATE_READY;
1823
1824 /* Process unlocked */
1825 __HAL_UNLOCK(hltdc);
1826
1827 return HAL_OK;
1828}
1829
1846HAL_StatusTypeDef HAL_LTDC_SetPitch_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t LinePitchInPixels, uint32_t LayerIdx)
1847{
1848 uint32_t tmp;
1849 uint32_t pitchUpdate;
1850 uint32_t pixelFormat;
1851
1852 /* Check the parameters */
1853 assert_param(IS_LTDC_LAYER(LayerIdx));
1854
1855 /* Process locked */
1856 __HAL_LOCK(hltdc);
1857
1858 /* Change LTDC peripheral state */
1859 hltdc->State = HAL_LTDC_STATE_BUSY;
1860
1861 /* get LayerIdx used pixel format */
1862 pixelFormat = hltdc->LayerCfg[LayerIdx].PixelFormat;
1863
1864 if (pixelFormat == LTDC_PIXEL_FORMAT_ARGB8888)
1865 {
1866 tmp = 4U;
1867 }
1868 else if (pixelFormat == LTDC_PIXEL_FORMAT_RGB888)
1869 {
1870 tmp = 3U;
1871 }
1872 else if ((pixelFormat == LTDC_PIXEL_FORMAT_ARGB4444) || \
1873 (pixelFormat == LTDC_PIXEL_FORMAT_RGB565) || \
1874 (pixelFormat == LTDC_PIXEL_FORMAT_ARGB1555) || \
1875 (pixelFormat == LTDC_PIXEL_FORMAT_AL88))
1876 {
1877 tmp = 2U;
1878 }
1879 else
1880 {
1881 tmp = 1U;
1882 }
1883
1884 pitchUpdate = ((LinePitchInPixels * tmp) << 16U);
1885
1886 /* Clear previously set standard pitch */
1887 LTDC_LAYER(hltdc, LayerIdx)->CFBLR &= ~LTDC_LxCFBLR_CFBP;
1888
1889 /* Set new line pitch value */
1890 LTDC_LAYER(hltdc, LayerIdx)->CFBLR |= pitchUpdate;
1891
1892 /* Change the LTDC state*/
1893 hltdc->State = HAL_LTDC_STATE_READY;
1894
1895 /* Process unlocked */
1896 __HAL_UNLOCK(hltdc);
1897
1898 return HAL_OK;
1899}
1900
1901
1914{
1915 /* Check the parameters */
1916 assert_param(IS_LTDC_LAYER(LayerIdx));
1917
1918 /* Process locked */
1919 __HAL_LOCK(hltdc);
1920
1921 /* Change LTDC peripheral state */
1922 hltdc->State = HAL_LTDC_STATE_BUSY;
1923
1924 /* Configure the default color values */
1925 LTDC_LAYER(hltdc, LayerIdx)->CKCR &= ~(LTDC_LxCKCR_CKBLUE | LTDC_LxCKCR_CKGREEN | LTDC_LxCKCR_CKRED);
1926 LTDC_LAYER(hltdc, LayerIdx)->CKCR = RGBValue;
1927
1928 /* Change the LTDC state*/
1929 hltdc->State = HAL_LTDC_STATE_READY;
1930
1931 /* Process unlocked */
1932 __HAL_UNLOCK(hltdc);
1933
1934 return HAL_OK;
1935}
1936
1948{
1949 /* Check the parameters */
1950 assert_param(IS_LTDC_LAYER(LayerIdx));
1951
1952 /* Process locked */
1953 __HAL_LOCK(hltdc);
1954
1955 /* Change LTDC peripheral state */
1956 hltdc->State = HAL_LTDC_STATE_BUSY;
1957
1958 /* Enable LTDC color keying by setting COLKEN bit */
1959 LTDC_LAYER(hltdc, LayerIdx)->CR |= (uint32_t)LTDC_LxCR_COLKEN;
1960
1961 /* Change the LTDC state*/
1962 hltdc->State = HAL_LTDC_STATE_READY;
1963
1964 /* Process unlocked */
1965 __HAL_UNLOCK(hltdc);
1966
1967 return HAL_OK;
1968}
1969
1981{
1982 /* Check the parameters */
1983 assert_param(IS_LTDC_LAYER(LayerIdx));
1984
1985 /* Process locked */
1986 __HAL_LOCK(hltdc);
1987
1988 /* Change LTDC peripheral state */
1989 hltdc->State = HAL_LTDC_STATE_BUSY;
1990
1991 /* Disable LTDC color keying by setting COLKEN bit */
1992 LTDC_LAYER(hltdc, LayerIdx)->CR &= ~(uint32_t)LTDC_LxCR_COLKEN;
1993
1994 /* Change the LTDC state*/
1995 hltdc->State = HAL_LTDC_STATE_READY;
1996
1997 /* Process unlocked */
1998 __HAL_UNLOCK(hltdc);
1999
2000 return HAL_OK;
2001}
2002
2014{
2015 /* Check the parameters */
2016 assert_param(IS_LTDC_LAYER(LayerIdx));
2017
2018 /* Process locked */
2019 __HAL_LOCK(hltdc);
2020
2021 /* Change LTDC peripheral state */
2022 hltdc->State = HAL_LTDC_STATE_BUSY;
2023
2024 /* Disable LTDC color lookup table by setting CLUTEN bit */
2025 LTDC_LAYER(hltdc, LayerIdx)->CR |= (uint32_t)LTDC_LxCR_CLUTEN;
2026
2027 /* Change the LTDC state*/
2028 hltdc->State = HAL_LTDC_STATE_READY;
2029
2030 /* Process unlocked */
2031 __HAL_UNLOCK(hltdc);
2032
2033 return HAL_OK;
2034}
2035
2047{
2048 /* Check the parameters */
2049 assert_param(IS_LTDC_LAYER(LayerIdx));
2050
2051 /* Process locked */
2052 __HAL_LOCK(hltdc);
2053
2054 /* Change LTDC peripheral state */
2055 hltdc->State = HAL_LTDC_STATE_BUSY;
2056
2057 /* Disable LTDC color lookup table by setting CLUTEN bit */
2058 LTDC_LAYER(hltdc, LayerIdx)->CR &= ~(uint32_t)LTDC_LxCR_CLUTEN;
2059
2060 /* Change the LTDC state*/
2061 hltdc->State = HAL_LTDC_STATE_READY;
2062
2063 /* Process unlocked */
2064 __HAL_UNLOCK(hltdc);
2065
2066 return HAL_OK;
2067}
2068
2096{
2097 return hltdc->State;
2098}
2099
2107{
2108 return hltdc->ErrorCode;
2109}
2110
2132static void LTDC_SetConfig(LTDC_HandleTypeDef *hltdc, LTDC_LayerCfgTypeDef *pLayerCfg, uint32_t LayerIdx)
2133{
2134 uint32_t tmp;
2135 uint32_t tmp1;
2136 uint32_t tmp2;
2137
2138 /* Configure the horizontal start and stop position */
2139 tmp = ((pLayerCfg->WindowX1 + ((hltdc->Instance->BPCR & LTDC_BPCR_AHBP) >> 16U)) << 16U);
2140 LTDC_LAYER(hltdc, LayerIdx)->WHPCR &= ~(LTDC_LxWHPCR_WHSTPOS | LTDC_LxWHPCR_WHSPPOS);
2141 LTDC_LAYER(hltdc, LayerIdx)->WHPCR = ((pLayerCfg->WindowX0 + \
2142 ((hltdc->Instance->BPCR & LTDC_BPCR_AHBP) >> 16U) + 1U) | tmp);
2143
2144 /* Configure the vertical start and stop position */
2145 tmp = ((pLayerCfg->WindowY1 + (hltdc->Instance->BPCR & LTDC_BPCR_AVBP)) << 16U);
2146 LTDC_LAYER(hltdc, LayerIdx)->WVPCR &= ~(LTDC_LxWVPCR_WVSTPOS | LTDC_LxWVPCR_WVSPPOS);
2147 LTDC_LAYER(hltdc, LayerIdx)->WVPCR = ((pLayerCfg->WindowY0 + (hltdc->Instance->BPCR & LTDC_BPCR_AVBP) + 1U) | tmp);
2148
2149 /* Specifies the pixel format */
2150 LTDC_LAYER(hltdc, LayerIdx)->PFCR &= ~(LTDC_LxPFCR_PF);
2151 LTDC_LAYER(hltdc, LayerIdx)->PFCR = (pLayerCfg->PixelFormat);
2152
2153 /* Configure the default color values */
2154 tmp = ((uint32_t)(pLayerCfg->Backcolor.Green) << 8U);
2155 tmp1 = ((uint32_t)(pLayerCfg->Backcolor.Red) << 16U);
2156 tmp2 = (pLayerCfg->Alpha0 << 24U);
2157 LTDC_LAYER(hltdc, LayerIdx)->DCCR &= ~(LTDC_LxDCCR_DCBLUE | LTDC_LxDCCR_DCGREEN | LTDC_LxDCCR_DCRED |
2158 LTDC_LxDCCR_DCALPHA);
2159 LTDC_LAYER(hltdc, LayerIdx)->DCCR = (pLayerCfg->Backcolor.Blue | tmp | tmp1 | tmp2);
2160
2161 /* Specifies the constant alpha value */
2162 LTDC_LAYER(hltdc, LayerIdx)->CACR &= ~(LTDC_LxCACR_CONSTA);
2163 LTDC_LAYER(hltdc, LayerIdx)->CACR = (pLayerCfg->Alpha);
2164
2165 /* Specifies the blending factors */
2166 LTDC_LAYER(hltdc, LayerIdx)->BFCR &= ~(LTDC_LxBFCR_BF2 | LTDC_LxBFCR_BF1);
2167 LTDC_LAYER(hltdc, LayerIdx)->BFCR = (pLayerCfg->BlendingFactor1 | pLayerCfg->BlendingFactor2);
2168
2169 /* Configure the color frame buffer start address */
2170 LTDC_LAYER(hltdc, LayerIdx)->CFBAR &= ~(LTDC_LxCFBAR_CFBADD);
2171 LTDC_LAYER(hltdc, LayerIdx)->CFBAR = (pLayerCfg->FBStartAdress);
2172
2173 if (pLayerCfg->PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888)
2174 {
2175 tmp = 4U;
2176 }
2177 else if (pLayerCfg->PixelFormat == LTDC_PIXEL_FORMAT_RGB888)
2178 {
2179 tmp = 3U;
2180 }
2181 else if ((pLayerCfg->PixelFormat == LTDC_PIXEL_FORMAT_ARGB4444) || \
2182 (pLayerCfg->PixelFormat == LTDC_PIXEL_FORMAT_RGB565) || \
2183 (pLayerCfg->PixelFormat == LTDC_PIXEL_FORMAT_ARGB1555) || \
2184 (pLayerCfg->PixelFormat == LTDC_PIXEL_FORMAT_AL88))
2185 {
2186 tmp = 2U;
2187 }
2188 else
2189 {
2190 tmp = 1U;
2191 }
2192
2193 /* Configure the color frame buffer pitch in byte */
2194 LTDC_LAYER(hltdc, LayerIdx)->CFBLR &= ~(LTDC_LxCFBLR_CFBLL | LTDC_LxCFBLR_CFBP);
2195 LTDC_LAYER(hltdc, LayerIdx)->CFBLR = (((pLayerCfg->ImageWidth * tmp) << 16U) | \
2196 (((pLayerCfg->WindowX1 - pLayerCfg->WindowX0) * tmp) + 3U));
2197 /* Configure the frame buffer line number */
2198 LTDC_LAYER(hltdc, LayerIdx)->CFBLNR &= ~(LTDC_LxCFBLNR_CFBLNBR);
2199 LTDC_LAYER(hltdc, LayerIdx)->CFBLNR = (pLayerCfg->ImageHeight);
2200
2201 /* Enable LTDC_Layer by setting LEN bit */
2202 LTDC_LAYER(hltdc, LayerIdx)->CR |= (uint32_t)LTDC_LxCR_LEN;
2203}
2204
2214#endif /* LTDC */
2215
2216#endif /* HAL_LTDC_MODULE_ENABLED */
2217
uint32_t HAL_GetTick(void)
Provides a tick value in millisecond.
#define HAL_LTDC_ERROR_FU
#define HAL_LTDC_ERROR_TE
#define HAL_LTDC_ERROR_NONE
HAL_StatusTypeDef HAL_LTDC_Init(LTDC_HandleTypeDef *hltdc)
Initialize the LTDC according to the specified parameters in the LTDC_InitTypeDef.
void HAL_LTDC_MspDeInit(LTDC_HandleTypeDef *hltdc)
De-initialize the LTDC MSP.
void HAL_LTDC_MspInit(LTDC_HandleTypeDef *hltdc)
Initialize the LTDC MSP.
HAL_StatusTypeDef HAL_LTDC_DeInit(LTDC_HandleTypeDef *hltdc)
De-initialize the LTDC peripheral.
__weak void HAL_LTDC_ReloadEventCallback(LTDC_HandleTypeDef *hltdc)
Reload Event callback.
void HAL_LTDC_IRQHandler(LTDC_HandleTypeDef *hltdc)
Handle LTDC interrupt request.
__weak void HAL_LTDC_LineEventCallback(LTDC_HandleTypeDef *hltdc)
Line Event callback.
__weak void HAL_LTDC_ErrorCallback(LTDC_HandleTypeDef *hltdc)
Error LTDC callback.
HAL_StatusTypeDef HAL_LTDC_ConfigColorKeying(LTDC_HandleTypeDef *hltdc, uint32_t RGBValue, uint32_t LayerIdx)
Configure the color keying.
HAL_StatusTypeDef HAL_LTDC_DisableDither(LTDC_HandleTypeDef *hltdc)
Disable Dither.
HAL_StatusTypeDef HAL_LTDC_SetPixelFormat(LTDC_HandleTypeDef *hltdc, uint32_t Pixelformat, uint32_t LayerIdx)
Reconfigure the pixel format.
HAL_StatusTypeDef HAL_LTDC_EnableColorKeying_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx)
Enable the color keying without reloading. Variant of the function HAL_LTDC_EnableColorKeying without...
HAL_StatusTypeDef HAL_LTDC_SetAddress_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t Address, uint32_t LayerIdx)
Reconfigure the frame buffer Address without reloading. Variant of the function HAL_LTDC_SetAddress w...
HAL_StatusTypeDef HAL_LTDC_EnableDither(LTDC_HandleTypeDef *hltdc)
Enable Dither.
HAL_StatusTypeDef HAL_LTDC_SetAddress(LTDC_HandleTypeDef *hltdc, uint32_t Address, uint32_t LayerIdx)
Reconfigure the frame buffer Address.
HAL_StatusTypeDef HAL_LTDC_SetWindowPosition(LTDC_HandleTypeDef *hltdc, uint32_t X0, uint32_t Y0, uint32_t LayerIdx)
Set the LTDC window position.
HAL_StatusTypeDef HAL_LTDC_Reload(LTDC_HandleTypeDef *hltdc, uint32_t ReloadType)
Reload LTDC Layers configuration.
HAL_StatusTypeDef HAL_LTDC_ConfigLayer_NoReload(LTDC_HandleTypeDef *hltdc, LTDC_LayerCfgTypeDef *pLayerCfg, uint32_t LayerIdx)
Configure the LTDC Layer according to the specified without reloading parameters in the LTDC_InitType...
HAL_StatusTypeDef HAL_LTDC_SetAlpha_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t Alpha, uint32_t LayerIdx)
Reconfigure the layer alpha value without reloading. Variant of the function HAL_LTDC_SetAlpha withou...
HAL_StatusTypeDef HAL_LTDC_EnableCLUT(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx)
Enable the color lookup table.
HAL_StatusTypeDef HAL_LTDC_EnableCLUT_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx)
Enable the color lookup table without reloading. Variant of the function HAL_LTDC_EnableCLUT without ...
HAL_StatusTypeDef HAL_LTDC_DisableColorKeying(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx)
Disable the color keying.
HAL_StatusTypeDef HAL_LTDC_ConfigLayer(LTDC_HandleTypeDef *hltdc, LTDC_LayerCfgTypeDef *pLayerCfg, uint32_t LayerIdx)
Configure the LTDC Layer according to the specified parameters in the LTDC_InitTypeDef and create the...
HAL_StatusTypeDef HAL_LTDC_SetPitch(LTDC_HandleTypeDef *hltdc, uint32_t LinePitchInPixels, uint32_t LayerIdx)
Function used to reconfigure the pitch for specific cases where the attached LayerIdx buffer have a w...
HAL_StatusTypeDef HAL_LTDC_SetAlpha(LTDC_HandleTypeDef *hltdc, uint32_t Alpha, uint32_t LayerIdx)
Reconfigure the layer alpha value.
HAL_StatusTypeDef HAL_LTDC_EnableColorKeying(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx)
Enable the color keying.
HAL_StatusTypeDef HAL_LTDC_SetWindowPosition_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t X0, uint32_t Y0, uint32_t LayerIdx)
Set the LTDC window position without reloading. Variant of the function HAL_LTDC_SetWindowPosition wi...
HAL_StatusTypeDef HAL_LTDC_ProgramLineEvent(LTDC_HandleTypeDef *hltdc, uint32_t Line)
Define the position of the line interrupt.
HAL_StatusTypeDef HAL_LTDC_SetWindowSize_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t XSize, uint32_t YSize, uint32_t LayerIdx)
Set the LTDC window size without reloading. Variant of the function HAL_LTDC_SetWindowSize without im...
HAL_StatusTypeDef HAL_LTDC_DisableColorKeying_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx)
Disable the color keying without reloading. Variant of the function HAL_LTDC_DisableColorKeying witho...
HAL_StatusTypeDef HAL_LTDC_SetPixelFormat_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t Pixelformat, uint32_t LayerIdx)
Reconfigure the pixel format without reloading. Variant of the function HAL_LTDC_SetPixelFormat witho...
HAL_StatusTypeDef HAL_LTDC_ConfigColorKeying_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t RGBValue, uint32_t LayerIdx)
Configure the color keying without reloading. Variant of the function HAL_LTDC_ConfigColorKeying with...
HAL_StatusTypeDef HAL_LTDC_ConfigCLUT(LTDC_HandleTypeDef *hltdc, uint32_t *pCLUT, uint32_t CLUTSize, uint32_t LayerIdx)
Load the color lookup table.
HAL_StatusTypeDef HAL_LTDC_SetPitch_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t LinePitchInPixels, uint32_t LayerIdx)
Function used to reconfigure the pitch for specific cases where the attached LayerIdx buffer have a w...
HAL_StatusTypeDef HAL_LTDC_DisableCLUT(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx)
Disable the color lookup table.
HAL_StatusTypeDef HAL_LTDC_DisableCLUT_NoReload(LTDC_HandleTypeDef *hltdc, uint32_t LayerIdx)
Disable the color lookup table without reloading. Variant of the function HAL_LTDC_DisableCLUT withou...
HAL_StatusTypeDef HAL_LTDC_SetWindowSize(LTDC_HandleTypeDef *hltdc, uint32_t XSize, uint32_t YSize, uint32_t LayerIdx)
Set the LTDC window size.
HAL_LTDC_StateTypeDef HAL_LTDC_GetState(LTDC_HandleTypeDef *hltdc)
Return the LTDC handle state.
uint32_t HAL_LTDC_GetError(LTDC_HandleTypeDef *hltdc)
Return the LTDC handle error code.
#define __HAL_LTDC_VERTICAL_BLANKING_RELOAD_CONFIG(__HANDLE__)
Reload during vertical blanking period all LTDC Layers.
#define __HAL_LTDC_LAYER_DISABLE(__HANDLE__, __LAYER__)
Disable the LTDC Layer.
#define __HAL_LTDC_DISABLE_IT(__HANDLE__, __INTERRUPT__)
Disables the specified LTDC interrupts.
#define __HAL_LTDC_ENABLE(__HANDLE__)
Enable the LTDC.
#define __HAL_LTDC_CLEAR_FLAG(__HANDLE__, __FLAG__)
Clears the LTDC pending flags.
#define __HAL_LTDC_ENABLE_IT(__HANDLE__, __INTERRUPT__)
Enables the specified LTDC interrupts.
#define __HAL_LTDC_DISABLE(__HANDLE__)
Disable the LTDC.
HAL_LTDC_StateTypeDef
HAL LTDC State structures definition.
@ HAL_LTDC_STATE_RESET
@ HAL_LTDC_STATE_READY
@ HAL_LTDC_STATE_ERROR
@ HAL_LTDC_STATE_BUSY
#define LTDC_FLAG_LI
#define LTDC_FLAG_FU
#define LTDC_FLAG_TE
#define LTDC_FLAG_RR
#define LTDC_IT_TE
#define LTDC_IT_RR
#define LTDC_IT_FU
#define LTDC_IT_LI
#define LTDC_LAYER_1
#define LTDC_LAYER_2
#define LTDC_PIXEL_FORMAT_AL88
#define LTDC_PIXEL_FORMAT_RGB565
#define LTDC_PIXEL_FORMAT_ARGB8888
#define LTDC_PIXEL_FORMAT_ARGB4444
#define LTDC_PIXEL_FORMAT_RGB888
#define LTDC_PIXEL_FORMAT_AL44
#define LTDC_PIXEL_FORMAT_ARGB1555
#define LTDC_TIMEOUT_VALUE
#define IS_LTDC_BLENDING_FACTOR2(__BLENDING_FACTOR1__)
#define IS_LTDC_VSYNC(__VSYNC__)
#define IS_LTDC_PCPOL(__PCPOL__)
#define IS_LTDC_AHBP(__AHBP__)
#define IS_LTDC_TOTALH(__TOTALH__)
#define IS_LTDC_CFBLNBR(__CFBLNBR__)
#define IS_LTDC_VSPOL(__VSPOL__)
#define IS_LTDC_HCONFIGSP(__HCONFIGSP__)
#define IS_LTDC_BLENDING_FACTOR1(__BLENDING_FACTOR1__)
#define IS_LTDC_DEPOL(__DEPOL__)
#define IS_LTDC_AAH(__AAH__)
#define IS_LTDC_VCONFIGSP(__VCONFIGSP__)
#define IS_LTDC_ALPHA(__ALPHA__)
#define IS_LTDC_HSPOL(__HSPOL__)
#define LTDC_LAYER(__HANDLE__, __LAYER__)
#define IS_LTDC_RELOAD(__RELOADTYPE__)
#define IS_LTDC_CFBLL(__CFBLL__)
#define IS_LTDC_PIXEL_FORMAT(__PIXEL_FORMAT__)
#define IS_LTDC_LIPOS(__LIPOS__)
#define IS_LTDC_HSYNC(__HSYNC__)
#define IS_LTDC_HCONFIGST(__HCONFIGST__)
#define IS_LTDC_AAW(__AAW__)
#define IS_LTDC_LAYER(__LAYER__)
#define IS_LTDC_TOTALW(__TOTALW__)
#define IS_LTDC_VCONFIGST(__VCONFIGST__)
#define IS_LTDC_AVBP(__AVBP__)
static void LTDC_SetConfig(LTDC_HandleTypeDef *hltdc, LTDC_LayerCfgTypeDef *pLayerCfg, uint32_t LayerIdx)
Configure the LTDC peripheral.
#define assert_param(expr)
This file contains all the functions prototypes for the HAL module driver.
HAL_StatusTypeDef
HAL Status structures definition
@ HAL_ERROR
@ HAL_OK
#define UNUSED(X)
#define __HAL_UNLOCK(__HANDLE__)
@ HAL_UNLOCKED
#define __HAL_LOCK(__HANDLE__)
LTDC handle Structure definition.
__IO HAL_LTDC_StateTypeDef State
LTDC_InitTypeDef Init
LTDC_LayerCfgTypeDef LayerCfg[MAX_LAYER]
LTDC_ColorTypeDef Backcolor
LTDC Layer structure definition.
LTDC_ColorTypeDef Backcolor