STM32 i2c 驱动0.42寸OLED

news/2025/2/22 15:53:53/

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 twinkleOLED_full_OLED();HAL_Delay(1000);OLED_clean_OLED();HAL_Delay(1000);OLED_drawString(28, 0, "012345678901234", 8, 16);//128 = 16*8OLED_drawString(28, 16, "012345678901234", 8, 16);//128 = 16*8OLED_drawString(28, 32, "012345678901234", 8, 16);//128 = 16*8OLED_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的版本号如下


http://www.ppmy.cn/news/63181.html

相关文章

全国职业院校技能大赛网络建设与运维赛项赛题(四)

全国职业院校技能大赛 网络建设与运维 赛题 (四)

设计模式——适配器模式(类适配器、对象适配器)

是什么? 我们平时的有线耳机接口分为USB的和Type-C的接口,但是手机的耳机插口却只有一个,像华为的耳机插口现在基本都是Type-c的,那如果我们现在只有USB接口的耳机怎么办呢,这个时候就需要使用到一个转换器&#xff0c…

动态规划-最少的硬币数目

动态规划-最少的硬币数目 1 题目2 示例示例 1:示例 2:示例 3:示例 4:示例 5:提示: 3 题解3.1 解题思路3.2 题解3.2.1 C解法3.2.2 C语言解法 1 题目 给定不同面额的硬币 coins 和一个总金额 amount。编写一…

leetcode-027-移除元素

题目及测试 package pid027; /*27. 移除元素 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可…

B. LuoTianyi and the Table

题目链接 Codeforces Round 872 (Div. 2) Example input 5 2 2 1 3 1 4 2 2 -1 -1 -1 -1 2 3 7 8 9 -3 10 8 3 2 4 8 -3 0 -7 1 4 3 -32030 59554 16854 -85927 68060 -64460 -79547 90932 85063 82703 -12001 38762 output 9 0 64 71 1933711 题目大意: 每组测试…

一个文章学会使用Git

GIT版本控制系统 版本控制系统 : ​ 1.记录历史版本信息 (记录每一次修改的记录) ​ 2.方便团队相互之间协作开发 ​ … 常用的版本控制系统 cvs / svn : 集中式版本控制系统git : 分布式版本控制系统 svn git GIT工作原理 工作区 : 我们能看到的,并且用来写代码的…

Mybatis一级缓存详解

目录 一级缓存 一级缓存的组织 一级缓存的生命周期 一级缓存的工作流程 Cache接口的设计以及CacheKey的定义 一级缓存的性能分析 一级缓存与Spring 事务一级缓存存在的弊端 官方文档分析 Spring通过Mybatis调用数据库的过程 一级缓存 对于会话(Session&am…

ai皮带跑偏撕裂监测算法 yolov7

ai皮带跑偏撕裂监测系统算法基于yolov7网络模型人工智能视觉技术,ai皮带跑偏撕裂监测算法模型自动识别现场画面中传送皮带撕裂、跑偏、偏移等情况,立即告警抓拍存档同步回传后台。YOLO 的核心思想就是把目标检测转变成一个回归问题,利用整张图…