当前位置: 首页 > article >正文

复旦微FM33单片机GPIO的“高级”玩法:用FL库实现软件PWM、按键扫描和LED流水灯

复旦微FM33单片机GPIO的“高级”玩法用FL库实现软件PWM、按键扫描和LED流水灯在嵌入式开发中GPIO通用输入输出是最基础也是最常用的外设之一。对于复旦微FM33系列单片机来说除了基本的电平控制通过巧妙运用其FL库函数可以实现更多实用功能。本文将带你探索如何利用FM33的FL GPIO库函数实现软件PWM调光、按键扫描和LED流水灯效果让你的项目更加生动有趣。1. 软件PWM实现原理与代码实战PWM脉冲宽度调制是控制LED亮度、电机速度等的常用技术。虽然FM33系列有硬件PWM模块但在某些场景下软件PWM更加灵活方便。1.1 软件PWM基本原理软件PWM的核心是通过定时器中断或SysTick定时器在固定周期内控制GPIO高低电平的时间比例。一个完整的PWM周期包括高电平时间和低电平时间占空比就是高电平时间占整个周期的比例。// PWM控制数据结构 typedef struct { GPIO_Type *GPIOx; uint32_t pin; uint16_t period; // PWM周期(ms) uint16_t duty; // 高电平时间(ms) uint16_t counter; // 当前计数 } SoftPWM_TypeDef; SoftPWM_TypeDef pwm { .GPIOx GPIOC, .pin FL_GPIO_PIN_1, .period 10, // 10ms周期 .duty 3, // 3ms高电平 .counter 0 };1.2 基于SysTick的PWM实现SysTick是Cortex-M内核的系统定时器非常适合用于实现软件PWM。下面是一个完整的实现示例void SysTick_Handler(void) { pwm.counter; if(pwm.counter pwm.period) { pwm.counter 0; FL_GPIO_SetOutputPin(pwm.GPIOx, pwm.pin); // 周期开始输出高电平 } else if(pwm.counter pwm.duty) { FL_GPIO_ResetOutputPin(pwm.GPIOx, pwm.pin); // 达到占空比时间输出低电平 } } void PWM_Init(void) { // 初始化GPIO FL_GPIO_InitTypeDef GPIO_InitStruct {0}; GPIO_InitStruct.pin pwm.pin; GPIO_InitStruct.mode FL_GPIO_MODE_OUTPUT; GPIO_InitStruct.outputType FL_GPIO_OUTPUT_PUSHPULL; FL_GPIO_Init(pwm.GPIOx, GPIO_InitStruct); // 配置SysTick为1ms中断 SysTick_Config(SystemCoreClock / 1000); }提示在实际应用中可以通过修改pwm.duty的值来动态调整亮度实现呼吸灯效果。1.3 多通道PWM扩展如果需要控制多个LED的亮度可以扩展上述结构实现多通道PWM控制#define PWM_CHANNELS 3 SoftPWM_TypeDef pwms[PWM_CHANNELS] { {GPIOC, FL_GPIO_PIN_0, 10, 2, 0}, // 通道1: PC0, 20%占空比 {GPIOC, FL_GPIO_PIN_1, 10, 5, 0}, // 通道2: PC1, 50%占空比 {GPIOC, FL_GPIO_PIN_2, 10, 8, 0} // 通道3: PC2, 80%占空比 }; void SysTick_Handler(void) { for(int i0; iPWM_CHANNELS; i) { pwms[i].counter; if(pwms[i].counter pwms[i].period) { pwms[i].counter 0; FL_GPIO_SetOutputPin(pwms[i].GPIOx, pwms[i].pin); } else if(pwms[i].counter pwms[i].duty) { FL_GPIO_ResetOutputPin(pwms[i].GPIOx, pwms[i].pin); } } }2. 高效按键扫描实现在嵌入式系统中按键是最常见的人机交互方式之一。下面介绍如何利用FM33的GPIO功能实现高效的按键扫描。2.1 按键硬件连接与消抖原理典型的按键连接方式是通过上拉电阻连接到GPIO按键按下时将GPIO拉低。由于机械按键的物理特性在按下和释放时会产生抖动通常需要软件消抖处理。消抖方法优点缺点延时法实现简单占用CPU时间定时扫描法不阻塞主程序需要定时器支持状态机法可靠性高实现稍复杂2.2 基于状态机的按键扫描实现下面是一个使用状态机实现的按键扫描代码支持单击、长按检测typedef enum { KEY_STATE_IDLE, KEY_STATE_PRESS_DOWN, KEY_STATE_PRESS, KEY_STATE_RELEASE } KeyState; typedef struct { GPIO_Type *GPIOx; uint32_t pin; KeyState state; uint32_t pressTime; uint8_t isPressed; uint8_t isLongPressed; } Key_TypeDef; Key_TypeDef key { .GPIOx GPIOA, .pin FL_GPIO_PIN_0, .state KEY_STATE_IDLE, .pressTime 0, .isPressed 0, .isLongPressed 0 }; #define KEY_DEBOUNCE_TIME 20 // 消抖时间(ms) #define KEY_LONG_PRESS_TIME 1000 // 长按时间(ms) void Key_Scan(void) { uint8_t currentState (FL_GPIO_ReadInputPort(key.GPIOx) key.pin) 0; switch(key.state) { case KEY_STATE_IDLE: if(currentState) { key.state KEY_STATE_PRESS_DOWN; key.pressTime 0; } break; case KEY_STATE_PRESS_DOWN: key.pressTime; if(key.pressTime KEY_DEBOUNCE_TIME) { if(currentState) { key.state KEY_STATE_PRESS; key.isPressed 1; } else { key.state KEY_STATE_IDLE; } } break; case KEY_STATE_PRESS: key.pressTime; if(!currentState) { key.state KEY_STATE_RELEASE; } else if(key.pressTime KEY_LONG_PRESS_TIME) { key.isLongPressed 1; } break; case KEY_STATE_RELEASE: key.isPressed 0; key.isLongPressed 0; key.state KEY_STATE_IDLE; break; } }2.3 多按键矩阵扫描对于需要多个按键的应用可以采用矩阵扫描方式节省GPIO资源。下面是一个4x4矩阵键盘的实现示例// 行线设置为输出列线设置为输入 #define ROW_NUM 4 #define COL_NUM 4 const uint32_t rowPins[ROW_NUM] {FL_GPIO_PIN_0, FL_GPIO_PIN_1, FL_GPIO_PIN_2, FL_GPIO_PIN_3}; const uint32_t colPins[COL_NUM] {FL_GPIO_PIN_4, FL_GPIO_PIN_5, FL_GPIO_PIN_6, FL_GPIO_PIN_7}; uint8_t keyMatrix[ROW_NUM][COL_NUM] {0}; void KeyMatrix_Init(void) { // 初始化行线为输出 FL_GPIO_InitTypeDef GPIO_InitStruct {0}; GPIO_InitStruct.mode FL_GPIO_MODE_OUTPUT; GPIO_InitStruct.outputType FL_GPIO_OUTPUT_PUSHPULL; for(int i0; iROW_NUM; i) { GPIO_InitStruct.pin rowPins[i]; FL_GPIO_Init(GPIOA, GPIO_InitStruct); FL_GPIO_ResetOutputPin(GPIOA, rowPins[i]); // 初始化为低电平 } // 初始化列线为输入带上拉 GPIO_InitStruct.mode FL_GPIO_MODE_INPUT; GPIO_InitStruct.pull FL_GPIO_PULL_UP; for(int i0; iCOL_NUM; i) { GPIO_InitStruct.pin colPins[i]; FL_GPIO_Init(GPIOA, GPIO_InitStruct); } } void KeyMatrix_Scan(void) { for(int row0; rowROW_NUM; row) { // 设置当前行为低电平 FL_GPIO_ResetOutputPin(GPIOA, rowPins[row]); // 延时一小段时间等待稳定 for(volatile int i0; i100; i); // 读取列线状态 uint16_t colData FL_GPIO_ReadInputPort(GPIOA); // 检查每一列 for(int col0; colCOL_NUM; col) { uint8_t pressed (colData colPins[col]) 0; keyMatrix[row][col] (keyMatrix[row][col] 1) | pressed; } // 恢复当前行为高电平 FL_GPIO_SetOutputPin(GPIOA, rowPins[row]); } }3. LED流水灯效果实现LED流水灯是展示GPIO控制能力的经典案例下面介绍几种常见的流水灯效果及其实现方法。3.1 基础流水灯最简单的流水灯效果是LED依次点亮和熄灭。使用FM33的FL库可以轻松实现#define LED_NUM 8 const uint32_t ledPins[LED_NUM] { FL_GPIO_PIN_0, FL_GPIO_PIN_1, FL_GPIO_PIN_2, FL_GPIO_PIN_3, FL_GPIO_PIN_4, FL_GPIO_PIN_5, FL_GPIO_PIN_6, FL_GPIO_PIN_7 }; void LED_Init(void) { FL_GPIO_InitTypeDef GPIO_InitStruct {0}; GPIO_InitStruct.mode FL_GPIO_MODE_OUTPUT; GPIO_InitStruct.outputType FL_GPIO_OUTPUT_PUSHPULL; for(int i0; iLED_NUM; i) { GPIO_InitStruct.pin ledPins[i]; FL_GPIO_Init(GPIOC, GPIO_InitStruct); FL_GPIO_ResetOutputPin(GPIOC, ledPins[i]); // 初始化为熄灭状态 } } void LED_Flow(uint32_t delay) { static uint8_t current 0; // 熄灭所有LED FL_GPIO_WriteOutputPort(GPIOC, 0x00); // 点亮当前LED FL_GPIO_SetOutputPin(GPIOC, ledPins[current]); // 更新下一个LED位置 current (current 1) % LED_NUM; // 延时 for(volatile uint32_t i0; idelay; i); }3.2 呼吸流水灯效果结合前面介绍的软件PWM技术可以实现呼吸效果的流水灯void LED_BreathingFlow(void) { static uint8_t current 0; static uint8_t direction 1; static uint8_t brightness 0; // 更新亮度 brightness direction; if(brightness 0 || brightness 100) { direction -direction; if(brightness 0) { current (current 1) % LED_NUM; } } // 设置PWM占空比 for(int i0; iLED_NUM; i) { if(i current) { pwms[i].duty brightness; } else { pwms[i].duty 0; } } }3.3 花样LED效果通过组合不同的控制模式可以创造出更多有趣的LED效果typedef enum { LED_MODE_FLOW, LED_MODE_BREATH, LED_MODE_BLINK, LED_MODE_RANDOM } LEDMode; LEDMode currentMode LED_MODE_FLOW; void LED_SetMode(LEDMode mode) { currentMode mode; } void LED_Update(void) { static uint32_t counter 0; counter; switch(currentMode) { case LED_MODE_FLOW: if(counter % 100 0) { LED_Flow(100000); } break; case LED_MODE_BREATH: if(counter % 5 0) { LED_BreathingFlow(); } break; case LED_MODE_BLINK: if(counter % 200 0) { FL_GPIO_ToggleOutputPin(GPIOC, FL_GPIO_PIN_ALL); } break; case LED_MODE_RANDOM: if(counter % 50 0) { uint16_t pattern rand() 0xFF; FL_GPIO_WriteOutputPort(GPIOC, pattern); } break; } }4. 综合应用智能RGB灯控制将前面介绍的技术结合起来我们可以实现一个完整的智能RGB灯控制系统支持多种灯光模式和亮度调节。4.1 硬件连接与初始化典型的RGB LED有4个引脚共阳/共阴极和R、G、B三个通道。这里以共阳极为例typedef struct { GPIO_Type *GPIOx; uint32_t r_pin; uint32_t g_pin; uint32_t b_pin; uint8_t r_bright; uint8_t g_bright; uint8_t b_bright; } RGB_LED; RGB_LED rgb { .GPIOx GPIOC, .r_pin FL_GPIO_PIN_0, .g_pin FL_GPIO_PIN_1, .b_pin FL_GPIO_PIN_2, .r_bright 0, .g_bright 0, .b_bright 0 }; void RGB_Init(void) { FL_GPIO_InitTypeDef GPIO_InitStruct {0}; GPIO_InitStruct.mode FL_GPIO_MODE_OUTPUT; GPIO_InitStruct.outputType FL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.pin rgb.r_pin; FL_GPIO_Init(rgb.GPIOx, GPIO_InitStruct); GPIO_InitStruct.pin rgb.g_pin; FL_GPIO_Init(rgb.GPIOx, GPIO_InitStruct); GPIO_InitStruct.pin rgb.b_pin; FL_GPIO_Init(rgb.GPIOx, GPIO_InitStruct); // 共阳极初始化为高电平(熄灭) FL_GPIO_SetOutputPin(rgb.GPIOx, rgb.r_pin); FL_GPIO_SetOutputPin(rgb.GPIOx, rgb.g_pin); FL_GPIO_SetOutputPin(rgb.GPIOx, rgb.b_pin); }4.2 颜色控制与模式切换通过组合不同通道的亮度可以实现丰富的颜色效果void RGB_SetColor(uint8_t r, uint8_t g, uint8_t b) { rgb.r_bright r; rgb.g_bright g; rgb.b_bright b; } void RGB_Update(void) { static uint8_t pwm_counter 0; pwm_counter; // 红色通道 if(pwm_counter rgb.r_bright) { FL_GPIO_ResetOutputPin(rgb.GPIOx, rgb.r_pin); } else { FL_GPIO_SetOutputPin(rgb.GPIOx, rgb.r_pin); } // 绿色通道 if(pwm_counter rgb.g_bright) { FL_GPIO_ResetOutputPin(rgb.GPIOx, rgb.g_pin); } else { FL_GPIO_SetOutputPin(rgb.GPIOx, rgb.g_pin); } // 蓝色通道 if(pwm_counter rgb.b_bright) { FL_GPIO_ResetOutputPin(rgb.GPIOx, rgb.b_pin); } else { FL_GPIO_SetOutputPin(rgb.GPIOx, rgb.b_pin); } } typedef enum { RGB_MODE_SOLID, RGB_MODE_RAINBOW, RGB_MODE_BREATH, RGB_MODE_STROBE } RGBMode; void RGB_SetMode(RGBMode mode) { static uint8_t hue 0; switch(mode) { case RGB_MODE_SOLID: // 保持当前颜色不变 break; case RGB_MODE_RAINBOW: hue; // HSV转RGB RGB_SetColor(/* 根据hue计算RGB值 */); break; case RGB_MODE_BREATH: // 呼吸效果 static uint8_t breath_val 0; static int8_t breath_dir 1; breath_val breath_dir; if(breath_val 0 || breath_val 100) { breath_dir -breath_dir; } RGB_SetColor(breath_val, breath_val, breath_val); break; case RGB_MODE_STROBE: // 闪光效果 static uint8_t strobe 0; strobe !strobe; RGB_SetColor(strobe*100, strobe*100, strobe*100); break; } }4.3 结合按键控制的完整系统最后我们将按键控制与RGB灯控制结合起来实现一个完整的交互系统void System_Run(void) { static RGBMode currentMode RGB_MODE_SOLID; // 初始化 RGB_Init(); Key_Init(); // 主循环 while(1) { // 按键扫描 Key_Scan(); // 处理按键事件 if(key.isPressed) { key.isPressed 0; currentMode (currentMode 1) % 4; } // 更新RGB灯状态 RGB_SetMode(currentMode); RGB_Update(); // 延时 for(volatile uint32_t i0; i10000; i); } }

