STM32F103C8T6 (HAL库)——0.96寸OLED屏幕驱动移植与图形化应用

STM32F103C8T6 驱动 oled 4针篇 测试了增加上拉电阻不行。测试了厂家给的程序还是不行。查看器件参数,写的3.3-6V供电,当时没怀疑,就采用了5V供电,排查的时候突然摸到oled电阻很烫,怀疑时电压问题,然后改用3.3V供电,oled正常显示内容,也不用增加上拉电阻。1.配置STM32编译环境,大部分买的STM32F103C8T6属于国产的,会导致程序烧录报错,如果出现问题参考另一篇。总结:采用3.3V供电,不用上拉电阻即可正常显示。2.环境配置好后,编写程序烧录就可以了。3.1 OLED屏一直黑的,不显示。字码转换工具查看另一篇。 阅读详情

1. 从点亮到画图:为什么需要更强大的OLED驱动库?

如果你已经跟着网上的教程,用STM32F103C8T6和HAL库成功点亮了那块0.96寸的OLED屏幕,并且能显示几行文字,恭喜你,你已经迈出了第一步!但不知道你有没有和我一样的感受:当你想画个进度条、显示个传感器波形,或者做个简单的小图标菜单时,面对那一堆直接操作SSD1306寄存器的WriteCmd和WriteDat函数,是不是有点无从下手?

我刚开始玩STM32和OLED的时候也是这样。自己写的驱动,显示字符和数字没问题,但一旦涉及到画线、画圆、显示图片,就得自己算坐标、写算法,代码又长又容易出错。更别提想做个动态效果或者稍微复杂点的界面了,那工作量简直让人头大。后来我发现,其实有更“聪明”的办法——那就是直接移植那些经过千锤百炼的、功能强大的开源图形库,比如 U8g2 或者 Adafruit GFX。

这两个库可以说是嵌入式图形显示的“瑞士军刀”。它们把底层繁琐的像素操作封装成了一个个简单的函数,比如 drawLine(), drawCircle(), print()。你不需要关心屏幕内存是怎么组织的,也不需要自己去算一个圆要用哪些像素点来画,调用一个函数就能搞定。这就像是你想盖房子,不需要从烧砖开始,而是直接使用标准化的预制件,效率和质量都高得多。

对于我们的STM32F103C8T6(也就是常说的“蓝桥杯”板或最小系统板)来说,虽然资源有限(64KB Flash,20KB RAM),但驱动一个128x64的单色OLED,运行U8g2这样的库是完全没有问题的。移植成功后,你就能获得一个完整的图形API接口,从此告别“点灯”时代,真正进入“图形化”应用开发。无论是做毕业设计、电子竞赛,还是个人DIY项目,界面的美观度和开发速度都能提升好几个档次。接下来,我就手把手带你,把U8g2库移植到我们的HAL库工程里,并实现一些炫酷的图形功能。

2. 工程准备与U8g2库的获取

在开始移植之前,我们需要一个干净的基础工程。这个工程已经配置好了I2C用来驱动OLED,就像原始文章里做的那样。如果你还没有,可以快速用STM32CubeMX生成一个。

2.1 基础工程创建 打开STM32CubeMX,选择STM32F103C8Tx芯片。在Pinout & Configuration标签页下,配置时钟树(通常选择外部晶振,主频拉到72MHz)。接着,找到I2C1,将其模式设置为I2C。我这里和原始文章一样,使用PB6和PB7作为I2C的SCL和SDA引脚。然后,在Project Manager标签页,给工程起个名字,比如OLED_U8g2_Demo,选择MDK-ARM作为Toolchain/IDE。关键一步是在Code Generator里,选择“Copy only the necessary library files”,这样工程会更清爽。最后点击GENERATE CODE,用Keil打开工程。

2.2 获取U8g2库源码 U8g2库的官方仓库在GitHub上(搜索“olikraus/u8g2”)。对于嵌入式开发者,我们不需要下载整个仓库的历史记录。最方便的方法是直接去Release页面下载最新的u8g2.zip源码包。这个包里包含了所有源代码和示例。下载后解压,我们重点关注以下几个文件夹:

  • csrc: 这是核心所在,里面是所有C源码文件。
  • sys: 包含了一些系统级的抽象层,比如u8x8_d_ssd1306_128x64_noname.c这个文件,它就是专门针对我们这种SSD1306驱动的128x64 OLED的显示驱动描述文件。
  • cppsrc: C++的封装,我们纯C环境用不到。

