MCU
STM32F103(ST)
IDE
STM32CubeIDE
목표
I2C LCD(SSD1306)를 구동함

 

0. SSD1306

- SSD1306은 단일 칩 CMOS OLED/PLED 드라이버로, 유기/고분자 발광을 위한 컨트롤러

- OLED는 저전력 소비, 높은 대비, 선명한 이미지 품질로 알려져 있어 작은 전자 프로젝트, 웨어러블 기기 및 임베디드 시스템에 이상적

- 다이오드 도트 매트릭스 그래픽 디스플레이 시스템. 128개의 세그먼트와 64개의 공통으로 구성

- SSD 1306에는 256단계 밝기 제어, 디스플레이 RAM 및 오실레이터가 내장

- 일반적으로 다양한 크기로 제공되며, 0.96인치에서부터 더 큰 크기도 있음

- SSD1306 디스플레이를 프로젝트에서 사용하려면 I2C(Inter-Integrated Circuit) 사용하여 통신

 

- SSD1306 Datashet

 

1. STM32CubeIDE - CubeMX

- I2C2 Mode and Configuration : Disable → I2C

- Project - Generate Code


 

2. github에서 library 다운로드

https://github.com/afiskon/stm32-ssd1306

 

GitHub - afiskon/stm32-ssd1306: STM32 library for working with OLEDs based on SSD1306, SH1106, SH1107 and SSD1309, supports I2C

STM32 library for working with OLEDs based on SSD1306, SH1106, SH1107 and SSD1309, supports I2C and SPI - afiskon/stm32-ssd1306

github.com

 

- *.c는 프로젝트 폴더의 Core\Src 폴더 안에 넣음

- *.h는 프로젝트 폴더의 Core\Inc 폴더 안에 넣음

- Build Project 하면 자동으로 Compile 함

- ssd1306.c, ssd1306.h : ssd1306을 사용하기 위한 함수 모음

- ssd1306_fonts.c, ssd1306_fonts.h : 글자를 뿌리기 위한 폰트(크기별)

 

3. STM32CubeIDE - IDE

- main.c의 main() 수정

  /* USER CODE BEGIN 2 */
  ssd1306_Init();
  HAL_Delay(1000);

  ssd1306_SetCursor(0,0);
  ssd1306_WriteString("LINE1", Font_7x10, White);

  ssd1306_SetCursor(0,10);
  ssd1306_WriteString("LINE2", Font_7x10, White);

  ssd1306_SetCursor(0,20);
  ssd1306_WriteString("LINE3", Font_7x10, White);

  ssd1306_SetCursor(0,30);
  ssd1306_WriteString("LINE4", Font_7x10, White);

  ssd1306_SetCursor(0,40);
  ssd1306_WriteString("LINE5", Font_7x10, White);

  ssd1306_SetCursor(0,50);
  ssd1306_WriteString("LINE6", Font_7x10, White);

  ssd1306_UpdateScreen();
  /* USER CODE END 2 */
 

- 실행 결과

 

'ST > STM32F103C8' 카테고리의 다른 글

STM32F103C8 - RAM 48KB + bonus?  (0) 2025.08.08
STM32F103C8 - LL driver + ADC + DMA  (0) 2025.08.08
STM32F103C8 - 1cycle Time  (0) 2025.08.08
STM32F103C8 - I2C HAL driver 오류  (0) 2025.08.08
STM32F103C8 - ADC(DMA interrupt)  (1) 2025.08.08

 

MCU
STM32F746G DISCOVERY(ST)
IDE
STM32CubeIDE
목표
CAMERA 입력을 받아 LCD로 출력

 

1. DCMI(digital camera Interface)

- MCU에 내장되어 있는 디지털 카메라 인터페이스(DCMI)

- DCMI를 이용하여 DM-CAM130 카메라 테스트

 

1-1. DM-CAM130

DM-CAM130

- Dimensions: 47.8 mm * 37.6 mm * 6mm

- Signal System: CMOS 1.3 Mega Pixel

- Resolution: Up to 1280 * 1024

- Interface:30-pin FPC connector

- Power Supply:From STM32F4DIS-BB

- Operating Temp.:-10°C ~ 70°C

- Supports still photos

- Frame Rate:15 fps for SXGA, 30 fps for VGA and CI

 

1-2. Signal

Interfacing a camera module with an MCU

제어신호

- PIXCLK는 camer의 clock를 공급한다.

- VSYNC는 frame 동기화에 사용된다.

- HSYNC는 line 동기화에 사용된다.

 

Image Data 신호

