6. External addressable flash
개요
이 단계에서는 메모리 매핑 모드에서 외부의 쿼드 또는 옥토 SPI 플래시를 활성화합니다. 외부 플래시는 애플리케이션이 대용량의 이미지를 다수 사용할 수 있도록 지원한다는 점에서 대부분의 프로젝트에 권장되고 있습니다. 내부 플래시는 사용량이 적정한 애플리케이션이라 하더라도 용량이 금새 가득차기 때문입니다.
Note
데이터가 외부 플래시에 배치될 경우 MCU에서 외부 플래시를 읽어들일 수 있어야 합니다. 최적의 성능을 얻으려면 외부 플래시가 원하는 속도(보통 최고 속도)로 실행되어야 합니다.
목표
이 섹션의 목표는 외부 플래시를 활성화하고, 이를 메모리 매핑 모드로 변경한 다음, 여기에서 데이터를 읽어오는 것입니다. 외부 플래시의 읽기 속도가 그래픽에 매우 중요하므로 읽기 속도도 테스트해야 합니다.
확인
다음은 이 섹션에서 확인해야 할 사항입니다.
확인사항 | 확인근거 |
---|---|
외부 플래시가 읽기 가능한지 여부 | 외부 플래시가 이미지 스토리지에서 사용 가능한지 여부 |
외부 플래시 성능 | 그래픽 성능이 이미지 메모리의 성능에 크게 좌우되는지 여부 |
전제 조건
다음은 이 단계에 대한 전제 조건입니다.
- 플래시 정보(일반적으로 제조사 데이터 시트의 정보)
- MCU와 외부 플래시 간 연결 정보
실행
QSPI 컨트롤러는 STM32CubeMX에 Connectivity -> QUADSPI 아래에서 구성됩니다.
이 모드 섹션에서 싱글/듀얼/쿼드 데이터 라인에 대한 플래시를 구성할 수 있습니다. 쿼드 라인이 속도가 가장 빠릅니다. 외부 RAM과 마찬가지로, 데이터 라인, 칩 및 클록 신호에서 사용되는 GPIO도 선택하여 구성해야 합니다.
블록 모드
플래시를 활성화한 후에는 플래시에서 데이터를 읽어오는 방법으로 테스트할 수 있습니다. STM32Cube 펌웨어 패키지에는 이에 대한 예시가 포함되어 있습니다.
메모리 매핑 모드
플래시를 활성화하고 블록 모드에서 이를 테스트한 후에는 반드시 메모리 매핑 모드로 변경해야 합니다. 그래야 CPU가 플래시에서 바로 데이터를 가져올 수 있습니다.
STM32 STM32Cube HAL에는 메모리 매핑 모드로 변경할 함수가 포함되어 있습니다. 여기에 예시가 나와 있습니다. 구성 데이터에 대한 데이터 시트를 참조해야 합니다. MCU를 위한 STM32Cube 펌웨어 패키지에 더 많은 예시가 포함되어 있습니다.
main.c
QSPI_CommandTypeDef s_command;
QSPI_MemoryMappedTypeDef s_mem_mapped_cfg;
/* Configure the command for the read instruction */
s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE;
s_command.Instruction = QUAD_INOUT_FAST_READ_CMD;
s_command.AddressMode = QSPI_ADDRESS_4_LINES;
s_command.AddressSize = QSPI_ADDRESS_24_BITS;
s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
s_command.DataMode = QSPI_DATA_4_LINES;
s_command.DummyCycles = N25Q128A_DUMMY_CYCLES_READ_QUAD;
s_command.DdrMode = QSPI_DDR_MODE_DISABLE;
s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
<p spaces-before="0">STM32 평가 키트 중 하나와 동일한 플래시를 사용하는 경우에는 이러한 보드를 위한 BSP 패키지(STM32Cube 펌웨어에서도 제공)에 하드웨어에서 수정이 가능한 중요 예시들이 포함되어 있습니다.</p>
<p spaces-before="0">플래시가 메모리 매핑 모드에 있을 때는 외부 RAM에서 사용한 것과 비슷한 코드를 이용해 테스트할 수 있습니다(MCU 데이터 시트에서 주소 확인).</p>
<pre><code class="cpp">volatile uint32_t *externalFlash = 0x90000000;
const uint32_t size = 1000;
volatile uint32_t result = 0;
//read external Flash
for(int i = 0; i < size; i++)
{
result += externalFlash[i];
}
이전 단계에서 수행한 메모리 성능 테스트를 재사용해서 외부 플래시의 성능도 테스트하십시오.