STM32H7 FMC - TFT LCD 출력하기 (STM32F7 FMC와 다른점)
STM32H7 EVM 보드에는 FMC를 이용하여 기존에 제작 해 두었던 TFT LCD 모듈을 연결할 수 있도록 구성하였다. STM32H7에서 FMC로 TFC LCD 테스트를 진행 해 볼 수 있다.
![](https://t1.daumcdn.net/cfile/tistory/998CD73C5F17C08B0A)
STM32H7 의 FMC는 Data(16), WR, RD, CS, A16 핀을 할당 할 수 있다.
메모리 맵핑은 기존 STM32 시리즈와 동일하게 0x6000 0000 에 가능하다.
![](https://t1.daumcdn.net/cfile/tistory/992F31335E54A63D30)
STM32CubeMX에서 FMC 설정을 LCD Interface 타입으로 설정하여 코드 생성 한다.
![](https://t1.daumcdn.net/cfile/tistory/991B014F5F17C08B3B)
STM32H7 FMC 기본 동작 테스트
FMC 제어를 위해 STM32CubeMx의 HAL 라이브러리가 제공된다.
uint8_t BSP_SRAM_WriteData(uint32_t uwStartAddress, uint16_t *pData, uint32_t uwDataSize)
{
if(HAL_SRAM_Write_16b(&hsram1, (uint32_t *)uwStartAddress, pData, uwDataSize) != HAL_OK)
{
return SRAM_ERROR;
}
else
{
return SRAM_OK;
}
}
스코프 확인식 신호가 정상 적으로 출력 되는것을 확이 할 수 있다.
MX_FMC_Init();
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
data ^= 0x55;
addr ^= 1;
if(addr)
{
//BSP_SRAM_WriteData(LCD_BANK_ADDR, &data, 1);
_LCD_DATA(0) ^= data ;
}
else
{
//BSP_SRAM_WriteData(LCD_BANK_ADDR+(1<<16), &data, 1);
_LCD_DATA((1<<16)) ^= data ;
}
GPIOD->ODR ^= GPIO_PIN_13;
HAL_Delay(100);
}
이제 실제 TFT LCD모듈을 연결하여 테스트 해 보자
![](https://t1.daumcdn.net/cfile/tistory/99BBDF505F17CA230F)
TFT LCD가 정상 동작을 하지 않는다.
스코프 확인 해 보니 Address, Data Write 구간에 CS핀이 4번 정도 High가 되는 현상이 있다.
![](https://t1.daumcdn.net/cfile/tistory/99604A495F17C31207)
너무 고속이라 그런가?
STM32H7에서 FMC에서 달라진 점은 속도 이다. 최대 180Mhz 까지 가능하다.
![](https://t1.daumcdn.net/cfile/tistory/99B05C4C5E54A63D1E)
열심히 구글링 결과 STM32H7 vs STM32F7 GPIO 속도 테스트2 와 같이 STM32H7의 버스 메트릭스 구조가 달라져서 그1사이클에 4번의 전환이 발생 한다고 한다. H7으로 코드 전환이 쉽지가 않네...
Memory Type을 바꾸어 보니 그런 현상이 없어 졌다.
hsram1.Init.MemoryType = FMC_MEMORY_TYPE_NOR;
![](https://t1.daumcdn.net/cfile/tistory/99F62C475F17C3150B)
/* FMC initialization function */
static void MX_FMC_Init(void)
{
/* USER CODE BEGIN FMC_Init 0 */
/* USER CODE END FMC_Init 0 */
FMC_NORSRAM_TimingTypeDef Timing = {0};
/* USER CODE BEGIN FMC_Init 1 */
/* USER CODE END FMC_Init 1 */
/** Perform the SRAM1 memory initialization sequence
*/
hsram1.Instance = FMC_NORSRAM_DEVICE;
hsram1.Extended = FMC_NORSRAM_EXTENDED_DEVICE;
/* hsram1.Init */
hsram1.Init.NSBank = FMC_NORSRAM_BANK1;
hsram1.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE;
//hsram1.Init.MemoryType = FMC_MEMORY_TYPE_SRAM;
hsram1.Init.MemoryType = FMC_MEMORY_TYPE_NOR;
hsram1.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_16;
hsram1.Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_DISABLE;
hsram1.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;
hsram1.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS;
hsram1.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE;
hsram1.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE;
hsram1.Init.ExtendedMode = FMC_EXTENDED_MODE_DISABLE;
hsram1.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_DISABLE;
hsram1.Init.WriteBurst = FMC_WRITE_BURST_DISABLE;
hsram1.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ONLY;
hsram1.Init.WriteFifo = FMC_WRITE_FIFO_ENABLE;
hsram1.Init.PageSize = FMC_PAGE_SIZE_NONE;
/* Timing */
Timing.AddressSetupTime = 30;
Timing.AddressHoldTime = 30;
Timing.DataSetupTime = 25;
Timing.BusTurnAroundDuration =50;
Timing.CLKDivision = 0;
Timing.DataLatency = 0;
Timing.AccessMode = FMC_ACCESS_MODE_A;
/* ExtTiming */
if (HAL_SRAM_Init(&hsram1, &Timing, NULL) != HAL_OK)
{
Error_Handler( );
}
/* USER CODE BEGIN FMC_Init 2 */
/* USER CODE END FMC_Init 2 */
}
SD카드 연결하고 BMP 이미지 출력하니 TFT LCD에 BMP이미지가 정상적으로 출력된다.
![](https://t1.daumcdn.net/cfile/tistory/9944973A5F17CA2315)