- camer의 data가 전송되는데 사용되며 병렬 연결의 경우 8bit에서 12bit까지 사용된다.

 

Serial

- camera의 Cofiguration을 위해 사용되며 주로 I2C 버스이다.

 

1-3. DCMI peripheral

DCMI slave AHB2 peripheral in STM32F2x7 line smart architecture

위와 같이 Camera data는 AHB2 주변 장치로 입력되어 GP DMA2와 연결된다.

 

1-4. RGB565

RGB565 foramt은 아래와 같이 5bit의 red value가 msb로 배치되고, 중간에 6bit의 green value가 배치되고 마지작에 5bit의 blue value가 lsb로 배치된다.

LTDC의 Pixel Format도 RGB565로 설정하고 Camera의 DMA target 주소와 LCD의 buffer주소를 동일하게 설정하면 Camera data가 LCD로 출력된다.

 

1-5. YCbYCr

YCbYCr format은 위와 같이 8bit씩 배치된다. 즉 640X480 pixel이라면 절반은 Y data이고 ¼은 Cb ¼은 Cr data이다.

 

2. STM32F746 DISCOVERTY CAMERA 관련 회로도

MCU
JH55-A OV9655 Camera Module

 

3. DCMI 설정

3-1. DCMI : Slave 8 bits External Synchro

3-2. Parameter Settings :

 

3-3. I2C GPIO Settings

 

3-4. GPIO Settings :

 

3-5. DMA : DMA2 stream1

 

3-6. NVIC : EXTI enable

- GENERATE CODE


4. main.c 수정

- 해상도에 맞추어 Sensor에 I2C data를 전송

- HAL_DCMI_Start_DMA 함수를 호출

파라미터로 hdcmi 개체와 capture mode buffer 및 사이즈

- DMA Mode로 동작하므로 손실없이 Camera Image를 그대로 보여줌

#define CAM_DMA_SIZE     (240*320)

OV9655_ReadID(&ov9655_id);
OV9655_QVGAConfig();
HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_CONTINUOUS, (uint32_t)pBuf, CAM_DMA_SIZE/2);
 

 

TM32F746 CAMERA 테스트

'ST > STM32F746DIS' 카테고리의 다른 글

STM32F746G DISCOVERY - LCD + TOUCH  (0) 2025.04.19
STM32F746G DISCOVERY - LCD I/F  (0) 2025.04.19
STM32F746G DISCOVERY - SDRAM  (0) 2025.04.19
STM32F746G DISCOVERY - TIM(IC, OC, PWM)  (0) 2025.04.19
STM32F746G DISCOVERY - TIMER  (0) 2025.04.19
 
MCU
STM32F746G DISCOVERY(ST)
IDE
STM32CubeIDE
목표
TOUCH SCREEN 입력을 받아 LCD 화면 전환

 

1. STM32F746 DISCOVERTY LCD + TOUCH 관련 회로도

Backlight driver & PFC of LCD panel

2. I2C 설정

2-1. I2C3 : I2C

 

2-2. I2C Parameter Settings : slave address 0x70

 

2-3. I2C GPIO Settings : PH7(I2C3_SCL), PH8(I2C3_SDA)로 변경

 

2-4. GPIO Settings : PI13(LCD_INT)로 추가

 

2-5. NVIC : EXTI enable

- GENERATE CODE


3. main.c 수정

- HAL_GPIO_EXTI_Callback() 작성

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	ts_trigger = 1;
}
 

 

- SDRAM 초기화 함수와 LTDC 프레임 버퍼 주소 지정, Touch Screen 초기화

	BSP_SDRAM_Initialization(REFRESH_COUNT);
	HAL_LTDC_SetAddress(&hltdc, pBuf, 0);
	status = BSP_TS_Init(480,272);
	if(status == 0) printf("Touch Init OK\r\n");
	else printf("Touch Init Error : %d\r\n", status);
 

 

- Touch 입력을 받아 화면 색을 바꾸는 함수 작성

	while (1)
	{
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		if(ts_trigger == 1)
		{
			ts_trigger = 0;
			if(BSP_TS_GetState(&TS_State)==0){
				x=TS_State.touchX[0];
				y=TS_State.touchY[0];
				printf("TS_x = %d , TS_y=%d \r\n",x,y);
				uint32_t rng_val = HAL_RNG_GetRandomNumber(&hrng);
				if(x < 240)
				{
					if(y < 136) buf_rect(pBuf, 0,240,0,136,rng_val & 0xffff);
					else buf_rect(pBuf, 0,240,136,272,rng_val & 0xffff);
				}
				else
				{
					if(y < 136) buf_rect(pBuf, 240,480,0,136,rng_val & 0xffff);
					else buf_rect(pBuf, 240,480,136,272,rng_val & 0xffff);
				}
			}
			HAL_Delay(10);
		}
	}
	/* USER CODE END 3 */
 
