Zeruns's Blog - stm32
type: channel
link: https://blog.zeruns.com/tag/stm32/
items: 基于STM32的同步整流Buck-Boost数字电源 开源
items: 基于STM32F407的LVGL工程模板（MSP3526屏幕），包含FreeRTOS版和裸机版
items: 基于STM32G4的0.96寸OLED显示屏驱动程序（HAL库），支持硬件/软件I2C
items: 基于STM32F1的0.96寸OLED显示屏驱动程序，支持硬件/软件I2C
items: 移植好U8g2图形库的STM32F407标准库工程模板，0.96寸OLED驱动程序
items: STM32F030C8T6最小系统板和流水灯（原理图和PCB）
items: STM32读取SHT3x系列温湿度传感器，标准库和HAL库
items: STM32软件I2C读取AM2320温湿度传感器数据
items: STM32单片机读取AHT10温湿度传感器数据
items: STM32使用硬件I2C读取SHTC3温湿度传感器

基于STM32的同步整流Buck-Boost数字电源 开源
type: item
date: 2024-06-05T01:35:00+08:00
description: AI摘要 一款基于STM32G474的四开关Buck-Boost数字电源，支持TypeC接口PD诱骗输入和DC5.5接口输入，输入/输出最高48V10A。通过PID算法实现输出控制与保护，含原理图、PCB、源码等开源资料。 此内容根据文章生成，仅用于文章内容的解释与总结 一款基于STM32G474的四开关Buck-Boost数字电源，支持TypeC接口PD诱骗输入和DC5.5接口输入，输入/输出最高48V10A，这是我的毕业设计，现在开源出来，含原理图、PCB、程序源码、外壳3D模型等资料。做得一般，勿喷，欢迎友好交流。作品演示视频：https://www.bilibili.com/video/BV1Ui421y7ip/基于CH32V307的智能电子负载开源，嵌入式大赛作品开源：https://blog.zeruns.com/archives/785.html本项目的立创开源平台开源链接：https://url.zeruns.com/noGf0电子/单片机技术交流QQ群：2169025065资料下载地址在文章末尾。硬件电路使用的嘉立创EDA软件来设计，这款软件真的很好用。简介​ 本文设计基于STM32的同步整流Buck-Boost数字电源，该电源电路由MOSFET驱动电路、4开关Buck-Boost电路、信号调理电路、PD快充协议电路、辅助电源电路、单片机控制电路等部分组成。​ 该电源可通过DC接口或Type-C接口供电，而且Type-C接口支持与充电器通过PD快充协议通讯，自动请求并获取最高20V的工作电压。该电源使用STM32G474单片机对输入输出的电压和电流实时监测，并通过PID控制算法来调整输出的PWM占空比，以及实现过压过流保护，还可采样主板温度来实现过温保护。此外可通过OLED屏实时查看电源的参数，并通过旋转编码器和按钮来设置输出电压和电流，还可以通过另一个Type-C接口与上位机通信，通过上位机软件可实时查看电源的各项参数和波形。设计性能参数​ 电源设计性能参数如下表：项目参数指标输入电压范围12Vdc~48Vdc输入电流范围0~10A输出最大功率450W输出电压范围0.5Vdc~48Vdc输出电流范围0~10A输出电压纹波峰峰值≤200mV开关频率181.333kHz实物图使用VOFA+作为上位机软件，可实时查看电源各项参数（输入电压和电流、输出电压和电流、主板温度、MCU温度、电源转换效率等）和波形变化。如下图所示。系统框架图硬件电路设计器件选型计算电感计算​ 在同步BUCK-BOOST电源中，电感的计算需要考虑BUCK模式和BOOST模式下的工作情况，以确保在两种模式下都能满足电路的工作要求。通常，电感的选择会基于两种模式中对电感要求更高的那个模式来进行。​ 当电源工作于BUCK降压模式时，假设输入电压最大为48V，输出电压最小为5V，计算最小的PWM占空比：$$ D_{min} = \frac{V_{out\_min}}{V_{in\_max}} = \frac{5V}{48V} = 10.417\% $$​ 定义电感电流波动量(25%的最大额定电流脉动，设最大额定电流为10A)：$$ \Delta I_L = 25\% \cdot I_{out\_nom} = 25\% \times 10A = 2.5A $$​ 计算最小需要的BUCK电感：$$ L_{minBuck} = \frac{V_{out\_min} \cdot (1 - D_{min})}{\Delta I_L \cdot f_{switch}} = \frac{5V}{2.5A \times 181333Hz} \times (1 - 10.417\%) \approx 9.88\mu H $$​ 当电源工作于BOOST升压模式时，以输入额定电压24V为计算点，计算PWM占空比：$$ D_{Bo} = 1 - \frac{V_{in\_nom}}{V_{out\_max}} = 1 - \frac{24V}{48V} = 50\% $$​ Boost 模式下，取1A（ $I_{minb}$ ）时Boost进入连续模式（CCM），计算电感：$$ L_{minBoost} = \frac{V_{out\_max} \cdot D_{Bo}(1-D_{Bo})^2}{2 \cdot I_{minb} \cdot f_{switch}} = \frac{48V \times 50\% \times (1 - 50\%)^2}{2 \times 1A \times 181333Hz} = 16.544\mu H $$​ 基于公式得出的计算结果，确定了为满足预定纹波电流要求所需的最小电感值。为了确保满足这一条件，应选用一个电感值略高于计算值的电感元…

