Zeruns's Blog - 源码
type: channel
link: https://blog.zeruns.com/tag/%E6%BA%90%E7%A0%81/
items: 基于STM32的同步整流Buck-Boost数字电源 开源
items: 基于STM32F407的LVGL工程模板（MSP3526屏幕），包含FreeRTOS版和裸机版
items: 移植好U8g2图形库的STM32F407标准库工程模板，0.96寸OLED驱动程序
items: STM32读取SHT3x系列温湿度传感器，标准库和HAL库

基于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…

移植好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…

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…