EEPROM读写背后的中断艺术:CW32F030C8T6 I2C事件驱动编程详解

modern-web-guidance-src(TypeScript) 「modern-web-guidance-src(TypeScript)」是开源项目(TypeScript)。项目简介:Keep your coding agent up to date with the latest web best practices源码完整,下载解压即可查看使用,适合学习参考、课程设计与二次开发。 立即下载

EEPROM读写背后的中断艺术:CW32F030C8T6 I2C事件驱动编程详解

在嵌入式系统设计中,如何高效处理外设通信一直是开发者面临的核心挑战。传统的轮询方式虽然简单,但在多任务环境下会造成CPU资源的严重浪费,特别是在低功耗设备或高响应性应用中。CW32F030C8T6作为一款高性能的32位微控制器,其I2C外设的中断驱动机制为EEPROM读写操作提供了优雅的解决方案,让开发者能够构建真正的事件驱动型嵌入式系统。

中断驱动的核心价值在于非阻塞式编程理念——主程序无需等待慢速的I2C通信完成,而是继续执行其他任务,当I2C传输完成或需要处理时,通过中断机制及时响应。这种架构特别适合需要同时处理多个外设或复杂算法的实时系统。

1. CW32F030C8T6 I2C中断系统架构解析

CW32F030C8T6的I2C控制器在设计上充分考虑了中断驱动的需求,提供了丰富的中断事件和灵活的状态机机制。与简单的GPIO中断不同,I2C中断涉及多个阶段的状态转换,每个状态都对应着特定的总线事件。

I2C中断事件主要分为以下几类:

  • 起始条件中断:当START信号成功发送后触发
  • 地址传输中断:从机地址发送完成后触发
  • 数据传输中断:每个数据字节传输完成后触发
  • 停止条件中断:STOP信号发送后触发
  • 错误中断:包括总线错误、仲裁丢失、NACK接收等异常情况

这些中断事件共同构成了一个完整的状态机,开发者需要根据当前状态决定下一步操作。CW32F030C8T6的I2C状态寄存器提供了详细的状态编码,例如:

状态码含义典型处理动作
0x08START已发送发送从机地址+写命令
0x10重复START已发送根据模式发送读/写地址
0x18SLA+W已发送,收到ACK发送数据或EEPROM内部地址
0x28数据字节已发送,收到ACK发送下一个数据或准备读操作
0x40SLA+R已发送,收到ACK准备接收数据
0x50数据字节已接收存储数据并准备ACK/NACK

提示:在实际应用中,建议将状态处理逻辑封装为独立的状态机函数,而不是在中断服务例程中直接处理复杂逻辑,以保持ISR的简洁性。

2. 中断驱动EEPROM读写的实现策略

实现高效的中断驱动EEPROM读写需要精心设计状态管理和数据缓冲机制。与简单的存储器访问不同,EEPROM操作通常涉及地址设置、数据写入、读取验证等多个阶段,每个阶段都需要准确的状态跟踪。

2.1 状态机设计

一个完整的EEPROM读写操作通常包含以下状态序列:

typedef enum {
    EEPROM_STATE_IDLE,          // 空闲状态
    EEPROM_STATE_START,         // 发送START
    EEPROM_STATE_ADDR_WRITE,    // 发送写地址
    EEPROM_STATE_MEM_ADDR,      // 发送EEPROM内部地址
    EEPROM_STATE_DATA_WRITE,    // 写入数据
    EEPROM_STATE_RESTART,       // 发送重复START
    EEPROM_STATE_ADDR_READ,     // 发送读地址
    EEPROM_STATE_DATA_READ,     // 读取数据
    EEPROM_STATE_STOP,          // 发送STOP
    EEPROM_STATE_ERROR          // 错误处理
} eeprom_state_t;

这种明确的状态划分使得中断处理逻辑更加清晰,每个中断只需要处理当前状态对应的操作,大大简化了代码复杂度。

2.2 数据缓冲与管理

在中断驱动设计中,数据缓冲区的管理至关重要。我们需要设计一个环形缓冲区或双缓冲区机制来处理连续的数据流:

#define EEPROM_BUFFER_SIZE 32

typedef struct {
    uint8_t data[EEPROM_BUFFER_SIZE];
    volatile uint16_t write_index;
    volatile uint16_t read_index;
    volatile uint16_t count;
} eeprom_buffer_t;

// 初始化缓冲区
void buffer_init(eeprom_buffer_t* buf) {
    buf->write_index = 0;
    buf->read_index = 0;
    buf->count = 0;
}

// 向缓冲区写入数据
bool buffer_write(eeprom_buffer_t* buf, uint8_t value) {
    if (buf->count >= EEPROM_BUFFER_SIZE) return false;
    
    buf->data[buf->write_index] = value;
    buf->write_index = (buf->write_index + 1) % EEPROM_BUFFER_SIZE;
    buf->count++;
    return true;
}

// 从缓冲区读取数据
bool buffer_read(eeprom_buffer_t* buf, uint8_t* value) {
    if (buf->count == 0) return false;
    
    *value = buf->data[buf->read_index];
    buf->read_index = (buf->read_index + 1) % EEPROM_BUFFER_SIZE;
    buf->count--;
    return true;
}

这种缓冲区机制确保了即使在高速数据流情况下,也不会因为临时处理不过来而丢失数据。

3. 中断服务例程的优化实践

中断服务例程(ISR)的设计质量直接影响到整个系统的响应性和稳定性。在CW32F030C8T6的I2C中断处理中,我们需要遵循几个关键原则:

3.1 保持ISR简洁高效

ISR应该尽可能简短,只处理最紧急的任务,将复杂逻辑推迟到主循环中处理:

void I2C1_IRQHandler(void) {
    // 获取并清除中断标志
    uint8_t status = I2C_GetState(CW_I2C1);
    I2C_ClearIrq(CW_I2C1);
    
    // 根据状态码处理不同情况
    switch (status) {
        case 0x08: // START条件已发送
            handle_start_condition();
            break;
        case 0x18: // SLA+W已发送,收到ACK
            handle_sla_w_ack();
            break;
        case 0x28: // 数据字节已发送,收到ACK
            handle_data_ack();
            break;
        case 0x40: // SLA+R已发送,收到ACK
            handle_sla_r_ack();
            break;
        case 0x50: // 数据字节已接收
            handle_data_received();
            break;
        default:
            // 处理错误或未预期状态
            handle_error_status(status);
            break;
    }
}

3.2 状态处理函数的实现

每个状态处理函数都应该专注于完成当前状态的任务并准备下一个状态:

void handle_data_ack(void) {
    if (current_operation == EEPROM_WRITE) {
        if (bytes_written < data_length) {
            // 发送下一个数据字节
            I2C_SendData(CW_I2C1, write_buffer[bytes_written++]);
        } else {
            // 写入完成,准备读取验证
            current_operation = EEPROM_READ;
            I2C_GenerateSTART(CW_I2C1, ENABLE);
        }
    }
}

注意:在状态转换时,要确保所有必要的标志和变量都正确更新,避免出现状态不一致的情况。

4. 主程序与中断的协同工作

中断驱动编程的核心在于主程序与中断服务例程之间的优雅协作。我们需要设计清晰的接口和通信机制,确保两者能够高效地交换数据和状态信息。

4.1 任务队列设计

为了实现主程序与ISR之间的解耦,可以设计一个简单的任务队列机制:

#define MAX_PENDING_TASKS 8

typedef struct {
    eeprom_task_t tasks[MAX_PENDING_TASKS];
    volatile uint8_t head;
    volatile uint8_t tail;
    volatile uint8_t count;
} task_queue_t;

// 添加任务到队列
bool add_eeprom_task(eeprom_task_type_t type, uint8_t address, 
                    const uint8_t* data, uint8_t length) {
    if (task_queue.count >= MAX_PENDING_TASKS) return false;
    
    task_queue.tasks[task_queue.head].type = type;
    task_queue.tasks[task_queue.head].address = address;
    task_queue.tasks[task_queue.head].length = length;
    memcpy(task_queue.tasks[task_queue.head].data, data, length);
    
    task_queue.head = (task_queue.head + 1) % MAX_PENDING_TASKS;
    task_queue.count++;
    
    // 如果I2C空闲,启动任务处理
    if (i2c_state == I2C_STATE_IDLE) {
        start_next_task();
    }
    
    return true;
}

4.2 主循环中的任务调度

主循环负责监控任务执行状态和处理非实时任务:

int main(void) {
    // 初始化硬件和外设
    hardware_init();
    i2c_init();
    task_queue_init();
    
    while (1) {
        // 处理已完成的任务
        if (current_task_completed) {
            process_completed_task();
            current_task_completed = false;
            start_next_task();
        }
        
        // 处理低优先级任务
        process_background_tasks();
        
        // 进入低功耗模式(如果需要)
        if (task_queue.count == 0 && !i2c_busy) {
            enter_low_power_mode();
        }
    }
}

这种设计使得主程序可以在等待I2C操作完成时执行其他有用工作,或者进入低功耗模式节省能源。

5. 错误处理与可靠性保障

在中断驱动的I2C通信中,健壮的错误处理机制是确保系统稳定性的关键。CW32F030C8T6提供了多种错误检测机制,我们需要充分利用这些特性。

5.1 错误检测与恢复

I2C通信中常见的错误包括总线错误、仲裁丢失、从机无应答等。针对这些错误,我们需要设计相应的恢复策略:

void handle_error_status(uint8_t status) {
    switch (status) {
        case 0x38: // 仲裁丢失
            // 释放总线并重试
            I2C_GenerateSTOP(CW_I2C1, ENABLE);
            bus_busy = false;
            retry_current_task();
            break;
            
        case 0x20: // SLA+W后收到NACK
        case 0x30: // 数据发送后收到NACK
        case 0x48: // SLA+R后收到NACK
            // 从机无应答,终止当前传输
            I2C_GenerateSTOP(CW_I2C1, ENABLE);
            current_task_failed = true;
            break;
            
        default:
            // 未知错误,执行完整复位
            i2c_reinit();
            reset_task_queue();
            break;
    }
    
    error_count++;
    if (error_count > MAX_ERROR_COUNT) {
        system_error_handler(ERROR_I2C_COMM_FAILURE);
    }
}

5.2 超时机制

为了防止系统因为某些异常情况而永久等待,必须实现超时检测机制:

// 在SysTick中断中更新超时计数器
void SysTick_Handler(void) {
    if (i2c_busy) {
        if (++i2c_timeout_counter > I2C_TIMEOUT_MS) {
            // I2C操作超时,执行恢复操作
            i2c_timeout_handler();
        }
    }
}

void i2c_timeout_handler(void) {
    // 强制终止当前I2C传输
    I2C_GenerateSTOP(CW_I2C1, ENABLE);
    i2c_busy = false;
    current_task_failed = true;
    i2c_timeout_counter = 0;
    
    // 可选:重新初始化I2C外设
    i2c_reinit();
}

6. 低功耗优化策略

对于电池供电的设备,功耗优化是至关重要的设计考虑。中断驱动架构本身就有利于低功耗设计,但还可以进一步优化。

6.1 智能睡眠管理

通过精心设计睡眠策略,可以显著降低系统平均功耗:

void enter_low_power_mode(void) {
    // 检查是否所有条件都满足进入低功耗模式
    if (task_queue.count == 0 && !i2c_busy && 
        !uart_tx_pending && !adc_converting) {
        
        // 设置唤醒源(I2C中断、GPIO中断等)
        set_wakeup_sources(WAKE_SOURCE_I2C | WAKE_SOURCE_GPIO);
        
        // 进入停止模式,保持SRAM内容
        HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
        
        // 唤醒后重新初始化系统时钟
        system_clock_init();
    }
}

6.2 动态频率调整

根据当前任务需求动态调整系统时钟频率:

void adjust_system_clock_based_on_task(void) {
    if (task_queue.count == 0) {
        // 没有 pending 任务,降低时钟频率
        set_system_clock(CLOCK_16MHZ);
    } else if (current_task_requires_high_speed()) {
        // 高速任务,提升时钟频率
        set_system_clock(CLOCK_48MHZ);
    } else {
        // 常规任务,使用中等时钟频率
        set_system_clock(CLOCK_32MHZ);
    }
}

在实际项目中,我发现最有效的优化往往来自于对业务逻辑的深入理解而非单纯的技术手段。比如通过批量处理EEPROM操作而不是单字节访问,可以减少总线占用时间和状态转换开销,同时也能显著降低功耗。另一个实用技巧是在设计初期就充分考虑错误处理和恢复机制,这比后期添加要有效得多。

中断驱动编程确实需要更复杂的状态管理和错误处理,但带来的性能提升和功耗优化是值得的。关键是找到适合项目需求的平衡点,既不要过度设计,也不能忽视可靠性。通过精心设计的状态机和清晰的任务接口,可以构建出既高效又可靠的事件驱动型嵌入式系统。

嵌入式软件学习:创建标准的工程文件 立即下载

相关推荐

图书管理系统:图书编目+借还书+超期罚款,Python+SQLite 可跑源码

面向课程设计的图书管理系统。用 Python 标准库 + SQLite 实现图书编目、读者管理、借还书与超期罚款计算,支持库存校验、借阅上限和借阅历史查询,零第三方依赖即可离线跑通,含样例数据和冒烟测试。MIT。作者 blog.youkuaiyun.com/mtl1994

高校技术转移办公室如何提升成果转化服务能力?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

科技中介服务机构如何利用平台实现服务流程的全流程闭环与智能支持.docx

科技中介服务机构如何利用平台实现服务流程的全流程闭环与智能支持

LLC谐振变换器恒压恒流双竞争闭环控制simulink仿真(附说明文档)

内容概要:本文详细介绍了LLC谐振变换器在恒压恒流双竞争闭环控制下的Simulink仿真设计,并附有说明文档。该仿真系统基于LLC谐振变换器的工作特性,构建了恒压(CV)与恒流(CC)双闭环竞争控制策略,通过智能逻辑切换实现输出电压与电流的精确调节,特别适用于电池充电等需要分阶段恒流恒压控制的应用场景。研究涵盖系统建模、控制环路设计、关键参数整定及仿真结果分析,全面展示了变换器在不同负载条件下的输出稳定性与动态响应性能,充分验证了所提出控制策略的有效性与可靠性; 适合人群:具备电力电子、自动控制等相关专业知识背景,熟悉Simulink仿真工具,从事开关电源、新能源发电、电动汽车充电系统等电源产品研发的工程师及高校研究生; 使用场景及目标:① 深入掌握LLC谐振变换器在恒压恒流模式下的控制原理与实现机制;② 学习并实践双闭环竞争控制策略在仿真环境中的建模方法与模式切换逻辑设计技巧;③ 为高效率、高性能DC-DC变换器的研发与优化提供可靠的仿真参考和技术支撑; 阅读建议:建议结合提供的Simulink模型文件与说明文档进行同步学习,重点关注控制环路的结构设计、PI调节器参数的整定过程以及恒压/恒流模式间切换逻辑的实现细节,可通过调整输入电压、负载等参数进行仿真验证,以深化对LLC变换器动态行为与控制性能的理解。

产业园区运营负责人在推动技术转移时,如何高效对接企业与科研机构?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

科技中介服务机构如何降低技术评估服务成本并提高响应效率?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

科技中介服务机构在开展技术交易撮合时,如何提升对接效率和成功率?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

三相维也纳Vienna整流器电流过零畸变消除仿真模型【三种消除方法】(Simulink仿真实现)

内容概要:本文针对三相维也纳(Vienna)整流器在运行过程中存在的交流输入电流过零畸变问题,提出并实现了三种有效的消除方法,并基于Simulink平台构建了完整的仿真模型进行验证。首先深入分析了电流过零畸变的成因,主要包括控制延迟、功率器件的非理想开关特性以及调制策略在零电流切换时刻引发的不连续性。随后,系统阐述了三种核心抑制策略:一是改进电流环控制算法,引入前馈补偿机制以提升动态响应速度,减小因控制滞后导致的畸变;二是优化空间矢量脉宽调制(SVPWM)策略,通过对冗余小矢量作用时间的精确分配,实现中点电位平衡与谐波抑制的协同控制;三是采用死区时间补偿与非线性校正相结合的方法,有效抵消功率器件开关延迟、反向恢复等非线性因素带来的波形失真。仿真结果表明,所提出的复合控制策略能显著改善输入电流波形质量,大幅降低总谐波畸变率(THD),有效提升系统功率因数、电能质量和运行稳定性。该研究为高功率密度、高效率的三电平功率因数校正(PFC)整流器的设计与优化提供了可复现的仿真方案和理论依据。; 适合人群:具备电力电子与电力传动领域扎实的理论基础,熟练掌握Simulink/Matlab仿真工具,从事新能源发电、电动汽车充电、航空航天电源、工业变流器等方向的硕士/博士研究生、研发工程师及科研人员;尤其适合正在开展Vienna整流器拓扑结构、先进调制策略或高性能PFC控制技术相关课题研究与产品开发的专业技术人员。; 使用场景及目标:①深入理解三相Vienna整流器中电流过零畸变的物理机理与数学建模方法;②掌握基于SVPWM的中点电位平衡控制与谐波抑制的协同优化策略;③为设计高效率、低谐波的中大功率PFC整流器提供一套完整的、经过验证的仿真解决方案与参数设计思路,服务于科研项目攻关与工程产品原型开发。; 阅读建议:建议读者结合文中详述的三种消除方法,动手搭建或修改相应的Simulink仿真模型,通过对比不同控制策略下的电流波形、THD分析及中点电位波动情况,深入理解各方法的优劣与适用条件。在实践过程中,应重点关注控制参数(如PI调节器增益、前馈系数)的整定对系统稳定性、动态响应和抗干扰能力的影响。同时,可参考文档中提供的Mathcad计算书与双闭环设计案例,深化对整流器系统级设计与参数匹配的理解,实现理论与实践的深度融合。

产业园区在推动企业技术需求对接时,如何实现精准匹配与资源聚合?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

高校技术转移办公室人员如何快速识别优质专利并推动其转化?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

高校技术转移办公室人员如何高效完成技术需求挖掘与转化对接?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

基于KKT条件的综合能源系统园区(IESP)双层优化模型,采用价格灵敏度方法,模拟综合能源服务提供商在电力市场中的战略套利行为研究(Matlab代码实现)

内容概要:本文围绕基于KKT条件的综合能源系统园区(IESP)双层优化模型展开研究,重点采用价格灵敏度方法模拟综合能源服务提供商在电力市场中的战略套利行为,并通过Matlab代码实现模型求解。研究构建了上层为市场策略优化、下层为系统运行优化的双层架构,利用KKT条件将下层问题转化为约束条件,结合价格灵敏度分析揭示了市场主体在电价波动中的响应机制与盈利模式。文中详细阐述了模型的数学推导、求解流程及仿真结果,验证了该方法在提升综合能源系统经济性和市场竞争力方面的有效性。; 适合人群:具备一定电力系统、优化理论和博弈论基础知识,从事能源互联网、综合能源系统、电力市场等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①研究综合能源系统在电力市场环境下的优化运行与商业模式;②掌握双层优化模型的建模与求解方法,特别是基于KKT条件的转化技巧;③理解价格灵敏度在市场策略分析中的应用,模拟服务提供商的战略决策行为。; 阅读建议:此资源侧重于理论建模与数值仿真,建议读者结合Matlab代码深入理解算法实现细节,重点关注KKT条件的处理方式与价格灵敏度的计算逻辑,并尝试复现仿真结果以加深对双层优化机制的理解。

三相充电桩维也纳PFC+三电平LLC谐振变换器三电平PSIM仿真设计(Simulink仿真实现)

