'SSD1306'에 해당되는 글 1건

  1. [Cortex-M3]U8glib STM32에 포팅 (SSD1306 OLED 0.96 inch) (2) 2017/01/16

 

우선 u8glib는 GLCD 기반의 그래픽 라이브러리 입니다.

arduino에서 많이 사용되고 있는것으로 보이며,

c언어 기반이라 포팅 가능할것으로 보여 구글링 도움을 받아 진행 하였습니다.
사실 진행 작업은 크게 어렵지 않습니다.
1. H/W Device initialize
2. g8lib H/W HAL(Hardware Access Layer) 연동
3. Draw 해서 사용하기만 하면 끝
먼저 H/W제어 device 초기화 관련 부부은

STmicro 에서 제공되는 CubeMX 툴을 이용하여 GPIO 및 SPI 인터페이스의 초기 화를 진행 하였습니다.
Cube MX 에서 컴파일러는 Keil로 설정 하였습니다.[

]
CubeMX 설정 파일을 다운로드 하여 사용하시기 바랍니다.
CubeMX의 장점은
어지간한 H/W initialize는 선택한 컴파일러의 프로젝트 파일과 소스코드가 생성되므로
사용자는 main문 내부에서 바로 구현가능하다는 점에 있습니다.

 

2. HAL 연동
이후 사용자는 u8g_arm.c 과 u8g_arm.h 파일을 생성합니다.
u8g_arm.c


#include "u8g_arm.h"  

void u8g_Delay(uint16_t val)  

{  

      HAL_Delay(val);  

}  

void u8g_MicroDelay(void)  

{  

      HAL_Delay(1);  

}  

void u8g_10MicroDelay(void)  

{  

      HAL_Delay(1);  

}  

uint8_t u8g_com_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)  

{  

  switch(msg)  

  {  

   case U8G_COM_MSG_STOP:  

    break;  

   case U8G_COM_MSG_INIT:  

    u8g_MicroDelay();  

    break;  

   case U8G_COM_MSG_ADDRESS:           /* define cmd (arg_val = 0) or data mode (arg_val = 1) */  

    u8g_10MicroDelay();  

    HAL_GPIO_WritePin(PORTB, DC, (GPIO_PinState)arg_val);  

    u8g_10MicroDelay();  

    break;  

   case U8G_COM_MSG_CHIP_SELECT:  

    if ( arg_val == 0 )  

    {  

         HAL_Delay(1);  

         HAL_GPIO_WritePin(PORTA, CS, GPIO_PIN_SET);  

    }  

    else  

      HAL_GPIO_WritePin(PORTA, CS, GPIO_PIN_RESET);  

    u8g_MicroDelay();  

    break;  

   case U8G_COM_MSG_RESET:  

    break;  

   case U8G_COM_MSG_WRITE_BYTE:  

     HAL_SPI_Transmit(&SPI_HANDLER, &arg_val, 1, 10000);  

     while(HAL_SPI_GetState(&SPI_HANDLER) != HAL_SPI_STATE_READY);  

     u8g_MicroDelay();  

     break;  

   case U8G_COM_MSG_WRITE_SEQ:  

   case U8G_COM_MSG_WRITE_SEQ_P:  

    {  

         HAL_SPI_Transmit(&SPI_HANDLER, (uint8_t *)arg_ptr, arg_val, 10000);  

         while(HAL_SPI_GetState(&SPI_HANDLER) != HAL_SPI_STATE_READY);  

         u8g_MicroDelay();  

         arg_val = 0;  

    }  

    break;  

  }  

  return 1;  

}  


 

u8g_arm.h

 



#ifndef _U8G_ARM_H  

#define _U8G_ARM_H  

#include "u8g.h"  

#include "stm32f1xx_hal.h"  

#define SPI_HANDLER hspi2 // use your SPI hadler  

extern SPI_HandleTypeDef SPI_HANDLER;  

#define DC GPIO_PIN_12  

#define CS GPIO_PIN_8

#define PORTB GPIOB

#define PORTA GPIOA

uint8_t u8g_com_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr);  

#endif





추가적으로 main 문에 하기와 같이 추가 해주면 끝입니다..
로고는 LCDAssistant를 이용하여 C 파일로 변환후 출력 하였습니다.




//main.c
u8g_t u8g;
u8g_InitComFn(&u8g, &u8g_dev_ssd1306_128x64_hw_spi, u8g_com_hw_spi_fn);

while(1)
{
u8g_FirstPage(&u8g);  
	 do  
	 {	

		  
		  u8g_DrawBox(&u8g,0,0,127,10);
		  
		  u8g_DrawBitmapP(&u8g,0,10,13,19,(const uint8_t *)&img);

		  u8g_DrawFrame(&u8g,0,29,127,15);	

		  u8g.font = u8g_font_courR08;//u8g_font_profont22;  
		  u8g_DrawStr(&u8g, 10, 40, "Research Engeneer");

		  u8g.font = u8g_font_7x13B;//u8g_font_profont22;  
		  u8g_DrawStr(&u8g, 10, 56, "S.Jung");
	
	
		
	 } while ( u8g_NextPage(&u8g) );  
    /* refresh screen after some delay */
    u8g_Delay(100); 
}
사용자 삽입 이미지

Bar 그리기 및 삭각테두리, 이미지, 텍스쳐 등등
 
잘 동작 됩니다. 단지 폰트가 많아서 안쓰는 것들은 좀 제거를 해야할듯 보입니다.

크리에이티브 커먼즈 라이센스
Creative Commons License
2017/01/16 23:10 2017/01/16 23:10

댓글을 달아 주세요

  1. 스스 2017/02/23 13:38  address  modify / delete  reply

    안녕하세요?
    말씀하신대로 해보니 아래와같은 에러가 나오는데 원인을 알수있을까요?

    linking...
    Oled\Oled.axf: Error: L6218E: Undefined symbol u8g_InitComFn (referred from main.o).
    Oled\Oled.axf: Error: L6218E: Undefined symbol u8g_dev_ssd1306_128x64_hw_spi (referred from main.o).

    감사합니다.

    • 홈키파 2017/02/23 18:48  address  modify / delete

      컴파일러 개발툴의

      프로젝트에서

      해당 파일을 추가 하고

      컴파일 진행 하셨는지요???

      혹시 하기의 헤더 파일이 인클루드 되어 있지 않다면

      소스에 추가 하시기 바랍니다.

      #include "u8g.h"