5. Framebuffer in external RAM
개요
이 단계에서는 내부 RAM에서 외부 RAM으로 프레임 버퍼를 이동시키고 프레임 버퍼를 디스플레이에 계속 전송할 수 있는지 확인합니다.
Note
디스플레이 컨트롤러가 전송 속도에 대한 일정 수준의 기대를 가지고 있다는 점에서 이 단계의 목표는 외부 RAM을 스트레스 테스트하는 것입니다. 이로 인해 오류가 발생할 수 있습니다. 흔히 발생하는 오류로는 외부 RAM의 대역폭이 충분히 높지 않아서 발생하는 LTDC 언더런 오류나, RAM이 잘못 구성되어 '사양에 맞지 않게' 실행되면서 발생하는 픽셀 오류가 있습니다.
목표
이 단계의 목표는 내부 RAM에서 프레임 버퍼 배열을 제거하고 외부 RAM에서 프레임 버퍼를 사용하는 것입니다.
확인
다음은 이 섹션에서 확인해야 할 사항입니다. 이는 프레임 버퍼가 내부 RAM에 있을 때의 확인 사항과 비슷하지만, 외부 메모리의 속도가 디스플레이에 대한 프레임 버퍼 전송에 영향을 줄 수 있다는 점에서 다시 확인을 해야 합니다.
확인사항 | 확인근거 |
---|---|
프레임 버퍼의 표시 여부 | 디스플레이 컨트롤러 또는 SPI의 구성 및 동작 여부 |
업데이트된 프레임 버퍼의 표시 여부 | 프레임 버퍼를 반복적으로 전송하는 방법을 알고 있는지 여부 |
프레임률이 올바른지 여부 | 픽셀 클록과 포치(porch)가 필요한 프레임률을 달성할 수 있도록 구성되어 있는지 여부 |
전제 조건
다음은 이 단계에 대한 전제 조건입니다.
- 외부 RAM에서 프레임 버퍼의 주소
실행
다음 두 가지 작업을 수행하게 됩니다.
- 외부 RAM에 프레임 버퍼 배치
- 외부 RAM에서 읽어올 수 있도록 디스플레이 컨트롤러 설정
프레임 버퍼가 외부 RAM에 있을 때는 여기에 배열을 할당하지 않는 것이 일반적입니다. 올바른 주소로 포인터를 선언하기만 하면 됩니다. 그러면 외부 RAM의 주소가 수동으로 선택됩니다. 외부 RAM의 어디든 주소가 될 수 있지만, 흔히 RAM의 시작 주소가 사용됩니다.
main.c
uint16_t* framebuffer = (uint16_t*)0xC0000000; //16 bpp framebuffer
내부 표시 단계에서 생성한 소규모 테스트 프로그램을 재사용할 수 있습니다.
LTDC 계층 구성
반드시 LTDC 계층의 구성을 변경해야 합니다. 이제 프레임 버퍼에 대한 특정 주소가 생성되었으므로 CubeMX에 이 주소(컬러 프레임 버퍼 시작 주소)를 삽입할 수 있습니다
프로그램 및 프레임 버퍼 어레이에서 이 라인을 반드시 제거해야 합니다.
main.c
/* USER CODE BEGIN 2 */
HAL_LTDC_SetAddress(&hltdc, framebuffer, LTDC_LAYER_1);
/* USER CODE END 2 */
LTDC 계층 크기가 03 단계에서 디스플레이의 일부만 업데이트하도록 설정된 경우(내부 RAM의 용량으로 인해) 에는 이를 재실행해야 합니다. 전체 디스플레이가 포함되도록 LTDC 계층을 다시 구성하십시오.