STM32F746 LCD + TOUCH 테스트

 

'ST > STM32F746DIS' 카테고리의 다른 글

STM32F746G DISCOVERY - CAMERA I/F  (0) 2025.04.19
STM32F746G DISCOVERY - LCD I/F  (0) 2025.04.19
STM32F746G DISCOVERY - SDRAM  (0) 2025.04.19
STM32F746G DISCOVERY - TIM(IC, OC, PWM)  (0) 2025.04.19
STM32F746G DISCOVERY - TIMER  (0) 2025.04.19

 

MCU
STM32F746G DISCOVERY(ST)
IDE
STM32CubeIDE
목표
LCD I/F를 이용하여 TFT LCD 출력

 

- 이전 글과 달리 IDE를 ATOLLIC → CubeIDE로 변경

- ATOLLIC은 CubeMX와 ATOLLIC을 따로 설치해야 하나, CubeIDE = CubeMX + IDE 통합 환경

- 사용상의 큰 다른점은 없으나, ATOLLIC에서 생성한 프로젝트를 CubeIDE에서 바로 사용할 수 없고 Import 해서 사용해야 함


1. LTDC(LCD-TFT Display Controller)

STM32F746G DISCOVERY Board에는 480 x 272 해상도의 4.3인치 터치패널이 있는 TFT-LCD가 달려있다.

Red : Green : Blue = 5 : 6 : 5 = 16bit Color에 480x272 해상도의 한 화면을 그릴때 메모리를 계산해 보면,

- 480 x 272 x 2byte = 261,120byte = 261Kbytes

- STM32F746의 SRAM이 320Kbytes인데, 한 화면을 그리고 나면 메모리가 없다.

그래서 외부 SDRAM을 프레임 버퍼 메모리로 사용해야 하므로, LCD 설정에 앞서 SDRAM을 설정 해야 한다.


2. STM32F746 DISCOVERTY LCD + TOUCH 관련 회로도

 

MCU

 

 

Backlight driver & PFC of LCD panel

 

3. LTDC 설정

3-1. RGB565(16 bits)

 

3-2. Clock Configuration : LCD Clock 9.6MHz로 설정

 

3-3. LTDC Parameter Settings

3-4. LTDC Layer Settings : Layer 설정

3-5. LTDC GPIO Settings : Data Bus 결선 확인

아래 회로도를 확인하여, LTDC에서 기본으로 지정하는 포트가 아니고 DISCOVERY Board에서 지정하는 포트로 변경해야 한다.

MCU

 

 

3-6. LCD DSP와 Backlight Pin 설정

 

4. RNG 설정

- 화면에 색을 랜덤으로 바꾸기 위해 Random Number Generator 를 enable

- GENERATE CODE


5. main.c 수정

- 네모 표시함수를 작성

/* USER CODE BEGIN 0 */

void buf_rect(uint16_t  *pBuf, uint32_t start_x, uint32_t stop_x,
              uint32_t start_y,uint32_t stop_y,uint16_t color)
{
    for(uint32_t j=start_y; j<stop_y; j++)
    {
        for(uint32_t i=start_x; i<stop_x; i++)
        {
            *(pBuf + j*480 + i) = (uint16_t)color;
        }
    }
}
 

 

- pBuf 주소를 지정

/* USER CODE BEGIN 1 */
    uint16_t  *pBuf = (uint16_t *)0xC0000000;
/* USER CODE END 1 */
 

 

- SDRAM 초기화 함수와 LTDC 프레임 버퍼 주소 지정

/* USER CODE BEGIN 2 */
    BSP_SDRAM_Initialization_sequence(REFRESH_COUNT);
    HAL_LTDC_SetAddress(&hltdc, pBuf, 0);  // Reconfigure the frame buffer Address
/* USER CODE END 2 */
 

 

