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

STM32F103 学习笔记-21-串口通信(第5节)—串口2345代码移植和讲解

本章基于 STM32F103 标准外设库开发从最基础的“串口是什么”讲起通过生活化类比拆解硬件原理配合逐行注释的可运行代码让零基础读者读完就能实现单片机与电脑的双向通信。一、什么是串口通信1.1 串口的本质单片机的“电话”串口USART是单片机和电脑之间最常用的通信方式你可以把它想象成两个人打电话TX发送端你的嘴巴负责说话RX接收端你的耳朵负责听话全双工通信两个人可以同时说话和听话串口最常用的模式半双工通信同一时间只能一个人说另一个人听单工通信只能一个人说另一个人只能听比如广播1.2 串口通信的“约定”通信参数就像两个人打电话必须说同一种语言、语速差不多才能听懂一样串口通信也需要双方提前约定好参数否则会出现“鸡同鸭讲”的乱码。参数含义最常用值类比波特率每秒传输的二进制位数115200说话的速度单位比特/秒数据位每次传输的数据长度8 位每次说 8 个字停止位数据传输结束的标志1 位说完一句话停顿一下校验位检查数据传输是否出错无校验说完后确认对方有没有听清注意电脑和单片机的这四个参数必须完全一致否则一定会出现乱码。二、STM32 串口硬件原理2.1 电脑和单片机之间的“翻译官”CH340G电脑只有 USB 接口没有串口接口而单片机只有串口接口没有 USB 接口。所以需要一个翻译官把 USB 信号和串口信号互相转换这个翻译官就是 CH340G 芯片。电脑 USB 接口 ↔ CH340G 芯片 ↔ STM32 单片机串口 USB 信号 串口信号 串口信号CH340G 的硬件连接非常简单CH340G 的 TX 引脚接单片机的 RX 引脚CH340G 的 RX 引脚接单片机的 TX 引脚两者的 GND 引脚必须连接在一起共地注意TX 和 RX 必须交叉连接这是新手最容易犯的错误。如果接反了串口会完全没有反应。2.2 STM32 串口内部结构STM32F103 一共有 5 个串口USART1、USART2、USART3、UART4、UART5。它们的内部结构基本相同主要由以下几个部分组成┌─────────────────────────────────────┐ │ │ CPU ─────►│ 数据寄存器(DR) ◄──► 移位寄存器 │ ◄──► TX引脚 │ (一个地址对应两个寄存器) │ │ 发送寄存器(TDR) 接收寄存器(RDR) │ ◄──► RX引脚 │ │ ├─────────────────────────────────────┤ │ │ │ 波特率发生器(BRR) ◄─── 控制器 │ │ │ └─────────────────────────────────────┘数据寄存器(DR)相当于一个邮箱。发送数据时CPU 把数据放进发送邮箱(TDR)接收数据时CPU 从接收邮箱(RDR)里取数据。移位寄存器把并行数据转换成串行数据发送出去或者把接收到的串行数据转换成并行数据。波特率发生器根据配置的波特率产生串口通信需要的时钟信号。控制器控制串口的工作模式、中断等。三、串口初始化的核心步骤串口初始化就像给手机设置通话功能需要一步步完成以下操作给手机充电使能 GPIO 和串口的时钟设置手机模式配置 TX 和 RX 引脚的工作模式设置通话参数配置波特率、数据位、停止位、校验位开启来电提醒配置接收中断可选开机使能串口3.1 为什么要使能时钟STM32 的所有外设默认都是关闭的这样可以节省功耗。就像你不用手机的时候会关机一样使用外设之前必须先打开它的电源时钟。USART1 挂载在APB2 总线上时钟频率 72MHzUSART2、USART3、UART4、UART5 挂载在APB1 总线上时钟频率 36MHz注意这是串口初始化最容易出错的地方如果 USART2 用了 APB2 的时钟串口会完全无法工作。3.2 GPIO 引脚模式配置TX 引脚配置为复用推挽输出。因为 TX 需要主动输出高低电平推挽输出可以提供足够的电流。RX 引脚配置为浮空输入。因为 RX 需要接收外部的信号浮空输入可以准确检测外部的高低电平。四、完整代码实现4.1 头文件设计bsp_usart.h我们把所有硬件相关的参数都用宏定义封装起来这样以后切换串口时只需要修改宏定义即可。#ifndef __BSP_USART_H #define __BSP_USART_H #include stm32f10x.h #include stdio.h #define DEBUG_USART1 0 #define DEBUG_USART2 0 #define DEBUG_USART3 0 #define DEBUG_USART4 0 #define DEBUG_USART5 1 #if DEBUG_USART1 // 串口1-USART1 #define DEBUG_USARTx USART1 #define DEBUG_USART_CLK RCC_APB2Periph_USART1 #define DEBUG_USART_APBxClkCmd RCC_APB2PeriphClockCmd #define DEBUG_USART_BAUDRATE 115200 // 串口1 USART GPIO 引脚宏定义 #define DEBUG_USART_GPIO_CLK (RCC_APB2Periph_GPIOA) #define DEBUG_USART_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd #define DEBUG_USART_TX_GPIO_PORT GPIOA #define DEBUG_USART_TX_GPIO_PIN GPIO_Pin_9 #define DEBUG_USART_RX_GPIO_PORT GPIOA #define DEBUG_USART_RX_GPIO_PIN GPIO_Pin_10 #define DEBUG_USART_IRQ USART1_IRQn #define DEBUG_USART_IRQHandler USART1_IRQHandler #elif DEBUG_USART2 //串口2-USART2 #define DEBUG_USARTx USART2 #define DEBUG_USART_CLK RCC_APB1Periph_USART2 #define DEBUG_USART_APBxClkCmd RCC_APB1PeriphClockCmd #define DEBUG_USART_BAUDRATE 115200 // 串口2 USART GPIO 引脚宏定义 #define DEBUG_USART_GPIO_CLK (RCC_APB2Periph_GPIOA) #define DEBUG_USART_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd #define DEBUG_USART_TX_GPIO_PORT GPIOA #define DEBUG_USART_TX_GPIO_PIN GPIO_Pin_2 #define DEBUG_USART_RX_GPIO_PORT GPIOA #define DEBUG_USART_RX_GPIO_PIN GPIO_Pin_3 #define DEBUG_USART_IRQ USART2_IRQn #define DEBUG_USART_IRQHandler USART2_IRQHandler #elif DEBUG_USART3 //串口3-USART3 #define DEBUG_USARTx USART3 #define DEBUG_USART_CLK RCC_APB1Periph_USART3 #define DEBUG_USART_APBxClkCmd RCC_APB1PeriphClockCmd #define DEBUG_USART_BAUDRATE 115200 // 串口3 USART GPIO 引脚宏定义 #define DEBUG_USART_GPIO_CLK (RCC_APB2Periph_GPIOB) #define DEBUG_USART_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd #define DEBUG_USART_TX_GPIO_PORT GPIOB #define DEBUG_USART_TX_GPIO_PIN GPIO_Pin_10 #define DEBUG_USART_RX_GPIO_PORT GPIOB #define DEBUG_USART_RX_GPIO_PIN GPIO_Pin_11 #define DEBUG_USART_IRQ USART3_IRQn #define DEBUG_USART_IRQHandler USART3_IRQHandler #elif DEBUG_USART4 //串口4-UART4 #define DEBUG_USARTx UART4 #define DEBUG_USART_CLK RCC_APB1Periph_UART4 #define DEBUG_USART_APBxClkCmd RCC_APB1PeriphClockCmd #define DEBUG_USART_BAUDRATE 115200 // 串口4 USART GPIO 引脚宏定义 #define DEBUG_USART_GPIO_CLK (RCC_APB2Periph_GPIOC) #define DEBUG_USART_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd #define DEBUG_USART_TX_GPIO_PORT GPIOC #define DEBUG_USART_TX_GPIO_PIN GPIO_Pin_10 #define DEBUG_USART_RX_GPIO_PORT GPIOC #define DEBUG_USART_RX_GPIO_PIN GPIO_Pin_11 #define DEBUG_USART_IRQ UART4_IRQn #define DEBUG_USART_IRQHandler UART4_IRQHandler #elif DEBUG_USART5 //串口5-UART5 #define DEBUG_USARTx UART5 #define DEBUG_USART_CLK RCC_APB1Periph_UART5 #define DEBUG_USART_APBxClkCmd RCC_APB1PeriphClockCmd #define DEBUG_USART_BAUDRATE 115200 // 串口5 USART GPIO 引脚宏定义 #define DEBUG_USART_GPIO_CLK (RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD) #define DEBUG_USART_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd #define DEBUG_USART_TX_GPIO_PORT GPIOC #define DEBUG_USART_TX_GPIO_PIN GPIO_Pin_12 #define DEBUG_USART_RX_GPIO_PORT GPIOD #define DEBUG_USART_RX_GPIO_PIN GPIO_Pin_2 #define DEBUG_USART_IRQ UART5_IRQn #define DEBUG_USART_IRQHandler UART5_IRQHandler #endif void USART_Config(void); void Usart_SendByte(USART_TypeDef* pUSARTx,uint8_t data); void Usart_sendHalfWord(USART_TypeDef * pUSARTx, uint16_t data); void Usart_SendArray(USART_TypeDef * pUSARTx, uint8_t *array, uint8_t size); void Usart_SendString(USART_TypeDef * pUSARTx, char *str); #endif /* __BSP_USART_H */4.2 源文件实现bsp_usart.c// bsp_usart.c #include bsp_usart.h /** * brief 配置嵌套向量中断控制器 NVIC * param 无 * retval 无 */ static void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; /* 配置中断优先级分组为 2 */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /* 配置 USART 为中断源 */ NVIC_InitStructure.NVIC_IRQChannel DEBUG_USART_IRQn; /* 抢断优先级为 1 */ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 1; /* 子优先级为 1 */ NVIC_InitStructure.NVIC_IRQChannelSubPriority 1; /* 使能中断 */ NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE; /* 初始化 NVIC */ NVIC_Init(NVIC_InitStructure); } /** * brief USART 初始化函数 * param 无 * retval 无 */ void USART_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; // 1. 使能串口时钟 DEBUG_USART_APBx(DEBUG_USART_CLK, ENABLE); // 2. 使能 GPIO 时钟 RCC_APB2PeriphClockCmd(DEBUG_USART_GPIO_CLK, ENABLE); // 3. 配置 TX 引脚为复用推挽输出 GPIO_InitStructure.GPIO_Pin DEBUG_USART_TX_PIN; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; // 复用推挽输出 GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; // 引脚速度 50MHz GPIO_Init(DEBUG_USART_GPIO, GPIO_InitStructure); // 4. 配置 RX 引脚为浮空输入 GPIO_InitStructure.GPIO_Pin DEBUG_USART_RX_PIN; GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING; // 浮空输入 GPIO_Init(DEBUG_USART_GPIO, GPIO_InitStructure); // 5. 配置串口参数 USART_InitStructure.USART_BaudRate DEBUG_USART_BAUDRATE; // 波特率 115200 USART_InitStructure.USART_WordLength USART_WordLength_8b; // 数据位 8 位 USART_InitStructure.USART_StopBits USART_StopBits_1; // 停止位 1 位 USART_InitStructure.USART_Parity USART_Parity_No; // 无校验 USART_InitStructure.USART_HardwareFlowControl USART_HardwareFlowControl_None; // 无硬件流控 USART_InitStructure.USART_Mode USART_Mode_Rx | USART_Mode_Tx; // 收发模式 USART_Init(DEBUG_USARTx, USART_InitStructure); // 6. 配置串口接收中断 USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE); // 7. 配置 NVIC 中断优先级 NVIC_Configuration(); // 8. 使能串口 USART_Cmd(DEBUG_USARTx, ENABLE); } /** * brief 发送单个字节 * param pUSARTx: 串口外设 * param ch: 待发送字节 * retval 无 */ void Usart_SendByte(USART_TypeDef * pUSARTx, uint8_t ch) { // 把数据写入发送数据寄存器 USART_SendData(pUSARTx, ch); // 等待发送数据寄存器为空TXE 标志位置 1 while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) RESET); } /** * brief 发送字符串 * param pUSARTx: 串口外设 * param str: 待发送字符串 * retval 无 */ void Usart_SendString(USART_TypeDef * pUSARTx, char *str) { unsigned int k 0; do { // 逐个发送字符串中的字符 Usart_SendByte(pUSARTx, *(str k)); k; } while (*(str k) ! \0); // 直到遇到字符串结束符\0 // 等待所有数据发送完成TC 标志位置 1 while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TC) RESET); } /** * brief 重定向 C 库函数 printf 到串口 * param ch: 待发送字符 * param f: 文件指针 * retval 发送的字符 */ int fputc(int ch, FILE *f) { Usart_SendByte(DEBUG_USARTx, (uint8_t)ch); return ch; } /** * brief 串口接收中断服务函数 * param 无 * retval 无 */ void DEBUG_USART_IRQHandler(void) { uint8_t ucTemp; // 检查是否是接收中断RXNE 标志位置 1 if (USART_GetITStatus(DEBUG_USARTx, USART_IT_RXNE) ! RESET) { // 读取接收到的数据 ucTemp USART_ReceiveData(DEBUG_USARTx); // 把接收到的数据回显给电脑 Usart_SendByte(DEBUG_USARTx, ucTemp); } }4.3 主函数main.c// main.c #include stm32f10x.h #include bsp_usart.h int main(void) { // 初始化串口 USART_Config(); // 发送欢迎信息 Usart_SendString(DEBUG_USARTx, 这是一个串口回显实验\r\n); Usart_SendString(DEBUG_USARTx, 你发送什么单片机就会返回什么\r\n); // 也可以使用 printf 发送 printf(printf 重定向成功\r\n); while(1) { // 主循环什么都不做所有工作都在中断中完成 } }五、printf 重定向详解5.1 什么是 printf 重定向printf 是 C 语言标准库中的函数默认是把数据输出到电脑的屏幕上。在单片机中我们没有屏幕所以需要把 printf 的输出重定向到串口这样就可以用 printf 方便地打印调试信息了。5.2 重定向的原理printf 函数内部会调用 fputc 函数来输出单个字符。我们只需要重新实现 fputc 函数让它把字符发送到串口printf 就会自动把所有数据输出到串口了。5.3 必须注意的事项在 Keil MDK 中使用 printf 重定向必须勾选“Use MicroLIB”选项点击 Keil 工具栏的“魔术棒”按钮切换到“Target”选项卡勾选“Use MicroLIB”点击“OK”保存设置注意如果不勾选这个选项程序会编译失败或者运行时卡死。六、串口接收的两种方式6.1 查询方式不推荐查询方式就是 CPU 一直不停地检查接收数据寄存器是否有数据。就像你一直盯着门口等快递什么事都干不了。// 查询方式接收数据 uint8_t Usart_ReceiveByte(USART_TypeDef * pUSARTx) { // 等待接收数据寄存器非空RXNE 标志位置 1 while (USART_GetFlagStatus(pUSARTx, USART_FLAG_RXNE) RESET); // 返回接收到的数据 return USART_ReceiveData(pUSARTx); }6.2 中断方式推荐中断方式就是 CPU 不用一直等当有数据到来时串口会给 CPU 发一个中断信号CPU 再去处理数据。就像快递员给你打电话你再去门口取快递平时你可以干别的事。这就是我们在代码中使用的方式它可以大大节省 CPU 资源。七、实验验证步骤7.1 软件准备安装 CH340G 驱动程序如果电脑没有自动安装下载并打开串口助手推荐使用野火串口助手7.2 硬件连接用 USB 线连接开发板的“USB TO UART”接口和电脑确保开发板上 USART1 的跳帽已经插上7.3 串口助手设置选择正确的串口号可以在设备管理器中查看设置波特率为 115200设置数据位为 8停止位为 1校验位为无点击“打开串口”按钮7.4 下载程序并测试编译程序并下载到开发板此时串口助手应该会收到欢迎信息在串口助手的发送框中输入任意字符点击“发送”串口助手的接收框中会显示你发送的字符八、常见问题与避坑指南8.1 串口完全没有输出可能原因及解决方法跳帽未插检查开发板上 USART1 的跳帽是否已经插上TX 和 RX 接反确认 CH340G 的 TX 接单片机的 RXRX 接单片机的 TX时钟总线配置错误USART1 在 APB2 总线其他串口在 APB1 总线串口助手未打开确认串口助手已经打开了正确的串口号程序未下载确认程序已经成功下载到开发板8.2 串口输出乱码可能原因及解决方法参数不匹配确认串口助手和代码中的波特率、数据位、停止位、校验位完全一致系统时钟配置错误如果系统时钟不是 72MHz串口波特率会不准CH340G 驱动问题重新安装 CH340G 驱动程序8.3 只能发送不能接收可能原因及解决方法RX 引脚配置错误确认 RX 引脚配置为浮空输入接收中断未使能确认调用了 USART_ITConfig 函数使能了接收中断中断服务函数名错误确认中断服务函数名和头文件中定义的一致九、小结串口是单片机和电脑之间最常用的通信方式本质是全双工的串行通信串口通信的四个参数波特率、数据位、停止位、校验位必须完全一致CH340G 是 USB 转串口芯片负责电脑和单片机之间的信号转换串口初始化的核心步骤使能时钟→配置 GPIO→配置串口参数→配置中断→使能串口推荐使用中断方式接收数据可以大大节省 CPU 资源使用 printf 重定向需要勾选 Keil 中的“Use MicroLIB”选项参考出处《零死角玩转 STM32F103-指南者》第 21 章 USART 串口通信STM32F103 官方参考手册 RM0008野火 STM32 串口通信教学视频

