【随手笔记】FLASH-W25Q16(三)
#include "bsp_w25q16.h"/*内部函数声明区*/
static HAL_StatusTypeDef bsp_w25q_Transmit(uint8_t * T_pData, uint16_t T_Size);
static HAL_StatusTypeDef bsp_w25q_Receive(uint8_t * R_pData, uint16_t R_Size);/*内部函数定义区*//*
函数参数:1、T_pData:发送数据缓冲区中取出数据发送出去2、T_Size :需要发送的数据的长度
*/
static HAL_StatusTypeDef bsp_w25q_Transmit(uint8_t * T_pData, uint16_t T_Size)
{return HAL_SPI_Transmit(&W25Q_SPI, T_pData, T_Size, 0xffff);
}/*
函数参数:1、R_pData:接收数据并放置到接收数据缓冲区中2、R_Size :需要接收的数据的长度
*/
static HAL_StatusTypeDef bsp_w25q_Receive(uint8_t * R_pData, uint16_t R_Size)
{return HAL_SPI_Receive(&W25Q_SPI, R_pData, R_Size, 0xffff);
}/*
写使能或失能参数:Type:1、为1时使能2、为0时失能
*/
HAL_StatusTypeDef Bsp_Write_En_De(uint8_t Type)
{uint8_t cmd;HAL_StatusTypeDef STD = HAL_ERROR;W25Q_CS_Level(0);SPI_Delay(1);switch(Type){case 1:cmd = W25Q_W_EN;break;case 0:cmd = W25Q_W_DIS;break;default:cmd = W25Q_W_DIS;break;}if(bsp_w25q_Transmit(&cmd, 1) == HAL_OK){STD = HAL_OK;}W25Q_CS_Level(1);return STD;
}/*
读状态寄存器参数:Select1、为0时是寄存器12、为1时是寄存器2参数:State(指针)1、返回的状态标志流程:先写入命令,然后读取状态
*/
HAL_StatusTypeDef Bsp_Read_State_Reg(uint8_t Select, uint8_t* State)
{uint8_t cmd;HAL_StatusTypeDef STD = HAL_ERROR;W25Q_CS_Level(0);SPI_Delay(1);switch(Select){case 0:cmd = W25Q_R_STA_REG1;break;case 1:cmd = W25Q_R_STA_REG2;break;default:cmd = W25Q_R_STA_REG1;break;}if(bsp_w25q_Transmit(&cmd, 1) == HAL_OK){if(bsp_w25q_Receive(State,1) == HAL_OK){STD = HAL_OK;}}W25Q_CS_Level(1);return STD;
}/*
判忙用处:判断当前flash是否在忙碌状态BUSY只读寄存器忙时高电平空闲低电平
*/
void Bsp_Judge_Busy(void)
{uint8_t State;do{Bsp_Read_State_Reg(0, &State); //不要用指针类型局部变量传进去,必被卡死State &= 0x01;}while(State == 0x01);//寄存器为1时为忙
}/*
读数据参数:R_Addr1、读取数据的地址参数:R_Data(数组指针)1、获取读取的数据参数:R_Size1、读取的数据的大小
*/
HAL_StatusTypeDef Bsp_W25Q_Read_Data(uint32_t R_Addr, uint8_t * R_Data, uint16_t R_Size)
{HAL_StatusTypeDef STD = HAL_ERROR;uint8_t addr[4] = {0};addr[0] = W25Q_R_Data;addr[1] = (R_Addr >> 16) & 0xFF;addr[2] = (R_Addr >> 8) & 0xFF;addr[3] = (R_Addr) & 0xFF;Bsp_Judge_Busy(); //判忙W25Q_CS_Level(0);SPI_Delay(1);if(bsp_w25q_Transmit(addr, 4) == HAL_OK){if(bsp_w25q_Receive(R_Data,R_Size) == HAL_OK){STD = HAL_OK;}}W25Q_CS_Level(1);return STD;
}/*
写数据-页页的描述:1字节到 256 字节(一页)页写的前提条件:编程之前必须保证额你存空间是0xff,所以得先进行擦除(擦除后模式全为1)页写的注意事项:进行页编程时,如果数据字节数超过了 256 字节,地址将自动回到页的起始地址,覆盖掉之前的数据。参数:WriteAddr1、地址,三个字节地址参数:PW_Data(数组指针)1、要写入的数据,长度根据PW_size来定2、高位先传参数:PW_Size2、要写入的数据长度先通过状态寄存器判断是否在忙,然后写使能,接着判忙,拉底片选选中,发命令字节0x02,发三个地址,高位优先,然后发你要写的数据,最后拉高片选
*/HAL_StatusTypeDef Bsp_W25Q_Page_Write(uint32_t WriteAddr, uint8_t * PW_Data, uint16_t PW_Size)
{HAL_StatusTypeDef STD = HAL_ERROR;uint8_t addr[4] = {0};addr[0] = W25Q_Page_Program;addr[1] = (WriteAddr >> 16) & 0xFF;addr[2] = (WriteAddr >> 8) & 0xFF;addr[3] = (WriteAddr) & 0xFF;Bsp_Judge_Busy(); //判忙Bsp_Write_En_De(1);Bsp_Judge_Busy();W25Q_CS_Level(0);SPI_Delay(1);if(bsp_w25q_Transmit(addr, 4) == HAL_OK){if(bsp_w25q_Transmit(PW_Data, PW_Size) == HAL_OK){STD = HAL_OK;}}W25Q_CS_Level(1);Bsp_Judge_Busy();return STD;
}/*
扇区擦除扇区的描述:W25Q16总共2MB,分为32块(每块64KB),每块16个扇区,每个扇区4K个字节。扇区的备注:W25Q16的最小擦除单位就是一个扇区所以至少给芯片开辟一个4KB的缓存区,以防止一次性删除太多,而丢失数据。(显然单片机不会给他开辟这么大的空间)参数:num : 扇区的序号*/
HAL_StatusTypeDef Bsp_W25Q_Sector_Erase(uint32_t num)
{HAL_StatusTypeDef STD = HAL_ERROR;//一个扇区有4KB的大小,//为了使找到对应的扇区地址,所以要乘以4KB//(1<<12) = 4096num *= (1<<12);uint8_t addr[4] = {0};addr[0] = W25Q_Sector_Erase;addr[1] = (num >> 16) & 0xFF;addr[2] = (num >> 8) & 0xFF;addr[3] = (num) & 0xFF;Bsp_Judge_Busy();Bsp_Write_En_De(1);Bsp_Judge_Busy();W25Q_CS_Level(0);SPI_Delay(1);if(bsp_w25q_Transmit(addr, 4) == HAL_OK){STD = HAL_OK;}W25Q_CS_Level(1);Bsp_Judge_Busy();return STD;
}/*
块擦除块的描述:W25Q16有2MB的容量,而2MB有32个块,所以1块有64kB的大小,所以这个函数一次能擦除64KB的大小。参数:Block_Addr1、块地址,共32个块,对应32个地址,以64K为单位寻址2、高位先传流程:先开写使能、判忙,再写命令,再写3个字节的地址,最后写失能参数:num : 块的序号
*/
HAL_StatusTypeDef Bsp_W25Q_Block_Erase(uint32_t num)
{uint8_t cmd = W25Q_Block_Erase;HAL_StatusTypeDef STD = HAL_ERROR;//总共有32个块,而一个块有64KB的大小,//为了使找到对应的块地址,所以要乘以64KBnum *= (1<<16);uint8_t addr[4] = {0};addr[0] = W25Q_Block_Erase;addr[1] = (num >> 16) & 0xFF;addr[2] = (num) & 0xFF;addr[3] = (num) & 0xFF;Bsp_Judge_Busy();Bsp_Write_En_De(1);Bsp_Judge_Busy();W25Q_CS_Level(0);SPI_Delay(1);if(bsp_w25q_Transmit(addr, 4) == HAL_OK){STD = HAL_OK;}W25Q_CS_Level(1);Bsp_Judge_Busy();return STD;
}/*
全片擦除描述:直接把芯片全部擦除
*/
HAL_StatusTypeDef Bsp_W25Q_Full_Erase(void)
{uint8_t cmd = W25Q_Full_Erase;HAL_StatusTypeDef STD = HAL_ERROR;Bsp_Judge_Busy();Bsp_Write_En_De(1);Bsp_Judge_Busy();W25Q_CS_Level(0);SPI_Delay(1);if(bsp_w25q_Transmit(&cmd, 1) == HAL_OK){STD = HAL_OK;}W25Q_CS_Level(1);Bsp_Judge_Busy();return STD;
}/*
读ID描述:读3个字节分别是生产厂家、存储器类型、容量
*/
HAL_StatusTypeDef Bsp_Read_Jedec_ID(uint8_t * R_Jedec_ID)
{uint8_t read_id[3] = {0};uint8_t cmd = W25Q_JEDEC_ID;HAL_StatusTypeDef STD = HAL_ERROR;Bsp_Judge_Busy();W25Q_CS_Level(0);SPI_Delay(1);if(bsp_w25q_Transmit(&cmd, 1) == HAL_OK){if(bsp_w25q_Receive(read_id, 3) == HAL_OK){STD = HAL_OK;}}W25Q_CS_Level(1);if(STD == HAL_OK){LOG_OUT("read_id= %x %x %x\r\n", read_id[0], read_id[1], read_id[2]);}else{LOG_OUT("read_id= err\r\n");}return STD;
}/** 电源开启*/
void W26Q16_Power_On(void)
{MX_SPI1_Init();//W25Q_WP_HIGH;rt_thread_mdelay(100);Bsp_Read_Jedec_ID(NULL);}/** 电源关闭*/
void W26Q16_Power_Off(void)
{//WP拉低开启读保护//W25Q_WP_LOW;W25Q_CS_Level(GPIO_PIN_RESET);rt_thread_mdelay(10);//失能SPI配置为IOw25q16_init_sleep();rt_thread_mdelay(1000);
}
#ifndef __DRV_W25Q16_H
#define __DRV_W25Q16_H#include "app_user.h"
#include "spi.h"/*句柄重命名*/
#define W25Q_SPI hspi1#define SPI_Delay(ms) rt_thread_mdelay(ms+1)/*片选引脚定义与函数调用*/
#define W25Q_CS_Pin GPIO_PIN_4
#define W25Q_CS_Port GPIOA#define W25Q_CS_Level(_CS_STATE__) HAL_GPIO_WritePin(W25Q_CS_Port, W25Q_CS_Pin, (GPIO_PinState)_CS_STATE__)//#define W25Q_WP_HIGH HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_SET)
//#define W25Q_WP_LOW HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4, GPIO_PIN_RESET)#define W25Q_W_EN 0x06 //写使能
#define W25Q_W_DIS 0x04 //写禁止#define W25Q_R_Data 0x03 //读数据#define W25Q_R_STA_REG1 0x05 //读状态寄存器1,紧跟着的字节就是当前状态
#define W25Q_R_STA_REG2 0x35 //读状态寄存器2,紧跟着的字节就是当前状态#define W25Q_W_STA_REG 0x01 //写状态寄存器,写入两个字节,分别到寄存器1,和寄存器2#define W25Q_Page_Program 0x02 //页编程,先跟3个地址字节,再跟一个数据字节#define W25Q_Block_Erase 0xD8 //块擦除64k,三个地址字节#define W25Q_Sector_Erase 0x20 //扇区擦除,跟三个地址#define W25Q_Full_Erase 0xC7 //全片擦除//0x60#define W25Q_Susp_Erase 0x75 //暂停擦除#define W25Q_Rest_Erase 0x7A //恢复擦除#define W25Q_PowDow_Mode 0xB9 //掉电模式#define W25Q_HPer_Mode 0xA3 //高性能模式#define W25Q_JEDEC_ID 0x9F //读3个字节分别是生产厂家、存储器类型、容量/*写使能或失能*/
HAL_StatusTypeDef Bsp_Write_En_De(uint8_t Type);/*读状态寄存器*/
HAL_StatusTypeDef Bsp_Read_State_Reg(uint8_t Select, uint8_t* State);/*判忙*/
void Bsp_Judge_Busy(void);/*读数据*/
HAL_StatusTypeDef Bsp_W25Q_Read_Data(uint32_t R_Addr, uint8_t * R_Data, uint16_t R_Size);/*页写*/
HAL_StatusTypeDef Bsp_W25Q_Page_Write(uint32_t WriteAddr, uint8_t * PW_Data, uint16_t PW_Size);/*扇区擦除*/
HAL_StatusTypeDef Bsp_W25Q_Sector_Erase(uint32_t num);/*块擦除*/
HAL_StatusTypeDef Bsp_W25Q_Block_Erase(uint32_t num);/*全片擦除*/
HAL_StatusTypeDef Bsp_W25Q_Full_Erase(void);/*读ID*/
HAL_StatusTypeDef Bsp_Read_Jedec_ID(uint8_t * R_Jedec_ID);void W26Q16_Power_On(void);
void W26Q16_Power_Off(void);
#endif /*W25Q16__H__*/
/* USER CODE BEGIN Header */
/********************************************************************************* @file spi.c* @brief This file provides code for the configuration* of the SPI instances.******************************************************************************* @attention** Copyright (c) 2024 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "spi.h"/* USER CODE BEGIN 0 *//* USER CODE END 0 */SPI_HandleTypeDef hspi1;/* SPI1 init function */
void MX_SPI1_Init(void)
{/* USER CODE BEGIN SPI1_Init 0 *//* USER CODE END SPI1_Init 0 *//* USER CODE BEGIN SPI1_Init 1 *//* USER CODE END SPI1_Init 1 */hspi1.Instance = SPI1;hspi1.Init.Mode = SPI_MODE_MASTER;hspi1.Init.Direction = SPI_DIRECTION_2LINES;hspi1.Init.DataSize = SPI_DATASIZE_8BIT;hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;hspi1.Init.NSS = SPI_NSS_SOFT;hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;hspi1.Init.TIMode = SPI_TIMODE_DISABLE;hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;hspi1.Init.CRCPolynomial = 7;if (HAL_SPI_Init(&hspi1) != HAL_OK){Error_Handler();}/* USER CODE BEGIN SPI1_Init 2 *//* USER CODE END SPI1_Init 2 */}void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};if(spiHandle->Instance==SPI1){/* USER CODE BEGIN SPI1_MspInit 0 *//* USER CODE END SPI1_MspInit 0 *//* SPI1 clock enable */__HAL_RCC_SPI1_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/**SPI1 GPIO ConfigurationPA5 ------> SPI1_SCKPA6 ------> SPI1_MISOPA7 ------> SPI1_MOSI*/GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStruct.Alternate = GPIO_AF0_SPI1;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/* USER CODE BEGIN SPI1_MspInit 1 *//* USER CODE END SPI1_MspInit 1 */}
}void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle)
{if(spiHandle->Instance==SPI1){/* USER CODE BEGIN SPI1_MspDeInit 0 *//* USER CODE END SPI1_MspDeInit 0 *//* Peripheral clock disable */__HAL_RCC_SPI1_CLK_DISABLE();/**SPI1 GPIO ConfigurationPA5 ------> SPI1_SCKPA6 ------> SPI1_MISOPA7 ------> SPI1_MOSI*/HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);/* USER CODE BEGIN SPI1_MspDeInit 1 *//* USER CODE END SPI1_MspDeInit 1 */}
}/* USER CODE BEGIN 1 *//* USER CODE END 1 */
void w25q16_init_sleep(void)
{extern SPI_HandleTypeDef hspi1;HAL_SPI_DeInit(&hspi1);__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_PULLDOWN;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_RESET);
}
相关文章:
【随手笔记】FLASH-W25Q16(三)
#include "bsp_w25q16.h"/*内部函数声明区*/ static HAL_StatusTypeDef bsp_w25q_Transmit(uint8_t * T_pData, uint16_t T_Size); static HAL_StatusTypeDef bsp_w25q_Receive(uint8_t * R_pData, uint16_t R_Size);/*内部函数定义区*//* 函数参数:1、T_…...