- random 함수를 발생시키는 함수를 추가하고 여기서 발생한 32bit 정수를 반씩 나누어 색으로 이용하는 함수를 작성

	while (1)
	{
	/* USER CODE END WHILE */
	
	/* USER CODE BEGIN 3 */
		uint32_t rng_val = HAL_RNG_GetRandomNumber(&hrng);
		printf("RNG_val = 0x%08lx \r\n",rng_val);
		buf_rect(pBuf, 0,240,0,136,rng_val & 0xffff);  	rng_val >>= 16;
		buf_rect(pBuf, 240,480,0,136,rng_val & 0xffff);
	
		rng_val = HAL_RNG_GetRandomNumber(&hrng);
		printf("RNG_val = 0x%08lx \r\n",rng_val);
		buf_rect(pBuf, 0,240,136,272,rng_val & 0xffff);  	rng_val >>= 16;
		buf_rect(pBuf, 240,480,136,272,rng_val & 0xffff);
		HAL_Delay(500);
	}
	/* USER CODE END 3 */
 
STM32F746 LCD 테스트

 

'ST > STM32F746DIS' 카테고리의 다른 글

STM32F746G DISCOVERY - CAMERA I/F  (0) 2025.04.19
STM32F746G DISCOVERY - LCD + TOUCH  (0) 2025.04.19
STM32F746G DISCOVERY - SDRAM  (0) 2025.04.19
STM32F746G DISCOVERY - TIM(IC, OC, PWM)  (0) 2025.04.19
STM32F746G DISCOVERY - TIMER  (0) 2025.04.19

 

1. LCD(Liquid Crystal Display)

- LCD는 "액정 표시 장치"로서, 액정을 사용하여 이미지를 표시하는 플랫 패널 디스플레이 기술

- 이전에는 CRT(Cathode Ray Tube) 기술이 주로 사용되었으며, 전자빔을 사용하여 유리 진공관 내부의 화면에 이미지를 형성하는 방식으로 작동

- CRT는 크기가 크고 무거워서 이동이 어렵고 전력 소비가 높은 단점이 있었으며, 해상도와 화질 면에서도 한계

- LCD는 이후에 등장한 기술로, 각 픽셀은 액정 분자의 상태를 변경하여 빛을 통과시켜 이미지를 형성

- LED(Light Emitting Diode) 백라이트를 사용하는 LED 디스플레이 기술이 LCD를 발전시켰으며, 더 밝고 효율적인 조명을 제공하고 색상 표현력과 에너지 효율성을 향상

- 또한, OLED(Organic Light Emitting Diode) 기술도 등장하여 각 픽셀이 독립적으로 발광하여 더 얇고 유연한 디스플레이를 만들 수 있게 되었음

 

2. TFT (Thin Film Transistor)

- TFT는 "반도체 박막 트랜지스터"의 약자

- TFT 디스플레이는 각 픽셀마다 반도체 박막 트랜지스터를 사용하여 화면의 밝기와 색을 제어

- TFT는 액정 분자의 회전을 통해 빛의 통과를 제어하여 디스플레이에 이미지를 형성하는 LCD 기술

- 이 기술은 전기적으로 각 픽셀을 제어하여 고해상도 이미지를 표시할 수 있습니다.

- TFT는 빠른 응답 속도와 낮은 전력 소비로 유명하며, 게이밍 모니터와 휴대전화에서 널리 사용됩니다.

- LCD 패널에서 TFT는 각 픽셀에 백라이트를 밝히는 방식으로 작동하여 화면을 조절합니다.

- 디스플레이의 각 부분을 독립적으로 조절할 수 있어 고화질 이미지를 표시할 수 있습니다.

 

3. 패널 유형

3-1. TN (Twisted Nematic)

- TN 기술은 LCD (Liquid Crystal Display) 패널에서 가장 일반적으로 사용되는 기술

- 주로 게이밍 모니터나 저가형 모니터에 사용

- 빠른 응답 속도와 낮은 가격이 장점

- 시야각이 제한되고 색재현성이 낮은 단점

 

3-2. VA (Vertical Alignment)

- VA 기술은 명암비와 색재현성을 개선하는 데 중점을 둔 LCD 기술

- TN보다 명암비가 더 높고, IPS보다 색재현성이 더 뛰어남

- TV 및 엔터테인먼트 목적에 주로 사용되며, 광대역 시야각과 깊은 검은색을 표현하는 데 우수

- 반응 속도가 상대적으로 느리고 가격이 높은 편

 

3-3. IPS (In-Plane Switching)

- IPS 기술은 LCD 패널의 시야각과 색재현성을 향상시키는 데 중점을 둔 기술

- 시야각이 넓고 색상 정확도가 높아 그래픽 작업이나 전문적인 작업에 적합

- 반응 속도는 느리지만, 최근의 IPS 패널은 더 빠른 속도

- 전체적으로 IPS 기술은 고품질의 이미지와 넓은 시야각을 제공

 

4. 패널 유형에 따른 비교