对于STM32的HAL库,我们还需要关注sys文件夹下的u8x8_d_ssd1306_128x64_noname.c文件,以及如何实现底层的byte-level通信函数。U8g2库结构清晰,但文件较多,我们只需要挑选出必要的部分加入到我们的工程中,避免编译缓慢和资源浪费。

3. 精简与移植:将U8g2库融入HAL工程

直接把整个csrc文件夹拖进工程会引入大量无关的驱动文件(支持上百种显示器),导致编译慢且占用过多Flash。我们需要进行“瘦身”。

3.1 在工程中创建U8g2组并添加核心文件 在Keil的Project窗口,右键Source Group,新建一个组,命名为U8g2。然后,从解压的U8g2源码中,只添加我们必需的文件:

  1. u8g2.h 和 u8g2.c: 库的主框架和API实现。
  2. u8x8.h 和 u8x8.c: 底层硬件抽象层。
  3. u8x8_d_ssd1306_128x64_noname.c: 针对我们这款OLED的显示驱动。
  4. u8x8_d_ssd1306_128x64_noname.c文件依赖u8x8_d_ssd1306_xxx.c中的一些通用函数,所以最好也把u8x8_d_ssd1306.c加进来。这样我们就集成了SSD1306系列的全部基础支持。

3.2 实现关键的硬件抽象回调函数 这是移植的核心步骤。U8g2库通过几个回调函数(callback)来操作硬件,我们需要根据HAL库的I2C函数来实现它们。在工程中新建一个文件,比如叫u8g2_hal.c,并包含对应的头文件。

首先,我们需要实现字节传输函数uint8_t u8x8_byte_hw_i2c。这个函数会被库调用来发送命令或数据。其原型在u8x8.h中定义。我们的实现大致如下:

#include “u8x8.h”
#include “main.h” // 包含hi2c1的定义

extern I2C_HandleTypeDef hi2c1; // 假设你的I2C句柄叫这个
#define OLED_I2C_ADDR 0x78 // OLED的I2C写地址,通常是0x78

uint8_t u8x8_byte_hw_i2c(U8X8_UNUSED u8x8_t *u8x8, U8X8_UNUSED uint8_t msg, U8X8_UNUSED uint8_t arg_int, U8X8_UNUSED void *arg_ptr) {
    switch(msg) {
        case U8X8_MSG_BYTE_SEND: // 库准备发送一批数据
            // arg_ptr指向待发送数据缓冲区,arg_int是数据长度
            if (HAL_I2C_Master_Transmit(&hi2c1, OLED_I2C_ADDR, (uint8_t*)arg_ptr, arg_int, HAL_MAX_DELAY) != HAL_OK) {
                return 0; // 传输失败
            }
            break;
        case U8X8_MSG_BYTE_INIT: // 初始化,可以放空或初始化硬件
            // 硬件初始化已在main.c中完成,这里通常不需要操作
            break;
        case U8X8_MSG_BYTE_SET_DC: // 设置数据/命令引脚(对于I2C接口的OLED,这个信号通常通过I2C字节中的控制位区分,所以这里我们不需要操作GPIO)
            // I2C模式下,DC(数据/命令)位是包含在传输的第一个字节里的,所以这个回调通常为空。
            break;
        case U8X8_MSG_BYTE_START_TRANSFER: // 开始传输(可空)
        case U8X8_MSG_BYTE_END_TRANSFER: // 结束传输(可空)
            break;
        default:
            return 0; // 未知消息,返回0表示失败
    }
    return 1; // 成功返回1
}

注意,对于I2C接口的SSD1306,每个通信序列的第一个字节是控制字节,其中最低位(Co bit)为0表示后续是命令,为1表示是数据。U8g2库在调用u8x8_byte_hw_i2c之前,已经帮我们组装好了这个控制字节,所以我们这里的传输函数非常简单,直接调用HAL的HAL_I2C_Master_Transmit把缓冲区发出去就行。

