Gönderen Konu: SSD1306 OLED u8glib Kullanımı  (Okunma sayısı 373 defa)

Çevrimdışı M_B

  • Profesyonel Üye
  • *****
  • İleti: 1333
SSD1306 OLED u8glib Kullanımı
« : 11 Ocak 2017, 04:30:16 »
Merhabalar;
CubeMx ile i2c proje olusturduktan sonra ilgili klasore gidip
-Drivers Klasor icine u8glib klasoru komple kopyalanır.
-src Klasorune u8g.h ve u8g_arm.h dosyaları kopyalanır. ( Düzenlenmiş olan )

Sonra AC6 calistirilip ilgili klasor import edilir.
Yapılan işlemlerde hata olup olmadığını anlamak icin derleme yapılır. Hatasız derlendiyse main iceriği düzenlenir.
Tum işlemler bittikten sonra Proje üzerine gelip sag tık CLEAN PROJECT yapılıp
sonra derlenir ve kite yukleme işlemi yapılır.

main.c
Kod: [Seç]
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f4xx_hal.h"
#include "u8g_arm.h"

/* Private variables ---------------------------------------------------------*/
I2C_HandleTypeDef hi2c3;

u8g_t u8g;

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
void Error_Handler(void);
static void MX_GPIO_Init(void);
static void MX_I2C3_Init(void);


/**********************************************************************
 *
 **********************************************************************/
void draw_color_box1(void)
{
  u8g_uint_t w,h;
  u8g_uint_t r, g, b;

  w = u8g_GetWidth(&u8g)/64;
  h = u8g_GetHeight(&u8g)/32;
  for( b = 0; b < 4; b++ )
    for( g = 0; g < 16; g++ )
      for( r = 0; r < 32; r++ )
      {
u8g_SetRGB(&u8g, r<<3, g<<4, b<<6);
u8g_DrawBox(&u8g, g*w + b*w*16, r*h, w, h);

      }
}
/**********************************************************************
 *
 **********************************************************************/
void draw(uint8_t pos)
{
  u8g_SetFont(&u8g, u8g_font_unifontr);
  u8g_DrawStr(&u8g,  0, 12+pos, "** M_B **");
  u8g_DrawStr(&u8g,  0, 25+pos, "Picproje.org");
}

/**********************************************************************
 *
 **********************************************************************/
int main(void)
{
  uint8_t pos = 0;
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_I2C3_Init();
 HAL_Delay(500);

  u8g_InitComFn(&u8g, &u8g_dev_ssd1306_128x64_i2c, u8g_com_hw_i2c_fn);
 // u8g_SetRot180(&u8g); // Yaziyi dondurur.
  u8g_SetDefaultForegroundColor(&u8g);

  while (1)
  {
      u8g_FirstPage(&u8g);
  do
  {
draw(pos);
  } while ( u8g_NextPage(&u8g) );
u8g_Delay(100);
        pos++;
        pos &= 15;
  }// while end.
}// end.

/*****************************************************
  System Clock Configuration
*****************************************************/
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  __HAL_RCC_PWR_CLK_ENABLE();

  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 4;
  RCC_OscInitStruct.PLL.PLLN = 168;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 4;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  {
    Error_Handler();
  }
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

/**********************************************************************
 * I2C3 init function
 **********************************************************************/
static void MX_I2C3_Init(void)
{
  hi2c3.Instance = I2C3;
  hi2c3.Init.ClockSpeed = 100000;
  hi2c3.Init.DutyCycle = I2C_DUTYCYCLE_2;
  hi2c3.Init.OwnAddress1 = 240;
  hi2c3.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c3.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c3.Init.OwnAddress2 = 0;
  hi2c3.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c3.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(&hi2c3) != HAL_OK)
  {
    Error_Handler();
  }

}
/**********************************************************************
  * Configure pins as
        * Analog
        * Input
        * Output
        * EVENT_OUT
        * EXTI
**********************************************************************/
static void MX_GPIO_Init(void)
{
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

}
/*****************************************************************************
  * @brief  This function is executed in case of error occurrence.
  * @param  None
  * @retval None
  ***************************************************************************/
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler */
  /* User can add his own implementation to report the HAL error return state */
  while(1)
  {
  }
  /* USER CODE END Error_Handler */
}

