[Из песочницы] Подключение oled дисплея с контроллером SSD1306 к STM32 по I2C

fc8d719a5012080c9d0b25a754965ce9.jpgМногие, наверное, знают о таких маленьких дешёвых (меньше $3) OLED дисплеях, которые можно найти в огромном ассортименте на ebay или aliexpress. В интернете существует множество различных статей о том, как подключать эти дисплеи к Arduino и другим МК, но для STM32f10x затруднительно найти даже библиотеку. Поэтому я решил написать эту статью.

Данный дисплей имеет разрешение 128×64 пиксела и контроллер SSD1306 и подклчается к микроконтроллеру по интерфейсу I2C.

Для STM32 была найдена библиотека для этого дисплея, но она была для серии f4xx — необходимо было модифицировать для f10x.

Исходные файлы модифицированной мной библиотеки можно взять тут.

ssd1306_i2c.c
ssd1306_i2c.h
Интерфейс для работы с I2C
ssd1306.c
ssd1306.h
Библиотека для работы с дисплеем. Представляет методы для рисования на дисплее, вывода текста, и вывода всего на oled.
fonts.c
fonts.h
Шрифты для вывода текста на экран. Там есть три шрифта, но можно создать любой свой при помощи этой программы или аналогов

Схема подключения предельно проста:
Vcc +3.3V. Допустимое напряжение — от 3.3В до 5В
GND GND
SCL PB6
SDA PB7

image

Для работы с библиотекой нужно подключить заголовочный файл:

#include "ssd1306.h"

И перед использованием инициализировать:
SSD1306_Init();

Теперь можно что-нибудь нарисовать:
SSD1306_GotoXY(0, 44); //Устанавливаем курсор в позицию 0;44. Сначала по горизонтали, потом вертикали.
SSD1306_Puts("Hello, habrahabr!!", &Font_7x10, SSD1306_COLOR_WHITE); //пишем надпись в выставленной позиции шрифтом "Font_7x10" белым цветом. 
SSD1306_DrawCircle(10, 33, 7, SSD1306_COLOR_WHITE); //рисуем белую окружность в позиции 10;33 и радиусом 7 пикселей

Всё, что мы нарисовали сейчас находится в буффере в оперативной памяти МК, чтобы вывести всё на дисплей необходимо вызвать:
SSD1306_UpdateScreen();

После этого наш дисплей обновится и будет выводить надпись и кружок. После вызова SSD1306_UpdateScreen () буффер в МК не сбрасывается сам, поэтому новые рисунки будут поверх предыдущих, для сброса можно заполнить всё чёрным цветом:
SSD1306_Fill(SSD1306_COLOR_BLACK);

Все функции библиотеки:
uint8_t SSD1306_Init(); //Инициализация

SSD1306_UpdateScreen(); //Посылаем данные из буффера в памяти дисплею

SSD1306_ToggleInvert(); //инвертирует цвета изображения в оперативной памяти

SSD1306_Fill(SSD1306_COLOR_t Color); //заполняем дисплей желаемым цветом

SSD1306_DrawPixel(uint16_t x, uint16_t y, SSD1306_COLOR_t color); //нарисовать один пиксел

SSD1306_GotoXY(uint16_t x, uint16_t y); //установить позицию текстового курсора

SSD1306_Putc(char ch, FontDef_t* Font, SSD1306_COLOR_t color); //вывести символ сh в позиции курсора

SSD1306_Puts(char* str, FontDef_t* Font, SSD1306_COLOR_t color); //вывести строку str в позиции курсора

SSD1306_DrawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, SSD1306_COLOR_t c); //нарисовать линию

SSD1306_DrawRectangle(uint16_t x, uint16_t y, uint16_t w, uint16_t h, SSD1306_COLOR_t c); //наррисовать прямоугольник

SSD1306_DrawFilledRectangle(uint16_t x, uint16_t y, uint16_t w, uint16_t h, SSD1306_COLOR_t c); //заполненный прямоугольник

SSD1306_DrawTriangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t x3, uint16_t y3, SSD1306_COLOR_t color); //треугольник

SSD1306_DrawCircle(int16_t x0, int16_t y0, int16_t r, SSD1306_COLOR_t c); //круг радиуса r

SSD1306_DrawFilledCircle(int16_t x0, int16_t y0, int16_t r, SSD1306_COLOR_t c); //заполненный круг

Доступные шрифты, но вы так же можете добавить свои, в том числе и русские:
  • Font_7×10
  • Font_11×18
  • Font_16×26

Дисплей работает довольно быстро (FPS около 14–18) на скорости I2C 400кГц (450 тоже без проблем, но рисковать не стал, а на 500 подтормаживает) и без проблем.

Использовал CooCox IDE. Готовый проект можно скачать тут: Яндекс.Диск.

P.S. с момента написания статьи и до её публикации из песочницы прошло довольно много времени (6 месяцев), за которое я успел несколько раз изменить библиотеку.

Более новую версию библиотеки с поддержкой DMA и тестовый проект для Keil и cubeMx можно взять здесь: github.com/SL-RU/stm32libs/tree/master/HAL/ssd1306

Самую последнюю версию библиотеки вы найдёте тут: github.com/SL-RU/sdmplayer/tree/master/src/v002/Hardware

Пример работы библиотеки:

С удовольствием отвечу на ваши вопросы! Удачи!

Комментарии (3)

  • 25 октября 2016 в 01:25

    0

    Добро пожаловать! Спасибо за статью. Пользуясь случаем, спрошу, а есть то же самое, только для SPI версии?
    • 25 октября 2016 в 01:39

      0

      Спасибо!
      Нет, к сожалению, но на самом деле переделывать почти ничего не придётся, особенно в библиотеках на HAL — изменить лишь пару функций отправки. Команды ведь те же, данные тоже.
  • 25 октября 2016 в 02:27

    0

    Странно. Поиск на github работает прекрасно.

© Habrahabr.ru