相关文章:

复旦微FM33单片机GPIO的“高级”玩法:用FL库实现软件PWM、按键扫描和LED流水灯

复旦微FM33单片机GPIO的“高级”玩法:用FL库实现软件PWM、按键扫描和LED流水灯 在嵌入式开发中,GPIO(通用输入输出)是最基础也是最常用的外设之一。对于复旦微FM33系列单片机来说,除了基本的电平控制,通过巧…...

WarcraftHelper:突破经典游戏限制的焕新体验工具

WarcraftHelper:突破经典游戏限制的焕新体验工具 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 当你在4K显示器上启动《魔兽争霸III》时&…...

保姆级教程:在Ubuntu 20.04上从零搭建AFL++模糊测试环境(含QEMU模式配置与常见报错解决)

从零构建AFL模糊测试环境:Ubuntu 20.04实战手册与深度排错指南 模糊测试作为现代软件安全领域的核心技术之一,正在重新定义漏洞挖掘的效率和深度。当传统人工审计难以应对日益复杂的代码规模时,AFL以其智能化的变异策略和精准的路径追踪能力&…...

VLC安卓版隐藏功能大揭秘:这些options参数让你的播放体验飞起

VLC安卓版隐藏功能大揭秘:这些options参数让你的播放体验飞起 作为安卓平台上最强大的开源播放器,VLC的潜力远不止表面看到的那些基础功能。许多用户不知道的是,通过调整options参数,可以彻底改变播放体验——解决卡顿、优化画质、…...