3.3 实现GPIO和延时回调 除了字节传输,U8g2还需要复位(Reset)和延时功能。对于我们的模块,如果硬件上没有把复位引脚接到STM32,或者我们不想控制它,可以忽略复位回调。延时回调必须实现,因为库需要微秒级的延时(例如初始化序列)。

// 复位回调(如果硬件连接了复位引脚则实现,否则返回1即可)
uint8_t u8x8_gpio_and_delay_stm32(U8X8_UNUSED u8x8_t *u8x8, U8X8_UNUSED uint8_t msg, U8X8_UNUSED uint8_t arg_int, U8X8_UNUSED void *arg_ptr) {
    switch(msg) {
        case U8X8_MSG_GPIO_AND_DELAY_INIT: // 初始化GPIO和延时(可空)
            // 如果需要,可以在这里初始化复位引脚为输出
            break;
        case U8X8_MSG_DELAY_MILLI: // 毫秒延时
            HAL_Delay(arg_int);
            break;
        case U8X8_MSG_DELAY_10MICRO: // 10微秒延时(用于I2C时序)
            // 实现一个简单的10微秒延时循环
            for (uint16_t i = 0; i < arg_int * 10; i++) {
                __NOP(); // 空操作
            }
            break;
        case U8X8_MSG_DELAY_100NANO: // 100纳秒延时(通常不需要)
            __NOP();
            break;
        case U8X8_MSG_GPIO_RESET: // 控制复位引脚
            // 如果连接了复位引脚,例如接到PA0
            // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, (GPIO_PinState)arg_int);
            break;
        default:
            break;
    }
    return 1;
}

3.4 构造U8g2对象并初始化 现在,硬件底层驱动已经“嫁接”好了。接下来我们在主程序(比如main.c)中创建并初始化U8g2对象。

首先,在文件顶部包含头文件并声明对象:

#include “u8g2.h”
u8g2_t u8g2; // 定义一个全局的U8g2对象

然后,在main函数的初始化部分(HAL_Init()和SystemClock_Config()之后,while(1)之前),添加以下初始化代码:

// 初始化U8g2库
u8g2_Setup_ssd1306_i2c_128x64_noname_f(&u8g2, U8G2_R0, u8x8_byte_hw_i2c, u8x8_gpio_and_delay_stm32);
// 参数解释:
// &u8g2: 我们定义的u8g2对象
// U8G2_R0: 旋转方向(0度旋转)
// u8x8_byte_hw_i2c: 我们实现的字节传输函数
// u8x8_gpio_and_delay_stm32: 我们实现的GPIO和延时函数

// 调用初始化函数,这会向OLED发送一系列初始化命令
u8g2_InitDisplay(&u8g2);
// 清空屏幕缓冲区
u8g2_ClearBuffer(&u8g2);
// 唤醒显示屏
u8g2_SetPowerSave(&u8g2, 0);

这里u8g2_Setup_ssd1306_i2c_128x64_noname_f是一个“构造器”函数,它把我们的硬件驱动函数和具体的显示屏型号绑定在一起。函数名中的f代表“full buffer”模式,即库会在内存中维护一个完整的128x64位(即1024字节)的帧缓冲区。所有绘图操作都先在这个缓冲区中进行,最后一次性发送到屏幕。这种方式编程最简单直观,但会占用1KB的RAM。对于STM32F103C8T6的20KB RAM来说,完全负担得起。

4. 释放图形能力:使用U8g2绘制基础图形与文字

库初始化成功后,你就可以像在PC上画图一样使用丰富的API了。所有绘图函数都需要在u8g2_FirstPage和u8g2_NextPage构成的循环内调用,这是U8g2的页面缓冲区处理机制。

4.1 绘制文字与数字 显示文字变得异常简单。U8g2内置了多种字体,你需要先设置字体,然后指定位置打印。

u8g2_ClearBuffer(&u8g2); // 清空缓冲区

// 设置字体(字体名称反映了高度和宽度,如u8g2_font_6x10_tf)
u8g2_SetFont(&u8g2, u8g2_font_6x10_tf);
// 在坐标(0, 10)处绘制字符串(原点在左上角,y向下递增)
u8g2_DrawStr(&u8g2, 0, 10, “Hello U8g2!”);