#ifdef USE_FULL_ASSERT

/**
   * @brief Reports the name of the source file and the source line number
   * where the assert_param error has occurred.
   * @param file: pointer to the source file name
   * @param line: assert_param error line source number
   * @retval None
   */
void assert_failed(uint8_t* file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
    ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */

}

#endif

/**
  * @}
  */

/**
  * @}
*/

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

u8g_arm.h
Kod: [Seç]
#ifndef _U8G_ARM_H
 #define _U8G_ARM_H


 #include "u8g.h"
 #include "stm32f4xx_hal.h"


 #define DATA_BUFFER_SIZE 1000
 #define I2C_TIMEOUT 10000
 #define DEVICE_ADDRESS 0x78 //device address is written on back side of your display
 #define I2C_HANDLER hi2c3 // use your i2c handler

 extern I2C_HandleTypeDef I2C_HANDLER;


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

 #endif

u8g_arm.c
Kod: [Seç]
#include "u8g_arm.h"

static uint8_t control = 0;
void u8g_Delay(uint16_t val)
{

  HAL_Delay(val);
}

void u8g_MicroDelay(void)
{
  int i;
  for (i = 0; i < 1000; i++);
}

void u8g_10MicroDelay(void)
{
int i;
for (i = 0; i < 10000; i++);
}


uint8_t u8g_com_hw_i2c_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();
      if (arg_val == 0)
      {
      control = 0;
      }
      else
      {
      control = 0x40;
      }
     break;

    case U8G_COM_MSG_WRITE_BYTE:
    {
    uint8_t buffer[2];
    buffer[0] = control;
    buffer[1] = arg_val;
    HAL_I2C_Master_Transmit(&I2C_HANDLER, DEVICE_ADDRESS, (uint8_t*) buffer, 2, I2C_TIMEOUT);
    }
    break;

    case U8G_COM_MSG_WRITE_SEQ:
    case U8G_COM_MSG_WRITE_SEQ_P:
    {
    uint8_t buffer[DATA_BUFFER_SIZE];
uint8_t *ptr = arg_ptr;
buffer[0] = control;
for (int i = 1; i <= arg_val; i++)
{
buffer[i] = *(ptr++);
}
HAL_I2C_Master_Transmit(&I2C_HANDLER, DEVICE_ADDRESS, (uint8_t *)buffer, arg_val, I2C_TIMEOUT);
    }

      break;
  }
  return 1;
}
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

Çevrimdışı diot

  • Profesyonel Üye
  • *****
  • İleti: 1968
  • BALIKESİR
Ynt: SSD1306 OLED u8glib Kullanımı
« Yanıtla #1 : 11 Ocak 2017, 05:00:50 »
ILI9341 2.8" spi kit ile uğraştınmı hiç elinde  stm için hazır library varmı ?


Çevrimdışı M_B

  • Profesyonel Üye
  • *****
  • İleti: 1333
Ynt: SSD1306 OLED u8glib Kullanımı
« Yanıtla #2 : 11 Ocak 2017, 06:12:38 »
ILI9341 2.8" spi kit ile uğraştınmı hiç elinde  stm için hazır library varmı ?
Hocam hiç uğraşmadım.  O yuzden elimde de library si yok.
Elime modul gecerse o zaman çalışma fırsatı yakalayabilirim.
O moduller ne kadar hocam.?
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

Çevrimdışı diot

  • Profesyonel Üye
  • *****
  • İleti: 1968
  • BALIKESİR
Ynt: SSD1306 OLED u8glib Kullanımı
« Yanıtla #3 : 11 Ocak 2017, 06:37:54 »
6$ civarı fiatı var

Çevrimdışı baran123

  • Profesyonel Üye
  • *****
  • İleti: 1777
Ynt: SSD1306 OLED u8glib Kullanımı
« Yanıtla #4 : 11 Ocak 2017, 09:14:25 »
6$ civarı fiatı var

Tilen Majerle kütüphanesi vardı hocam. Fakat 2.2 içindi biraz düzenleme ile yapılabilir.
https://stm32f4-discovery.net/2014/04/library-08-ili9341-lcd-on-stm32f429-discovery-board/