15、深拷贝浅拷贝的区别?如何实现一个深拷贝?

目录 一、先说本质区别 二、从内存角度理解 三、浅拷贝是什么 常见浅拷贝方式 1. Object.assign 2. 展开运算符 ... 3. 数组方法 四、深拷贝是什么 五、常见深拷贝实现方式 1. JSON.parse(JSON.stringify(obj)) 优点 缺点 无法处理: 2. structuredClo…...

上海知名seo优化公司

为什么选择上海知名SEO优化公司 在当今数字化时代,网站的流量和排名直接关系到企业的市场竞争力。特别是在竞争激烈的上海市场,一个优秀的SEO优化公司能够帮助企业在百度搜索结果中获得更好的排名,从而吸引更多的潜在客户。为什么企业选择上…...

数据取证实战:Passware Kit Forensic 和 ElcomSoft 到底怎么选?附真实案例对比

数据取证工具深度评测:Passware Kit Forensic与ElcomSoft实战决策指南 当企业遭遇数据泄露或需要电子取证时,选对工具往往意味着调查成功与否的分水岭。Passware Kit Forensic和ElcomSoft作为行业两大标杆,常让专业人士陷入选择困境——它们都…...

STM32F429DISC开发板SDRAM(IS42S16400J)性能优化—基于STM32cubeMX HAL库的实战技巧