相关文章:

STM32F103 学习笔记-21-串口通信(第5节)—串口2345代码移植和讲解

本章基于 STM32F103 标准外设库开发,从最基础的“串口是什么”讲起,通过生活化类比拆解硬件原理,配合逐行注释的可运行代码,让零基础读者读完就能实现单片机与电脑的双向通信。一、什么是串口通信?1.1 串口的本质&…...

保姆级 Kali Linux 安装教程|零基础小白也能看懂,从镜像下载到虚拟机配置全程图文详解,零报错上手

kali 背景 基于Debian的Linux操作系统 Kali Linux是基于Debian的Linux发行版, 设计用于数字取证操作系统。每一季度更新一次。由Offensive Security Ltd维护和资助。最先由Offensive Security的Mati Aharoni和Devon Kearns通过重写BackTrack来完成,Back…...

LLMCompiler:大语言模型并行函数调用编译器原理与实践

1. 项目概述:一个为LLM设计的“并行函数调用编译器”如果你正在构建基于大语言模型(LLM)的智能体应用,并且被工具调用(Function Calling)的串行延迟和高昂成本所困扰,那么LLMCompiler这个项目值…...

2026 年了,国产大模型和 GPT/Claude的差距还有多大?

作为一名每天要在终端、代码库和几十个 API 接口里反复横跳的开发者,我在这几年见证了 AI 行业最疯狂的三年。记得 2023 年大家还在笑话国产大模型只会“套壳”,2024 年开始被 DeepSeek 的性价比震撼,而到了 2026 年的今天,坐在电…...

