STM32 i2c は 0.42 インチ OLED を駆動します。これがプロジェクトで使用されるソリューションです。デバッグもさらに困難です。主なことは、フォントとコードを一致させることです。次の章では、フォントを取り込むプロセスについて説明します詳細を確認し、このソリューションで使用してください。
この記事で使用したテストコード
STM32i2c ドライブ 0.42 インチ OLED、SSD1306 リソース - CSDN ライブラリ
ディスプレイに最小サイズの OLED を使用する必要があるプロジェクトがあり、いろいろ選んだ結果、0.42 インチの超小型 OLED を見つけました。実際のプロジェクトで OLED をデバッグするプロセスの簡単な記録です。
このOLEDの寸法図
OLEDの決定式図
OLEDのハードウェアインターフェース
STM32F030F4Px を使用してハードウェア上の OLED を接続します
なお、PA5/PA6はi2c機能を使用しているため、プルアップ抵抗の設計が必要です。
模式図は比較的簡単なので、あまり説明しません。
クロック構成は次のとおりです. 内部 HSI クロックを使用し、周波数を 48Mhz に逓倍します. これも非常に重要であり、クロックの遅延に大きく関係します. 遅延機能が正しく構成されていない場合、間違った I2C タイミング、そして間違った OLED 構成 もちろん、外部クロックを使用することもできます
使用されている stm32cubemx バージョン。最新バージョンを使用するのが最善です
stm32cubemx の I2C ピンの構成については、出力として構成できます。
生成されたプロジェクトは次の設定を使用します
OLED初期化機能
void write_i(uint8_t cmd)
{
OLED_send_cmd(cmd);
}
void InitSSD1306()
{
// RES=0;
// delay(1000);
// RES=1;
///delay(10);
HAL_Delay(1000);
write_i(0xAE); /*display off*/
write_i(0xD5); /*set osc division*/
write_i(0xF0);
write_i(0xA8); /*multiplex ratio*/
write_i(0x27); /*duty = 1/40*/
write_i(0xD3); /*set display offset*/
write_i(0x00);
write_i(0x40); /*Set Display Start Line */
write_i(0x8d); /*set charge pump enable*/
write_i(0x14);
write_i(0x20); /*Set page address mode*/
write_i(0x02);
write_i(0xA1); /*set segment remap*/
write_i(0xC8); /*Com scan direction*/
write_i(0xDA); /*set COM pins*/
write_i(0x12);
write_i(0xAD); /*Internal IREF Setting*/
write_i(0x30);
write_i(0x81); /*contract control*/
write_i(0x2F); /*128*/
write_i(0xD9); /*set pre-charge period*/
write_i(0x22);
write_i(0xdb); /*set vcomh*/
write_i(0x20);
write_i(0xA4); /*Set Entire Display On/Off*/
write_i(0xA6); /*normal / reverse*/
write_i(0x0C); /*set lower column address*/
write_i(0x11); /*set higher column address*/
write_i(0xAF); /*display ON*/
}
画面を反転する機能は非常に便利で、デバッグ時にさらに便利です。
void OLED_reverse_All(unsigned char mode)//(1黑底白字,0白底黑字)
{
if(mode){
OLED_send_cmd(0xA6);//1亮0灭
}else{
OLED_send_cmd(0xA7);//1灭0亮
}
}
メイン機能では、ライトの点滅と画面の更新の操作を実行します。
HAL_Delay(1000);
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_4);//LED twinkle
OLED_full_OLED();
HAL_Delay(1000);
OLED_clean_OLED();
HAL_Delay(1000);
OLED_drawString(28, 0, "012345678901234", 8, 16);//128 = 16*8
OLED_drawString(28, 16, "012345678901234", 8, 16);//128 = 16*8
OLED_drawString(28, 32, "012345678901234", 8, 16);//128 = 16*8
OLED_display();
halライブラリでI2Cを使用するにはSDAピンの入出力設定が必要ですが、ここではレジスタへの直接操作ではなく、ライブラリ関数を使用することで用途要件にも対応できます。
#define IIC_SDA_PIN GPIO_PIN_6
#define IIC_SCL_PIN GPIO_PIN_5
#define IIC_SDA_H HAL_GPIO_WritePin(IIC_SDA, IIC_SDA_PIN, GPIO_PIN_SET)
#define IIC_SDA_L HAL_GPIO_WritePin(IIC_SDA, IIC_SDA_PIN, GPIO_PIN_RESET)
#define IIC_SCL_H HAL_GPIO_WritePin(IIC_SCL, IIC_SCL_PIN, GPIO_PIN_SET)
#define IIC_SCL_L HAL_GPIO_WritePin(IIC_SCL, IIC_SCL_PIN, GPIO_PIN_RESET)
void IIC_OUT(void)//SDA是输出方向
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.Pin=IIC_SDA_PIN;
GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_HIGH;
GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出模式
HAL_GPIO_Init(IIC_SDA,&GPIO_InitStructure);
}
void IIC_IN(void)//SDA是输入方向
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.Pin=IIC_SDA_PIN;
GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_HIGH;
GPIO_InitStructure.Pull = GPIO_PULLUP;
GPIO_InitStructure.Mode=GPIO_MODE_INPUT; //输入上拉模式
HAL_GPIO_Init(IIC_SDA,&GPIO_InitStructure);
}
実際のテスト効果図は次のとおりです。
使用したテストコードは以下の通り
STM32i2c ドライブ 0.42 インチ OLED、SSD1306 リソース - CSDN ライブラリ
keilのバージョン番号は以下の通りです