// 设置更大的字体
u8g2_SetFont(&u8g2, u8g2_font_10x20_tf);
u8g2_DrawStr(&u8g2, 0, 35, “STM32F103C8T6”);

// 显示变量(数字)
int sensorValue = 1234;
char tempBuffer[20];
sprintf(tempBuffer, “ADC: %d”, sensorValue);
u8g2_SetFont(&u8g2, u8g2_font_7x13_tf);
u8g2_DrawStr(&u8g2, 0, 55, tempBuffer);

// 将缓冲区内容发送到屏幕显示
u8g2_SendBuffer(&u8g2);

你不需要再自己编写字模数组,U8g2库内置了海量的字体(从4x6像素到几十像素高的字体都有),只需要在u8g2_fonts.c文件中包含你需要的字体即可。为了节省空间,通常只添加用到的字体。

4.2 绘制几何图形 画线、画框、画圆,都是一行代码的事。

u8g2_ClearBuffer(&u8g2);

// 画一条从(10,10)到(118,54)的对角线
u8g2_DrawLine(&u8g2, 10, 10, 118, 54);

// 画一个矩形框,左上角(20,20),宽40,高30
u8g2_DrawFrame(&u8g2, 20, 20, 40, 30);

// 画一个实心矩形,左上角(70,20),宽40,高30
u8g2_DrawBox(&u8g2, 70, 20, 40, 30);

// 画一个圆,圆心(64,32),半径20
u8g2_DrawCircle(&u8g2, 64, 32, 20, U8G2_DRAW_ALL); // U8G2_DRAW_ALL表示绘制整个圆

// 画一个圆角矩形框,左上角(10,50),宽108,高10,圆角半径3
u8g2_DrawRFrame(&u8g2, 10, 50, 108, 10, 3);

// 绘制一个三角形,三个顶点坐标
u8g2_DrawTriangle(&u8g2, 100, 10, 110, 30, 90, 30);

u8g2_SendBuffer(&u8g2);

4.3 制作一个动态进度条 结合图形和文字,我们可以轻松创建UI元素。下面是一个简单的进度条示例,它会随着一个变量(比如ADC采样值)变化而更新。

// 假设在某个循环或定时器中断中更新
static uint8_t progress = 0;

void updateProgressBar(void) {
    u8g2_ClearBuffer(&u8g2);

    // 绘制进度条外框
    u8g2_DrawFrame(&u8g2, 10, 20, 108, 12);
    // 绘制进度条填充部分,宽度随progress变化(0-100)
    u8g2_DrawBox(&u8g2, 12, 22, (uint16_t)progress * 104 / 100, 8);

    // 显示百分比文字
    u8g2_SetFont(&u8g2, u8g2_font_7x13_tf);
    char pctText[10];
    sprintf(pctText, “%d%%”, progress);
    // 计算文字宽度使其居中
    uint8_t textWidth = u8g2_GetStrWidth(&u8g2, pctText);
    u8g2_DrawStr(&u8g2, 64 - textWidth/2, 50, pctText);

    u8g2_SendBuffer(&u8g2);

    // 模拟进度增加
    progress++;
    if (progress > 100) progress = 0;
}

5. 进阶应用:显示自定义图标与位图

虽然U8g2内置了丰富的图形函数,但显示复杂的图标、Logo或者图片,还是需要用到位图(Bitmap)。U8g2支持XBM格式的位图,这是一种纯文本的位图格式,可以直接包含在C代码中。

5.1 使用在线工具生成XBM位图 你可以用任何图像处理软件(如Photoshop、GIMP)制作一个单色(黑白)图片,保存为PNG或BMP格式。然后,使用在线转换工具(搜索“image to xbm converter”)将其转换为XBM格式。XBM文件本质上是一个C语言数组定义。例如,一个16x16的图标转换后可能如下:

#define icon_width 16
#define icon_height 16
static unsigned char icon_bits[] = {
   0x00, 0x00, 0x06, 0x60, 0x0e, 0x70, 0x1c, 0x38, 0x38, 0x1c, 0x70, 0x0e,
   0x60, 0x06, 0xc0, 0x03, 0xc0, 0x03, 0x60, 0x06, 0x70, 0x0e, 0x38, 0x1c,
   0x1c, 0x38, 0x0e, 0x70, 0x06, 0x60, 0x00, 0x00 };

