Use the register reload interrupt instead of polling VSYNCS in CDSR
This commit is contained in:
@@ -222,15 +222,15 @@ void LCD_Init_LTDC()
|
|||||||
// init ltdc
|
// init ltdc
|
||||||
LTDC_Init(<DC_InitStruct);
|
LTDC_Init(<DC_InitStruct);
|
||||||
|
|
||||||
#if 0
|
LTDC_ITConfig(LTDC_IER_RRIE, ENABLE);
|
||||||
LTDC_ITConfig(LTDC_IER_LIE, ENABLE);
|
|
||||||
NVIC_InitTypeDef NVIC_InitStructure;
|
NVIC_InitTypeDef NVIC_InitStructure;
|
||||||
NVIC_InitStructure.NVIC_IRQChannel = LTDC_IRQn;
|
NVIC_InitStructure.NVIC_IRQChannel = LTDC_IRQn;
|
||||||
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = LTDC_IRQ_PRIO;
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = LTDC_IRQ_PRIO;
|
||||||
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; /* Not used as 4 bits are used for the pr e-emption priority. */;
|
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
|
||||||
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
||||||
NVIC_Init( &NVIC_InitStructure );
|
NVIC_Init( &NVIC_InitStructure );
|
||||||
|
|
||||||
|
#if 0
|
||||||
DMA2D_ITConfig(DMA2D_CR_TCIE, ENABLE);
|
DMA2D_ITConfig(DMA2D_CR_TCIE, ENABLE);
|
||||||
NVIC_InitStructure.NVIC_IRQChannel = DMA2D_IRQn;
|
NVIC_InitStructure.NVIC_IRQChannel = DMA2D_IRQn;
|
||||||
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = DMA_SCREEN_IRQ_PRIO;
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = DMA_SCREEN_IRQ_PRIO;
|
||||||
@@ -299,9 +299,6 @@ void LCD_LayerInit()
|
|||||||
// Enable layer and reload
|
// Enable layer and reload
|
||||||
LTDC_LayerCmd(LTDC_Layer1, ENABLE);
|
LTDC_LayerCmd(LTDC_Layer1, ENABLE);
|
||||||
LTDC_ReloadConfig(LTDC_IMReload);
|
LTDC_ReloadConfig(LTDC_IMReload);
|
||||||
|
|
||||||
/* dithering activation */
|
|
||||||
LTDC_DitherCmd(ENABLE); // ????
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void LCD_Init(void)
|
void LCD_Init(void)
|
||||||
@@ -313,6 +310,10 @@ void LCD_Init(void)
|
|||||||
/* Configure the LCD Control pins */
|
/* Configure the LCD Control pins */
|
||||||
LCD_AF_GPIOConfig();
|
LCD_AF_GPIOConfig();
|
||||||
|
|
||||||
|
// Enable LTDC IRQ in NVIC
|
||||||
|
NVIC_EnableIRQ(LTDC_IRQn);
|
||||||
|
NVIC_SetPriority(LTDC_IRQn, 7);
|
||||||
|
|
||||||
LCD_Init_LTDC();
|
LCD_Init_LTDC();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -604,6 +605,15 @@ uint16_t* lcdGetScratchBuffer()
|
|||||||
return (uint16_t*)LCD_SCRATCH_FRAME_BUFFER;
|
return (uint16_t*)LCD_SCRATCH_FRAME_BUFFER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static volatile uint8_t _frameBufferAddressReloaded = 0;
|
||||||
|
|
||||||
|
extern "C" void LTDC_IRQHandler(void)
|
||||||
|
{
|
||||||
|
// clear interrupt flag
|
||||||
|
LTDC->ICR = LTDC_ICR_CRRIF;
|
||||||
|
_frameBufferAddressReloaded = 1;
|
||||||
|
}
|
||||||
|
|
||||||
static void lcdSwitchLayers()
|
static void lcdSwitchLayers()
|
||||||
{
|
{
|
||||||
if (currentLayer == LCD_FIRST_LAYER) {
|
if (currentLayer == LCD_FIRST_LAYER) {
|
||||||
@@ -616,12 +626,12 @@ static void lcdSwitchLayers()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// reload shadow registers on vertical blank
|
// reload shadow registers on vertical blank
|
||||||
|
_frameBufferAddressReloaded = 0;
|
||||||
LTDC->SRCR = LTDC_SRCR_VBR;
|
LTDC->SRCR = LTDC_SRCR_VBR;
|
||||||
|
|
||||||
// wait for reload
|
// wait for reload
|
||||||
// TODO: replace through some smarter mechanism without busy wait
|
// TODO: replace through some smarter mechanism without busy wait
|
||||||
while ((LTDC->CDSR & LTDC_CDSR_VSYNCS) == 0);
|
while(_frameBufferAddressReloaded == 0);
|
||||||
while ((LTDC->CDSR & LTDC_CDSR_VSYNCS) == 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void lcdRefresh()
|
void lcdRefresh()
|
||||||
|
|||||||
Reference in New Issue
Block a user