특징
TN
VA
IPS
사용되는 기술
TFT
TFT
TFT
시야각
좁음
(약 160도)
넓음
(약 178도)
매우 넓음
(약 178도)
응답속도
빠름
(일반적으로 1ms 이내)
느림
(일반적으로 5ms 이상)
보통
(일반적으로 4ms 이내)
명암비
낮음
(일반적으로 1000:1 이하)
매우 높음
(일반적으로 2000:1 이상)
높음
(일반적으로 1000:1 이상)
색재현도
낮음
(일반적으로 6비트)
중간
(일반적으로 8비트)
높음
(일반적으로 8비트 이상)
색정확도
낮음
중간
매우 높음
주요 용도
게이밍, 저가형 모니터 등
TV, 엔터테인먼트 목적 등
그래픽 작업, 전문적인 작업 등
가격
상대적으로 저렴
보통
보통

요약하자면,

- TFT는 LCD 기술의 하위 카테고리로 색을 표현하는 방식

- TN, VA, IPS는 TFT 디스플레이 기술의 한 유형

'전자 부품 > LCD' 카테고리의 다른 글

LCD - LVDS, MIPI, HDMI 인터페이스 비교  (0) 2025.03.16

1. LCD 인터페이스

- LCD와 다른 장치(예: 컴퓨터, 카메라, 스마트폰 등) 사이에 데이터를 전송하기 위한 연결 방식

- 다양한 인터페이스가 있으며, 각각의 특징과 용도에 따라 선택할 수 있음

- 일반적으로는 LVDS, MIPI, HDMI와 같은 표준이 널리 사용되며, 이는 디스플레이와 다른 장치 사이의 효율적인 데이터 전송을 지원

 

2. LCD - LVDS, MIPI, HDMI 인터페이스 비교

특성
LVDS
MIPI
HDMI
전송 속도

높음

중간

매우 높음

대역폭

높음

중간

매우 높음

신호 간섭 및
안정성
높은 내부 간섭 저항성, 외부 간섭에 민감함
내부 및 케이블 전송 시 안정적
외부 간섭에 대한 적절한 보호, 케이블 길이에 따른 신호 감쇠
전력 소모

낮음

중간

높음

용도

임베디드 시스템, 산업용, 의료용
모바일 기기, 카메라, 주변 장치
TV, 모니터, 비디오 및 오디오 신호
장거리 전송

신호 감쇠 발생 가능성 있음

짧은 거리에 적합, 장거리 전송에는 적합하지 않음
케이블 리프터나 리피터를 사용하여 장거리 전송 가능
비용

저렴함

다소 높음

다소 높음

시장 점유율

일부 시스템에서 널리 사용

모바일 기기 및 산업용 시스템에서 널리 사용
TV 및 모니터에 널리 사용

연결 형태

케이블

내부 및 케이블

케이블

설치 및 관리

복잡함

비교적 쉬움

비교적 쉬움

필요한 핀 수

일반적으로 수십 개

주로 수십 개

HDMI 1.4: 19개 이상, HDMI 2.0 이상: 더 많음
화면 크기

일반적으로 7인치에서 15인치까지
일반적으로 3인치에서 10인치까지
일반적으로 32인치에서 100인치까지
오디오

주로 비디오 전송에 사용, 별도의 오디오 인터페이스 필요
오디오 데이터 전송 가능

디지털 오디오 및 비디오 전송 가능

 

3. LCD - LVDS, MIPI, HDMI 사용 시기

시기
LVDS 사용 시기
MIPI 사용 시기
HDMI 사용 시기
1990년대
디지털 시그널 전송을 위해 LVDS 도입
-
-
2000년대
디지털 시그널을 LCD 디스플레이에 전달하기 위해 널리 사용
-
초고해상도 디스플레이 및 멀티미디어 장치에 적용
2010년대 초반
-
MIPI Alliance 설립 및 모바일 장치에 MIPI 인터페이스 도입
HDMI 2.0 도입으로 초고해상도 및 3D 비디오 지원
2010년대 후반
-
모바일 디바이스에서 MIPI 인터페이스가 표준으로 사용됨
HDMI 2.1 도입으로 대역폭 증가 및 다양한 기능 지원
현재
-
MIPI 인터페이스가 모바일 및 임베디드 시스템에서 널리 사용
HDMI 2.1 및 HDMI 2.1a 등의 새로운 업데이트 및 개선사항 적용

 

'전자 부품 > LCD' 카테고리의 다른 글

LCD 기술 비교 - TN, VA, IPS  (0) 2025.03.16

+ Recent posts