5.2 使用U8g2绘制位图 在你的工程中新建一个头文件(如my_bitmaps.h),将上面的数组定义放进去。然后在主程序中,使用u8g2_DrawXBM函数来绘制它。

#include “my_bitmaps.h”

void drawIcon(void) {
    u8g2_ClearBuffer(&u8g2);
    // 在坐标(56, 24)处绘制图标
    u8g2_DrawXBM(&u8g2, 56, 24, icon_width, icon_height, icon_bits);
    u8g2_SendBuffer(&u8g2);
}

u8g2_DrawXBM函数会自动处理位图的显示。你还可以结合之前的图形函数,为图标添加一个外框或者背景,制作成更精美的UI按钮。

5.3 优化与内存管理 使用U8g2的full buffer模式(_f后缀)最方便,但消耗1KB RAM。如果你的项目RAM非常紧张,可以考虑使用page buffer模式(_1、_2后缀,如u8g2_Setup_ssd1306_i2c_128x64_noname_1)。这种模式下,库一次只处理一页(8行)的数据,内存占用小(比如128字节),但编程模型略有不同,绘图指令需要放在一个特定的循环结构里(u8g2_FirstPage/u8g2_NextPage),每页都会被重复调用多次。对于STM32F103C8T6,我建议初学者先用full buffer模式,开发更顺畅,1KB的RAM开销在大多数应用中是完全可以接受的。

移植完成后,你会发现原本需要大量底层代码的图形功能,现在变成了简单的函数调用。这不仅仅是代码量的减少,更是开发思维的升级——从“如何控制每个像素”转向“如何设计界面和交互”。你可以用更多的精力去构思项目功能本身,而不是陷在驱动的泥潭里。我自己的好几个小项目,比如温湿度计、简易示波器、游戏机,都是在U8g2的帮助下快速实现了漂亮的界面。下次当你再想用OLED做点有趣的东西时,试试这个强大的库吧,它绝对能让你的开发体验焕然一新。

STM32F103C8T6 (HAL库)——0.96寸OLED屏幕驱动移植与图形化显示实战 本文详细介绍了STM32F103C8T6 (HAL库)驱动0.96寸OLED屏幕的移植与图形化显示实战。从硬件准备、CubeMX工程配置到驱动优化与高级图形应用,提供了完整的解决方案和性能优化技巧,帮助开发者快速实现嵌入式显示系统的开发。 阅读详情

相关推荐

STM32CubeMX+Keil实现OLED屏幕驱动详细步骤

本文详细介绍如何使用STM32CubeMX和Keil5通过I²C协议驱动SSD1306 OLED屏幕,涵盖硬件连接、GPIO配置、软件模拟I²C时序、字符点阵显示原理及常见问题排查方法,帮助开发者从零实现OLED显示功能。

weixin_42451850的博客 767

STM32系列(HAL库)——F103C8T6使用SPI方式点亮OLED

目录 1.软件准备 2.硬件准备 3.CubeMX配置 (1)芯片选择 (2)配置RCC、SYS、时钟树 (3)配置SPI (4)配置GPIO (5)生成代码工程 4.代码移植 (1)复制文件 (2)在Keil5里添加文件 (3)修改oled.h文件 (4)修改oled.c文件 (5)修改main.c函数 (6).代码下载 5.最终效果 1.软件准备 (1)编程平台:Keil5 (2)CubeMX (3)中景园移植代码——点我下载 提...

嵌入式创客工坊的博客 2万+

STM32与u8g2库实战:OLED图形界面开发全攻略

本文详细介绍了如何在STM32平台上移植和运用u8g2图形库进行OLED界面开发。内容涵盖从硬件准备、CubeMX配置、u8g2库的精简移植,到编写硬件驱动桥梁代码,并提供了丰富的图形API实战示例,如绘制几何图形、进度条、动画及中文字体显示,帮助开发者快速构建稳定、炫酷的嵌入式图形界面。

weixin_29183637的博客 116

stm32f103c8t6驱动oled