通用人工智能系统(GPAIS)的技术挑战与可信AI治理框架

1. GPAIS:从概念到现实,我们离“通用”还有多远?如果你关注AI领域,最近几年一定被各种“全能”模型刷过屏。从能写代码、画图、聊天的ChatGPT,到能处理多模态信息的GPT-4V,再到各种宣称能“理解世界”的智能…...

容器是怎么管理 Bean 的?

文章目录1. 核心蓝图:BeanDefinition2. 核心管理流程:生命周期流水线第一阶段:准备与实例化第二阶段:装配与填充第三阶段:初始化(Initialization)第四阶段:生存与销毁3. 核心机制&am…...

医学影像分割:2D超图像与3D网络性能对比与选型指南

1. 项目概述:从“切片”到“体素”的认知跃迁在医学影像分析领域,分割任务一直是核心中的核心。无论是肿瘤的勾画、器官的量化,还是病灶的追踪,精准的分割都是后续诊断、治疗规划和疗效评估的基石。长久以来,处理三维医…...

Bean 会被 JVM 回收吗?

文章目录核心结论:**会,但前提是它必须变得“不可达”。**1. Singleton Bean(单例):通常与容器同生死2. Prototype Bean(多例):管生不管死3. 决定 Bean 被回收的具体条件总结对照表核…...