基于STM32F407的LVGL工程模板（MSP3526屏幕），包含FreeRTOS版和裸机版
type: item
date: 2024-05-23T23:53:00+08:00
description: AI摘要 介绍了基于STM32F407的LVGL工程模板，支持MSP3526屏幕，包含FreeRTOS和裸机版，使用SPI+DMA驱动，帧率达9FPS全屏刷新。 此内容根据文章生成，仅用于文章内容的解释与总结 在STM32F407上移植好了LVGL图形库，LCD屏幕型号是MSP3526，想换其他屏幕可以自己修改LCD的驱动程序，项目工程包含FreeRTOS版和裸机版。使用SPI+DMA驱动屏幕。这款LCD屏分辨率为320x480，尺寸为3.5寸，LCD驱动芯片为ST7796，接口为SPI，电容触摸屏驱动芯片为FT6336U，接口为IIC。MCU超频后全屏刷新时帧率为9FPS左右，局部刷新时帧率为30+FPS，对于SPI来说这个帧率应该算可以了吧。STM32使用硬件I2C读取SHTC3温湿度传感器：https://blog.zeruns.com/archives/692.html移植好U8g2图形库的STM32F407标准库工程模板：https://blog.zeruns.com/archives/722.html基于STM32G4的0.96寸OLED显示屏驱动程序（HAL库），支持硬件/软件I2C：https://blog.zeruns.com/archives/776.html电子/单片机技术交流群：2169025065效果图效果演示视频：https://www.bilibili.com/video/BV1Ni421S7ta/LVGL简介LVGL(轻量级和通用图形库)是一个免费和开源的图形库，它提供了创建嵌入式GUI所需的一切，具有易于使用的图形元素，美丽的视觉效果和低内存占用。主要特性：丰富且强大的模块化图形组件：按钮 (buttons)、图表 (charts)、列表 (lists)、滑动条 (sliders)、图片 (images) 等高级的图形引擎：动画、抗锯齿、透明度、平滑滚动、图层混合等效果支持多种输入设备：触摸屏、 键盘、编码器、按键等支持多显示设备不依赖特定的硬件平台，可以在任何显示屏上运行配置可裁剪（最低资源占用：64 kB Flash，16 kB RAM）基于UTF-8的多语种支持，例如中文、日文、韩文、阿拉伯文等可以通过类CSS的方式来设计、布局图形界面（例如：Flexbox、Grid）支持操作系统、外置内存、以及硬件加速（LVGL已内建支持STM32 DMA2D、NXP PXP和VGLite）即便仅有单缓冲区(frame buffer)的情况下，也可保证渲染如丝般顺滑全部由C编写完成，并支持C++调用支持Micropython编程，参见：LVGL API in Micropython支持模拟器仿真，可以无硬件依托进行开发丰富详实的例程详尽的文档以及API参考手册，可线上查阅或可下载为PDF格式在 MIT 许可下免费和开源配置要求：基本上，每个能够驱动显示器的现代控制器都适合运行 LVGL。 最低要求是：16、32 或 64 位微控制器或处理器建议使用 >16 MHz 时钟速度闪存/ROM： > 64 kB 用于非常重要的组件 (> 建议使用 180 kB)RAM:静态 RAM 使用量：\~2 kB，取决于使用的功能和对象类型堆: > 2kB (> 建议使用 8 kB)动态数据（堆）: > 2 KB (> 如果使用多个对象，建议使用 16 kB). 在 lv_conf.h 文件中配置 LV_MEM_SIZE 生效。显示缓冲区：> “水平分辨率”像素（推荐 >10 × 10×“ 水平分辨率”）MCU或外部显示控制器中的一个帧缓冲区C99 或更新的编译器LVGL官网：https://lvgl.io/接线说明LCD屏MCU/开发板功能描述GNDGNDLCD屏电源地VCC5V或3.3VLCD屏电源正极LCD_CSPE6LCD屏SPI片选LCD_RSTPC1LCD屏复位LCD_RSPC0LCD屏命令/数据选择SDI(MOSI)PB5LCD屏SPI数据线，主机输出从机输入SCKPB3LCD屏SPI时钟线LED3.3V背光LED（可以自己接IO口，用软件控制背光）SDO(MISO)PB4LCD屏SPI数据线，主机输入从机输出CTP_SCLPB8电容触摸屏控制器I2C时钟线CTP_RSTPB7电容触摸屏控制器复位CTP_SDAPB9电容触摸屏控制器I2C数据线CTP_INTPB6电容触摸屏控制器中断信号注意一下，我效果图里用的这款开发板的PB4引脚是没有在两边的排针里的，是在上面的JTAG接口里。资料和程序下载屏幕资料在线文档：https://url.zeruns.com/68x3Y屏幕资料打包下载地址1：https://www.123pan.com/s/2Y9Djv-rZevH.html屏幕资料打包下载地址2：http…

