STM32F103模拟I2C驱动TM1650数码管:从时序误区到实战源码解析

手把手教你用STM32的GPIO口驱动TM1650数码管模块(附完整模拟I2C代码) 本文详细介绍了如何使用STM32的GPIO口通过模拟I2C协议驱动TM1650数码管模块,包括硬件连接、电路设计、模拟I2C协议实现及核心代码解读。特别针对新手常见问题提供了解决方案和调试技巧,帮助开发者快速掌握STM32与TM1650的通信技术。 阅读详情

1. 初识TM1650:看似I2C却暗藏玄机

第一次接触TM1650数码管驱动芯片时,我习惯性地把它当成了普通的I2C设备来处理。毕竟从表面上看,它确实有SCL和SDA两根线,看起来和标准的I2C接口一模一样。于是我直接使用了STM32F103的硬件I2C库函数来驱动,结果消息发出去了,数码管却毫无反应。

用逻辑分析仪抓取数据后,我发现STM32确实按照I2C协议发送了数据,但TM1650就是不给任何响应。这时候我才意识到问题没那么简单,仔细对比时序图后发现,TM1650的通信协议虽然类似I2C,但在关键细节上存在明显差异。这就像两个人说着相似但不完全相同的语言,表面上能沟通,实际上却存在理解偏差。

TM1650实际上使用的是类I2C协议,它在起始条件、停止条件和数据采样时机上都与标准I2C有微妙差别。比如说,标准I2C要求在SCL高电平时SDA保持稳定,而TM1650对时序的要求更加宽松,但在某些关键点上又更加严格。这种"似是非是"的特性让很多开发者栽了跟头,包括我在内。

2. 硬件连接与GPIO配置

2.1 引脚定义与硬件连接

在实际项目中,我选择了STM32F103的GPIOA_Pin4作为SDA线,GPIOB_Pin0作为SCL线。选择这两个引脚没有特殊原因,主要是为了方便布线,你可以根据实际需求选择任意可用的GPIO引脚。

#define TM1650_SCL_GPIO GPIOB
#define TM1650_SDA_GPIO GPIOA
#define TM1650_SCL_pin GPIO_Pin_0
#define TM1650_SDA_pin GPIO_Pin_4

硬件连接非常简单:TM1650的SCL引脚接STM32的SCL GPIO,SDA接SDA GPIO,VCC接3.3V或5V(根据你的TM1650版本),GND接地。需要注意的是,虽然TM1650工作电压较宽,但我建议使用3.3V以确保与STM32的电平兼容性。

2.2 GPIO初始化配置

GPIO的初始化需要特别注意模式设置。对于SCL线,我们始终设置为推挽输出模式,因为STM32只需要向TM1650发送时钟信号。而SDA线则需要在不同时间切换为输出模式(发送数据时)和输入上拉模式(接收应答时)。

void TM1650_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA, ENABLE);
    
    // SCL引脚配置为推挽输出
    GPIO_InitStruct.GPIO_Pin = TM1650_SCL_pin;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(TM1650_SCL_GPIO, &GPIO_InitStruct);
    
    // SDA引脚同样先配置为输出
    GPIO_InitStruct.GPIO_Pin = TM1650_SDA_pin;
    GPIO_Init(TM1650_SDA_GPIO, &GPIO_InitStruct);
    
    TM1650_SCL_H;
    TM1650_SDA_H;
    
    // 设置默认亮度
    TM1650_SetDisplay(brighting_6);
}

3. 模拟时序的關鍵细节

3.1 起始和停止条件

TM1650的起始条件与标准I2C相似,但在时序要求上有些许不同。起始条件是在SCL为高电平时,SDA从高电平跳变到低电平。停止条件则是在SCL为高电平时,SDA从低电平跳变到高电平。

void TM1650_Start(void)
{
    SDA_OUT();  // 设置SDA为输出模式
    TM1650_SDA_H;
    TM1650_SCL_H;
    TM1650_delay_us(4);  // 保持时间稍长于标准I2C
    TM1650_SDA_L;
    TM1650_delay_us(4);
    TM1650_SCL_L;
}

void TM1650_Stop(void)
{
    SDA_OUT();
    TM1650_SCL_L;
    TM1650_SDA_L;
    TM1650_delay_us(4);
    TM1650_SCL_H;
    TM1650_delay_us(4);
    TM1650_SDA_H;
}

在实际调试中,我发现TM1650对时序的要求没有标准I2C那么严格,但延迟时间不能太短。经过多次测试,4微秒的延迟在各种情况下都能稳定工作。

3.2 数据发送与应答检测

数据发送时,每一位数据都在SCL的低电平期间变化,在SCL的高电平期间保持稳定。这与标准I2C相同,但TM1650的应答检测机制有所不同。

void TM1650_Send_Byte(unsigned char oneByte)
{
    unsigned char t;
    SDA_OUT();
    TM1650_SCL_L;
    
    for(t = 0; t < 8; t++)
    {
        if((oneByte & 0x80) == 0x80)
            TM1650_SDA_H;
        else
            TM1650_SDA_L;
        
        oneByte <<= 1;
        TM1650_delay_us(4);
        TM1650_SCL_H;
        TM1650_delay_us(4);
        TM1650_SCL_L;
        TM1650_delay_us(4);
    }
}

unsigned char TM1650_Wait_Ack(void)
{
    unsigned char ucErrTime = 0;
    SDA_IN();  // 设置SDA为输入模式
    
    TM1650_SDA_H;
    TM1650_delay_us(1);
    TM1650_SCL_H;
    TM1650_delay_us(1);
    
    while(READ_SDA)  // 等待SDA被拉低
    {
        ucErrTime++;
        if(ucErrTime > 250)
        {
            TM1650_Stop();
            return 1;  // 超时,返回错误
        }
    }
    
    TM1650_SCL_L;
    return 0;  // 正常应答
}

4. 数码管显示控制实战

4.1 数码管段码与位址映射

TM1650可以驱动4位数码管,每位数码管都有对应的地址。理解这个地址映射关系是正确显示的关键。

void TM1650_SendDigData(uint16_t index, uint16_t num)
{
    uint8_t indexAddr = 0;
    uint8_t numValue = 0;
    
    // 数码管位址映射
    switch(index)
    {
        case 1: indexAddr = 0x68; break;  // 第一位数码管
        case 2: indexAddr = 0x6A; break;  // 第二位数码管
        case 3: indexAddr = 0x6C; break;  // 第三位数码管
        case 4: indexAddr = 0x6E; break;  // 第四位数码管
        default: break;
    }
    
    // 数字到段码的转换
    numValue = s_7number[num];
    
    // 发送显示数据
    TM1650_Start();
    TM1650_Send_Byte(indexAddr);
    TM1650_Wait_Ack();
    TM1650_Send_Byte(numValue);
    TM1650_Wait_Ack();
    TM1650_Stop();
}

段码表定义了数字0-9和字母A-F的显示模式,采用共阴极接法。如果你使用的是共阳极数码管,需要取反这些值。

uint8_t s_7number[16] = {
    0x3F,  // 0
    0x06,  // 1
    0x5B,  // 2
    0x4F,  // 3
    0x66,  // 4
    0x6D,  // 5
    0x7D,  // 6
    0x07,  // 7
    0x7F,  // 8
    0x6F,  // 9
    0x77,  // A
    0x7C,  // B
    0x39,  // C
    0x5E,  // D
    0x79,  // E
    0x71   // F
};

4.2 多位数显示实现

在实际应用中,我们经常需要显示多位数。下面这个函数可以将一个0-9999的数字显示在4位数码管上。

void DisplayNumber_4BitDig(uint16_t Num)
{
    // 分解各位数字
    uint16_t thousands = Num / 1000 % 10;
    uint16_t hundreds = Num / 100 % 10;
    uint16_t tens = Num / 10 % 10;
    uint16_t units = Num % 10;
    
    // 依次发送各位数字
    TM1650_SendDigData(1, thousands);
    TM1650_SendDigData(2, hundreds);
    TM1650_SendDigData(3, tens);
    TM1650_SendDigData(4, units);
}

如果你需要显示带小数点的数字,只需要在对应的段码上加上小数点位的值(通常是0x80)。

5. 亮度调节与显示设置

5.1 亮度等级配置

TM1650提供8级亮度调节,从最暗的1级到最亮的8级。亮度控制通过发送特定的命令字实现。

#define brighting_8 0x00  // 最亮
#define brighting_7 0x07
#define brighting_6 0x06
#define brighting_5 0x05
#define brighting_4 0x04
#define brighting_3 0x03
#define brighting_2 0x02
#define brighting_1 0x01  // 最暗

void TM1650_SetDisplay(uint8_t brightness)
{
    // 亮度值乘以16,再加上显示开关和模式设置
    TM1650_SendCommand(0x48, brightness * 16 + 1 * 4 + 1);
}

在实际使用中,我发现亮度等级6或7在大多数环境下都能提供良好的可视性,同时功耗相对较低。亮度等级8虽然最亮,但功耗也最大,适合在强光环境下使用。

5.2 显示模式选择

TM1650支持不同的显示模式,包括7段4位和8段4位显示。通过修改命令字的低几位可以切换不同的模式。

// 设置显示模式和亮度
void TM1650_DisplayConfig(uint8_t brightness, uint8_t on_off, uint8_t mode)
{
    // brightness: 0-7 亮度等级
    // on_off: 0=关闭显示, 1=开启显示
    // mode: 0=7段显示, 1=8段显示
    
    uint8_t command = (brightness & 0x07) << 4;
    command |= (on_off & 0x01) << 2;
    command |= (mode & 0x01) << 0;
    
    TM1650_SendCommand(0x48, command);
}

这个函数提供了更灵活的显示设置,你可以根据需要动态调整显示参数。

6. 按键扫描功能实现

6.1 按键读取原理

TM1650不仅能够驱动数码管,还集成了按键扫描功能,可以检测最多7×4=28个按键。按键状态通过读取特定的地址获取。

unsigned char TM1650_Read_KEY(void)
{
    unsigned char temp;
    
    TM1650_Start();
    TM1650_Send_Byte(0x49);  // 按键读取地址
    TM1650_Wait_Ack();
    temp = TM1650_Read_Byte();  // 读取按键数据
    TM1650_NAck();  // 发送非应答
    TM1650_Stop();
    
    return temp;
}

读取到的按键数据需要进一步解析才能得到具体的按键编号。TM1650的按键编码方式比较特殊,每个按键对应一个唯一的字节值。

6.2 按键编码解析

为了将读取到的按键字节值转换为更容易理解的按键编号,我们需要建立一个映射表。

uint32_t key_number[7][4] = {
    {11,12,13,14},
    {21,22,23,24},
    {31,32,33,34},
    {41,42,43,44},
    {51,52,53,54},
    {61,62,63,64},
    {71,72,73,74}
};

uint8_t key_numberH[7][4] = {
    {0x44,0x45,0x46,0x47},
    {0x4C,0x4D,0x4E,0x4F},
    {0x54,0x55,0x56,0x57},
    {0x5C,0x5D,0x5E,0x5F},
    {0x64,0x65,0x66,0x67},
    {0x6C,0x6D,0x6E,0x6F},
    {0x74,0x75,0x76,0x77}
};

uint32_t TM1650_Get_KEY(void)
{
    unsigned char key;
    uint32_t key_name, i, j;
    
    key = TM1650_Read_KEY();
    
    // 查找按键对应的编号
    for(i = 0; i < 7; i++)
        for(j = 0; j < 4; j++)
        {
            if(key == key_numberH[i][j])
            {
                key_name = key_number[i][j];
                return key_name;
            }
        }
    
    return 0;  // 没有按键按下
}

这种编码方式使得每个按键都有唯一的ID,第一行按键编号为11-14,第二行为21-24,依此类推。在实际应用中,你可以根据需要修改这个映射关系。

7. 常见问题与调试技巧

7.1 时序问题排查

在调试TM1650时,时序问题是最常见的坑。如果你发现数码管不显示或者显示乱码,首先应该检查时序是否符合要求。

我建议使用逻辑分析仪或者示波器来观察SCL和SDA的实际波形。重点关注以下几个方面:起始条件是否正确(SCL高时SDA从高到低)、数据位变化时机(应该在SCL低时变化)、停止条件是否正确(SCL高时SDA从低到高)。

如果没有逻辑分析仪,可以通过调整延时时间来排查。逐步增加或减少延时时间,观察显示效果的变化。有时候只是几个微秒的差别就会导致通信失败。

7.2 硬件连接检查

硬件连接问题也是常见的故障原因。确保所有连接都牢固可靠,没有虚焊或短路。特别注意上拉电阻的设置,虽然TM1650内部有上拉电阻,但在长距离传输时可能需要外接上拉电阻。

电源稳定性也很重要,不稳定的电源会导致显示闪烁或者通信失败。建议在VCC和GND之间加一个100nF的滤波电容。

7.3 软件调试技巧

在软件层面,我建议添加一些调试输出,比如通过串口打印发送的数据和接收到的应答。这样可以帮助你确定问题出现在哪个环节。

如果可能,实现一个简单的测试函数,依次测试每个功能:先测试单个数码管显示,再测试多位数显示,最后测试按键功能。这样能够快速定位问题所在。

void TM1650_Test(void)
{
    // 测试所有数码管显示0-9
    for(int i = 0; i < 10; i++)
    {
        TM1650_SendDigData(1, i);
        TM1650_SendDigData(2, i);
        TM1650_SendDigData(3, i);
        TM1650_SendDigData(4, i);
        delay_ms(500);
    }
    
    // 测试亮度调节
    for(int i = 1; i <= 8; i++)
    {
        TM1650_SetDisplay(i);
        delay_ms(300);
    }
}

这样的测试函数可以帮助你快速验证驱动是否正常工作,以及在哪些方面存在问题。

TM1650键盘模块避坑指南:I2C时序调试中的5个常见问题 本文深度解析了在RK3399Pro等平台上调试TM1650键盘模块I2C时序的实战经验。针对I2C通信不稳定、ACK丢失、信号质量差等5个常见问题,提供了从示波器波形诊断、设备树参数调优到驱动层代码编写的系统性解决方案,帮助开发者实现稳定可靠的键盘读取。 阅读详情

相关推荐

STM32的TM1650程序.rar

STM32的TM1650程序.rar

STM32+TM1650(从手册到实现)【模拟I2C】

在一段时间里,我的高中只能看数码管的十几个引脚发愣,觉得点灯是一个非常大且重要的工程之一,到了大学,才后知后觉有一种特殊的芯片可以对引脚进行管理,仅需要两个单片机的IO口就可以进行管理这个庞大的LED组合 一、准备工作 在手册中我们去了解是如何做到的通信 读图: 一、我们可以将CLK线作为“眼睛”,当CLK睁开的时候,SDA的信号才当真 二、信号的组成部分 ①Start ②data1 ③wait ask ④data2 ⑤wait ask ⑥Stop 至此我们已经完成了..

weixin_60742599的博客 4445

RK3588 MIPI屏幕调试避坑指南:双通道8Lane下DSC压缩屏的花屏、分层问题排查实录

本文详细解析了RK3588平台在双通道8Lane MIPI接口下调试DSC压缩屏时遇到的花屏、分层问题。通过硬件信号完整性检查、软件配置验证及帧数据分析,提供了一套系统化的排查方法,并深入探讨了初始化序列优化和双通道同步机制,帮助工程师高效解决高分辨率屏幕显示异常问题。

weixin_27015733的博客 282

STM32F103学习笔记(5)——数码管驱动TM1650使用

一、简介 TM1650 是一种带键盘扫描接口的 LED(发光二极管显示器)驱动控制专用电路。内部集成有 MCU 输入输出控制数字接口、数据锁存器、LED 驱动、键盘扫描、辉度调节等电路。TM1650 性能稳定、质量可靠、抗干扰能力强,可适用于 24 小时长期连续工作的应用场合。 两种显示模式:8段×4位和7段×4位 段驱动电流大于25mA,位驱动电流大于150mA 提供8级亮度控制 键盘扫描:7×4bit内部集成三极管驱动 高速两线式串行接口 内置时钟振荡电路 内置上电复位电路 支持2.8V-5.5V电

Leung的博客 1万+

Python程序—定子故障三相永磁同步电动机振动与电流数据集

1.0 kW 电机匝间短路故障数据: 正常匝间短路振动数据: 匝间短路故障,严重度为2.26%: 匝间短路故障,严重度为2.70%: 匝间短路故障,严重度为3.35%: 匝间短路故障,严重度为4.41%: 匝间短路故障,严重度为6.48%: 匝间短路故障,严重度为12.17%: 匝间短路故障,严重度为21.69%1.5 kW 电机匝间短路故障数据: 正常匝间短路振动数据: 匝间短路故障,严重度为1.57%: 匝间短路故障,严重度为1.88%: 匝间短路故障,严重度为2.34%

m0_66465741的博客 1322

从查表法到实时计算:SimpleFOC库中正弦函数优化的技术演进

本文深入探讨了SimpleFOC库v2.0.1版本中正弦函数优化技术的演进,从传统查表法到实时计算的创新实践。通过定点数优化、对称性利用和分段线性插值等关键技术,实现了在嵌入式电机控制中的高效三角函数计算,显著提升性能和资源利用率。

weixin_28273593的博客 455

在STM32F103上的TM1650和AIP650驱动实现源码

第一次使用这个器件,没详细看芯片资料,掉进了一个坑,以为是使用I2C驱动,结果使用F103的库函数去驱动,结果消息是发出去了,但是数码管没显示。还用逻辑分析仪抓了数据,发现I2C上把消息都发出去了,就是没响应。对比时序图发现和I2C的定义有区别。网上找了个参考,自己稍微修改了下调通了,发出来共享给需要的人。类似于I2C,不等于是I2C.代码很简单直接上源码。

hyhsandy1803的博客 4386

Obsidian与GPT协作:数学公式从KaTeX到MathJax的无缝转换实践

本文针对Obsidian用户从GPT等AI助手复制数学公式时遇到的KaTeX与MathJax格式不兼容问题,提供了高效的解决方案。重点介绍了KaTeX to MathJax插件的核心作用,它能自动将AI生成的KaTeX格式公式(如\(...\))无缝转换为Obsidian默认支持的MathJax格式($...$),实现复制粘贴后公式即时渲染,极大提升了数学笔记与AI协作的效率和流畅度。

weixin_29209825的博客 139

芯参谋(93):Zephyr_驱动开发指南

本文为面向Cortex-M/RISC-V平台的Zephyr存储驱动移植指南,聚焦binding YAML、设备模型、SPI/I2C/UART/GPIO、Flash/MTD、NAND坏块管理、SDMMC/eMMC、文件系统(LittleFS/FatFs)、NVS/ZMS、电源管理与ISR-DMA并发安全。核心理念:驱动骨架由“binding声明硬件契约、Kconfig声明依赖、设备模型定义初始化顺序”三者构建,其余为厂商时序差异。重点指出四大高频问题:compatible与DTS不匹配、初始化等级错误导致de

qq520131714的专栏 675

fMRI数据处理:从DICOM到NIFTI(下)

上一篇我们完成了对原始DICOM的数据整理,将其整理为了BIDS目录结构。作为从从DICOM到NIFTI的最后一篇,当然是介绍如何批量将DICOM格式转NIFTI格式啦!从DICOM到NIFTI系列就完成啦!撒花★,°.°★。从核磁机器把数据拷回来——到整理成BIDS格式——到批量转格式;我们fMRI数据处理的第一步就算是正式迈出去啦!接下来的内容,敬请期待吧~

weixin_44933894的博客 2080

避坑指南:sherpa-onnx中文语音识别模型实测对比(2024最新版)

本文实测对比了sherpa-onnx框架下Paraformer、Zipformer、SenseVoice等主流中文语音识别模型。针对不同应用场景,从准确率、延迟、资源占用等维度提供选型建议,并分享部署避坑指南与最佳实践,帮助开发者高效选择本地语音转文字方案。

xray4的博客 2289

京东双十一超级折扣 当当旗舰店驱动书

手把手教你学Linux设备驱动开发」点击链接直接打开 或者复制文案打开京东。

BeiJingXunWei的博客 180

AD9176 双通道高速DAC调试记录

AD9176是一款高性能双通道16位数模转换器,支持高达12.6GSPS采样率,专为多频段无线应用设计。该器件集成8通道15.4Gbps JESD204B接口,支持复数/实数数据输入,每通道最大输入速率达3.08GSPS。关键特性包括:48位高精度NCO、灵活的插值滤波器(最高12倍)、优异的动态性能(SFDR达-83dBc@1.84GHz)以及多芯片同步功能。硬件调试需重点关注时钟配置(建议250M基准时钟)、JESD参数匹配及交流耦合设计。测试指标要求SFDR>55dBc@312MHz,实测值可达65d

universaldata的博客 1493

AI 如何接进 LabVIEW:链路怎么搭、边界在哪、还差什么

这篇讨论的是:如果让 AI 真正连进 LabVIEW 开发环境,链路该怎么搭、边界在哪,以及从开源 demo 走到可交付系统还差哪些工程工作。阅读说明:本文基于公开开源项目与通用工程方法整理,用于技术选型讨论,不代表已完成的客户案例、已交付系统或实测性能指标。文中能力模块是常见需求分类,具体范围与指标需按实际工况沟通与验收确认。

bjcyck的博客 124

双三相电机控制避坑指南:为什么你的SVPWM谐波大?四矢量调制实战解析

本文深入解析双三相电机控制中SVPWM谐波大的问题,并提供四矢量调制实战方案。通过分析谐波来源、四矢量调制原理及工程实现步骤,显著降低电流THD至3-5%,提升系统效率2.3个百分点。特别适合需要优化电机控制的工程师参考。

weixin_30645617的博客 398

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

BcoreOS 系统制作实战:用一个升级包,让Rocky Linux10.1跑进Ubuntu 25.04

本节以 Rocky 10.1 作为系统母盘,演示如何根据内核校验和匹配 AOS 镜像,并最终生成可用的 BcoreOS 升级包。

xiaozhi@fslib.org的博客 229

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Linux下i2c标准驱动开发流程

i2c_driver。

大道之行,始于足下 344

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

芯参谋(103):Zephyr 驱动开发指南

本文系统阐述Zephyr环境下存储器件驱动移植的核心方法论,聚焦“何时复用、何时自研”这一关键问题,通过分层架构解析(设备驱动层与框架层对接)、官方驱动可复用性判断(基于JEDEC ID表)及典型路径选择(SPINOR走MTD、NAND走坏块管理、eMMC走块设备),指导开发者高效完成SPINOR/SPINAND等器件的移植。内容涵盖驱动骨架搭建、binding设计、初始化等级配置、命令层实现、页边界处理、擦除超时管理及上板联调流程,强调参数表提取、时序校验与错误传播规范,最终形成可量产落地、可上游提交的高

qq520131714的专栏 88

【正点原子Linux连载】第十九章 设备树下的platform驱动编写 摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南

第133~182行,platform下的 probe函数:led_probe,当设备树中的设备节点与驱动之间匹配成功会先去初始化pinctrl里面配置的IO,也就是根据示例代码19.1.1.1中的属性进行配置,然后再执行probe函数,第140行调用led_gpio_init函数时,将pdev->dev.of_node作为参数传递到函数中,platform_device结构体中内置了一个device结构体类型的成员变量dev。首先修改设备树文件,加上我们需要的设备信息,本章我们就使用到一个LED0。

weixin_55796564的博客 59

RS485半双工通信模块驱动开发—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】

本文详细分析了RK3568平台RS485串口在单板自发自收失败的常见原因,强调半双工特性下A/B悬空或无对端时RX为空属正常现象。重点指出:write成功仅表示数据进入UART FIFO,不代表信号已发送;需通过A/B短接回环验证链路通断;正确配置DE/RE控制(GPIO或硬件自动方向)、设备树、权限及串口参数;避免与RS232混淆。推荐使用uart_rs485.c工具进行完整测试,确保收发器供电、极性正确、tcdrain完成,最终以“发回显”作为过单板标准。