Bean 什么时候会被销毁?

文章目录 1. 核心触发时机:容器关闭2. 不同作用域(Scope)的差异3. 销毁逻辑的具体执行顺序 Bean 的销毁时机主要取决于它的 作用域(Scope) 以及 容器(ApplicationContext)的状态。 在 Spring 中…...

航空发动机齿轮有限元可靠性分析与齿廓修形优化【附仿真】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)多保真度主动学习代理模型与模型修正: …...

CANN/hcomm通信域初始化

HcclCommInitRootInfo 【免费下载链接】hcomm HCOMM(Huawei Communication)是HCCL的通信基础库,提供通信域以及通信资源的管理能力。 项目地址: https://gitcode.com/cann/hcomm 产品支持情况 Ascend 950PR/Ascend 950DT:…...

OBS虚拟摄像头插件:4个虚拟摄像头同时工作的终极指南

OBS虚拟摄像头插件:4个虚拟摄像头同时工作的终极指南 【免费下载链接】obs-virtual-cam 项目地址: https://gitcode.com/gh_mirrors/obsv/obs-virtual-cam 还在为OBS直播画面只能分享到一个应用而烦恼吗?今天我要介绍的obs-virtual-cam插件&…...

ThinkPad风扇控制革命:如何用TPFanCtrl2告别过热与噪音困扰

