MCU: STM32F103VCT
STM에는 Flexible static memory controller(이하 FSMC)라고 하는 동기 / 비동기 외부 메모리를 컨트롤 하기 위한 인터페이스가 있습니다. 여기에서 외부 메모리라함은 SRAM, NOR Flash, NAND Flash 그리고 LCD 모듈들이 있습니다.
LCD를 제어하기 위해서는 SPI, I2C로 제어하는 직렬(serial) 방식이나 8bit 또는 16bit로 제어하는 병렬(parallel) 방식이 있습니다.
오늘은 병렬로 제어하는 방식을 알아봅시다.
병렬 인터페이스에는 Intel 사의 8080 타입, 모토로라 사의 6800 타입이 있습니다.
두 타입의 차이점은 아래와 같습니다.
FSMC를 사용해서 LCD를 제어하기 위해서는 아래와 같이 핀을 연결해야 합니다.
FSMC [D0:D15] = FSMC 16bit 데이터 버스
FSMC NEx = FSMC Chip Select
FSMC NOE = FSMC Output Enable
FSMC NWE = FSMC Write Enable
FSMC Ax = LCD Register와 LCD Display RAM을 선택하기 위한 Address line (0~25)
(LCD의 RS핀과 연결합니다)
다음은 8080 타입 인터페이스의 LCD를 STM의 FSMC 인터페이스와 연결하는 방법을 나타냅니다.
다음은 6800 타입 인터페이스의 LCD를 STM의 FSMC 인터페이스와 연결하는 방법을 나타냅니다.
또, LCD를 제어하기 위한 타이밍 에 대한 설명도 나타냅니다. (이 부분은 수식을 봐도 잘 이해가 안됩니다..)
- Address setup time
- Address hold time
- Data setup time
STM32F1 시리즈에서 FSMC관련된 메모리는 아래와 같이 구성됩니다.
STM Application Note에 보면 Nor Flash/SRAM bank는 병렬 LCD 인터페이스를 제어하는데 알맞다고 설명합니다.
따라서 Bank1을 사용하게 되고 Bank1은 sub bank를 4개를 가지고 있습니다. 이 sub bank에 따라 NEx의 숫자가 정해집니다.
그리고 RS핀에 연결된 Ax핀에 따라 LCD Display RAM를 제어하기 위한 주소가 달라집니다.
위 Table 101에 작은 글씨를 보면, 16bit 메모리의 경우에 내부적으로 HADDR의 25:1 의 범위를 사용한다고 되어있습니다. 즉 Ax에 왼쪽으로 1칸 쉬프트 시킨 값을 사용합니다. 여기서 x는 0부터 시작합니다.
예를 들면,
NE1에 A16을 사용한다. (= FSMC bank1 NOR/PSRAM 1을 사용)
= Base Address: 0x60000000
RAM Address: (0b0000 0000 0000 0001 0000 0000 0000 0000 << 1)
= 0b0000 0000 0000 0010 0000 0000 0000 0000 = 0x20000
그렇다면 코드로는 간단하게 아래와 같이 작성하게 됩니다.
// Bank1 NE1
#define TFT_LCD_REG (*((volatile unsigned short *) 0x60000000))
// A16
#define TFT_LCD_DATA (*((volatile unsigned short *) 0x60020000))
void Write_REG(uint16_t Reg)
{
TFT_LCD_REG = Reg;
}
void Write_Data(uint16_t Data)
{
TFT_LCD_D = Data;
}
다음에는 FSMC를 사용하여 SSD1963 드라이버가 내장되어있는 LCD를 제어해보도록 하겠습니다.
감사합니다.
Reference
TFT LCD interfacing with the high-density STM32F10xxx FSMC
'MCU > STM32:HAL' 카테고리의 다른 글
[STM32F][Teraterm]YMODEM 프로토콜로 헥사 전송시 버그 (0) | 2023.03.24 |
---|---|
[STM32][DSP] DSP 라이브러리 설정 (2) | 2022.06.17 |
[STM32F][HAL] CAN (0) | 2021.05.20 |
[HAL][STM32F]USART와 Queue (2) | 2021.03.24 |
[STM32F]FSMC로 LCD(SSD1963) 제어하기 (2) | 2021.02.07 |
[STM32F][HAL] USART Interrupt (0) | 2020.12.23 |
[STM32F][HAL] DAC (Digital to Analog Converter) (0) | 2020.12.22 |
[STM32F][HAL] OUTPUT COMPARE 사용하기 (0) | 2020.06.01 |