基于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配置，设置两个…

基于STM32F1的0.96寸OLED显示屏驱动程序，支持硬件/软件I2C
type: item
date: 2024-02-26T00:17:00+08:00
description: AI摘要 介绍了基于STM32F1的0.96寸OLED显示屏驱动程序，支持硬件/软件I2C，可显示多种内容并绘图。 此内容根据文章生成，仅用于文章内容的解释与总结 基于STM32F103的0.96寸OLED显示屏驱动程序（4针脚I2C接口），支持硬件IIC/软件IIC。这款驱动程序比较完善，可以实现 英文、整数、浮点数、汉字、图像、二进制数、十六进制数 等内容显示，可以画点、直线、矩形、圆、椭圆、三角形等，支持多种字体，差不多相当于一个简易版图形库了。该程序是基于江协科技的代码二次修改的，原版程序只支持软件I2C，我修改后支持硬件I2C，也可以修改宏定义改成使用软件I2C。程序是使用ST标准库写的。测试硬件为STM32F103C8T6和AIR32F103CBT6，在这两款单片机上都测试过能跑，其中使用硬件I2C时STM32通信速率最高可以跑到1.3Mbit/s，AIR32最高只能跑600kbit/s。关于OLED的驱动原理，以及驱动程序的使用教程可以看江协科技的视频：https://url.zeruns.com/L7j6ySTM32使用硬件I2C读取SHTC3温湿度传感器：https://blog.zeruns.com/archives/692.html移植好U8g2图形库的STM32F407标准库工程模板：https://blog.zeruns.com/archives/722.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我这里就不详细讲解了。需要用的元件STM32开发板入门套件：https://u.jd.com/fQS0YAeSTM32F103最小系统板：https://s.click.taobao.com/TsFFvwtOLED模块：https://s.click.taobao.com/EF0Evwt杜邦线：https://s.click.taobao.com/VMkDvwt面包板：https://s.click.taobao.com/bhg8TxtDAPLink（可代替ST-Link，带虚拟串口）：https://s.click.taobao.com/QVQ8Txt江协科技的STM32入门套件：https://s.click.taobao.com/NTn9Txt程序完整工程下载地址：百度网盘：https://url.zeruns.com/kSxoe 提取码: wgc3123网盘(不限速)：https://www.123pan.com/s/2Y9Djv-HGcvH.html 提取码:m7sp工程使用Keil5创建，用Vscode+EIDE开发，两个软件都可以打开此工程。工程文件全部使用UTF-8编码，如果打开显示乱码需要修改编辑器编码为UTF-8。main.c文件：#include …