ThinkPad风扇控制革命:如何用TPFanCtrl2告别过热与噪音困扰 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 在ThinkPad用户群体中,风扇控制一直…...

深度解析 MCP (Model Context Protocol):构建 AI Agent 的核心纽带

深度解析 MCP (Model Context Protocol):构建 AI Agent 的核心纽带 摘要 在当前大模型(LLM)向智能体(Agent)演进的过程中,如何打破“信息孤岛”,实现模型与外部工具、数据库及本地文件系统的标准…...

收藏必看!2026年AI内卷混战风口拆解,小白也能轻松入局大模型

2026年刷各大平台,相信不少程序员和零基础小伙伴都被AI圈内卷刷屏!既能自主决策、智能交互的人形机器人遍地开花,还有全网爆火、玩法持续迭代升级的AI小龙虾OpenClaw强势出圈。当下大模型技术更新迭代速度极快,用日新月异来形容行…...

收藏!2026年转AI大模型应用开发,正确学习顺序别踩坑(小白/程序员必看)

本文深度剖析2026年AI智能体公司的生存困境,点出其商业模式局限、缺乏行业深耕经验的核心痛点,揭示其难以持续盈利的底层逻辑。同时,结合当下AI大模型的爆发式发展趋势,强调大模型应用开发的学习价值,为小白、程序员整…...

