Zeruns's Blog - HAL库
type: channel
link: https://blog.zeruns.com/tag/HAL%E5%BA%93/
items: 基于STM32G4的0.96寸OLED显示屏驱动程序（HAL库），支持硬件/软件I2C
items: STM32读取SHT3x系列温湿度传感器，标准库和HAL库

基于STM32G4的0.96寸OLED显示屏驱动程序（HAL库），支持硬件/软件I2C
type: item
date: 2024-03-17T03:27:50+08:00
description: AI摘要 介绍了一款基于STM32G4的0.96寸OLED显示屏驱动程序，支持硬件/软件I2C，使用HAL库开发。该驱动功能丰富，支持多种内容显示与图形绘制，适用于英文、汉字、图像等展示，并提供了详细的配置与使用说明。 此内容根据文章生成，仅用于文章内容的解释与总结 基于STM32G474的0.96寸OLED(SSD1306)显示屏驱动程序（4针脚I2C接口），支持硬件IIC/软件IIC，HAL库版。这款驱动程序比较完善，可以实现 英文、整数、浮点数、汉字、图像、二进制数、十六进制数 等内容显示，可以画点、直线、矩形、圆、椭圆、三角形等，支持多种字体，差不多相当于一个简易版图形库了。该程序是基于江协科技的代码二次修改的，原版程序是基于STM32F103的，且只支持软件I2C，我修改后支持硬件I2C，也可以修改宏定义改成使用软件I2C。测试硬件为NUCLEO-G474RE开发板关于OLED的驱动原理，以及驱动程序的使用教程可以看江协科技的视频：https://url.zeruns.com/L7j6ySTM32使用硬件I2C读取SHTC3温湿度传感器：https://blog.zeruns.com/archives/692.html移植好U8g2图形库的STM32F407标准库工程模板：https://blog.zeruns.com/archives/722.html基于STM32F1的0.96寸OLED显示屏驱动程序，支持硬件/软件I2C：https://blog.zeruns.com/archives/769.html电子/单片机技术交流群：2169025065效果图I2C协议简介I2C 通讯协议(Inter－Integrated Circuit)是由 Phiilps 公司开发的，由于它引脚少，硬件实现简单，可扩展性强，不需要 USART、CAN 等通讯协议的外部收发设备（那些电平转化芯片），现在被广泛地使用在系统内多个集成电路(IC)间的通讯。I2C只有一跟数据总线 SDA(Serial Data Line)，串行数据总线，只能一位一位的发送数据，属于串行通信，采用半双工通信。半双工通信：可以实现双向的通信，但不能在两个方向上同时进行，必须轮流交替进行，其实也可以理解成一种可以切换方向的单工通信，同一时刻必须只能一个方向传输，只需一根数据线。对于I2C通讯协议把它分为物理层和协议层物理层规定通讯系统中具有机械、电子功能部分的特性（硬件部分），确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑，统一收发双方的数据打包、解包标准（软件层面）。I2C物理层I2C 通讯设备之间的常用连接方式(1) 它是一个支持多设备的总线。“总线”指多个设备共用的信号线。在一个 I2C 通讯总线中，可连接多个 I2C 通讯设备，支持多个通讯主机及多个通讯从机。(2) 一个 I2C 总线只使用两条总线线路，一条双向串行数据线SDA（Serial Data Line ），一条串行时钟线SCL（Serial Clock Line ）。数据线即用来表示数据，时钟线用于数据收发同步(3) 总线通过上拉电阻接到电源。当 I2C 设备空闲时会输出高阻态，而当所有设备都空闲，都输出高阻态时，由上拉电阻把总线拉成高电平。I2C通信时单片机GPIO口必须设置为开漏输出，否则可能会造成短路。关于更多STM32的I2C相关信息和使用方法可以看这篇文章：https://url.zeruns.com/JC0Ah还有江协科技的STM32入门教程：https://www.bilibili.com/video/BV1th411z7sn?p=31我这里就不详细讲解了。使用说明默认是使用硬件IIC的，用的I2C3，SCL是PA8，SDA是PC9。硬件I2CSTM32CubeMX配置，找到你要用的I2C外设的引脚，并设置引脚功能为SCL和SDA，如下图所示是I2C3的SCL。接着配置I2C外设，启用对应的I2C外设，速度模式设置为 Fast Mode Plus，速度改成 1000，其他默认就行。配置GPIO，上面设置完后会自动把那两个引脚配置为复用开漏输出模式，接着只需要把IO输出速度改成 Very High ，还有GPIO标签(User Label)定义分别改成I2C3_SCL和I2C3_SDA就行，如果是用的别的I2C也可以设置成别的值，代码对应处要修改一下。改完后点击生成代码。OLED.c文件里，将 #define OLED_USE_SW_I2C 注释掉，将 #define OLED_USE_HW_I2C 取消注释，如果你用的是别的引脚作为I2C引脚，并且定义了别的名字那就将代码里的 I2C3_SCL 和 I2C3_SDA 也改一下。软件I2CSTM32CubeMX配置，设置两个…