移植好U8g2图形库的STM32F407标准库工程模板，0.96寸OLED驱动程序
type: item
date: 2023-06-11T18:24:00+08:00
description: AI摘要 移植U8g2图形库到STM32F407标准库工程，驱动0.96寸OLED屏，使用硬件IIC。文章详细介绍了U8g2库的特性、时钟配置、代码实现及开源项目推荐。 此内容根据文章生成，仅用于文章内容的解释与总结 移植好U8g2图形库的STM32F407标准库工程模板，用的0.96寸OLED屏（SSD1306），用硬件IIC驱动。花了一晚上时间去移植。开发板主控MCU用的是STM32F407VET6，I2C接口用I2C1，SCL接PB6，SDA接PB7。嵌入式相关文章：https://blog.zeruns.com/category/IOT/电子/电路相关文章：https://blog.zeruns.com/category/electrical/电子/单片机技术交流群：2169025065U8g2简介U8g2图形库是一个用于嵌入式设备的单色图形库，支持多种单色OLED和LCD显示控制器，如SSD1306，ST7920等。U8g2库可以从Arduino IDE的库管理器安装，也可以移植到STM32等平台。U8g2库支持三种绘图模式：全屏缓存模式，页面缓存模式和U8x8字符模式。U8g2库的使用需要选择合适的构造函数，初始化显示器，设置引脚号，编写回调函数和绘图指令。U8g2图形库的优点是可以使用多种字体，支持中文显示，提供丰富的图形程序，如线条，框，圆，位图等。U8g2图形库的缺点是需要占用一定的内存空间，速度较慢，不支持无控制器的显示屏。U8g2图形库的应用场景有：显示传感器数据，制作时钟，显示菜单，显示动画等。U8g2图形库是一个功能强大，兼容性好，易于使用的单色图形库。效果图演示视频：https://www.bilibili.com/video/BV17W4y197WW/关于晶振的问题我晶振用的8Mhz的，时钟树配置那PLL参数我修改过，使MCU工作主频168Mhz，如果换用其他频率的晶振需要修改参数，具体怎么改自行百度。修改的地方如下：stm32f4xx.h 文件的137行。#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */ // 这里的8000000改成你的晶振频率，单位Hzsystem_stm32f4xx.c 文件的364行和394行。#if defined(STM32F40_41xxx) || defined(STM32F427_437xx) || defined(STM32F429_439xx) || defined(STM32F401xx) || defined(STM32F469_479xx) /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */ #define PLL_M 4 // 这里4对应下面时钟树图片中的 /M 的 /4#if defined (STM32F40_41xxx) #define PLL_N 168 // 这里168对应下面时钟树图片中的 *N 的 x168元件购买地址0.96寸OLED屏：https://u.jd.com/1zjpDNCSTM32F407开发板：https://s.click.taobao.com/7AtnHFu杜邦线：https://u.jd.com/1zjFP0Z代码完整工程文件下载：https://url.zeruns.com/JUoKJ 提取码：t6wt部分代码：main.c#include "stm32f4xx.h" // #include "Timer.h" #include "Delay.h" #include "u8g2.h" #include "OLED.h" #include "IWDG.h" uint8_t u8x8_gpio_and_delay(U8X8_UNUSED u8x8_t *u8x8, U8X8_UNUSED uint8_t msg, U8X8_UNUSED uint8_t arg_int, U8X8_UNUSED void *arg_ptr); uint8_t u8x8_byte_hw_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr); void u8g2_Init(u8g2_t *u8g2); void draw(u8g2_t *u8g2); int main(void) { uint8_t t = 0; IWDG_Configuration(); // 初始化看门狗 OLED_I2C_Init(); // 初始化OLED u8g2_t u8g2; u8g2_Init(&u8g2…

