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

CH32V307 - SPI基础时序详解

目录前言一、SPI概念1.接口说明2.时序实现3.应用方法二、基础时序实现代码1.IO口读写操作2.SPI对应IO口初始化3.SPI开始时序4.SPI终止时序5.SPI交换一个字节三、函数调用四、实验现象五、完整代码main.cSPI.cSPI.hKey.c / Key.hLED.c / LED.hOLED.c / OLED.h / OLED_Font.h下节预告前言本文主要以NRF24L01模块来讲解SPI通信协议在此只用SPI基础时序来进行NRF24L01模块的简单读写操作完整的模块驱动代码后面会给出。一、SPI概念SPI为同步、全双工通信协议同时支持一主多从的模式。SPI通信协议相比较I2C通信协议来说要简单很多但它的劣势在于它的接线相对较多它同样也支持多设备挂载总线但是每个设备都要多出一根SS片选信号线这根信号线就代替了I2C协议中的寻址与应答位操作。1.接口说明SPI接线端口主要有5个SCK时钟线、MOSI主机发送数据线、MISO主机接收数据线、CS片选信号线、GND共地。SCK是同步通信协议都需要的用来同步双方的时序明确什么时候收发数据。MOSI是主机对外发送数据的信号线也是输出线。M指的就是主机S指的是从机含义就是主机Output、从机Input。MISO是主机接收数据的信号线是输入线。在挂载多从机时同样也会有与I2C通信线一样高低电平冲突的风险所以协议规定从机在不发送数据时应当把该端口设置为高阻态。CSSS是片选信号线这是SPI的独特所在每个从机都有单独的CS片选线与主机相连默认低电平有效。当从机读取到CS为低电平时就知道主机要对自己发送信号了就会进入接收模式。对主机来说该线为输出线。在一主多从的模式中有几个从机主机就要引出多少个CS线每根CS线连接到对应的从机。GND使所有设备共地这样所有设备的高低电平才一致。这也是实际使用中最容易忽略的一点。所有线当中对于主机来说输出线为SCK、MOSI、CS一般将他们设置为推挽输出模式。而输入线为MISO一般设置为上拉输入或浮空输入模式。2.时序实现SPI的时序规范比较简单由起始时序 - 交换字节时序 - 终止时序组成起始时序时只需操作CS片选线选中对应的从机也就是拉低CS而终止时序时只需拉高CS线取消选中从机。SPI中字节的发送和接收通过交换字节来实现在发送一个字节的同时也接收一个字节这也是高效利用全双工通信的一种表现。具体操作为在SCK的特定时钟沿置位MOSI来发送数据在SCK的另一个时钟沿读取MISO来接收数据。数据与I2C一样为高位先行。为什么说是特定时钟沿呢因为SPI的时序规定有4种模式由CPOL与CPHA两个参数决定是哪个模式。CPOL决定空闲状态时SCK的电平状态而CPHA决定在哪个边沿发送或读取数据。我们以最常用的模式0来讲解模式0中CPOL0决定空闲状态初始状态SCK为低电平CPHA1决定SCK的奇数边沿移入数据接收数据、偶数边沿移出数据发送数据。具体时序是这样的首先起始信号CS置0因为SCK第一个边沿奇数边沿就要读取数据了所以我们必须在操作SCK前先移出第一位数据若发送字节的最高位第7位为1我们则置MOSI为1反之置0。然后我们置SCK为1形成第一个边沿。此时奇数边沿出现主从机都开始读取数据主机读MISO从机读MOSI读到的数据从高位开始存入接收字节第一次读到的数据存入接收字节的第七位最高位。接收完数据后继续操作SCK拉低形成第二个边沿。此时偶数边沿出现主从机都开始发送下一位数据主机写MOSI从机写MISO。按如此操作循环8次收发1个字节的任务就完成了注意在发送一个字节的同时也收到了一个字节它们是同时进行的。如果要继续收发字节也可以在后面连续收发直至所有字节收发完成把CS置1形成结束信号。模式0一个完整的时序流程就是这样了。对于SPI要特别注意模式的选择最常用的就是模式0。我们不说上升沿下降沿因为上升沿和下降沿是由CPOL和CPHA两个参数共同决定的CPHA只看是奇数还是偶数边沿不管你是上升还是下降沿。3.应用方法SPI的应用方法也是与I2C差不多的协议只规定了通信的时序而具体的数据由厂商自己来决定需要去查询具体的数据手册如何读数据、写数据都会详细说明而模式的选择呢一般厂商会给你时序图直接看图说话就好就算不给你时序图你也要知道模式几对应什么时序、或CPOL和CPHA的参数对应什么时序。而SPI的读写流程大体是差不多的一般由主机发送要写还是读如果写数据要发送写在什么地址的寄存器中然后再发送要写的数据内容如果读数据一样也要发送读取什么地址的寄存器然后下一个时序从机就会把对应寄存器中的数据发过来了。可以看到在单一字节交换时有一半的数据是没有用的例如主机发送要读取的寄存器地址的时序中从机发送过来的数据是无用数据从机发送发送寄存器数据的时序中主机发送的数据也是无用数据。那么这些数据我们默认可以用0x00或0xFF代替同时这些数据虽然实际上是接收了但是程序不会去处理他们。例如主机发送要读取0x30地址的数据这个时序中主机不会理会接收到的数据而下一个时序主机发送0xFF交换过来的数据就是从机0x30地址的对应数据了同时从机发送数据时接收到的这个0xFF它也不会去处理。当然交换字节在连续收发时就有大用处了例如主机先发送要读取0x30的地址数据然后在下一个时序接收0x30地址的数据同时发送要读取0x40的数据那么再下一个时序主机就能接收到0x40地址的数据了。以此类就能连续进行读写操作效率翻倍。当然具体的操作还是要根据模块对应的数据手册来这里只是简单举个例子。二、基础时序实现代码这里讲解的是软件模拟SPI的代码操作。1.IO口读写操作/*写CE使能引脚*/ void SPI_W_CE(uint8_t Byte) { GPIO_WriteBit(GPIOE,GPIO_Pin_8,(BitAction)Byte); } /*写CS片选信号*/ void SPI_W_CSN(uint8_t Byte) { GPIO_WriteBit(GPIOE,GPIO_Pin_9,(BitAction)Byte); } /*写SCK时钟线*/ void SPI_W_SCK(uint8_t Byte) { GPIO_WriteBit(GPIOE,GPIO_Pin_10,(BitAction)Byte); } /*写MOSI主机发送数据线*/ void SPI_W_MOSI(uint8_t Byte) { GPIO_WriteBit(GPIOE,GPIO_Pin_11,(BitAction)Byte); } /*读MISO主机接收数据线*/ uint8_t SPI_R_MISO(void) { return GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_12); }还是软件模拟通信协议的标准流程先封装好对应端口的读写函数对于输出端口配置写函数输入端口配置读函数。移植过程中只需修改对应端口号即可。CSN说明CS片选信号为低电平有效。这里CE接口是NRF24L01的收发使能引脚CE为0时模块与主机进行通信CE为1时模块对外与其他模块进行无线通信这里有个了解即可。2.SPI对应IO口初始化/*初始化SPI引脚*/ void SPI_GPIO_Init(void) { /*开启时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); //开启GPIOA的时钟 /*GPIO初始化*/ GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; //将输出引脚初始化为推挽输入 GPIO_InitStructure.GPIO_Pin GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOE, GPIO_InitStructure); GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU; //将输入引脚初始化为上拉输入 GPIO_InitStructure.GPIO_Pin GPIO_Pin_12; GPIO_Init(GPIOE, GPIO_InitStructure); SPI_W_CE(0); SPI_W_CSN(1); SPI_W_SCK(0); SPI_W_MOSI(0); }对SPI对应引脚进行初始化输出引脚CS、SCK、MOSI、CE都初始化为推挽输出模式输入引脚MISO初始化为上拉输入或者浮空输入。GPIO初始化后对输出引脚进行空闲状态电平设置。片选信号线CS设置为高电平不选中从机其他都设置为低电平即可。3.SPI开始时序/*SPI开始时序*/ void SPI_Start(void) { SPI_W_CSN(0); }SPI开始时序非常简单就是把CS片选信号线设置为低电平选中从机即可。4.SPI终止时序/*SPI终止时序*/ void SPI_Stop(void) { SPI_W_CSN(1); }SPI终止时序则反之把CS片选信号设置为高电平取消选中从机。5.SPI交换一个字节/*SPI交换一个字节时序*/ uint8_t SPI_SwapByte(uint8_t SendByte) { uint8_t i, ReceiveByte 0x00; for(i0; i8; i) { SPI_W_MOSI(SendByte 0x80); SendByte 1; SPI_W_SCK(1); if(SPI_R_MISO()) { ReceiveByte | 0x01; } ReceiveByte 1; SPI_W_SCK(0); } return ReceiveByte; }SPI交换一个字节的时序就相对复杂一点我们通过循环移位的方式来实现。这里用的是模式0。首先要明确交换字节函数传参为发送字节返回值为接受字节这一点是比较特别的。对于模式0奇数边沿读数据偶数边沿写数据说明第一个边沿就要读取第一位数据了所以我们先写数据再操作SCK。数据遵循高位先行的原则使用位操作写SendByte的第七位最高位数据到MOSI然后把SendByte左移一位这样第六位次高位就变成了最高位下一次发送的最高位就是原先的下一位了如此就能实现由高位到低位依次发送的效果了然后我们拉高SCK形成第一个边沿此时主、从机都要读取数据我们是主机把MISO的数据写入接收字节ReceiveByte的最低位然后把ReceiveByte左移一位循环操作后先接收到的数据自然就成了最高位实现由高位到低位接收数据然后我们再拉低SCK形成偶数边沿开始写MOSI循环操作。最终返回ReceiveByte接收字节。三、函数调用SPI_Start(); //SPI开始 SPI_SwapByte(txByte); //SPI发送要写的数据 SPI_Stop(); //SPI终止我们编写的是最基础的时序结构所以调用时需要完整调用开始和终止时序。传入要发送的字节数据对于接收到的数据我们不进行处理。SPI_Start(); //SPI开始 reByte SPI_SwapByte(0xFF); //SPI接收读取的数据 SPI_Stop(); //SPI终止在接收数据时我们发送无效数据0xFF只处理接收到的数据即可。四、实验现象这是NRF24L01的接线示意图我们对照下面表格将它与CH32连接即可。NRF24L01CH32V307VCC3V3GNDGNDCEPE8CSNPE9SCKPE10MOSIPE11MISOPE12依旧先编译-后连接-再上电-才下载本次实验需要使用之前的OLED和按键程序确保OLED屏幕是按照之前教程连接的。下载后OLED屏幕上第二行会显示发送是否完成第三行会显示接收到的数据初始时接收到的数据可能是非0数我们按下开发板上的USER按键向0x40地址写入发送数据。OLED屏幕上第二行会显示OK!同时程序会不断读取0x40地址的数据并在第三行显示此时OLED上就会显示我们读取到的数据了这个数据正是我们前一次写入0x40地址的数据。每按下按键一次写入的数据就会加一。五、完整代码main.c#include ch32v30x.h #include debug.h #include OLED.h #include key.h #include SPI.h uint8_t txByte 0x00; //发送的数据 uint8_t rxByte 0x00; //存储接收的数据 int main(void) { /*模块初始化*/ OLED_Init(); //OLED初始化 Delay_Init(); //延时函数初始化 Key_Init(); //按键初始化 SPI_GPIO_Init(); //SPI端口初始化 /*标题显示*/ OLED_ShowString(1,5,SPI TEST); OLED_ShowString(2,1,Send:); OLED_ShowString(3,1,Receive:); while (1) { if(Key_Flag) //按键按下发送数据 { Key_Flag 0; //清除按键标志位 SPI_Start(); //SPI开始 SPI_SwapByte(0x20 | 0x04); //SPI发送写0x40寄存器指令 SPI_SwapByte(txByte); //SPI发送要写的数据 SPI_Stop(); //SPI终止 txByte; //发送数据自增 OLED_ShowString(2,6,OK!); //屏幕显示表示发送完成 } Delay_Ms(1); //循环读取数据 SPI_Start(); //SPI开始 SPI_SwapByte(0x00 | 0x04); //SPI发送读0x40寄存器指令 rxByte SPI_SwapByte(0xFF); //SPI接收读取的数据 SPI_Stop(); //SPI终止 OLED_ShowHexNum(3, 9, rxByte, 2); //屏幕显示接收到的数据 } }SPI.c#include ch32v30x.h /*写CE使能引脚*/ void SPI_W_CE(uint8_t Byte) { GPIO_WriteBit(GPIOE,GPIO_Pin_8,(BitAction)Byte); } /*写CS片选信号*/ void SPI_W_CSN(uint8_t Byte) { GPIO_WriteBit(GPIOE,GPIO_Pin_9,(BitAction)Byte); } /*写SCK时钟线*/ void SPI_W_SCK(uint8_t Byte) { GPIO_WriteBit(GPIOE,GPIO_Pin_10,(BitAction)Byte); } /*写MOSI主机发送数据线*/ void SPI_W_MOSI(uint8_t Byte) { GPIO_WriteBit(GPIOE,GPIO_Pin_11,(BitAction)Byte); } /*读MISO主机接收数据线*/ uint8_t SPI_R_MISO(void) { return GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_12); } /*初始化SPI引脚*/ void SPI_GPIO_Init(void) { /*开启时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); //开启GPIOA的时钟 /*GPIO初始化*/ GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; //将输出引脚初始化为推挽输入 GPIO_InitStructure.GPIO_Pin GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOE, GPIO_InitStructure); GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU; //将输入引脚初始化为上拉输入 GPIO_InitStructure.GPIO_Pin GPIO_Pin_12; GPIO_Init(GPIOE, GPIO_InitStructure); SPI_W_CE(0); SPI_W_CSN(1); SPI_W_SCK(0); SPI_W_MOSI(0); } /*SPI开始时序*/ void SPI_Start(void) { SPI_W_CSN(0); } /*SPI终止时序*/ void SPI_Stop(void) { SPI_W_CSN(1); } /*SPI交换一个字节时序*/ uint8_t SPI_SwapByte(uint8_t SendByte) { uint8_t i, ReceiveByte 0x00; for(i0; i8; i) { SPI_W_MOSI(SendByte 0x80); SendByte 1; SPI_W_SCK(1); if(SPI_R_MISO()) { ReceiveByte | 0x01; } ReceiveByte 1; SPI_W_SCK(0); } return ReceiveByte; }SPI.h#ifndef __SPI_H #define __SPI_H #include ch32v30x.h void SPI_W_CE(uint8_t Byte); void SPI_W_CSN(uint8_t Byte); void SPI_W_SCK(uint8_t Byte); void SPI_W_MOSI(uint8_t Byte); uint8_t SPI_R_MISO(void); void SPI_GPIO_Init(void); void SPI_Start(void); void SPI_Stop(void); uint8_t SPI_SwapByte(uint8_t SendByte); #endifKey.c / Key.hKey模块代码与第六章 CH32V307-USART收发HEX数据包的模块代码一致。LED.c / LED.hLED模块代码与第三章 CH32C307-通用模块的模块代码一致。OLED.c / OLED.h / OLED_Font.hOLED模块代码与第二章 CH32V307-OLED驱动的模块代码一致。下节预告下一章我们准备开始学习CAN总线协议。本章SPI较为简单建议自己上手写一遍程序加深记忆。加油

相关文章:

CH32V307 - SPI基础时序详解

目录 前言 一、SPI概念 1.接口说明 2.时序实现 3.应用方法 二、基础时序实现代码 1.IO口读写操作 2.SPI对应IO口初始化 3.SPI开始时序 4.SPI终止时序 5.SPI交换一个字节 三、函数调用 四、实验现象 五、完整代码 main.c SPI.c SPI.h Key.c / Key.h LED.c / L…...

终极指南:如何使用Legacy iOS Kit让旧iPhone/iPad重获新生

终极指南:如何使用Legacy iOS Kit让旧iPhone/iPad重获新生 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to downgrade/restore, save SHSH blobs, and jailbreak legacy iOS devices 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit 你…...

All-In-One Sandbox:Agent自动化任务的统一执行环境

All-In-One Sandbox:Agent自动化任务的统一执行环境 当你的Agent需要同时操作浏览器、执行代码、运行Shell命令来完成一个任务时,是否曾陷入这样的困境:浏览器下载的文件要上传到云存储,代码沙箱才能读取;代码生成的结果又要重新上传,供下一个工具使用……这种“文件共享…...

上位机开发初体验|第一个项目从 0 到 1:项目创建与整体 UI 布局

作为上位机开发的新手,我的第一个项目从基础的项目搭建和 UI 布局开始入手,这一步也是整个项目的基础,做好窗体、容器、控件的基础样式配置,能为后续的功能开发打下整洁的框架。以下是我整理的详细操作步骤,亲测实用&a…...

最新!OpenClaw 2026年云端与本地Windows11、macOS、Linux系统安装及使用零技术步骤

最新!OpenClaw 2026年云端与本地Windows11、macOS、Linux系统安装及使用零技术步骤。本文面向零基础用户,完整说明在轻量服务器与本地Windows11、macOS、Linux系统中部署OpenClaw(Clawdbot)的流程,包含环境配置、服务启…...

API平台选型指南:从RapidAPI到幂简集成,如何为你的项目精准匹配?

1. 为什么API平台选型如此重要? 想象一下你正在开发一个本地生活应用,需要整合支付、地图和AI能力。如果每个功能都从零开发,光是支付系统可能就要耗费半年时间。而通过API平台,你可以在几小时内接入成熟的支付宝接口,…...

光学设计必知:Ansys Zemax中6种系统孔径类型的适用场景全解析

Ansys Zemax系统孔径类型深度解析:从基础原理到高阶应用 在光学系统设计中,系统孔径的设定如同为整个光学系统划定"通行规则",它决定了哪些光线能够参与成像,哪些将被排除在外。Ansys Zemax作为业界领先的光学设计软件&…...

OSX-KVM网络流量监控:使用Wireshark分析虚拟机通信

OSX-KVM网络流量监控:使用Wireshark分析虚拟机通信 【免费下载链接】OSX-KVM Run macOS on QEMU/KVM. With OpenCore Big Sur Monterey Ventura support now! Only commercial (paid) support is available now to avoid spammy issues. No Mac system is requir…...

ESP32 C3按键唤醒终极指南:MicroPython固件修改与实战代码分享

ESP32 C3按键唤醒终极指南:MicroPython固件修改与实战代码分享 当你的ESP32 C3设备需要依靠纽扣电池运行数月甚至数年时,睡眠模式就成为了救命稻草。但官方MicroPython固件在C3型号上的按键唤醒功能存在严重缺陷——这个发现让我在凌晨三点的实验室里既崩…...

AI 产品岗转技术岗:零基础学习路径与面试避坑指南

一、转岗前期:先想清楚3个核心问题 很多AI产品经理转技术岗的初衷,要么是觉得产品工作"不落地",要么是想深入技术核心提升竞争力,但转岗不是拍脑袋决定的,必须先明确三个问题: 你要转哪个细分技术…...

Vue3新手避坑指南:从Element Plus到axios拦截器的5个实用技巧

Vue3实战避坑手册:Element Plus与axios拦截器的高效配置策略 作为一名从后端转型全栈开发的工程师,我深刻理解在Vue3入门阶段遇到的种种困惑。本文将分享五个关键场景的解决方案,这些正是我在实际项目中踩过坑后总结的精华。 1. Element Pl…...

Rolldown包体积优化:从1MB到100KB的蜕变之旅

Rolldown包体积优化:从1MB到100KB的蜕变之旅 【免费下载链接】rolldown Modern bundler built on Rollup with couple more features, such as multiple entry points, presets, better configuration experience and more. 项目地址: https://gitcode.com/GitHub…...

从Hugging Face到ModelScope:手把手教你迁移训练好的模型并部署推理服务

从Hugging Face到ModelScope:模型迁移与生产化部署实战指南 当你在Hugging Face生态中完成模型训练后,如何将其转化为可稳定服务的产品级应用?ModelScope作为国产化的模型服务平台,为模型工程化提供了完整的解决方案。本文将带你深…...

FPGA嵌入式开发中8类主流I/O标准选型指南

1. 番外篇:I/O Type 扩展知识详解在嵌入式硬件开发,尤其是基于FPGA的可编程逻辑系统设计中,I/O电气标准(I/O Type)远非简单的“高电平/低电平”二值抽象。它是连接芯片内部逻辑与外部物理世界的桥梁,直接决…...

Q-Learning在游戏AI中的5个实战技巧:从贪吃蛇到Flappy Bird

Q-Learning在游戏AI中的5个实战技巧:从贪吃蛇到Flappy Bird 当我在大学第一次用Q-Learning训练贪吃蛇AI时,那个笨拙的小蛇总是不停地撞墙。经过72小时的参数调整后,它终于能吃掉屏幕上90%的苹果——这个经历让我深刻体会到,在游戏…...

MapLibre Native核心架构解析:深入理解矢量瓦片渲染机制

MapLibre Native核心架构解析:深入理解矢量瓦片渲染机制 【免费下载链接】maplibre-native MapLibre Native - Interactive vector tile maps for iOS, Android and other platforms. 项目地址: https://gitcode.com/GitHub_Trending/ma/maplibre-native Map…...

GitHub推荐项目精选/hac/hacktricks核心架构解析:从CTF到真实世界的技术沉淀

GitHub推荐项目精选/hac/hacktricks核心架构解析:从CTF到真实世界的技术沉淀 【免费下载链接】hacktricks Welcome to the page where you will find each trick/technique/whatever I have learnt in CTFs, real life apps, and reading researches and news. 项…...

Stable Yogi Leather-Dress-Collection可视化分析:使用Visio绘制模型服务架构图

Stable Yogi Leather-Dress-Collection可视化分析:使用Visio绘制模型服务架构图 最近在规划一个基于Stable Yogi模型的服装设计项目,需要向团队和合作伙伴清晰地展示整个技术架构。我发现,用文字描述一堆服务器、网关、数据库,大…...

如何用LiveKit Agents构建10个教育领域AI应用案例:从智能辅导到虚拟教师

如何用LiveKit Agents构建10个教育领域AI应用案例:从智能辅导到虚拟教师 【免费下载链接】agents Build real-time multimodal AI applications 🤖🎙️📹 项目地址: https://gitcode.com/GitHub_Trending/agen/agents Liv…...

DBC、LDF与Excel互转工具升级:矩阵对比功能深度解析

1. 矩阵对比功能:工程师的协议更新利器 每次遇到CAN或LIN协议更新时,最头疼的就是要手动对比成百上千个信号的变化。我曾经为了核对某个车型的DBC文件更新,花了整整两天时间逐行检查Excel表格,眼睛都快看花了。直到发现了这个工具…...

DIY必备:用HM-10蓝牙模块打造无线串口通信(详细AT指令解析)

DIY必备:用HM-10蓝牙模块打造无线串口通信(详细AT指令解析) 在智能家居遥控器、机器人控制或传感器数据采集等DIY项目中,无线通信往往是关键环节。HM-10蓝牙模块以其低成本、易用性和稳定的串口透传功能,成为创客们实现…...

【Dify企业级成本治理白皮书】:基于17个高并发生产案例的Token粒度追踪、模型路由优化与RBAC成本分摊模型

第一章:Dify企业级成本治理白皮书核心方法论概览Dify企业级成本治理并非单纯聚焦于资源用量压缩,而是以“可观测性驱动、策略即代码、全生命周期闭环”为三大支柱,构建面向AI应用生产环境的可持续成本优化体系。该方法论强调在模型服务、向量…...

论文笔记:Buffer of Thoughts: Thought-Augmented Reasoning with Large Language Models

1. Motivation 大型语言模型(LLMs)如GPT-4、PaLM和LLaMA在各种推理任务中展现出了令人印象深刻的性能。除了通过扩大模型规模来提高推理性能外,还有更有效的提示方法可以进一步增强LLMs的功能和性能。然而,现有的单查询推理&#…...

RISC-V裸机C驱动调试实战:3步定位寄存器配置错误,省去8小时反复烧写

第一章:RISC-V裸机C驱动调试实战:3步定位寄存器配置错误,省去8小时反复烧写在RISC-V裸机开发中,GPIO、UART等外设寄存器配置错误常导致功能静默失效——既无编译报错,也无运行时异常,仅表现为信号无输出或接…...

优先队列实战:用分支限界法解决最小权顶点覆盖问题(附Python代码)

优先队列实战:用分支限界法解决最小权顶点覆盖问题(附Python代码) 在算法竞赛和实际工程中,图论问题往往需要高效的解决方案。最小权顶点覆盖问题(Minimum Weight Vertex Cover, MWVC)是一个经典的NP难问题…...

LiveKit Agents 在科研领域的10个创新应用案例:构建实时多模态AI应用

LiveKit Agents 在科研领域的10个创新应用案例:构建实时多模态AI应用 【免费下载链接】agents Build real-time multimodal AI applications 🤖🎙️📹 项目地址: https://gitcode.com/GitHub_Trending/agen/agents LiveKi…...

3个为什么你需要Windows Cleaner:告别C盘爆红的终极解决方案

3个为什么你需要Windows Cleaner:告别C盘爆红的终极解决方案 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 当你的C盘图标突然变红,系统弹…...

告别SFTP客户端!用SSHFS在Mac访达直接编辑远程服务器文件(保姆级教程)

告别SFTP客户端!用SSHFS在Mac访达直接编辑远程服务器文件(保姆级教程) 对于需要频繁操作远程服务器文件的开发者来说,传统的SFTP客户端虽然功能完善,但每次上传下载的繁琐操作总会打断工作流。想象一下,如…...

MinIO vs 阿里云OSS:自建文件服务器的成本与性能对比

MinIO与商业云存储的终极对决:技术决策者的成本效益分析指南 当企业需要存储海量非结构化数据时,技术决策者往往面临一个关键选择:采用MinIO自建文件服务器,还是直接购买阿里云OSS等商业云存储服务?这个看似简单的选择…...

新手必看:GitHub_Trending/agen/agentkit常见问题与解决方案汇总

新手必看:GitHub_Trending/agen/agentkit常见问题与解决方案汇总 【免费下载链接】agentkit Every AI Agent deserves a wallet. 项目地址: https://gitcode.com/GitHub_Trending/agen/agentkit GitHub_Trending/agen/agentkit是一款为AI Agent提供钱包功能的…...