使用VSCode+CubeMx开发STM32,这里介绍使用硬件I2C接口驱动OLED屏幕;

1.建立工程

1.1 创建项目文件

从已有的仓库中创建一个工程:

1
git clone https://github.com/makerinchina-iot/vscode_stm32cubemx_hello.git oled

使用VSCode打开工程后,需要更改如下名字:

  • 文件夹根目录下CMakeLists.txt 文件中修改工程名字为oled:
1
set(CMAKE_PROJECT_NAME oled)
  • stm32cubemx配置文件更改为 oled.ioc ,并更改以下文件名:
1
2
3
4
...
ProjectManager.ProjectFileName=oled.ioc
ProjectManager.ProjectName=oled
...
1.2 引脚配置

使用STM32CubeMx打开ioc配置文件,然后配置对应的硬件I2C引脚;

2. 编写代码

2.1 基本的硬件I2C使用

由CubeMx配置好I2C后,直接使用接口 HAL_I2C_Master_TransmitHAL_I2C_Mem_Write 来对I2C进行写操作即可;

2.2 OLED显示
  • OLED初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// OLED initialisation sequence
const uint8_t OLED_INIT_CMD[] = {
OLED_MULTIPLEX, 0x3F, // set multiplex ratio
OLED_CHARGEPUMP, 0x14, // set DC-DC enable
OLED_MEMORYMODE, 0x00, // set horizontal addressing mode
OLED_COLUMNS, 0x00, 0x7F, // set start and end column
OLED_PAGES, 0x00, 0x3F, // set start and end page
OLED_COMPINS, 0x12, // set com pins
OLED_XFLIP, OLED_YFLIP, // flip screen
OLED_DISPLAY_ON // display on
};


void ssd1306_init(void)
{
for (uint32_t i = 0; i < sizeof(OLED_INIT_CMD); i++)
{
ssd1306_write_cmd(OLED_INIT_CMD[i]);
}
}
  • OLED写命令和写数据操作
1
2
3
4
5
6
7
8
9
10
11
static void ssd1306_write_cmd(uint8_t cmd)
{
uint8_t buff[2] = {OLED_CMD_MODE, cmd};

HAL_I2C_Master_Transmit(&hi2c2, OLED_ADDR, buff, 2, HAL_MAX_DELAY);
}

static void ssd1306_write_data(uint8_t *pdata, uint16_t len)
{
HAL_I2C_Mem_Write(&hi2c2, OLED_ADDR, OLED_DAT_MODE, I2C_MEMADD_SIZE_8BIT, pdata, len, HAL_MAX_DELAY);
}
  • OLED基本显示

SSD1306为128x64像素,分为8个Page和128列,1个Page的1列包含8个像素点,因此写入时按字节写入,1个字节会填充1个page的1列像素点,高位在上,低位在下,示意图如下:

显示时候就需要先指定位置,即Page和列的坐标,然后写入像素即可显示了;

  • 设置坐标
1
2
3
4
5
6
void ssd1306_set_pos(uint8_t x, uint8_t y)
{
ssd1306_write_cmd(OLED_PAGE | y);
ssd1306_write_cmd(x & 0x0f);
ssd1306_write_cmd(OLED_COLUMN_HIGH | (x >> 4));
}
  • OLED显示条纹测试

0-63列显示上半部分,64-127列显示下半部分:

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
void ssd1306_test_bar()
{

static uint8_t mem_buff[8][128];

// clear
memset(mem_buff, 0, sizeof(mem_buff));

for (uint8_t x = 0; x < 8; x++)
{
// set cloumn 0-63
for (uint8_t i = 0; i < 64; i++)
{
mem_buff[x][i] = 0x0f;
}
// set column 64-127
for (uint8_t i = 64; i < 128; i++)
{
mem_buff[x][i] = 0xf0;
}
}

// write to all
for (uint8_t i = 0; i < 8; i++)
{
ssd1306_set_pos(0, i);
ssd1306_write_data(mem_buff[i], 128);
}
}

3.编译并烧录代码

3.1 编译和烧录
  • 点击生成按键即可编译工程;

  • 在VSCode中执行task:openocd-flash烧录;

3.2 硬件连接与结果
  • 按照如下方式连接硬件:
STM32 OLED
3.3V 3V3
PB13 SCL
PB14 SDA
GND GND
  • 最后可以看到OLED显示如下: