使用STM32 DMA+SPI读取74HC165数据的正确方法

STM32与74HC165实现高效IO扩展方案 在嵌入式系统开发中,IO资源管理是核心挑战之一。通过移位寄存器技术,可以将并行输入转换为串行输出,大幅节省MCU引脚资源。MC74HC165A作为经典8位并行输入/串行输出移位寄存器,支持级联扩展,配合STM32的SPI接口,能实现高效IO扩展。这种方案特别适合需要密集按钮阵列的HMI界面、工业设备状态监测等场景。文章详细解析了硬件设计、固件优化及抗干扰措施,并提供了功耗优化和故障排查的实用技巧。 阅读详情

单片机读取74HC165芯片的数据在网上一搜一大把,但是能做到高速,高效,低cpu占用的做法目前我没有见到,所以在此我补充一篇文档,如果能帮上大家那肯定是再好不过啦。

众所周知,74HC165是并入转串出的芯片,这类芯片其实还有很多,甚至包括传入转并出的595,思路与本文雷同。

上图是芯片的引脚图,LD,是锁存电平,低电平锁存,高电平读取锁存数据,CE低电平时芯片正常工作,相当于使能脚。那么对于STM32来说,读取和级联的正确的接法应该如下:

我用文字描述一下:

NSS就是随便用一个IO口,比如PA4连接,需要连接所有的LD脚;

SPICLK就是时钟 对于SPI1来说就是PA5,需要连接所有的CLK脚;

MISO串行数据读取,连接PA6; 在165上仅连接第一片的SO,后面的级联即可;

MOSI数据输出,连接PA7,在165上需要连接所有的CE;

,有人会问,165是只读取数据的,为什么还要连接SPI的输出端呢,这是因为CE需要低电平信号作为使能,如果不接SPI的数据,就需要一个额外的IO口提供这个信号,当然,也可以直接接地。但是经过长期反复测试,你听我的肯定是最好的。不要接地!

以下为编程思路:

1,让spi处于SPI_Direction_2Lines_RxOnly模式,此时启动后clk会持续发送时钟脉冲,但是LD信号需要在每次读取前发送,ce可以直接给低电平。问题是什么时候给,那就需要中断,由于连续工作,中断频繁,cpu开销很大,此方案最终验证不合格。

2,让spi处于SPI_Direction_2Lines_RxOnly模式,ce直接低电平,使用dma接收数据,在数据接收完毕后产生一个中断,此时需要将spi停止,再给个LD锁存信号,然后再重新开启DMA和SPI开启下一轮读取,此方案大大减少了cpu的占用,提高了速度,但是使用中发现,读取的数据与内存的位置始终是错位的,观测时序后发现实际上是DMA与SPI启动的不同步造成的。但是勉强是可以用的了。

3。让spi处于SPI_Direction_2Lines_FullDuplex模式,DMA读取,在读取前使用SPI发送一个数据

SPI_I2S_SendData(SPI2, 0x00);,发送数据的次数取决于芯片的数量,这是因为要利用发送的时钟同时将数据读取回来。此时可以关闭dma中断,因为不需要在中断里停止spi了。需要保存spi一致开启,因为在这个模式下,如果不发送数据,是不会自动发送时钟脉冲的,所以脉冲的启动实际上需要数据发送本身来驱动了。此时你会发现只要发送一个字节,就会发送对应的时钟,此时也可以同时读取一个字节的数据了。由于没有了中断,cpu的负担又少了一些,但是运行后发现,数据位置是错位了,而且读取的数据少于实际发送的数量,监测时序后发现还是DMA与SPI的硬件启动时间不同步造成的。

4.经过上面一系列的尝试,经过3天,最终的结局来了。spi需要处于SPI_Direction_2Lines_FullDuplex模式,DMA的SPI双通道同时工作,他会内部同步协调,DMA负责发送0x00,有几片165就发送几个0,在CE端实际上呈现的就是连续的低电平,DMA的RX通道负责自动接收。DMA模式设置为DMA_Mode_Normal,不要循环读。在每次启动DMA之前做一次LD的电平脉冲,启动之后立刻处理上一次回来的数据。这后面就做其他的事就行了。不需要中断。只要有合适的任务间隔,该方法可以用最低的cpu负担处理165的数据。

上代码:

// SPI1 初始化配置
void SPI1_Init(void) {
    GPIO_InitTypeDef GPIO_InitStructure;
    SPI_InitTypeDef  SPI_InitStructure;

    // 开启时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE);

    // 配置SCK, MISO, MOSI引脚复用推挽输出PA5-CLK PA6-MISO PA7-MOSI
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // SPI初始化设置
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_InitStructure.SPI_CRCPolynomial = 7;
    SPI_Init(SPI1, &SPI_InitStructure);

    SPI_Cmd(SPI1, ENABLE); //使能SPI外设
}

// DMA发送初始化
void SPI1_DMA_TX_Init(uint8_t *tx_buffer, uint16_t size) {
    DMA_InitTypeDef DMA_InitStructure;

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //开启DMA时钟

    DMA_DeInit(DMA1_Channel3);
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI1->DR);
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)tx_buffer;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
    DMA_InitStructure.DMA_BufferSize = size;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_MemoryDataSize_Byte;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel3, &DMA_InitStructure);

    SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, ENABLE); //使能SPI的DMA发送请求
}

// DMA接收初始化
void SPI1_DMA_RX_Init(uint8_t *rx_buffer, uint16_t size) {
    DMA_InitTypeDef DMA_InitStructure;

    DMA_DeInit(DMA1_Channel2);
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI1->DR);
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)rx_buffer;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    DMA_InitStructure.DMA_BufferSize = size;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_MemoryDataSize_Byte;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
    DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel2, &DMA_InitStructure);

    SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Rx, ENABLE); //使能SPI的DMA接收请求
}

// 启动一次DMA传输并等待完成
void SPI1_TransmitReceive_DMA(uint8_t *tx_data, uint8_t *rx_data, uint16_t len) {
  
NSS=0;//PA4引脚 接LD

    // 关闭DMA通道
    DMA_Cmd(DMA1_Channel2, DISABLE);
    DMA_Cmd(DMA1_Channel3, DISABLE);
    // 设置缓冲区大小
    DMA_SetCurrDataCounter(DMA1_Channel2, len);
    DMA_SetCurrDataCounter(DMA1_Channel3, len);//len就是165的片数
NSS=1;
    // 启动DMA通道
    DMA_Cmd(DMA1_Channel2, ENABLE);
    DMA_Cmd(DMA1_Channel3, ENABLE);
//这里可以处理上一次回来的数据    
}
//只要在合适的任务间隔中调用SPI1_TransmitReceive_DMA就行了

精简后就是上面这些,在合适的任务间隔中调用SPI1_TransmitReceive_DMA就行了。

STM32硬件SPI驱动74HC165实现IO扩展方案 在嵌入式系统开发中,IO口资源管理是核心挑战之一。移位寄存器作为数字电路基础元件,通过串并转换原理可有效扩展微控制器的输入能力。MC74HC165A作为经典8位并行输入/串行输出芯片,配合STM32硬件SPI接口,能实现高效可靠的多路信号采集。该方案在工业HMI和智能家居领域具有显著优势,既能减少PCB面积又能降低BOM成本。通过硬件SPI的主从通信机制,开发者可以轻松实现多芯片级联,满足医疗设备和工业控制等场景对高密度数字输入的需求。 阅读详情

相关推荐

STM32F373VC与74HC165的SPI扩展IO方案详解

在嵌入式系统开发中,IO扩展是解决微控制器引脚资源不足的常见需求。移位寄存器作为数字电路基础元件,通过串行转并行工作原理实现IO扩展。74HC165作为8位并行输入/串行输出移位寄存器,配合STM32硬件SPI接口,可高效扩展数字输入通道。该方案在工业控制领域具有重要价值,特别适用于传感器网络、产线监测等需要多路信号采集的场景。通过SPI协议实现数据通信,结合DMA传输和硬件滤波技术,能显著提升系统实时性和抗干扰能力。本文以STM32F373VC与MC74HC165A的硬件设计为例,深入解析电路连接、时序控

culiao6493的博客 493

GD32系列笔记三:模拟SPI通信

1. SPI介绍:SPI 是英语 Serial Peripheral interface 的缩写,顾名思义就是串行外围设备接口。是一种高速、全双工,同步的通信总线。2. 提供时钟的为主设备(Master),接收时钟的设备为从设备(Slave)。3. SPI通信有4条线,单向通信时3条线,少了一条数据线,分别是:MOSI: 主设备数据输出,从设备数据输入MISO: 主设备数据输入,从设备数据输出SCLK: 时钟,由主设备发出CS: 片选,使能片选时,主机对从机的操作才有效。

A1820485554的博客 5181

STM32与74HC165实现高效数字输入扩展方案

数字输入扩展是嵌入式系统开发中的常见需求,尤其在工业自动化领域需要处理大量传感器信号。通过移位寄存器如74HC165实现并行转串行(PISO)转换,可以大幅节省微控制器GPIO资源。该技术利用串行通信原理,仅需3个GPIO引脚即可扩展8路数字输入,级联设计更可无限扩展通道数。结合STM32的定时器和DMA特性,能构建高性能、低成本的工业控制解决方案,典型应用包括控制面板扫描和多传感器监测。本文详细介绍基于STM32F373RC与MC74HC165A的硬件设计要点和软件优化技巧,帮助工程师快速实现稳定可靠的数

weixin_33912453的博客 368

STM32F030软件SPI控制74HC165

仅仅作为一个调试记录,供硬件设计使用。 环境 硬件:NUCLEO-F030R8。某宝购买的74HC165模组,接了 888 路按键。 开发环境:Win10+IAR EWARM 8.22.1 原理图 只是一个示意性的原理图,我自己不想画了,虽然图片的IO脚和主芯片不同。 我用的芯片型号为STM32F030R8。对应的实际IO接线如下: 165侧 芯片侧 1 PL -> PA4 SPI1_NSS 2 CP CLK -> PB3 SPI1_SCK 9 QH D

努力中的老周的专栏 4666

STM32与74HC165实现高性价比IO扩展方案

在嵌入式系统开发中,IO扩展是解决微控制器引脚不足的常见需求。通过移位寄存器如74HC165实现并行转串行通信,可以大幅提升IO利用率。其工作原理是利用SPI接口将并行数据转换为串行流传输,既降低硬件复杂度又节约成本。这种方案特别适合工业控制、传感器采集等需要大量数字输入的场景。结合STM32的SPI外设,可实现多片74HC165级联,构建高密度输入系统。实测表明,该方案相比传统IO扩展芯片可降低60%以上布线复杂度,同时保持稳定的42MHz通信速率。关键技术点包括正确的时序控制、抗干扰设计和DMA传输优化

weixin_29190169的博客 341

STM32 SPI接口与74HC165实现高效按钮扩展方案

在嵌入式系统开发中,GPIO资源管理是核心挑战之一。通过移位寄存器实现IO扩展是经典解决方案,其原理是将并行输入转换为串行输出,利用SPI接口与微控制器通信。MC74HC165作为8位并行输入/串行输出移位寄存器,配合STM32的SPI接口,可大幅节省GPIO资源。这种方案特别适合工业控制面板、安全门禁等需要多按钮输入的场合,支持级联扩展和实时状态检测。关键技术点包括SPI时序配置、硬件消抖电路设计以及中断驱动优化,实测显示仅需4个MCU引脚即可管理16个按钮输入,相比传统方案节省75%的IO资源。

weixin_33804582的博客 430

关于使用SPI总线读取并转串(74HC165)发生数据移位的问题