【2026最新版|收藏备用】用Skill简化大模型知识库连接,小白程序员入门必看

本文专为2026年入门大模型的小白、程序员打造,详细介绍如何通过Skill技术简化大模型与外部知识库的对接流程,对比传统RAG方法的繁琐痛点,手把手讲解Markdown(.md)格式文档的存储技巧、SKILL.md文件的技能描述与导航方法…...

VMware Unlocker 3.0:专业解锁工具让PC轻松运行macOS虚拟机的高效指南

VMware Unlocker 3.0:专业解锁工具让PC轻松运行macOS虚拟机的高效指南 【免费下载链接】unlocker VMware Workstation macOS 项目地址: https://gitcode.com/gh_mirrors/unloc/unlocker 在Windows或Linux系统上运行macOS虚拟机,对于iOS应用开发者…...

GitHub中文界面终极指南:3步免费快速安装,告别英文困扰

GitHub中文界面终极指南:3步免费快速安装,告别英文困扰 【免费下载链接】github-chinese GitHub 汉化插件,GitHub 中文化界面。 (GitHub Translation To Chinese) 项目地址: https://gitcode.com/gh_mirrors/gi/github-chinese 还在为…...

基于Kubernetes的AI应用控制平面:kiro-acp架构解析与实践指南

1. 项目概述:一个面向AI应用开发的集成控制平面最近在GitHub上闲逛时,发现了一个名为kiro-acp的项目,隶属于haliphax-ai这个组织。光看名字,acp很容易让人联想到“应用控制平面”。点进去一看,果然,这是一个…...

