Перейти к содержанию
    

LTDC - как же правильно организовать тут 'vertical blank interrupt' (HAL и пр.)?

Помогите кто в теме. Не получается пока что сделать нормальное прерывание типа 'vertical blank interrupt' (VBI) или V-SYNC (так ли?) на LTDC.

Пока что разбираюсь тут средствами/методами HAL.

У LTDC есть всего 2 подходящих прерывания :

Цитата

• Line interrupt   -  generated when a programmed line is reached. The line interrupt position is programmed in the LTDC_LIPCR register

• Register Reload interrupt - generated when the shadow registers reload was performed during the vertical blanking period

Еще есть и такие прерывания у LTDC:

Цитата

• FIFO Underrun interrupt - generated when a pixel is requested from an empty layer FIFO

• Transfer Error interrupt - generated when an AHB bus error occurs during data transfer

Мне нужно прерывание по окончании выдачи всех данных текущего фрейма на LCD индикатор во время "паузы" и "обратного хода луча". Даже у STM-щиков есть красивые слова по этому поводу:

Цитата

                        4.5.4 Framebuffer content update during BLANKING period

A way to optimize graphic performance (especially when the performance bottleneck is the framebuffer memory bandwidth), is to update the framebuffer content during the blanking period. Since in this period the LTDC is not fetching any pixel data from the framebuffer, the bus bandwidth is relaxed and it allows the update of the framebuffer.

Вот такие вещи можно сделать средствами HAL: включаем глобальное прерывание у LTDC и вызываем готовые процедуры:

/**
 * @brief  Define the position of the line interrupt.
 * @param  hltdc   pointer to a LTDC_HandleTypeDef structure that contains
 *                 the configuration information for the LTDC.
 * @param  Line    Line Interrupt Position.
 * @note   User application may resort to HAL_LTDC_LineEventCallback() at line interrupt generation.
 * @retval  HAL status
 */
HAL_StatusTypeDef HAL_LTDC_ProgramLineEvent(LTDC_HandleTypeDef* hltdc, uint32_t Line);

И тут, для ЖКИ скажем 800x480 (ширина X высота) параметр 'Line' может быть до 800 (!) и самое интересное возникает такое прерывание в конце (!) каждой строки.

Вот у меня код соотв. колбека для этого:

void HAL_LTDC_LineEventCallback(LTDC_HandleTypeDef* hltdc)
{
	g_uFrameStarted = 1;

	/* Change the buffer address to the next one */
	jpegOutDataAddress = (jpegOutDataAddress == JPEG_OUTPUT_DATA_BUFFER0) ?
			JPEG_OUTPUT_DATA_BUFFER1 : JPEG_OUTPUT_DATA_BUFFER0;

	/* Change the layer (for DMA2D copy and active on LCD) */
	if (dma2dCopyDstAddress == LCD_START_ADDR_LAYER_1)
	{
		dma2dCopyDstAddress = LCD_START_ADDR_LAYER_0;

		/* now on the LCD active layer is LCD_START_ADDR_LAYER_1 */
		__HAL_LTDC_LAYER_DISABLE(hltdc, 0);
		__HAL_LTDC_LAYER_ENABLE(hltdc, 1);
	}
	else
	{
		dma2dCopyDstAddress = LCD_START_ADDR_LAYER_1;

		/* now on the LCD active layer is LCD_START_ADDR_LAYER_0 */
		__HAL_LTDC_LAYER_DISABLE(hltdc, 1);
		__HAL_LTDC_LAYER_ENABLE(hltdc, 0);
	}

	__HAL_LTDC_RELOAD_CONFIG(hltdc);

	HAL_LTDC_ProgramLineEvent(hltdc, 800);
}

Правильно ли я тут переключаю слои? Подскажите кто в теме.

Но этот колбек вызывается в конце (!) каждой (!) строки (!). И на фига? Теперь что счетчик глобальный ставить и следить когда последняя строка будет?

А вот еще код для такого прерывания: 

Цитата

• Register Reload interrupt - generated when the shadow registers reload was performed during the vertical blanking period

для него надо уже вызывать такую готовую соотв. процедуру:


/**
 * @brief  Reload LTDC Layers configuration.
 * @param  hltdc      pointer to a LTDC_HandleTypeDef structure that contains
 *                    the configuration information for the LTDC.
 * @param  ReloadType This parameter can be one of the following values :
 *                      LTDC_RELOAD_IMMEDIATE : Immediate Reload
 *                      LTDC_RELOAD_VERTICAL_BLANKING  : Reload in the next Vertical Blanking
 * @note   User application may resort to HAL_LTDC_ReloadEventCallback() at reload interrupt generation.
 * @retval  HAL status
 */
HAL_StatusTypeDef HAL_LTDC_Reload(LTDC_HandleTypeDef* hltdc, uint32_t ReloadType);

И тут, в качестве параметра 'ReloadType' задаем 'LTDC_RELOAD_VERTICAL_BLANKING'. Но если я в соотв. коллбеке для такого прерывания напишу такой соотв. код:

void HAL_LTDC_ReloadEventCallback(LTDC_HandleTypeDef* hltdc)
{
	g_uFrameStarted = 1;

	/* Change the buffer address to the next one */
	jpegOutDataAddress = (jpegOutDataAddress == JPEG_OUTPUT_DATA_BUFFER0) ?
			JPEG_OUTPUT_DATA_BUFFER1 : JPEG_OUTPUT_DATA_BUFFER0;

	/* Change the layer (for DMA2D copy and active on LCD) */
	if (dma2dCopyDstAddress == LCD_START_ADDR_LAYER_1)
	{
		dma2dCopyDstAddress = LCD_START_ADDR_LAYER_0;

		/* now on the LCD active layer is LCD_START_ADDR_LAYER_1 */
		__HAL_LTDC_LAYER_DISABLE(hltdc, 0);
		__HAL_LTDC_LAYER_ENABLE(hltdc, 1);
	}
	else
	{
		dma2dCopyDstAddress = LCD_START_ADDR_LAYER_1;

		/* now on the LCD active layer is LCD_START_ADDR_LAYER_0 */
		__HAL_LTDC_LAYER_DISABLE(hltdc, 1);
		__HAL_LTDC_LAYER_ENABLE(hltdc, 0);
	}

	__HAL_LTDC_RELOAD_CONFIG(hltdc);

	HAL_LTDC_Reload(hltdc, LTDC_RELOAD_VERTICAL_BLANKING);
}

То у меня же возникнет опять это прерывание т.к. я тут вызываю такое (чтобы переключиться между слоями):

__HAL_LTDC_RELOAD_CONFIG(hltdc);

???

Помогите пожалуйста с примером/наброском куска правильного кода для организации прерывания "обратного хода луча" тут. У STM-щиков примеров на эту тему вообще ничего не нашел. В Инете тоже пока что ничего такого не обнаружил. Извините если много понаписал. Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Такой еще вопрос возник (по этой же теме):

Цитата

 

Частоту Fclk для самого ЖКИ выгоднее повышать до максимума или же поменьше сделать? Чтобы больше "паузы" сделать между отрисовками?

Или лучше чтобы побыстрее все было?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...