afiskonライブラリafiskon/stm32-ssd1306はSSD1306は4iloライブラリからforkされたものの様で、SSD1306 OLEDのI2C版とSPI版に対応しています。
Nucleo-F446REとNucleo-G431KBで動作確認しました。
以下の記事を参考にさせていただきました。
「afiskon」さん(本家) https://github.com/afiskon/stm32-ssd1306
「hacksOnTable」さん 「STM32 OLED TUTORIAL(Youtube)」
HALを使ったプログラミングはSTM32CubeIDEの登場でかなり便利になりましたが、MPUのシリーズによって特徴があり、設定やプログラミングが方法がそれぞれ少しずつ異なります。冗長になりますが、Nucleo-F446REとNucleo-G431GBで、SSD1306のI2C版とSPI版の使い方を説明します。
STM32CubeIDEのバージョン: 1.10.1
I2C版 Nucleo-F446RE
Board SelecotorでNuckeo-F446REを指定してDefult Modeで初期化。
MXの設定
Pinout & Configuration
Connectivity
I2C1
Mode
I2C: I2C
Configuration
Parameter Settings
Master Features
I2C Speed Mode: Standard Mode
GPIO Settings
PB8 I2C1_SCL
PB9 I2C1_SDA
afiskonライブラリではデフォルトでI2C1を使う設定になっています。I2C2やI2C3などを使う場合は「ssd1306_conf_template.h」を適宜書き換えます。
ハードウェアの準備
SSD1306 | F446RE | Arduino Header |
---|---|---|
GND | GND | GND |
VDD | 3V3 | 3V3 |
SCK | PB8 | D15 |
SDA | PB9 | D14 |
ブレッドボード配線図
ライブラリの準備
GitHubのafiskon/stm32-ssd1306からZIPファイルをダウンロードします。
- ssd1306.h
- ssd1306_conf_templates.h
- ssd1306_fonts.h
- ssd1306_tests.h
を「<Projectフォルダ>\Core\Inc\」に
- ssd1306.c
- ssd1306_fonts.c
- ssd1306_tests.c
を「<Projectフォルダ>\Core\Src\」にコピーします。IDEのProject ExplorerでProjectフォルダを右クリックし「Refresh」します。
「Core/Inc/ssd1306_conf_template.h」の内容を以下のように書き換えます。
// Choose a microcontroller family //#define STM32F0 #define STM32F4
重要:「ssd1306_conf_template.h」を「ssd1306_conf.h」にRenameします。
ソースコード
MXでコード生成して、Core\Src\main.cに以下のコードを追加します。
/* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "ssd1306.h" #include "ssd1306_fonts.h" #include "ssd1306_tests.h" /* USER CODE END Includes */ <略> /* USER CODE BEGIN 2 */ ssd1306_TestAll(); /* USER CODE END 2 */
実行している様子
FPS表示値
Standard Mode | 9 |
Fast Mode | 34 |
F446REの駆動クロックはHSI/84MHz。
I2C信号波形
F446RE I2C Fast Mode 2.2kΩ Pullup
C1:SDA C2:SCL
I2C版 Nucleo-G431KB
Board SelecotorでNuckeo-G431KBを指定してDefult Modeで初期化。
MXの設定
Pinout & Configuration
Connectivity
I2C1
Mode
I2C: I2C
Configuration
Parameter Settings
Master Features
I2C Speed Mode: Standard Mode
GPIO Settings
PA15 I2C1_SCL
PB7 I2C1_SDA
ブレッドボード配線図
SSD1306 | G431KB | Arduino Header |
---|---|---|
GND | GND | GND |
VDD | 3V3 | 3V3 |
SCK | PA15 | D5 |
SDA | PB7 | D4 |
ライブラリの準備
必要なファイルをコピーします。
- Core/Inc/ssd1306.h
- Core/Inc/ssd1306_conf_templates.h
- Core/Inc/ssd1306_fonts.h
- Core/Inc/ssd1306_tests.h
- Core/Src/ssd1306.c
- Core/Src/ssd1306_fonts.c
- Core/Src/ssd1306_tests.c
「Core/Inc/ssd1306_conf_template.h」の内容を以下のように書き換えます。
// Choose a microcontroller family //#define STM32F0 #define STM32G4
「#define STM32G4」はコメントアウトで用意されていないので書き加えます。「ssd1306.h」では
#elif defined(STM32G4) #include "stm32g4xx_hal.h"
と、STM32G4を使用する場合の定義があります。
重要:「ssd1306_conf_template.h」を「ssd1306_conf.h」にRenameします。
ソースコード
MXでコード生成して、Core\Src\main.cに以下のコードを追加します。
/* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "ssd1306.h" #include "ssd1306_fonts.h" #include "ssd1306_tests.h" /* USER CODE END Includes */ <略> /* USER CODE BEGIN 2 */ ssd1306_TestAll(); /* USER CODE END 2 */
main.cへのソースコードの追加はI2C版 Nucleo-F446REと同じです。
実行している様子
FPS表示値
Standard Mode | 9 |
Fast Mode | 35 |
Fast Mode Plus | 76 |
※Fast Mode Plusで使用する場合は2.2kΩ程度で外部Pullupする。
G431KBの駆動クロックはHSI/170MHz。
I2C信号波形
G431RB I2C Fast Mode Plus 2.2kΩ Pullup
C1:SDA C2:SCL
SPI版 Nucleo-F446RE
Board SelecotorでNuckeo-F446REを指定してDefult Modeで初期化。
MXの設定
Pinout & Configuration
System Core
Configuration
GPIO
PA10 : Output Push Pull : Very High : OLED_Res
PB4 : Output Push Pull : Very High : OLED_CS
PB5 : Output Push Pull : Very High : OLED_DC
Connectivity
SPI2
Mode
Mode: Half Duplex Master
Configuration
Parameter Settings
Clock Parameters
Prescaler(for Baud Rate): 64
Clock Polarity(CPOL): High
Clock Phase(CPHA): 2 Edge
GPIO Settings
PB10 SPI2_SCK
PC1 SPI2_MOSI
Nucleo-F446REでは、SPI1はデフォルトでは使用不可になっているのでSPI2を使用します。MISOは使わないのでModeはHalf Duplex Masterにします。
動作確認のためClock Prescalerは大きめにしてクロック周波数を低く設定します。
重要:Clock Polarity(CPOL)、Clock Phase(CPHA)は上記の通り設定すると動作するようです。
またGPIOで制御信号線(CS、RES、DC)を割り当てます。右側のPinout図でPinをクリックしてGPIO_Outputを選択し、User Labelを設定します。User Labelはssd1306_conf_template.hで定義されているものを入力します。
ハードウェアの準備
SSD1306 | F446RE | Arduino Header | 機能 |
---|---|---|---|
GND | GND | GND | GND |
VDD | 3V3 | 3V3 | 3.3V Power |
D0 | PB10 | D6 | SPI/SCK |
D1 | PC1 | A4 | SPI/MOSI |
RES | PA10 | D2 | Reset |
DC | PB5 | D4 | Data/Command |
CS | PB4 | D5 | SPI/CS |
ブレッドボード配線図
ライブラリの準備
必要なファイルをコピーします。
- Core/Inc/ssd1306.h
- Core/Inc/ssd1306_conf_templates.h
- Core/Inc/ssd1306_fonts.h
- Core/Inc/ssd1306_tests.h
- Core/Src/ssd1306.c
- Core/Src/ssd1306_fonts.c
- Core/Src/ssd1306_tests.c
Core\Inc\ssd1306_conf_template.hを以下のように変更します。
// Choose a microcontroller family //#define STM32F0 //#define STM32F1 #define STM32F4 //#define STM32L0 //#define STM32L1 //#define STM32L4 //#define STM32F3 //#define STM32H7 //#define STM32F7 //#define STM32G0 // Choose a bus //#define SSD1306_USE_I2C #define SSD1306_USE_SPI // I2C Configuration //#define SSD1306_I2C_PORT hi2c1 //#define SSD1306_I2C_ADDR (0x3C << 1) // SPI Configuration #include "main.h" #define SSD1306_SPI_PORT hspi2 #define SSD1306_CS_Port OLED_CS_GPIO_Port #define SSD1306_CS_Pin OLED_CS_Pin #define SSD1306_DC_Port OLED_DC_GPIO_Port #define SSD1306_DC_Pin OLED_DC_Pin #define SSD1306_Reset_Port OLED_Res_GPIO_Port #define SSD1306_Reset_Pin OLED_Res_Pin
SPI2を使うのでSSD_1306_SPI_PORTの定義をhspi2に変更します。
あまり感心できるものではありませんが、OLED_CS_GPIO_Portなどが定義されていないというエラーが出るので、直前に
#include "main.h"
という一行を追加して、定義されているヘッダーファイルをインポートします。
重要:「ssd1306_conf_template.h」を「ssd1306_conf.h」にRenameします。
ソースコード
MXでコード生成して、Core\Src\main.cに以下のコードを追加します。
/* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "ssd1306.h" #include "ssd1306_fonts.h" #include "ssd1306_tests.h" /* USER CODE END Includes */ <略> /* USER CODE BEGIN 2 */ ssd1306_TestAll(); /* USER CODE END 2 */
main.cのコード追加はI2C版と同じです。
実行している様子
FPS表示値
SPI Prescaler:64 (655.25KBits/s) | 60 |
SPI Prescaler:16 (2.625MBits/s) | 144 |
SPI Prescaler: 2 (21.0MBits/s) | 217 |
F446REの駆動クロックはHSI/84MHz。
SPI信号波形
F446RE SPI Prescaler=16
C1:MOSI C2:SCK
SPI版 Nucleo-G431KB
Board SelecotorでNuckeo-G431KBを指定してDefult Modeで初期化。
MXの設定
Pinout & Configuration
System Core
Configuration
GPIO
PA11 : Output Push Pull : Very High : OLED_Res
PB4 : Output Push Pull : Very High : OLED_CS
PB5 : Output Push Pull : Very High : OLED_DC
Connectivity
SPI1
Mode
Mode: Half Duplex Master
Configuration
Parameter Settings
Basic Parameters
Data Size: 8bit
Clock Parameters
Prescaler(for Baud Rate): 256
Clock Polarity(CPOL): High
Clock Phase(CPHA): 2 Edge
GPIO Settings
PA5 SPI2_SCK
PA7 SPI2_MOSI
Nucleo-G431KBではデフォルトでSPI1が使用できるのでSPI1を使います。MISOは使わないのでModeはHalf Duplex Masterにします。重要:Data Sizeがデフォルトでは4bitになっているので、8bitに変更します。
動作確認のためClock Prescalerは大きめにしてクロック周波数を低く設定します。
Clock Polarity(CPOL)、Clock Phase(CPHA)は上記の通り設定すると動作するようです。
またGPIOで制御信号線(CS、RES、DC)を割り当てます。右側のPinout図でPinをクリックしてGPIO_Outputを選択し、User Labelを設定します。User Labelはssd1306_conf_template.hで定義されているものを入力します。
ハードウェアの準備
SSD1306 | G431KB | Arduino Header | 機能 |
---|---|---|---|
GND | GND | GND | GND |
VDD | 3V3 | 3V3 | 3.3V Power |
D0 | PA5 | A4 | SPI/SCK |
D1 | PA7 | A6 | SPI/MOSI |
RES | PA11 | D10 | Reset |
DC | PB5 | D11 | Data/Command |
CS | PB4 | D12 | SPI/CS |
ブレッドボード配線図
ライブラリの準備
必要なファイルをコピーします。
- Core/Inc/ssd1306.h
- Core/Inc/ssd1306_conf_templates.h
- Core/Inc/ssd1306_fonts.h
- Core/Inc/ssd1306_tests.h
- Core/Src/ssd1306.c
- Core/Src/ssd1306_fonts.c
- Core/Src/ssd1306_tests.c
Core\Inc\ssd1306_conf_template.hを以下のように変更します。
// Choose a microcontroller family //#define STM32F0 //#define STM32F1 //#define STM32F4 //#define STM32L0 //#define STM32L1 //#define STM32L4 //#define STM32F3 //#define STM32H7 //#define STM32F7 //#define STM32G0 #define STM32G4 // Choose a bus //#define SSD1306_USE_I2C #define SSD1306_USE_SPI // I2C Configuration //#define SSD1306_I2C_PORT hi2c1 //#define SSD1306_I2C_ADDR (0x3C << 1) // SPI Configuration #include "main.h" #define SSD1306_SPI_PORT hspi1 #define SSD1306_CS_Port OLED_CS_GPIO_Port #define SSD1306_CS_Pin OLED_CS_Pin #define SSD1306_DC_Port OLED_DC_GPIO_Port #define SSD1306_DC_Pin OLED_DC_Pin #define SSD1306_Reset_Port OLED_Res_GPIO_Port #define SSD1306_Reset_Pin OLED_Res_Pin
あまり感心できるものではありませんが、OLED_CS_GPIO_Portなどが定義されていないというエラーが出るので、直前に
#include "main.h"
という一行を追加して、定義されているヘッダーファイルをインポートします。
重要:「ssd1306_conf_template.h」を「ssd1306_conf.h」にRenameします。
ソースコード
MXでコード生成して、Core\Src\main.cに以下のコードを追加します。
/* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "ssd1306.h" #include "ssd1306_fonts.h" #include "ssd1306_tests.h" /* USER CODE END Includes */ <略> /* USER CODE BEGIN 2 */ ssd1306_TestAll(); /* USER CODE END 2 */
main.cはいずれも同じコードです。
実行している様子
FPS表示値
SPI Prescaler:256 (654.062KBits/s) | 69 |
SPI Prescaler: 64 (2.65625MBits/s) | 199 |
SPI Prescaler: 8 (21.25MBits/s) | 437 |
SPI Prescaler: 4 (42.5MBits/s) | 動作せず |
G431REの駆動クロックはHSI/170MHz。
SPI信号波形
G431KB SPI Prescaler=64
C1:MOSI C2:SCK
0 件のコメント:
コメントを投稿