STM32F030C8T6最小系统板和流水灯（原理图和PCB）
type: item
date: 2023-05-21T17:53:00+08:00
description: AI摘要 介绍了基于STM32F030C8T6的最小系统板设计与流水灯实现，开源了原理图和PCB文件，并提供了元件购买链接及例程下载。 此内容根据文章生成，仅用于文章内容的解释与总结 STM32F030C8T6最小系统板和流水灯。嵌入式课的课程设计，要做个流水灯，我就顺便画个最小系统板，开源出来了，各位大佬指点指点，有哪里需要优化改进的。那个WS2812的RGB灯用错引脚了，所以没法用PWM来控制，画的时候没考虑到，要用到可以自己换一下IO脚。画了个 MSP430F149的最小系统板 开源出来了：https://blog.zeruns.com/archives/713.html电子/单片机技术交流群：2169025065效果图资源下载例程下载地址：https://url.zeruns.com/5hTOd 提取码：ame9PCB制板文件（Gerber）下载：https://pan.baidu.com/s/1KVE2wBR3KYPoqVpxH1r4lA?pwd=hyk4 提取码：hyk4开源链接：https://oshwhub.com/zeruns/stm32f030-zui-xiao-xi-tong-he-liu-shui-deng/CubeMX配置图元件购买地址STM32F030C8T6：https://s.click.taobao.com/Hquc1HuAMS1117-3.3：https://s.click.taobao.com/4TfJgGuST-Link v2：https://s.click.taobao.com/e1Ac1Hu0805电阻样品本：https://s.click.taobao.com/oWjIgGu0805电容样品本：https://s.click.taobao.com/r9ea1Hu元器件购买推荐立创商城，优惠注册链接：https://activity.szlcsc.com/invite/D03E5B9CEAAE70A4.html原理图PCB推荐阅读高性价比和便宜的VPS/云服务器推荐: https://blog.vpszj.cn/archives/41.html怎样搭建个人博客：https://blog.zeruns.com/archives/218.html我的世界服务器搭建教程：https://blog.zeruns.com/tag/mc/STM32读取SHT3x系列温湿度传感器：https://blog.zeruns.com/archives/700.html使用VSCode代替Keil实现STM32和51单片机的开发：https://blog.zeruns.com/archives/690.html

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…