STM32读取SHT3x系列温湿度传感器，标准库和HAL库
type: item
date: 2023-01-04T00:19:00+08:00
description: AI摘要 STM32通过硬件I2C和软件模拟IIC读取SHT3x温湿度传感器数据并显示在OLED屏上，包含标准库和HAL库代码实现。 此内容根据文章生成，仅用于文章内容的解释与总结 STM32读取SHT3x系列(SHT30、SHT31、SHT35)温湿度传感器的数据并显示在0.96寸OLED屏上。我下面提供两份代码，一份是标准库使用硬件I2C的，另一份是HAL库使用软件模拟IIC的。我用的单片机是STM32F103C8T6，温湿度传感器是SHT30。STM32软件I2C读取AM2320温湿度传感器数据：https://blog.zeruns.com/archives/695.htmlSTM32使用硬件I2C读取SHTC3温湿度传感器：https://blog.zeruns.com/archives/692.htmlSTM32单片机读取AHT10温湿度传感器数据：https://blog.zeruns.com/archives/693.html电子/单片机技术交流群：2169025065实现效果图I2C协议简介I2C 通讯协议(Inter－Integrated Circuit)是由 Phiilps 公司开发的，由于它引脚少，硬件实现简单，可扩展性强，不需要 USART、CAN 等通讯协议的外部收发设备（那些电平转化芯片），现在被广泛地使用在系统内多个集成电路(IC)间的通讯。I2C只有一跟数据总线 SDA(Serial Data Line)，串行数据总线，只能一位一位的发送数据，属于串行通信，采用半双工通信半双工通信：可以实现双向的通信，但不能在两个方向上同时进行，必须轮流交替进行，其实也可以理解成一种可以切换方向的单工通信，同一时刻必须只能一个方向传输，只需一根数据线.对于I2C通讯协议把它分为物理层和协议层物理层规定通讯系统中具有机械、电子功能部分的特性（硬件部分），确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑，统一收发双方的数据打包、解包标准（软件层面）。I2C物理层I2C 通讯设备之间的常用连接方式(1) 它是一个支持多设备的总线。“总线”指多个设备共用的信号线。在一个 I2C 通讯总线中，可连接多个 I2C 通讯设备，支持多个通讯主机及多个通讯从机。(2) 一个 I2C 总线只使用两条总线线路，一条双向串行数据线SDA（Serial Data Line ），一条串行时钟线SCL（Serial Data Line ）。数据线即用来表示数据，时钟线用于数据收发同步(3) 总线通过上拉电阻接到电源。当 I2C 设备空闲时会输出高阻态，而当所有设备都空闲，都输出高阻态时，由上拉电阻把总线拉成高电平。I2C通信时单片机GPIO口必须设置为开漏输出，否则可能会造成短路。关于更多STM32的I2C相关信息和使用方法可以看这篇文章：https://url.zeruns.com/JC0Ah我这里就不详细讲解了。SHT3x温湿度传感器SHT3x数据手册下载地址：原版：https://url.zeruns.com/uWNnP 提取码：icqu中文版(机翻)：https://url.zeruns.com/n9b9t 提取码：vedy浏览数据手册可以得到一个大概信息，SHT30是一个可以检测温度和湿度的传感器，温度范围：-40℃\~125℃湿度范围：0%\~100%工作电压：2.4v\~5.5v通讯方式：i2c时钟频率：0 \~ 1000kHz找到如下几个关键信息SHT3x设备地址和读写命令SHT3x的地址可以通过第2个引脚接高或低电平来设置，我在淘宝买的模块的传感器2脚是通过一个电阻接到VCC，也就是默认是0x44。在实际的使用过程中，SHT3x的设备地址需要与读写数据/命令方向位组成一个字节同时发送，字节的最低位为读写数据/命令方向位，高7位是SHT3x的设备地址。如果要通过I2C写数据或命令给SHT3x，在I2C起始信号之后，需要发送“1000 1000”，即0x88给SHT3x，除了通过高7位“1000 100”（0x44）的设备地址寻址还通过最低位“0”通知SHT3x接下来是写数据或命令操作。如果要通过I2C读取SHT3x中的数据，在I2C起始信号之后，需要发送“1000 1001”，即0x89给SHT3x，除了通过高7位“1000 100”的设备地址寻址还通过最低位“1”通知SHT3x接下来是读取数据的操作。简单来说就是，0x88表示写数据，0x89表示读数据。不过使用STM32硬件I2C时只需要输入0x88就行，最低位标准库会处理的。读取温湿度数据可知，不同的命令，获取的数据方式不一样，有单次测量和周期测量模式，还有一个Clock Stretching Enable 和 Disable的区别。Clock Stretchin…