이전 게시글에서는 STM32F746G-DISCO 보드의 I2C를 테스트하기 위해 터치스크린을 사용해 보았습니다.
I2C 테스트를 하나 더 해 보기로 결정한 후 무엇을 해 볼까 고민하다가 흔하디 흔한 SSD1306 드라이버를 사용하는 OLED를 테스트해 보았습니다. 전원 GND/VCC 2개의 라인과, I2C용 SCL/SDA 2라인 총 4개인 라인으로 되어있습니다.
이전 게시글에서는 I2C3을 사용했었는데 이번에는 아두이노의 I2C 포트인 I2C1 포트를 사용하여 OLED를 디스플레이해 보았습니다.
STM32CubeIDE에서 새 프로젝트를 생성 후 핀 초기화 후 SYS/USART1/I2C1 부분만 설정하였습니다.
I2C 설정은 기본값을 사용하였습니다.
프로젝트 생성 후 OLED를 구동하기 위해 u8glib 라이브러리 코드를 사용하였는데 관련 소스는 아래 github을 참고하였습니다.
소스코드를 다운로드 받은 후 압축을 풀면 폴더내에 u8glib 코드가 있는데 프로젝트의 Drivers 밑에 복사해 줍니다.
추가된 소스를 프로젝트에서 참조할 수 있도록 include와 symbol 패스를 설정하여 줍니다.
main 함수에 u8glib의 초기화 코드를 추가합니다.
/* USER CODE BEGIN 2 */
u8g_InitComFn(&u8g, &u8g_dev_ssd1306_128x64_i2c, u8g_com_hw_i2c_fn);
/* USER CODE END 2 */
OLED에 디스플레이될 draw함수를 추가합니다.
void draw(void)
{
u8g_DrawFrame(&u8g, 0, 0, 128, 64);
u8g_SetFont(&u8g, u8g_font_fixed_v0);
u8g_DrawStr(&u8g, 2, 12, "STM32F746G-DISCO");//write string - you set coordinates and string
u8g_DrawHLine(&u8g, 0, 14, 128);
u8g_DrawStr(&u8g, 2, 32, "I2C1 Test by rudalskim");//write string - you set coordinates and string
u8g_DrawStr(&u8g, 2, 52, "rudalskim.tistory.com");
}
main 함수의 while문에 아래 코드를 추가하여 OLED에 디스플레이되도록 합니다.
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
u8g_FirstPage(&u8g);
do {
draw();
} while ( u8g_NextPage(&u8g) );
u8g_Delay(10);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
회로 구성은 아래와 같이 연결하였습니다. 소스를 빌드 후 실행해 보면 잘 동작됩니다.
I2C1인터페이스를 사용하여 OLED가 정상동작됨을 확인 해 보았습니다.
'Hardware > STM32' 카테고리의 다른 글
[STM32F746G-DISCO] RCC (Reset and Clock Control) (0) | 2024.07.07 |
---|---|
[STM32F746G-DISCO] SPI 사용하기 (feat. OLED) (0) | 2024.07.06 |
[STM32F746G-DISCO] I2C 사용하기 (feat. 터치스크린) (0) | 2024.07.05 |
[STM32F746G-DISCO] USART 사용하기 (1) | 2024.07.05 |
STM32CubeIDE에서 시리얼 터미널 설치하기 (0) | 2024.07.05 |
댓글