STM32软件I2C读取AM2320温湿度传感器数据
type: item
date: 2022-12-08T17:06:00+08:00
description: AI摘要 STM32通过软件I2C读取AM2320温湿度数据并显示在OLED屏上，包含详细代码和时序解析。 此内容根据文章生成，仅用于文章内容的解释与总结 STM32单片机使用软件IIC读取AM2320温湿度传感器的数据并显示在0.96寸OLED屏上。我用的单片机是STM32F103C8T6，程序用的是ST标准库写的。STM32使用硬件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我这里就不详细讲解了。AM2320温湿度传感器介绍AM2320 数字温湿度传感器是一款含有己校准数字信号输出的温湿度复合型传感器。采用专用的温湿度采集技术，确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电容式感湿元件和一个高精度集成测温元件，并与一个高性能微处理器相连接。该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。AM2320 通信方式采用单总线、标准 I2C 两种通信方式。标准单总线接口，使系统集成变得简易快捷。超小的体积、极低的功耗，信号传输距离可达 20 米以上，使其成为各类应用甚至最为苛刻的应用场合的最佳选择。I2C 通信方式采用标准的通信时序，用户可直接挂在 I2C通信总线上，无需额外布线，使用简单。两种通信方式都采用直接输出经温度补偿后的湿度、温度及校验 CRC 等数字信息，用户无需对数字输出进行二次计算，也无需要对湿度进行温度补偿，便可得到准确的温湿度信息。两种通信方式可自由切换，用户可自由选择，使用方便，应该领域广泛。产品为 4 引线，连接方便，特殊封装形式可根据用户需求而提供。AM2320数据手册下载地址：https://url.zeruns.com/74o6F浏览数据手册可以得到一个大概信息：温度范围：-40℃\~80℃温度误差：±0.5℃湿度范围：0%\~99.9%湿度误差：±3%工作电压：3.1v\~5.5v通讯方式：I2C或单总线时钟频率：100kHz以内找到如下几个关键信息设备地址和读写命令在实际的使用过程中，AM2320的设备地址需要与读写数据/命令方向位组成一个字节同时发送，字节的最低位为读写数据/命令方向位，高7位是AM2320的设备地址。如果要通过I2C写数据或命令给AM2320，在I2C起始信号之后，需要发送“1011 1000”，即0xB8给AM2320，除了通过高7位“1011 100”的设备地址寻址还通过最低位“0”通知AM2320接下来是写数据或命令操作。如果要通过I2C读取AM2320中的数据，在I2C起始信号之后，需要发送“1011 1001”，即0xB9给AM2320，除了通过高7位“1011 100”的设备地址寻址还通过最低位…

STM32单片机读取AHT10温湿度传感器数据
type: item
date: 2022-11-10T17:20:00+08:00
description: AI摘要 STM32通过硬件I2C读取AHT10温湿度传感器数据，并在OLED屏上显示，包含详细代码和实现过程。 此内容根据文章生成，仅用于文章内容的解释与总结 STM32使用硬件IIC读取AHT10温湿度传感器的数据并显示在0.96寸OLED屏上。我用的单片机是STM32F103C8T6，程序用的是ST标准库写的。STM32使用硬件I2C读取SHTC3温湿度传感器：https://blog.zeruns.com/archives/692.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我这里就不详细讲解了。AHT10温湿度传感器介绍AHT10是一款国产的温湿度传感器芯片，价格便宜，精度还高，体积也小。AHT10配有一个全新设计的ASIC专用芯片、一个经过改进的MEMS半导体电容式湿度传感元件和一个标准的片上温度传感元件，其性能已经大大提升甚至超出了前一代传感器的可靠性水平，新一代温湿度传感器，经过改进使其在恶劣环境下的性能更稳定。AHT10数据手册下载地址：https://url.zeruns.com/EDEwF浏览数据手册可以得到一个大概信息：温度范围：-40℃\~85℃温度误差：±0.3℃湿度范围：0%\~100%湿度误差：±2%工作电压：1.8v\~3.6v通讯方式：I2C时钟频率：100kHz和400kHz找到如下几个关键信息温湿度设备地址和读写命令在实际的使用过程中，AHT10的设备地址需要与读写数据/命令方向位组成一个字节同时发送，字节的最低位为读写数据/命令方向位，高7位是AHT10的设备地址。如果要通过I2C写数据或命令给AHT10，在I2C起始信号之后，需要发送“0111 0000”，即0x70给AHT10，除了通过高7位“0111 000”的设备地址寻址还通过最低位“0”通知AHT10接下来是写数据或命令操作。如果要通过I2C读取AHT10中的数据，在I2C起始信号之后，需要发送“0111 0001”，即0x71给AHT10，除了通过高7位“0111 000”的设备地址寻址还通过最低位“1”通知AHT10接下来是读取数据的操作。简单来说就是，0x70表示写数据，0x71表示读数据。不过使用STM32硬件I2C时只需要输入0x70就行，最低位标准库会处理的。读取温湿度数据从数据手册可知，一个测量周期包概括三个步骤：发送测量命令等待测量完成读取测量后的数据 总结如下：发送测量命令：先发送写入指令（0x70），再发送触发测量指令（0xAC）,再发送命令参数（0x33和0x00）。等待测量完成：数据手册上写的75ms，等待的时间大于这个就行了。接收数据：发送读取指令（0x71），连续接收6个字节数据。接收到的第一个字节是状态字，检查状态字第3位校准使能位是否为1，不为1就发送初始化命令，检查第7位忙闲指示，如果是0为测量完成，进行下一步。对接收到的数据进行转换处理。数据的计算由AHT10数据手册可知例如：采…