内容概要:本文详细阐述了三相充电桩中维也纳功率因数校正(PFC)电路与三电平LLC谐振变换器的PSIM仿真设计,并基于Simulink平台实现了系统建模与闭环控制策略的仿真验证。重点探讨了维也纳PFC与全桥LLC谐振变换器的协同工作机理,涵盖变频控制与移相控制相结合的混合控制策略设计与优化。文档提供了完整的仿真模型构建流程,包括主电路参数设计、控制环路搭建、系统动态响应分析及稳定性验证,尤其关注在不同负载条件下的效率表现与电能质量改善能力,旨在为新能源汽车充电设施与高效电力电子变换器的研发提供一套可复现、可扩展的技术方案。; 适合人群:具备电力电子、自动控制或电气工程等相关专业背景,从事新能源汽车充电技术、电力变换器拓扑研究、高效电源系统开发的科研人员、工程师及高校研究生。; 使用场景及目标:① 深入理解三相维也纳PFC与三电平LLC谐振变换器的工作原理及其联合控制方法;② 掌握基于Simulink的电力电子系统建模、仿真与闭环调试技术;③ 为高性能充电桩系统的研发、优化与工程化实现提供理论依据和仿真支撑。; 阅读建议:建议读者结合电力电子变换器基础理论,循序渐进地学习文档内容,重点关注控制策略的设计逻辑与参数整定方法,并动手实践仿真模型的搭建与调试,以深化对系统动态特性与控制性能的理解。

全桥LLC谐振(变频+移相混合控制)变换器闭环仿真模型(Simulink仿真实现)

内容概要:本文详细介绍了全桥LLC谐振变换器在变频控制(PFM)与移相控制相结合的混合控制策略下的闭环仿真模型构建过程,基于Simulink平台实现。该变换器通过融合两种控制方式的优势,实现了高效、稳定的电压调节与软开关特性,适用于中高功率DC-DC转换应用场景。文档系统阐述了系统建模、控制环路设计(包括电压外环与电流内环)、谐振腔关键参数计算、PWM信号生成及闭环反馈机制的实现方法,并通过仿真验证了在不同负载条件下输出电压的稳定性、动态响应性能以及零电压开关(ZVS)的实现效果。同时,文中探讨了该模型与PFC、CLLC、DAB等其他电力电子系统的协同仿真潜力,凸显其在现代电力电子系统设计与研究中的重要价值。; 适合人群:具备扎实的电力电子技术理论基础,熟悉Simulink/Matlab仿真环境,从事开关电源、新能源变换器、电力电子系统设计及相关领域研发工作的工程师与高校研究生。; 使用场景及目标:①用于高校教学与科研项目中,帮助学生深入理解LLC谐振变换器的工作原理、谐振特性及混合控制策略的实现逻辑;②为工业界全桥LLC电源产品的开发提供高保真的仿真原型与设计参考,加速产品迭代;③支持研究人员对变频-移相混合控制下的系统效率优化、动态响应提升、软开关范围拓展等关键技术问题进行深入探究。; 阅读建议:建议读者结合所提供的Simulink仿真模型文件进行实操学习,重点关注控制环路中PI参数的整定过程与谐振元件(如谐振电感、励磁电感、谐振电容)设计之间的强耦合关系,并通过主动调整输入电压、负载大小等工况条件,观察系统的启动过程、稳态性能和抗干扰能力,从而深刻掌握LLC变换器的非线性动态行为与控制规律。

禁止系统自动更新-Windows Update Blocker-v1.8 .exe

禁止系统自动更新_Windows Update Blocker_v1.8 .exe

大模型就业课(零基础可学)

面向零基础/小白/在职人群的大模型就业课,课程都是生产项目,学完直接找工作,工作直接复用技术栈。

上一篇: 嵌入式系统SRAM时序优化:从理论到实践的性能提升指南
下一篇: 从基础到实践(三十):CAN的硬件设计指南(一)
ruby5
博客等级 码龄15年 29粉丝 893原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值