STM32 마이크로컨트롤러의 FSMC(Flexible Static Memory Controller)를 사용하여 ILI9341 TFT LCD를 구동할 때 발생하는 일반적인 문제는 전원을 껐다가 다시 켰을 때 디스플레이가 정상적으로 작동하지 않는 현상이다. 이 문제는 코드가 처음 실행되거나 디버깅 중에는 잘 동작하나, 전원 사이클 이후에는 예기치 못한 동작을 보인다.
다음은 FSMC 인터페이스 설정에 사용된 초기화 함수이다:
void setup_display_interface(void)
{
FSMC_NORSRAMInitTypeDef interface_config;
FSMC_NORSRAMTimingInitTypeDef timing_params;
timing_params.FSMC_AddressSetupTime = 0x02;
timing_params.FSMC_AddressHoldTime = 0x00;
timing_params.FSMC_DataSetupTime = 0x05;
timing_params.FSMC_BusTurnAroundDuration = 0x00;
timing_params.FSMC_CLKDivision = 0x00;
timing_params.FSMC_DataLatency = 0x00;
timing_params.FSMC_AccessMode = FSMC_AccessMode_B;
interface_config.FSMC_Bank = FSMC_Bank1_NORSRAM1;
interface_config.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
interface_config.FSMC_MemoryType = FSMC_MemoryType_NOR;
interface_config.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
interface_config.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
interface_config.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
interface_config.FSMC_WrapMode = FSMC_WrapMode_Disable;
interface_config.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
interface_config.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
interface_config.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
interface_config.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
interface_config.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
interface_config.FSMC_ReadWriteTimingStruct = &timing_params;
interface_config.FSMC_WriteTimingStruct = &timing_params;
FSMC_NORSRAMInit(&interface_config);
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
}
해결책은 FSMC 설정 구조체를 라이브러리 기본값으로 먼저 초기화한 후 필요한 값만 덮어쓰는 것이다:
void setup_display_interface_fixed(void)
{
FSMC_NORSRAMInitTypeDef interface_config;
FSMC_NORSRAMTimingInitTypeDef timing_params;
// 구조체를 기본값으로 초기화
FSMC_NORSRAMStructInit(&interface_config);
timing_params.FSMC_AddressSetupTime = 0x02;
timing_params.FSMC_AddressHoldTime = 0x00;
timing_params.FSMC_DataSetupTime = 0x05;
timing_params.FSMC_BusTurnAroundDuration = 0x00;
timing_params.FSMC_CLKDivision = 0x00;
timing_params.FSMC_DataLatency = 0x00;
timing_params.FSMC_AccessMode = FSMC_AccessMode_B;
interface_config.FSMC_Bank = FSMC_Bank1_NORSRAM1;
interface_config.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
interface_config.FSMC_MemoryType = FSMC_MemoryType_NOR;
interface_config.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
interface_config.FSMC_ReadWriteTimingStruct = &timing_params;
interface_config.FSMC_WriteTimingStruct = &timing_params;
FSMC_NORSRAMInit(&interface_config);
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
}
이 문제가 발생하는 이유는 지역 변수로 선언된 구조체(interface_config)가 스택에 할당될 때 초기화되지 않은 상태로 남아 있기 때문이다. 이러한 미정의 값들이 FSMC 설정에 영향을 미쳐 전원 재시작 시 일관성 없는 동작을 유발한다. 모든 필드 값을 명시적으로 설정하지 않으면, 임의의 메모리 값이 하드웨어 설정에 반영되어 예측 불가능한 결과를 초래할 수 있다.