关于使用SPI总线读取并转串(74HC165)发生数据移位的问题 背景: 使用STM32H743主控,通过SPI读取74HC165的数据,74HC165接了7个按键。 现象: 在所有按键都没按下的时候读取到的数据应该为0x00,按下某个按键对应的bit应该变成1。实际测试发现不按任何按键的时候数据是0x01,按第一个按键的时候读取到0x03,依次类推。按键对应的bit错了一位。 原因: SPI的初始化代码如下: void MX_SPI5_Init(void) { hspi5.Insta

gzggyg 5740

STM32与74HC165实现高效按键扩展方案

在嵌入式系统开发中,GPIO资源优化是提升硬件效率的关键技术之一。通过移位寄存器如MC74HC165A,开发者可以将并行输入转换为串行输出,大幅减少微控制器引脚占用。这种方案基于SPI通信协议,利用STM32的硬件外设实现高效数据传输,特别适合需要处理多路输入的工业控制面板和智能家居设备。MC74HC165A的级联能力支持扩展更多按键,而STM32的DMA功能则能实现零开销数据采集。该技术不仅降低了PCB设计复杂度,还能减少BOM成本,是资源受限场景下的理想解决方案。

weixin_42653691的博客 239

STM32 DMA+SPI读取74HC165:从轮询到硬件流水线完整实践

在嵌入式系统中,并行输入扩展常用74HC165移位寄存器,一颗芯片可扩展8路输入,级联后能覆盖几十路开关与按键。其读取本质是“假字节换真字节”——主控发出时钟,芯片将锁存的并行数据逐位移出。传统轮询方式在SPI全双工传输中占用CPU等待,且易受中断干扰导致数据帧错位。利用DMA接管数据搬运后,SPI外设与内存之间自动完成传输,CPU只需处理完成中断,时序由硬件控制,稳定性和实时性显著提升。该方案广泛应用于工业控制面板、按钮阵列、编码器信号采集等高密度输入场景。文章基于STM32 HAL库,从GPIO、SPI

weixin_29164497的博客 295

STM32与MC74HC165A实现多路输入扩展方案

在嵌入式系统开发中,GPIO资源管理是核心挑战之一。移位寄存器通过串行化技术,将多个并行输入信号转换为串行数据流,显著节省微控制器引脚资源。MC74HC165A作为典型的8位并行输入/串行输出移位寄存器,配合STM32的GPIO或SPI接口,可实现高效的多路信号采集。这种硬件扩展方案特别适合工业控制、自动化监测等需要处理大量数字输入的场景。通过级联多个芯片,理论上可无限扩展输入通道,而仅需3个GPIO引脚控制。在软件层面,开发者既可采用基本的GPIO模拟时序,也能利用STM32的硬件SPI和DMA实现高速数

weixin_30629653的博客 422

74HC165级联读取32路开关状态?STM32硬件SPI驱动方案实测

本文详细介绍了基于STM32硬件SPI驱动74HC165级联的32路开关状态读取方案,适用于工业自动化和智能家居控制等场景。通过硬件SPI配置和DMA传输优化,实现了高效、低CPU占用的多路信号采集,并提供了抗干扰设计和性能对比数据。

weixin_33925615的博客 349

STM32 SPI DMA高效读取74HC165:多路开关量采集方案与实战

在工业控制与嵌入式系统开发中,多路开关量、按键状态的高效采集是常见需求。74HC165作为并行输入转串行输出的移位寄存器,常与STM32配合实现IO扩展,但传统轮询方式不仅占用CPU,还易受中断干扰。借助SPI主模式与DMA数据传输,主机只需发送哑字节即可同步读取多片级联的开关信号,CPU仅在传输完成时唤醒,极大降低负载。该方案适用于按键矩阵、拨码开关、限位开关等并行输入场景,并可通过多组片选扩展至数百路通道。本文将讲解SPI时序适配、级联数据顺序、软件消抖等工程细节,帮助开发者实现稳定高效的开关量采集系统

weixin_29184075的博客 314

使用DMA进行STM32的SPI口读写操作

在嵌入式系统中,SPI(Serial Peripheral Interface)是一种常见的串行通信接口,用于连接主控制器与外部设备,如传感器、存储器和其他外设。为了提高SPI的传输效率,可以使用DMA(Direct Memory Access)来实现SPI口的读写操作。通过配置STM32的SPI口和DMA控制器,我们可以使用DMA实现高效的SPI口读写操作。需要注意的是,在使用DMA进行SPI读写操作时,务必确保数据缓冲区的有效性和数据长度的正确性,以避免数据错误或溢出。函数等待DMA传输完成,并使用。

ElBackend的博客 1384

STM32与MC74HC165A实现高效IO扩展方案

在嵌入式系统开发中,IO扩展是解决GPIO资源不足的关键技术。通过移位寄存器如MC74HC165A,可将并行输入转换为串行输出,大幅节省主控芯片引脚资源。其工作原理是利用时钟信号将并行数据逐位移出,配合STM32的SPI接口或GPIO模拟时序实现高效读取。这种方案特别适合工业控制、智能家居等需要监测大量数字输入的场合。MC74HC165A支持多芯片级联,结合STM32F745VG的高性能处理能力,可构建稳定可靠的输入扩展系统。典型应用包括机械按钮矩阵、传感器网络等场景,通过硬件SPI和DMA传输还能实现数据

weixin_30561425的博客 352

Stata实战:DID平行趋势检验完整操作指南(附reghdfe+coefplot代码)

本文提供了一份使用Stata进行DID平行趋势检验的完整实战指南。文章详细讲解了从数据准备、生成相对时间变量,到利用reghdfe命令构建动态效应模型,以及使用coefplot命令进行结果可视化的全流程操作。核心在于通过检验政策前交互项的显著性,验证处理组与对照组是否满足平行趋势假设,为后续因果推断奠定可靠基础。

weixin_29231725的博客 1380

网课、网页视频倍速播放简单脚本

一个简单的网页视频倍速脚本

huazn612的博客 1万+

STM32与MC74HC165A实现高效GPIO扩展方案

在嵌入式系统开发中,GPIO资源管理是硬件设计的关键挑战。移位寄存器作为数字电路基础元件,通过串行转并行原理,能有效扩展微控制器的输入接口。MC74HC165A作为经典8位并行输入/串行输出芯片,配合STM32的SPI或GPIO接口,可实现多路信号采集的工程优化方案。该技术特别适用于工业控制、传感器矩阵等需要大量数字输入的场合,能以极低成本解决GPIO资源紧张问题。通过级联设计和硬件抗干扰措施,系统可稳定实现32路甚至64路信号采集,相比传统方案节省90%引脚资源。热词提示:ARM Cortex-M4架构为

337

配置Dot1q终结子接口实现跨设备VLAN间通信示例

示例图 一.实验目的 1.配置Dot1q终结子接口实现跨设备VLAN间通信示例 二.注意事项 1.Dot1q终结子接口和QinQ终结子接口不支持透传不带VLAN Tag的报文, 收到不带VLAN Tag的报文会直接丢弃 2.由于三层以太网子接口不支持VLAN报文,当它收到VLAN报文时,会将VLAN报文当成是 非法报文而丢弃,因此,需要在子接口上将VLAN Tag剥掉,也就是需要VLAN终结 三.VLAN终结简介 1.VLAN终结的实质包含两个方面: ①.对接口接收到报文,剥除VLAN标

qq_44751470的博客 7097

STM32与MC74HC165A实现高效I/O扩展方案

在嵌入式系统设计中,GPIO资源管理是核心挑战之一。通过并行转串行技术,MC74HC165A芯片能够显著扩展微控制器的输入能力,仅需3个GPIO即可读取8路数字信号。其工作原理基于移位寄存器,通过SPI接口实现高速数据传输,特别适合工业控制、智能家居等需要大量传感器监测的场景。结合STM32的硬件SPI和DMA功能,可实现微秒级响应,比传统I2C方案更具实时性优势。该方案在自动化设备、电梯控制等场景中已获验证,能有效解决GPIO资源不足问题。

weixin_34034261的博客 609

TDSQL-单机安装

根据腾讯云官方要求,TDSQL安装至少需要三台机器。本人想要学习TDSQL但是没有足够的机器资源,经过仔细分析研究TDSQL安装过程,尝试发现单台机器也可以成功安装TDSQL,现将本人单台机器安装TDSQL的过程以及安装过程中遇到的问题在此分享。具体安装过程可参考腾讯官方文档,本文仅分享与官方文档不一致的步骤。

u012607648的博客 6808

CloudCompare 二次开发(16)——计算点云最值

不依赖任何第三方点云相关库,使用ClopudCompare计算点云最值。

点云侠的博客 517

STM32G071RB与MC74HC165A实现高效IO扩展方案

在嵌入式系统开发中,IO资源管理是核心挑战之一。移位寄存器作为数字电路基础元件,通过串行化传输机制实现并行数据的转换与扩展。MC74HC165A作为典型的8位并行输入/串行输出移位寄存器,配合STM32的SPI接口,能有效解决GPIO资源紧张问题。该方案通过级联设计可扩展输入通道,特别适合工业控制面板、家电控制等需要多按钮检测的场景。相比I2C扩展器方案,这种基于SPI的硬件移位方案具有更高的抗干扰能力和实时性,同时保持较低成本。关键技术点包括正确的时序控制、消抖算法优化以及SPI时钟配置,实测显示在8MH

无花的专栏 426

引入高分辨率特征层保持的YOLOv10小目标增强:从思路到完整实现

大概两个月前,我在做一个无人机航拍图像检测的项目,目标是识别图片里的小型车辆和行人。用的数据集是VisDrone,相信做小目标检测的朋友对这个数据集都不陌生。一开始我直接跑了官方YOLOv10的代码,结果在tiny vehicle这一类上mAP50只有可怜的0.312。那些小目标基本就是几个像素点,YOLOv10在三次下采样之后,这些小目标的特征几乎就消失不见了。 后来我折腾了大概三周,尝试了各种方法:改anchor、调loss权重、做数据增强、甚至考虑过换检测头。最后发现最有效的还是引入一个高分辨率特征

YOLO 50
上一篇: 使用8脚单片机驱动幻彩LED
下一篇: STM32F103 开发USB设备端点超过ENDP4以上时崩溃问题的解决
csaaa2005
博客等级 码龄15年 51粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

csaaa2005

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值