要驱动OLED显示屏,您可以使用STM32F103C8T6微控制器及其相关的GPIO引脚和SPI总线接口。 以下是驱动OLED显示屏的一些基本步骤: 配置STM32F103C8T6的SPI总线接口。 通过SPI总线发送命令和数据给OLED显示屏。这些命令和数据将用于控制显示屏的显示内容和其他属性,例如亮度和对比度。 将OLED显示屏的引脚连接到STM32F103C8T6的GPIO引脚。这些引...

weixin_35753291的博客 2438

STM32 HAL库工程目录结构解析与模块化开发实践指南

在嵌入式系统开发中,清晰的工程目录结构是保障代码可维护性、可移植性和团队协作效率的基石。其核心原理在于实现配置与实现的解耦,通过合理的分区设计隔离工具生成代码与用户自定义代码。这一技术价值体现在能够大幅降低因硬件配置变更导致的代码维护成本,并提升项目的模块化程度。在STM32 HAL库开发场景下,这一理念通过STM32CubeMX工具链得以具体实践,形成了以Core和Drivers为核心、用户自定义模块为扩展的典型目录范式。开发者需要重点掌握在USER CODE区域安全注入代码的方法,并理解如何创建BSP、

weixin_30781775的博客 316

STM32毕业设计选题指南:从物联网到AI,四大法则与五大热门方向解析

嵌入式系统作为连接物理世界与数字世界的核心技术,其核心在于通过微控制器实现对外设的精准控制和数据交互。其工作原理基于硬件抽象层与实时操作系统,通过GPIO、ADC、定时器等外设驱动传感器与执行器,完成从信号采集、处理到控制的闭环。这项技术的价值在于其高可靠性、低功耗与实时性,是物联网、工业自动化、智能设备等领域的基石。在应用场景上,嵌入式系统广泛服务于智能家居的环境监测与控制、工业现场的总线通信与运动控制、仪器仪表的信号处理以及新兴的边缘智能计算。本文聚焦于STM32平台,针对毕业设计中的常见挑战,提供了涵

weixin_30920513的博客 304

STM32F103C8T6使用硬件IIC驱动OLED

开始配置 I2C1 ,/*!< 时钟频率.该参数必须设置小于 400kHz *//*!< I2C模式.该参数参考 @ref I2C_mode *//*!< I2C快速模式占空比.该参数参考 @ref I2C_duty_cycle_in_fast_mode *//*!< 指定自身I2C设备的地址.该参数可以是7位或10位地址 *//*!< 使能应答位.该参数参考 @ref I2C_acknowledgement *//*!< 7位或10位从地址设置.

qq_64284744的博客 7151

3英寸电子墨水屏驱动全攻略:从原理到多平台实战

电子墨水屏(e-Paper)是一种基于电泳显示技术的低功耗显示器件,其核心原理是通过电场控制微胶囊内黑白带电粒子的移动来形成图像,一旦粒子位置固定,即使撤去电场也能保持显示状态,从而实现静态显示零功耗。这项技术的关键价值在于其极致的低功耗和类纸的视觉体验,使其在物联网、嵌入式系统和需要长期离线显示的领域具有不可替代的优势。典型的应用场景包括电子价签、智能家居信息牌、便携式仪表盘和低功耗传感器数据显示终端。本文将以广泛使用的3英寸G型电子墨水屏模块为例,深入解析其驱动芯片(如UC8151D/SSD1680)、

weixin_33947521的博客 535

STM32F103C8T6控制的OLED IIC 4针

简介 介绍一个c8t6驱动OLED的程序,之前做设计的时候,在网上找的内容较少,所以和大家分享下。分享下采用C8T6设计时出现的问题,避免大家走弯路。由于能力有限,程序大部分来自网路,只用于学习交流。 第一次写的博客,本想把程序去不传上去,后来发现好像不能。有问题大家再问吧,互相学习。 所采用的OLED 采用4针,IIC通信协议的0.96寸OLED屏幕;显示中文需要取模软件; 采用ZET6需要配...

CHINESEmen6的博客 2万+

STM32F103C8T6—库函数应用I2C/SPI驱动OLED显示中文、字符串

stm32-oled入门

Fine的优快云博客 7276

STM32(HAL库)软件IIC驱动OLED

本文通过STM32F103C8T6单片机(HAL库)通过软件IIC方式对OLED进行驱动。

weixin_44597885的博客 9765

基于STM32 HAL库实现u8g2图形库在OLED上的高效移植与优化

本文详细介绍了基于STM32 HAL库实现u8g2图形库在OLED屏幕上的高效移植与优化方法。通过硬件配置、库裁剪和性能优化策略,解决了资源受限环境下的显示问题,为嵌入式开发者提供了实用的解决方案。

7z8x2c4v6b9的博客 219

嵌入式开发必备:手把手教你用DB-9连接器搞定RS-232串口通信(附万用表测试技巧)

本文详细解析了嵌入式开发中RS-232串口通信的硬件连接核心。从DB-9连接器的引脚定义入手,深入讲解DTE与DCE设备角色,明确直连线与交叉线的选择法则,并重点分享了使用万用表进行线缆连通性测试、电压测量及故障诊断的实战技巧,帮助开发者彻底掌握串口通信的硬件连接与排查方法。

tgb345678的博客 1168

告别裸机驱动!用HAL库+STM32CubeMX快速点亮你的OLED(IIC/软件模拟)

本文详细介绍了如何使用STM32CubeMX和HAL库快速驱动OLED屏幕,涵盖硬件IIC和软件模拟IIC两种实现方式。通过STM32F103芯片示例,提供从环境搭建到代码实现的完整指南,帮助开发者高效完成OLED显示项目,显著提升嵌入式开发效率。

weixin_30764771的博客 433

STM32实战:ADXL345传感器驱动与数据采集全解析(IIC/SPI双模式适配)

本文详细解析了STM32驱动ADXL345传感器的全流程,包括IIC和SPI双模式适配、硬件连接、寄存器配置及数据采集处理。通过实战代码示例和常见问题排查指南,帮助开发者快速实现高精度加速度数据采集,适用于运动检测、姿态识别等多种嵌入式应用场景。

weixin_29171087的博客 314

Qt Quick (QML) 老年人健康管理

通过 **Qt SQL** 模块将所有健康数据(用药记录、体检数据等)安全地存储在本地 **SQLite** 数据库中。你想用 **Qt C++** 结合 **Qt Quick** (QML) 来开发一个老年人健康管理软件,主要功能包含 **用药提醒** 和 **健康记录** (使用 `Qt SQL` 存储数据)。* **UI 框架**: Qt Quick (QML) - 用于构建流畅、动态的用户界面。**数据模型类 (models/MedicationReminder.h / .cpp)**

寒寒豆豆软件公司的博客 194

STM32F103C8T6驱动0.96OLED实现动态图片教学(静态原神和动态坤坤动画)

编者第一想法是做一个原神的登陆界面的动态图片,但奈何找不到与之对应的GIF图片(如读者有这张GIF动图请务必联系我),只能做了一张原神标题的静态图片和坤坤的经典动图,这其中更繁琐的是一张一张的取模,制作不易还请大家点赞+收藏+关注后再进行学习。静态图:原神​​​​​​​动态图:坤坤起舞

weixin_66429380的博客 5086

深度学习(五)迁移学习(实战:新数据预测+vgg16和聚类预测)

6、成功引入PCA数据降维技术,剔除了数据中的噪音信息、降低了模型复杂度、减少了模型训练时间,并最终提高了模型表现;gen=datagen.flow_from_directory(path,target_size=(224,224),batch_size=2,save_to_dir=dst_path,save_prefix='gen',save_format='jpg') # 生成图片大小224*224,bs产生多少组图像,存储路径和前缀。1、通过使用新数据,实现了模型的2次训练,达到了较好的预测效果;

weixin_37699342的博客 775

STM32F103C8T6 驱动 0.96 寸 OLED (SSD1306, I2C 接口) 教程

本教程详细介绍如何使用 STM32F103C8T6 微控制器(常见为 “蓝色飞线板” Blue Pill)通过 I2C 接口驱动 0.96 寸 OLED 显示屏(SSD1306 控制器),使用 STM32 HAL 库进行开发。内容从基础知识开始,一步步带领初学者完成 OLED 显示从初始化到显示文字、图形和图片的完整过程。

h050210的博客 9443

Vue3 - 详解实现网站接入微信扫码登录功能,微信授权生成登录二维码用户用手机扫描二维码登陆,微信扫描二维码登录详细流程及示例代码,支持弹框式、浏览器单独新开页显示,最新vue集成微信扫码授权登录!

vue3,nuxt3,PC网站,网页,微信扫码登录,微信登陆,vue3微信扫码登录,获取个人信息,扫码登录后如何获取用户手机号,微信扫码授权登录,vue3详细实现微信扫一扫登陆,pc网页微信登录,vue3集成微信扫码登录,详细流程和示例源码,第三方扫码登录,vue3微信扫码登录怎么新开一页,跳页显示二维码,内嵌登录二维码,iframe,iframe新页面弹出,弹出一个小窗口显示登录二维码,登录报错,微信扫码没反应,解决手机点登录报错没反应,官方文档,手机扫描微信二维码登录网站,最好用的插件,vue-wxlo

🏆 前端领域优质创作者 1万+

硅电容的工艺结构原理及选型参数总结

硅电容,也称为硅质电容或硅二极管电容,是一种特殊的电容器。它利用硅二极管的结构来实现电容的功能。本文对硅电容的工作原理,结构特点,选型参数及设计注意事项进行总结。

fydar的博客 2333

STM32F103C8T6 使用 HAL 库驱动 OLED 显示屏

本报告旨在概述使用STM32F103C8T6微控制器结合HAL库来驱动OLED显示屏的过程。OLED显示屏因其高对比度、低功耗和快速响应时间等特点,在嵌入式系统中得到广泛应用。本项目通过STM32的I2C接口与OLED显示屏进行通信,实现文字、图像等信息的显示。

3254968421的博客 2423

YOLOV12进阶:MSDA多尺度空洞注意力机制解析与实战,突破检测尺度瓶颈

在目标检测中,“尺度差异”是个老大难问题——大目标占据画面大半,小目标可能只有几个像素,普通模型很难同时精准检测。而MSDA(Multi-Scale Dilated Attention,多尺度空洞注意力)就像给模型配备了“变焦眼镜”,能同时关注不同尺度的目标,让YOLOV12在大、中、小目标检测上都能表现出色。这篇教程会带你从原理到实操,掌握这个强大的注意力机制,让你的检测模型真正“通吃”各种尺度的目标。MSDA的“多尺度空洞注意力”设计,是目标检测突破尺度瓶颈的关键一步。

know_F0727的博客 264

STM32F103C8T6 使用 HAL 库驱动 OLED 显示屏(SPI 接口)

本报告详细介绍了使用STM32F103C8T6微控制器结合STM32 HAL库,通过SPI接口驱动OLED显示屏的过程。OLED显示屏因其高对比度、宽视角和快速响应时间,在嵌入式系统中得到广泛应用。本项目通过STM32的SPI接口与OLED显示屏进行高速数据传输,实现文字、图像等信息的显示。

3254968421的博客 2291

三维点云转深度图

点云投影过程是将三维点云数据转化为二维图像坐标的关键步骤,它的实现涉及到相机内外参数的计算,包括相机的内部参数(如焦距和主点)和外部参数(如相机位置和方向)。具体来说,可以通过将每个点的三维坐标转换为相机坐标系下的坐标,然后使用相机内部参数和外部参数来计算在二维图像中的坐标。接着计算每个点的深度值,将深度值映射到像素值上,最后创建深度图像并将深度值赋给对应的像素值。这里需要注意的是,在将深度值映射到像素值上时,需要将像素值转换为 uchar 类型,否则在将深度值赋给像素值时会出现类型不匹配的错误。

点云兔子的博客 3173

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

STM32F407VET6 使用SPI 驱动0.96寸OLED

STM32F407VET6 使用SPI 驱动0.96寸OLED

snoopy_13579的博客 2843

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: 图解编码器与解码器:从原理到5个经典应用案例(含GNN/VAE示例)
下一篇: C#实现二进制数据高效读写:从CSV到DAT文件的转换实战
linux6sysadmin
博客等级 码龄4年 59粉丝 1615原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值