Блиблиотека OLED дисплея SSD1306 для STM32 микроконтроллеров

Приветствую!

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

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

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

Исходные коды моей модифицированной библиотеки и тестовый проект можно взять тут: http://github.com/SL-RU/stm32libs/tree/master/HAL/ssd1306

Тестовый проект сделан в Keil при помощи программы STM32CubeMX.

Видео работы:

Конфигурация портов: img

Подключение:

OLED pin STM32
Vcc +3.3v
GND GND
SDA I2C1_SDA
SCL I2C1_SCL

В CubeMX также необходимо сконфигурировать интерфейс I2C так: img

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

#include "ssd1306.h"

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

SSD1306_Init();

Теперь можно что-нибудь нарисовать:

SSD1306_GotoXY(0, 44); //Устанавливаем курсор в позицию 0;44. Сначала по горизонтали, потом вертикали.
SSD1306_Puts("Hello world!!", &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_7x10
  • Font_11x18
  • Font_16x26

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

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

P.S. В Keil после загрузки прошивки в МК он не сбрасывается. Для меня это ненадолго стало серьёзной проблемой, но я справился. Всё решается очень просто - этой галочкой: pic