1. 认识STM32F429DISC开发板与SDRAM 刚拿到STM32F429DISC开发板时,我第一眼就被板载的那颗IS42S16400J SDRAM芯片吸引了。这块8MB的存储空间对于嵌入式开发来说简直是"豪华配置",但真正用起来才发现,如果不做优化,性能可…...

[具身智能-220]:“关节空间”与“操作空间”

在机器人学中,关节空间 (Joint Space) 和 操作空间 (Operational Space) 是描述机器人运动的两种基本方式,它们之间通过运动学相互关联。理解这两个概念是进行机器人轨迹规划和控制的基础。简单来说,关节空间关注机器人“内部”的关节状态&am…...

避坑指南:RcisTarget转录因子分析中常见的5个错误及解决方案(附数据库选择建议)

RcisTarget转录因子分析实战避坑指南:从参数优化到结果验证 在基因调控网络研究中,RcisTarget作为一款强大的R包,能够通过motif富集分析预测调控基因集的转录因子。然而,即使是经验丰富的研究者,在实际分析过程中也常会…...

SpeedyBee F405 V4 55A飞塔到手后,除了接线你还需要注意这3个关键设置

SpeedyBee F405 V4 55A飞塔实战配置指南:从避坑到性能调优 当你拿到这块集成了飞控与电调的SpeedyBee F405 V4 55A飞塔时,官方说明书可能已经帮你完成了硬件组装的基础部分。但真正的挑战往往始于地面站连接成功后的那一刻——那些说明书里没细说的"…...

LSTM时序预测辅助忍者像素绘卷:天界画坊生成动态像素动画

LSTM时序预测辅助忍者像素绘卷:天界画坊生成动态像素动画 1. 引言:当像素艺术遇上AI动画 想象一下这样的场景:一位独立游戏开发者正在为他的复古风格RPG游戏设计角色动画。传统方法需要手工绘制每一帧像素画,一个简单的行走动画…...

ArcMap10.4.1缓冲区分析避坑指南:解决距离单位混淆和叠加效果的常见问题

ArcMap 10.4.1缓冲区分析实战避坑手册:从原理到精准操作 第一次在ArcMap里做缓冲区分析时,我盯着屏幕上那些重叠的彩色圆圈发懵——明明设置了500米缓冲距离,为什么生成的区域看起来比隔壁城市的还大?后来才发现,我的数…...

羊四种行为检测数据集(2000张高质量标注)|YOLO目标检测训练数据集

羊四种行为检测数据集(2000张高质量标注)|YOLO目标检测训练数据集 前言 在智慧养殖与畜牧业数字化转型的背景下,基于计算机视觉的动物行为识别逐渐成为研究与工程应用的热点方向。通过对动物行为的自动检测与分析,可…...

13、探索transforms.RandomRotation()在图像增强中的灵活应用

1. 理解transforms.RandomRotation()的核心功能 当你第一次接触图像数据增强时,可能会被各种变换函数搞得晕头转向。今天我们就来深入聊聊transforms.RandomRotation()这个在PyTorch中非常实用的图像旋转工具。简单来说,它能帮你把图片随机旋转一定角度&…...

算法解析 | 深入EGO Planner:无ESDF的实时避障与轨迹优化

1. EGO Planner的核心创新:告别ESDF的实时避障革命 第一次接触EGO Planner时,最让我惊讶的是它居然完全抛弃了传统路径规划中视为"标配"的ESDF(欧几里得符号距离场)。这就像看到有人不用GPS导航,仅凭直觉就能…...

Canape实战指南:XCP工程配置与调试(一)

1. 从零开始创建XCP工程 第一次打开Canape时,那个满屏英文的界面确实让我有点懵。不过别担心,跟着我的步骤走,保证你能在10分钟内搭好第一个XCP工程。先说说我的习惯 - 我会在D盘专门建个"Canape_Projects"文件夹,里面按…...

Jetson Nano 实战:源码编译 PyCUDA 的完整指南与避坑手册

1. 为什么要在Jetson Nano上源码编译PyCUDA? 在嵌入式AI开发领域,Jetson Nano凭借其小巧的体积和强大的GPU计算能力,成为众多开发者的首选设备。PyCUDA作为Python生态中调用CUDA加速的黄金搭档,能让开发者用Python语法轻松实现GP…...

别再傻傻用IP了!用Kali+SET克隆真实网站的完整避坑指南

KaliSET钓鱼网站进阶实战:从克隆到高仿的避坑指南 在网络安全测试中,钓鱼网站的真实性直接决定了测试效果。很多初学者止步于简单的IP访问和基础模板克隆,却忽略了细节打磨的重要性。本文将带你突破基础操作,实现从"一眼假&q…...

OneRec:生成式推荐模型在短视频场景下的端到端实践与优化

1. 生成式推荐模型为何成为短视频行业新宠 最近两年,生成式推荐模型正在悄悄改变短视频平台的推荐逻辑。传统推荐系统像流水线上的工人,每个环节各司其职:召回负责大海捞针,粗排快速筛选,精排细致打分,最后…...

STL分解实战:从原理到应用的时间序列分析指南

1. STL分解的基本原理与核心价值 STL分解全称为Seasonal-Trend decomposition using LOESS,这个看似复杂的名字其实蕴含着非常直观的时间序列处理逻辑。想象你正在观察一条蜿蜒的山路,STL分解就像帮你把这条路拆解成三个关键部分:山坡本身的倾…...

YOLOv11 OBB实战:手把手构建旋转目标检测数据集

1. 为什么需要旋转目标检测? 在传统的目标检测任务中,我们通常使用水平矩形框(HBB)来标注物体。这种标注方式简单直接,但对于某些特定场景下的物体检测效果并不理想。比如在遥感图像中,飞机、船只等物体往往…...

Flutter系列之Dialog宽度自定义的实战技巧与避坑指南

1. 为什么你的Dialog宽度设置总是失效? 很多Flutter新手都会遇到这样的困惑:明明给Dialog的child设置了width属性,为什么显示出来还是默认的宽度?这个问题我刚开始接触Flutter时也踩过坑。其实根本原因在于Dialog组件内部使用了Co…...

高炮广告牌哪个公司好

开篇:定下基调在当今的广告宣传领域,高炮广告牌以其显著的位置和强大的视觉冲击力,成为众多企业推广品牌和产品的重要选择。本次测评旨在为对高炮广告牌感兴趣的人群,提供一份客观、专业的参考,帮助大家了解市场上不同…...

19 多语言切换实操:一个指令,让AI适配任意编程语言

多语言切换实操:一个指令,让AI适配任意编程语言 摘要 本文为《30天掌控AI编程:从指令到落地,手把手教你指挥AI写代码》系列第十九篇,属于第三阶段多语言实战核心内容。本篇专注AI代码跨语言无缝切换这一高频痛点,针对零基础开发者、多技术栈项目人员,拆解如何通过结构…...

Redis专题(二)

1. Redis的简介Redis支持多种数据结构,有广泛的业务应用场景。数据保存在内存,读写性能高,很适合做缓存。数据可以持久化到硬盘,可以做数据库来用。官⽅对Redis的作⽤,也已经定位成了三个⽅⾯:Cache(缓存)&…...

18 指挥AI批量生成业务代码,大幅提升开发效率

指挥AI批量生成业务代码,大幅提升开发效率 摘要 本文为《30天掌控AI编程:从指令到落地,手把手教你指挥AI写代码》系列第十八篇,属于第三阶段多场景实战核心内容。本篇聚焦业务代码批量生成这一高效开发痛点,针对企业开发中大量重复、模块化的业务场景,讲解如何通过结构…...

17 指挥AI写Mamba相关模型代码,快速适配大模型场景

指挥AI写Mamba相关模型代码,快速适配大模型场景 摘要 本文为《30天掌控AI编程:从指令到落地,手把手教你指挥AI写代码》系列第十七篇,属于第三阶段多场景实战核心内容。本篇聚焦当下大模型领域热门的Mamba架构,针对零基础大模型开发、无深度学习基础的使用者,拆解指挥AI…...

效率飞跃:基于快马ai定制openclaw在ubuntu上的高级自动化部署方案

最近在Ubuntu上部署OpenClaw时,发现手动配置实在太费时间了。作为一个经常需要部署各种开源工具的开发老鸟,我决定探索一套自动化方案来提升效率。经过反复实践,终于总结出一套高效的部署流程,现在分享给大家。 自动化部署方案设…...

城通网盘解析终极指南:如何免费获取高速直连下载地址

城通网盘解析终极指南:如何免费获取高速直连下载地址 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 在数字化信息时代,城通网盘作为国内广泛使用的文件分享平台,却因…...