wanwuzhineng_01的博客 449

【正点原子Linux连载】 第十三章 Linux按键输入实验 摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南

本章我们实现按键输入,在驱动程序中使用一个整形变量来表示按键值,应用程序通过read函数来读取按键值,判断按键有没有按下。也就是模拟按键按下,GPIO3_C5为高电平,松开按键为低电平。注意,本章例程只是为了演示Linux下GPIO输入驱动的编写,实际中的按键驱动并不会采用本章中所讲解的方法,Linux下的input子系统专门用于输入设备!第120~131行,key_open函数通过调用keyio_init函数来始化按键所使用的IO,应用程序每次打开按键驱动文件的时候都会初始化一次按键IO。

weixin_55796564的博客 201

Swarm-Rebuild-详细说明

一个 Chrome 扩展:点一下,当前网页会淡出成空白画布,然后一群"多人协作光标"像设计团队一样,把页面一格格重新画回来。纯视觉表演,不改动你的页面。

我的开源项目:https://gitee.com/derekgo/vue-cms_xg 399

语音识别模块驱动开发—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】

本文详述了在RK3568平台使用ASR语音模组的串口通信调试过程,重点解决识别帧(A5FC...FB)无法接收的问题。核心要点包括:正确配置/dev/ttyS7@115200波特率,确保模组供电与麦克风拾音;必须先唤醒后发命令,以出厂词为准;解析帧时需确认data[4]=0xA0、data[5]=0x91,再提取动作码(02开灯、03关灯、04播音、05停);避免与其他模块共用排针导致短路或干扰;使用hex模式读取,防止文本模式误吞0xA5;通过poll+CO_NONBLOCK实现非阻塞监听,确保帧完整捕获

wanwuzhineng_01的博客 406

芯参谋(100):RT-Thread_驱动开发指南

本文档为Microchip PIC/AVR/SAM三族MCU的全流程开发指南,覆盖从选型、MCC配置、代码生成到量产烧录的完整链路。针对三族工具链差异大、生态复杂的问题,按“选型→配置→应用→烧录→调试”顺序组织,明确各环节官方出处与可复现命令。重点解决跨族迁移中的共性难题:MCC生成边界、PPS引脚映射失效、UPDI连接失败、内存溢出及量产固件一次性烧录等。通过机制-配置-排查三段式结构,结合速查表与读者路径,实现工程问题快速定位,提升开发效率与产品可靠性。

qq520131714的专栏 552

基于PIC32CX1025SG41128 USB CDC Dual-Bank Bootloader设计

本项目基于PIC32CX1025SG41128实现支持USB CDC虚拟串口的双Bank安全Bootloader,替代传统UART升级方式。通过抽象通信接口,实现固件分块传输、CRC校验与安全切换,确保升级中断时系统可回退。采用双Bank布局,预留failsafe区域记录版本与重试信息,支持RAM触发重启进入升级模式。配套上位机工具btl_host.py与打包脚本make_merged_bin.py,完成镜像生成与下载。工程结构清晰,兼容MPLAB X/VSCode开发环境,适用于高可靠性嵌入式设备远程升级

lindd911911的博客 269

TMC2209步进电机驱动开发

TMC2209是两相步进电机驱动,最高峰值电流2A(有效值1.4A),供电电压4.75V~29V。开发时一定要注意电流的阈值,2A的电流可能不适配大扭矩的电机需求。通信接口:半双工UART(单数据线,共用一根线收发,必须控制收发方向)细分:最高 256 微步(UART 模式),引脚模式最高 16 细分控制方式:STEP + DIR 脉冲方向控制(主流用法,不是串口发脉冲)用法:引脚模式和UART配置模式,UART模式可实时改变寄存器状态MS1/MS2:引脚模式时用于改变细分;

weixin_44425713的博客 340
上一篇: TF 卡本地文件浏览器开发教程
下一篇: Jetson Nano+YOLOv5:轻量级目标检测在边缘端的性能优化与实战解析
devops8pract
博客等级 码龄4年 533粉丝 849原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值