2024软件测试面试热点问题
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 大厂面试热点问题 1、测试人员需要何时参加需求分析? 如果条件循序 原则上来说 是越早介入需求分析越好 因为测试人员对需求理解越深刻 对测试工…...

【JAVA】java 企业微信信息推送
前言 JAVA中 将信息 推送到企业微信 // 企微消息推送messageprivate String getMessage(String name, String problemType, String pushResults, Long orderId,java.util.Date submitTime, java.util.Date payTime) {String message "对接方:<font color\…...

介绍一下数组(c基础)(smart 版)
c初期,记住规则,用规则。 我只是介绍规则。(有详细版,这适合smart人看) 数组(同类型) int arr[n] {} ; int 是 元素类型。 int arr[n] {} ; arr为标识符。 {} 集合,元素有次…...

Java项目实战II基于Spring Boot的个人云盘管理系统设计与实现(开发文档+数据库+源码)
目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 基于Spring Boot的个人云盘管理系统设计…...
探索数据科学与大数据技术专业本科生的广阔就业前景
随着信息技术的不断发展,数据科学与大数据技术已经成为各大行业的关键推动力。在这样一个数据驱动的时代,越来越多的企业依赖数据来驱动决策、优化运营和创造价值。因此,数据科学与大数据技术专业的本科生在就业市场上具有广阔的前景和多样的…...
微服务架构面试内容整理-Zuul
Zuul 是由 Netflix 开发的一个边缘服务(API 网关),用于动态路由、监控、认证、以及对微服务架构中的请求进行过滤。它在微服务架构中扮演着重要的角色,提供了一种集中管理和控制服务访问的方式。以下是 Zuul 的主要特点、工作原理和使用场景: 主要特点 1. 动态路由: Zuu…...

解决Knife4j 接口界面UI中文乱码问题
1、查看乱码情况 2、修改 编码设置 3、删除 target 文件 项目重新启动 被坑死了...
微服务架构面试内容整理-Sleuth
Spring Cloud Sleuth 是一个分布式追踪工具,用于监控微服务系统中请求的传播情况。它通过在微服务之间传递追踪信息,帮助开发者理解系统的行为,快速定位性能瓶颈和问题。以下是 Sleuth 的主要特点、工作原理和使用场景: 主要特点 …...
Go语言的接口示例
Go语言的接口(interface)是一种轻量级的多态性实现方式,是构建高扩展性、高复用性代码的利器。Go语言的接口非常灵活,不要求显式的实现声明,只要一个类型实现了接口规定的方法,它就可以被视为该接口的实现者。在本篇博客中,我们将通过多个实际示例,探讨Go语言接口的使用…...

【Apache ECharts】<农作物病害发生防治面积>
在vs Code里打开, 实现 1. 首先引入 echarts.min.js 资源 2. 在body部分设一个 div,设置 id 为 main 3. 设置 script 3.1 基于准备好的dom,初始化echarts实例 var myChart echarts.init(document.getElementById(main)); 3.2 指定图表的…...

基于vue3实现的聊天机器人前端(附代码)
<template><div class"container"><!-- 页面头部 --><header><h1>跟它说说话吧!</h1><p>一个活泼的伙伴,为你提供情感支持!</p></header><!-- 聊天容器 --><div c…...

DICOM标准:深入详解DICOM医学影像中的传输语法
引言 DICOM(数字成像和通信医学)标准在医学影像数据交换中扮演着至关重要的角色。其中,*传输语法(Transfer Syntax)是DICOM标准中定义数据编码和传输方式的核心部分。理解传输语法对于确保不同设备和系统之间的互操作性…...
sql server 文件备份恢复
数据库介绍文件组 PRIMARY 文件 lys D:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\lys.mdf lys_02 D:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\lys_02.ndf文件组 sec 有2个表(sec_1,sec_2) 文件 …...

Gradle命令编译Android Studio工程项目并签名
文章目录 gradlew命令gradlew编译debug apkgradlew编译release apkapksigner签名apkgradlew注意事项 gradlew命令 gradlew 是一个脚本文件,它允许你在没有全局安装 Gradle 的情况下运行 Gradle 构建。这个脚本在多平台上可用,对于 Windows 系统来说是 g…...
lua入门教程:垃圾回收
Lua的垃圾回收机制是一种自动内存管理方式,用于回收不再被程序访问的对象,从而避免内存泄漏。以下是一个关于Lua垃圾回收机制的详细教程: 一、Lua垃圾回收机制概述 Lua使用自动内存管理,这意味着程序员不需要手动释放内存。Lua的…...

基于前后端分离架构,SaaS云平台与私有云部署的智慧校园源码,java电子班牌源码
基于前后端分离架构,SaaS云平台与私有云部署的智慧校园源码,java电子班牌源码,自主研发,自主版权,上百个学校应用案例,支持二次开发。 在信息技术飞速发展的今天,教育领域也迎来了一场革命性的变…...
知识总结五
一、C深浅拷贝 浅拷贝:只复制对象的成员变量的值,如果成员变量包含指针,则只复制指针值,不复制指针所指向的数据。深拷贝:复制对象的成员变量的值,并且如果成员变量包含指针,则还复制指针所指向…...

一、初识C语言(1)
1.C语言识别的是二进制语言 C语言是一门计算机语言,计算机是硬件,硬件分通电(1)和 未通电(0)两种情况,所以C语言识别的都是0 / 1信号,也就是二进制语言。 2.C语言文件类型以及基本框…...
petty 状态管理库文档
自研 Petty 状态管理库产生背景 petty 是一款适用于 vue2.5以下版本(目前已兼容vue2.5x 以上版本)的状态管理库,能够在 vue 2这种配置项的代码中,去实现类似于 vue3 里的 pinia、React 里的hook的调用形式,用函数式的…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...