0 / 0 / 0
Регистрация: 14.10.2020
Сообщений: 2
1

STM32F031 + oled ssd1306

14.10.2020, 10:34. Показов 795. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго дня.
Использую STM32F031 (точнее STSPIN32F0601 на базе STM32F031x6x7). При попытке прикрутить дисплей на ssd1306 получаю не хватку памяти. Массив буфера uint8_t SSD1306_Buffer[SSD1306_WIDTH * SSD1306_HEIGHT / 8] забивает всю оставшуюся RAM. Подскажите, как можно выкрутиться из данной ситуации? Другой МК не могу использовать по понятным причинам.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.10.2020, 10:34
Ответы с готовыми решениями:

STM32 and SSD1306 oled
hi all! А может кто прикручивал данный дисплей http://www.ebay.com/itm/170929165278 к stm32 ?...

Проблема с stm32f050 (stm32f031)
Здравствуйте. Купил в былые времена пяток stm32f050 по 16 рублей. Руки до них дошли только...

SSD1306
Приветствую сообщество! Уже неделю мучаюсь, пытаюсь завести сей дисплей на stm32f103. Выложил код...

AVR, SPI и SSD1306
Приобрёл для одного из своих проектов вот такой дисплей. Пытаюсь его запустить. Начал с примеров...

4
Почетный модератор
11525 / 4320 / 448
Регистрация: 12.06.2008
Сообщений: 12,412
14.10.2020, 10:40 2
Цитата Сообщение от serge_lod Посмотреть сообщение
Подскажите, как можно выкрутиться из данной ситуации?
Записывать не весь кадр разом, а частями.
1
0 / 0 / 0
Регистрация: 14.10.2020
Сообщений: 2
14.10.2020, 11:04  [ТС] 3
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
#include "ssd1306.h"
 
 
static uint8_t SSD1306_Buffer[SSD1306_WIDTH * SSD1306_HEIGHT / 8];
 
static SSD1306_t SSD1306;
 
//I2C write command
void ssd1306_WriteCommand(uint8_t command)
{
    HAL_I2C_Mem_Write(&hi2c1,SSD1306_I2C_ADDR,0x00,1,&command,1,10);
}
 