微信小程序集成ChatGPT:架构设计与工程实践全解析

1. 项目概述:一个在微信小程序里跑起来的ChatGPT最近在捣鼓微信小程序,想看看能不能把ChatGPT这种大模型的能力塞进去。毕竟,现在AI对话这么火,如果能在小程序里直接调用,做个智能客服、个人助手或者创意工具&#xff…...

本地部署AI助手Catai:基于Llama.cpp的模型管理与服务集成指南

1. 项目概述:在本地运行你自己的AI助手 如果你和我一样,对大型语言模型(LLM)充满好奇,既想体验它们强大的对话和推理能力,又对数据隐私、网络依赖或API调用成本有所顾虑,那么本地部署一个AI模型…...

通用人工智能系统GPAIS:从专用AI到通用智能体的架构与实战

1. 项目概述:从“专用”到“通用”的AI范式跃迁最近几年,AI领域的热点几乎被大语言模型(LLM)和扩散模型(AIGC)所垄断。我们见证了它们在文本生成、代码编写、图像创作等特定任务上展现出的惊人能力。然而&a…...

2026 AI大会报名通道即将关闭:3大未公开优先注册通道+5类免审资格今日解锁

更多请点击: https://intelliparadigm.com 第一章:2026年AI技术大会报名截止时间 2026年AI技术大会(AI Tech Summit 2026)官方报名通道将于北京时间2026年3月15日23:59准时关闭,逾期系统将自动终止注册流程。本次大会…...

CANN/ops-math 3D反射填充算子

aclnnReflectionPad3d 【免费下载链接】ops-math 本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-math 📄 查看源码 产品支持情况 产品是否支持Ascend 950PR/Ascend 950DT√Atlas …...

CANN/runtime CMO缓存操作

11-06 CMO 缓存操作 【免费下载链接】runtime 本项目提供CANN运行时组件和维测功能组件。 项目地址: https://gitcode.com/cann/runtime 本章节描述 CMO(Cache Maintenance Operations)缓存操作接口,用于缓存刷新与失效操作。 aclErr…...

Context Harness:本地优先AI知识库引擎,无缝集成Cursor与Claude

1. 项目概述:一个为AI工具打造的本地优先知识库引擎如果你和我一样,日常重度依赖像Cursor、Claude Code这类AI编程助手,那你肯定也遇到过这个痛点:当你想让AI帮你分析一个复杂的私有代码库、查阅公司内部的API文档,或者…...

构建安全多语言代码沙盒:从原理到实践

1. 项目概述:从“Can I Code?”到“Can I Code!”“let-sunny/canicode”这个项目名,初看有点意思。它不像一个传统的工具库或框架,名字里带着一个问句的意味——“我能编码吗?”。这恰恰是很多初学者,甚至是在特定领…...

AI赋能宠物纪念册:Gemini3.1Pro的情感文案术

在 2026 年,AI 的应用场景已经从“写文案、做海报、生成代码”扩展到更细分、更情绪化也更需要边界感的领域。比如宠物殡葬、生命纪念、情感告别、个性化内容定制等场景,过去往往依赖人工经验和手工整理,现在则可以借助 Gemini 3.1 Pro 先完成…...

深度解析next-routes:Next.js早期动态路由解决方案的设计与实现

1. 项目概述:一个被时代铭记的Next.js路由解决方案如果你在2017年到2020年间使用Next.js开发过项目,那么你大概率听说过甚至用过next-routes这个库。在那个Next.js官方路由系统还相对“简陋”的年代,next-routes凭借其Express风格的动态路由定…...