STM32使用硬件I2C读取SHTC3温湿度传感器
type: item
date: 2022-11-03T20:51:00+08:00
description: AI摘要 本文介绍了使用STM32硬件I2C读取SHTC3温湿度传感器数据并显示在0.96寸OLED屏幕上的实现方法，包含I2C协议简介、SHTC3传感器操作步骤及程序代码解析，适合嵌入式开发学习者参考。 此内容根据文章生成，仅用于文章内容的解释与总结 STM32使用硬件IIC读取SHTC3温湿度传感器的数据并显示在0.96寸OLED屏上。我用的是STM32F103C8T6，程序用的是ST标准库写的。电子/单片机技术交流群：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我这里就不详细讲解了。SHTC3温湿度传感器SHTC3数据手册下载地址：https://url.zeruns.com/WpLDy浏览数据手册可以得到一个大概信息，SHTC3是一个可以检测温度和湿度的传感器，温度范围：-40℃\~125℃湿度范围：0%\~100%工作电压：1.6v\~3.6v通讯方式：i2c时钟频率：三种模式分别是 0 ~ 100kHz 0 ~ 400kHz 0 ~ 1000kHz找到如下几个关键信息温湿度设备地址和读写命令在实际的使用过程中，SHTC3的设备地址需要与读写数据/命令方向位组成一个字节同时发送，字节的最低位为读写数据/命令方向位，高7位是SHTC3的设备地址。如果要通过I2C写数据或命令给SHTC3，在I2C起始信号之后，需要发送“1110 0000”，即0xE0给SHTC3，除了通过高7位“1110 000”的设备地址寻址还通过最低位“0”通知SHTC3接下来是写数据或命令操作。如果要通过I2C读取SHTC3中的数据，在I2C起始信号之后，需要发送“1110 0001”，即0xE1给SHTC3，除了通过高7位“1110 000”的设备地址寻址还通过最低位“1”通知SHTC3接下来是读取数据的操作。简单来说就是，0xE0表示写数据，0xE1表示读数据。不过使用STM32硬件I2C时只需要输入0xE0就行，最低位标准库会处理的。读取温湿度数据可知，不同的命令，除了获取的数据顺序不一样，还有一个Clock Stretching Enable 和 Disable的区别。Clock Stretching是时钟拉伸的意思。如果使用Clock Stretching Enable命令的话，那么发送完测量命令之后，在SHTC3测量温度湿度数据的过程中，SHTC3会拉低I2C的时钟线SCL，通过这样来禁止主机发送命令给SHTC3，只有当SHTC3完成温度湿度数据测量时，SHTC3才会释放时钟线SCL。如果使用Clock Stretching Disable命令的话，在SHTC3测量数据的过程中，SHTC3并不会拉低I2C的时钟线SCL，只是如果主机在SHTC3测量数据的过程中发送命令或数据的时候，SHTC3是不会响应主机的，主机可以通过SHTC3是否有响应信号来判断SHTC3是否完成数据的测量。从数据手册可知，一个测量周期包概括四个步骤：发送唤醒命令。发送测量命令读取测量…