//Initializing SSD1306 chip
void ssd1306_Init(void)
{   
    HAL_Delay(100);
    /* Init LCD */
    ssd1306_WriteCommand(0xAE); //display off
    ssd1306_WriteCommand(0x20); //Set Memory Addressing Mode   
 
    if (SSD1306_HEIGHT == 32)
    {
        ssd1306_WriteCommand(0x00); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
        ssd1306_WriteCommand(0xA1);//0xA1 отражение по горизонтали, для отображения справа налево необходимо использовать команду 0xA0
        ssd1306_WriteCommand(0xC8);//0xC8 отражение по вертикали, 0xC0 для переворота изображения по вертикали.
        ssd1306_WriteCommand(0x81); //--set contrast control register
        ssd1306_WriteCommand(0xF0);
        ssd1306_WriteCommand(0xA6); //--set normal display
        ssd1306_WriteCommand(0xA8); //--set multiplex ratio(1 to 64)
        ssd1306_WriteCommand(SSD1306_HEIGHT - 1); //
        ssd1306_WriteCommand(0xA4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
        ssd1306_WriteCommand(0xD3); //-set display offset
        ssd1306_WriteCommand(0x00); //-not offset
        ssd1306_WriteCommand(0xD5); //--set display clock divide ratio/oscillator frequency
        ssd1306_WriteCommand(0x80); //--set divide ratio
        ssd1306_WriteCommand(0xD9); //--set pre-charge period
        ssd1306_WriteCommand(0x22); //
        ssd1306_WriteCommand(0xDA); //--set com pins hardware configuration
        ssd1306_WriteCommand(0x02); //128*32
        ssd1306_WriteCommand(0xDB); //--set vcomh
        ssd1306_WriteCommand(0x40); 
    };
    
    if (SSD1306_HEIGHT == 64)
    {
        ssd1306_WriteCommand(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
        ssd1306_WriteCommand(0xB0); //Set Page Start Address for Page Addressing Mode,0-7
        ssd1306_WriteCommand(0xC8); //Set COM Output Scan Direction
        ssd1306_WriteCommand(0x00); //---set low column address
        ssd1306_WriteCommand(0x10); //---set high column address
        ssd1306_WriteCommand(0x40); //--set start line address
        ssd1306_WriteCommand(0x81); //--set contrast control register
        ssd1306_WriteCommand(0xFF);
        ssd1306_WriteCommand(0xA1); //--set segment re-map 0 to 127
        ssd1306_WriteCommand(0xA6); //--set normal display
        ssd1306_WriteCommand(0xA8); //--set multiplex ratio(1 to 64)
        ssd1306_WriteCommand(0x3F); //
        ssd1306_WriteCommand(0xA4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
        ssd1306_WriteCommand(0xD3); //-set display offset
        ssd1306_WriteCommand(0x00); //-not offset
        ssd1306_WriteCommand(0xD5); //--set display clock divide ratio/oscillator frequency
        ssd1306_WriteCommand(0xF0); //--set divide ratio
        ssd1306_WriteCommand(0xD9); //--set pre-charge period
        ssd1306_WriteCommand(0x22); //
        ssd1306_WriteCommand(0xDA); //--set com pins hardware configuration
        ssd1306_WriteCommand(0x12);
        ssd1306_WriteCommand(0xDB); //--set vcomh
        ssd1306_WriteCommand(0x20); //0x20,0.77xVcc
    };
    
    ssd1306_WriteCommand(0x8D); //--set DC-DC enable
    ssd1306_WriteCommand(0x14); //
    ssd1306_WriteCommand(0xAF); //--turn on SSD1306 panel
    ssd1306_Fill(Black);
    ssd1306_UpdateScreen();
    SSD1306.CurrentX = 0;
    SSD1306.CurrentY = 0;
    SSD1306.Initialized = 1;
}
 
//Fill screen with black or white
void ssd1306_Fill(SSD1306_COLOR color) 
{
    /* Set memory */
    uint32_t i;
    for(i = 0; i < sizeof(SSD1306_Buffer); i++)
    {
        SSD1306_Buffer[i] = (color == Black) ? 0x00 : 0xFF;
    }
}
 
 
//Update RAM to screen
void ssd1306_UpdateScreen(void) 
{
    uint8_t i;
    for (i = 0; i < 8; i++) {
        ssd1306_WriteCommand(0xB0 + i);
        ssd1306_WriteCommand(0x00);
        ssd1306_WriteCommand(0x10);
        HAL_I2C_Mem_Write(&hi2c1, SSD1306_I2C_ADDR, 0x40, 1, &SSD1306_Buffer[SSD1306_WIDTH * i], SSD1306_WIDTH, 100);
    }
}
 
/*
Params:
- x: x coordinate 0-127
- y: y coordinate 0-31
- color: Black/White
*/
void ssd1306_DrawPixel(uint8_t x, uint8_t y, SSD1306_COLOR color)
{
    if (x >= SSD1306_WIDTH || y >= SSD1306_HEIGHT) 
    {
        return;
    }
    if (SSD1306.Inverted) 
    {
        color = (SSD1306_COLOR)!color;
    }
    if (color == White)
    {
        SSD1306_Buffer[x + (y / 8) * SSD1306_WIDTH] |= 1 << (y % 8);
    } 
    else 
    {
        SSD1306_Buffer[x + (y / 8) * SSD1306_WIDTH] &= ~(1 << (y % 8));
    }
}
 
/*
Writing single character function
Params:
- ch: character to be displayed
- Font: font selection Font_7x10/Font_11x18/Font_16x26
- color: Black/White
*/
char ssd1306_WriteChar(char ch, FontDef Font, SSD1306_COLOR color)
{
    uint32_t i, b, j;
    if (SSD1306_WIDTH <= (SSD1306.CurrentX + Font.FontWidth) ||
        SSD1306_HEIGHT <= (SSD1306.CurrentY + Font.FontHeight))
    {
        return 0;
    }
    for (i = 0; i < Font.FontHeight; i++)
    {
        b = Font.data[(ch - 32) * Font.FontHeight + i];
        for (j = 0; j < Font.FontWidth; j++)
        {
            if ((b << j) & 0x8000) 
            {
                ssd1306_DrawPixel(SSD1306.CurrentX + j, (SSD1306.CurrentY + i), (SSD1306_COLOR) color);
            } 
            else 
            {
                ssd1306_DrawPixel(SSD1306.CurrentX + j, (SSD1306.CurrentY + i), (SSD1306_COLOR)!color);
            }
        }
    }
    SSD1306.CurrentX += Font.FontWidth;
    return ch;
}
 
/*
Writing string function
Params:
- str: pointer to string
- Font: font selection Font_7x10/Font_11x18/Font_16x26
- color: Black/White
*/
char ssd1306_WriteString(char* str, FontDef Font, SSD1306_COLOR color)
{
    while (*str) 
    {
        if (ssd1306_WriteChar(*str, Font, color) != *str)
        {
            return *str;
        }
        str++;
    }
    return *str;
}
 
 
//Set cursor coordinate
void ssd1306_SetCursor(uint8_t x, uint8_t y) 
{
    /* Set write pointers */
    SSD1306.CurrentX = x;
    SSD1306.CurrentY = y;
}

Можно ткнуть пальцем, как это реализовать?
Я так понимаю ковырять нужно в сторону void ssd1306_UpdateScreen(void) и HAL_I2C_Mem_Write
0
Модератор
Эксперт по электронике
8924 / 6691 / 920
Регистрация: 14.02.2011
Сообщений: 23,580
14.10.2020, 12:07 4
Цитата Сообщение от serge_lod Посмотреть сообщение
Я так понимаю ковырять нужно в сторону void ssd1306_UpdateScreen(void)
ковырять нужно в сторону даташита дисплея и написания своей библиотеки
в идеале можно в качестве буфера использовать всего один байт
0
Rius
14.10.2020, 12:22     STM32F031 + oled ssd1306
  #5

Не по теме:

Я таким образом подключал дисплей с памятью на 300КБ к микроконтроллеру, у которого её всего 64КБ.

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.10.2020, 12:22

Подключение OLED дисплея SSD1306 к Arduino Uno
Наконец приехали Arduino Uno и OLED дисплей 128x64px SPI. Начал делать, как описано на странице:...

Метеостанция DHT11+SSD1306+HR911105A
Приветствую, решил запилить датчик температуры в серверную и столкнулся с проблемой: при загрузке...

Дисплей SSD1306 и Arduino nano
заказал с али дисплей SSD1306, подключил к ардуинке по I2C, питание 5 В кинул, включил, всё...

SSD1306 и неверный порядок включения питания
Я юзал otid на sh1106, он нормально переносит ситуацию, когда vpp (vcc) подано, но vdd (для логики)...

Загружается код и зависает экран 0.96 дюймов ssd1306 (решено)
Дратути. ************* Довольный UPD перекур.Надеюсь все кто столкнётся с данной проблемой...

Oled+stm32
Вот нашел библиотеку для инициализации и вывода сообщений в дисплей oled 128x64, в библиотеке...

MVA vs OLED ?
Кто лучше - ибо технологии разные , а результат схожий .


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru