STM32F429IGT6使用CubeMX配置SPI通信(W25Q256芯片)

news2024/11/26 20:00:50

1、硬件电路

需要系统性的看一下W25Q256芯片手册 

2、设置RCC,选择高速外部时钟HSE,时钟设置为180MHz

3、配置SPI

 

4、生成工程配置

 

5、相关代码

#define sFLASH_ID 0XEF4019 // W25Q256

#define SPI_FLASH_PageSize 256
#define SPI_FLASH_PerWritePageSize 256

#define W25Q256_WriteEnable 0x06    // 写使能指令
#define W25Q256_WriteDisable 0x04   // 写屏蔽指令
#define W25Q256_ReadStatusReg 0x05  // 读取状态寄存器1
#define W25Q256_WriteStatusReg 0x01 // 写入状态寄存器1
//#define W25Q256_ReadData 0x03       // 3字节模式读取数据指令
#define W25Q256_ReadData 0x13       // 4字节模式读取数据指令
#define W25Q256_FastReadData 0x0B   //
#define W25Q256_FastReadDual 0x3B
#define W25Q256_PageProgram 0x02 // 页写入指令
#define W25Q256_BlockErase 0xD8
#define W25Q256_SectorErase 0x20
#define W25Q256_ChipErase 0xC7
#define W25Q256_PowerDown 0xB9
#define W25Q256_ReleasePowerDown 0xAB
#define W25Q256_DeviceID 0xAB
#define W25Q256_ManufactDeviceID 0x90
#define W25Q256_JedecDeviceID 0x9F
#define W25Q256_Enter4ByteMode 0xB7 // 4字节地址模式指令
#define W25Q256_ReadStatusRegister3 0x15
#define W25Q256_WriteStatusRegister3 0x11   //写状态寄存器3指令
#define WIP_Flag 0x01
#define Dummy_Byte 0xFF

#define FLASH_WriteAddress 0x00000
#define FLASH_ReadAddress FLASH_WriteAddress
#define FLASH_SectorToErase FLASH_WriteAddress

/* 获取缓冲区的长度 */
#define TxBufferSize1 (countof(TxBuffer1) - 1)
#define RxBufferSize1 (countof(TxBuffer1) - 1)
#define countof(a) (sizeof(a) / sizeof(*(a)))
#define BufferSize (countof(Tx_Buffer) - 1)

#define FLASH_WriteAddress 0x00000
#define FLASH_ReadAddress FLASH_WriteAddress
#define FLASH_SectorToErase FLASH_WriteAddress

/* 发送缓冲区初始化 */
extern uint8_t ReadBuff[4096];
extern uint8_t WriteBuff[4096];

/**
 * @brief   拉低片选线
 * @param   无
 * @retval  无
 */
void SPI_FLASH_NSS_LOW(void)
{
    HAL_GPIO_WritePin(SPI5_NSS_GPIO_Port, SPI5_NSS_Pin, GPIO_PIN_RESET);
}

/**
 * @brief   拉高片选线
 * @param   无
 * @retval  无
 */
void SPI_FLASH_NSS_HIGH(void)
{
    HAL_GPIO_WritePin(SPI5_NSS_GPIO_Port, SPI5_NSS_Pin, GPIO_PIN_SET);
}

/**
 * @brief   获取 FLASH ID
 * @param   无
 * @retval  FLASH ID
 */
uint32_t SPI_FLASH_ReadID(void)
{
    uint32_t temp = 0;
    uint32_t temp0 = 0;
    uint32_t temp1 = 0;
    uint32_t temp2 = 0;
    // 拉低片选线,开始通信
    SPI_FLASH_NSS_LOW();
    // 发送获取W25Q256芯片ID指令
    SPI_FLASH_SendByte(W25Q256_JedecDeviceID);
    // 接收数据
    temp0 = SPI_FLASH_ReadByte();
    temp1 = SPI_FLASH_ReadByte();
    temp2 = SPI_FLASH_ReadByte();
    // 拉高片选线,结束通信
    SPI_FLASH_NSS_HIGH();
    temp = temp0 << 16 | temp1 << 8 | temp2;
    return temp;
}

/**
 * @brief   发送一个字节
 * @param   无
 * @retval  无
 */
void SPI_FLASH_SendByte(uint8_t ch)
{
    HAL_SPI_Transmit(&hspi5, &ch, 1, 500);
}

/**
 * @brief   发送n个字节
 * @param   pData:发送数据首地址
 * @param   data_number:发送数据个数(以字节为单位)
 * @retval  无
 */
void SPI_FLASH_SendnByte(uint8_t *pData, uint32_t data_number)
{
    HAL_SPI_Transmit(&hspi5, pData, data_number, 500);
}

/**
 * @brief   接收一个字节
 * @param   无
 * @retval  接收的数据
 */
uint8_t SPI_FLASH_ReadByte(void)
{
    uint8_t rxData = 0;
    HAL_SPI_Receive(&hspi5, &rxData, 1, 500);
    return rxData;
}

/**
 * @brief   接收n个字节
 * @param   pData:接收数据首地址
 * @param   data_number:接收数据个数(以字节为单位)
 * @retval  无
 */
void SPI_FLASH_ReadnByte(uint8_t *pData, uint32_t data_number)
{
    HAL_SPI_Receive(&hspi5, pData, data_number, 500);
}

/**
 * @brief   使能写命令
 * @param   无
 * @param   无
 * @retval  无
 */
void SPI_FLASH_WriteEnable(void)
{
    // 拉低片选线,开始通信
    SPI_FLASH_NSS_LOW();
    // 发送写使能指令
    SPI_FLASH_SendByte(W25Q256_WriteEnable);
    // 拉高片选线,结束通信
    SPI_FLASH_NSS_HIGH();
}

/**
 * @brief   等待写入、擦除等操作完成
 * @param   无
 * @param   无
 * @retval  无
 */
void SPI_FLASH_WaitForWriteEnd(void)
{
    uint8_t FLASH_Status = 0;
    // 拉低片选线,开始通信
    SPI_FLASH_NSS_LOW();
    // 发送写状态寄存器1指令
    SPI_FLASH_SendByte(W25Q256_ReadStatusReg);
    do
    {
        // 获取写状态寄存器1的值并做判断。0:空闲、1:忙碌
        FLASH_Status = SPI_FLASH_ReadByte();
    } while (SET == (FLASH_Status & WIP_Flag));

    // 拉高片选线,结束通信
    SPI_FLASH_NSS_HIGH();
}

/**
 * @brief   擦除扇区
 * @param   SectorAddr:擦除扇区首地址
 * @retval  无
 */
void SPI_FLASH_SectorErase(uint32_t SectorAddr)
{
    // uint8_t ADDR[4] = {0x00,0x00,0x00,0x00};
    //  使能写命令
    SPI_FLASH_WriteEnable();
    // 拉低片选线,开始通信
    SPI_FLASH_NSS_LOW();
    // 发送擦除扇区命令
    SPI_FLASH_SendByte(W25Q256_SectorErase);
    // 发送擦除地址24 ~ 31bit
    SPI_FLASH_SendByte((SectorAddr & 0xFF000000) >> 24);
    // 发送擦除地址16 ~ 23bit
    SPI_FLASH_SendByte((SectorAddr & 0xFF0000) >> 16);
    // 发送擦除地址8 ~ 15bit
    SPI_FLASH_SendByte((SectorAddr & 0xFF00) >> 8);
    // 发送擦除地址0 ~ 7bit
    SPI_FLASH_SendByte(SectorAddr & 0xFF);
    // 拉高片选线,结束通信
    SPI_FLASH_NSS_HIGH();
    // HAL_Delay(3000);
    // 等待擦除操作结束
    SPI_FLASH_WaitForOperaEnd();
}

/**
 * @brief   配置4字节模式
 * @param   无
 * @retval  无
 */
void SPI_FLASH_FOUR_MODE(void)
{
    uint8_t temp = 0;
    // 使能写命令
    SPI_FLASH_WriteEnable();
    // 拉低片选线,开始通信
    SPI_FLASH_NSS_LOW();
    // 发送写状态寄存器3命令
    SPI_FLASH_SendByte(W25Q256_WriteStatusRegister3);
    // 发送要写的数据
    SPI_FLASH_SendByte(0x02);

    // 拉高片选线,结束通信
    SPI_FLASH_NSS_HIGH();

    // 拉低片选线,开始通信
    SPI_FLASH_NSS_LOW();
    // 发送读状态寄存器3命令
    SPI_FLASH_SendByte(W25Q256_ReadStatusRegister3);
    // 读取数据
    temp = SPI_FLASH_ReadByte();
    // 拉高片选线,结束通信
    SPI_FLASH_NSS_HIGH();

    if (1 == (0x02 & temp))
    {
        // 拉低片选线,开始通信
        SPI_FLASH_NSS_LOW();
        // 发送配置四字节模式指令
        SPI_FLASH_SendByte(W25Q256_Enter4ByteMode);
        // 拉高片选线,结束通信
        SPI_FLASH_NSS_HIGH();
    }
    SPI_FLASH_WaitForOperaEnd();
}

/**
 * @brief   对 FLASH 按页写入数据,调用本函数写入数据前需要先擦除扇区
 * @param   pBuffer:要写入数据的指针
 * @param   WriteAddr:写入数据地址
 * @param   NumByteToWrite:写入数据长度。必须小于等于SPI_FLASH_PerWritePageSize
 * @retval  无
 */
void SPI_FLASH_PageWrite(uint8_t *pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite)
{
    // 使能写命令
    SPI_FLASH_WriteEnable();
    // 拉低片选线,开始通信
    SPI_FLASH_NSS_LOW();
    // 发送页写入指令
    SPI_FLASH_SendByte(W25Q256_PageProgram);
    // 发送写入地址[24,31]bit
    SPI_FLASH_SendByte((WriteAddr & 0xFF000000) >> 24);
    // 发送写入地址[16,23]bit
    SPI_FLASH_SendByte((WriteAddr & 0xFF0000) >> 16);
    // 发送写入地址[8,15]bit
    SPI_FLASH_SendByte((WriteAddr & 0xFF00) >> 8);
    // 发送写入地址[0,7]bit
    SPI_FLASH_SendByte(WriteAddr & 0xFF);
    if (NumByteToWrite > SPI_FLASH_PerWritePageSize)
    {
        NumByteToWrite = SPI_FLASH_PerWritePageSize;
        printf("256\r\n");
    }
    for (int i = 0; i < NumByteToWrite; i++)
    {
        SPI_FLASH_SendByte(pBuffer[i]);
    }
    // 拉高片选线,结束通信
    SPI_FLASH_NSS_HIGH();
}

/**
 * @brief   FALSH不定量数据写入函数,调用本函数写入数据前需要先擦除扇区
 * @param   pBuffer:要写入数据的指针
 * @param   WriteAddr:写入数据地址
 * @param   NumByteToWrite:写入数据长度
 * @retval  无
 */
void SPI_FLASH_BufferWrite(uint8_t *pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite)
{
    uint8_t NumOfPage = 0;
    uint8_t NumOfSingle = 0;
    uint8_t Addr = 0;
    uint8_t count = 0;
    uint8_t temp = 0;
    /*mod 运算求余,若 writeAddr 是 SPI_FLASH_PageSize 整数倍,运算结果 Addr 值为0*/
    Addr = WriteAddr % SPI_FLASH_PageSize;
    /* 差 count 个数据值,刚好可以对齐到页地址 */
    count = SPI_FLASH_PageSize - Addr;
    /* 计算出要写多少整数页 */
    NumOfPage = NumByteToWrite / SPI_FLASH_PageSize;
    /*mod 运算求余,计算出剩余不满一页的字节数 */
    NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize;
    /* Addr=0, 则 WriteAddr 刚好按页对齐 aligned */
    if (0 == Addr)
    {
        /*NumByteToWrite < SPI_FLASH_PageSize*/
        if (0 == NumOfPage)
        {
            SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite);
            SPI_FLASH_WaitForOperaEnd(); // 等待操作完成
        }
        else
        {
            /* 先把整数页都写了 */
            for (int i = 0; i < NumOfPage; i++)
            {
                SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite);
                SPI_FLASH_WaitForOperaEnd(); // 等待操作完成
                WriteAddr += SPI_FLASH_PageSize;
                pBuffer += SPI_FLASH_PageSize;
            }
            /* 若有多余的不满一页的数据,把它写完 */
            SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle);
            SPI_FLASH_WaitForOperaEnd(); // 等待操作完成
        }
    }
    else /* 若地址与 SPI_FLASH_PageSize 不对齐 */
    {
        /*NumByteToWrite < SPI_FLASH_PageSize*/
        if (0 == NumOfPage)
        {
            /* 当前页剩余的 count 个位置比 NumOfSingle 小,写不完 */
            if (NumOfSingle > count)
            {
                temp = NumOfSingle - count;
                /* 先写满当前页 */
                SPI_FLASH_PageWrite(pBuffer, WriteAddr, count);
                SPI_FLASH_WaitForOperaEnd(); // 等待操作完成
                WriteAddr += count;
                pBuffer += count;
                /* 再写剩余的数据 */
                SPI_FLASH_PageWrite(pBuffer, WriteAddr, temp);
                SPI_FLASH_WaitForOperaEnd(); // 等待操作完成
            }
            else /* 当前页剩余的 count 个位置能写完 NumOfSingle 个数据 */
            {
                SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite);
                SPI_FLASH_WaitForOperaEnd(); // 等待操作完成
            }
        }
        else /*NumByteToWrite > SPI_FLASH_PageSize*/
        {
            /*先把距离页地址的count个数据减去,计算需要写的页数和NumOfSingle,然后写数据时先把原来减去的count个数据写入,写满当前页*/
            /*再写剩余数据,即计算好的NumOfPage和NumOfSingle*/
            NumByteToWrite -= count;
            NumOfPage = NumByteToWrite / SPI_FLASH_PageSize;
            NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize;
            SPI_FLASH_PageWrite(pBuffer, WriteAddr, count);
            SPI_FLASH_WaitForOperaEnd(); // 等待操作完成
            WriteAddr += count;
            pBuffer += count;
            /* 把整数页都写了 */
            for (int i = 0; i < NumOfPage; i++)
            {
                SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize);
                SPI_FLASH_WaitForOperaEnd(); // 等待操作完成
                WriteAddr += SPI_FLASH_PageSize;
                pBuffer += SPI_FLASH_PageSize;
            }
            if (0 != NumOfSingle)
            {
                SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle);
                SPI_FLASH_WaitForOperaEnd(); // 等待操作完成
            }
        }
    }
}

/**
 * @brief   读取FLASH数据
 * @param   pBuffer:存储读出数据的指针
 * @param   WriteAddr:读取地址
 * @param   NumByteToRead:读取数据长度
 * @retval  无
 */
void SPI_FLASH_BufferRead(uint8_t *pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead)
{
    // 拉低片选线,开始通信
    SPI_FLASH_NSS_LOW();
    // 发送读取数据指令
    SPI_FLASH_SendByte(W25Q256_ReadData);
    // 发送读取地址[24,31]bit
    SPI_FLASH_SendByte((ReadAddr & 0xFF000000) >> 24);
    // 发送读取地址[16,23]bit
    SPI_FLASH_SendByte((ReadAddr & 0xFF0000) >> 16);
    // 发送读取地址[8,15]bit
    SPI_FLASH_SendByte((ReadAddr & 0xFF00) >> 8);
    // 发送读取地址[0,7]bit
    SPI_FLASH_SendByte(ReadAddr & 0xFF);
    // 读取数据
    for (int i = 0; i < NumByteToRead; i++)
    {
        // 读取一个字节数据
        pBuffer[i] = SPI_FLASH_ReadByte();
    }
    // 拉高片选线,结束通信
    SPI_FLASH_NSS_HIGH();
    SPI_FLASH_WaitForOperaEnd(); // 等待操作完成
}

/**
 * @brief   等待写入、擦除等操作结束
 * @param   none
 * @param   none
 * @param   none
 * @retval  none
 */
void SPI_FLASH_WaitForOperaEnd(void)
{
    uint8_t FLASH_Status = 0;
    // 拉低片选线,开始通信
    SPI_FLASH_NSS_LOW();
    // 发送读状态寄存器1指令
    SPI_FLASH_SendByte(W25Q256_ReadStatusReg);
    do
    {
        // 接收读取状态寄存器1寄存器内容
        FLASH_Status = SPI_FLASH_ReadByte();
    } while (SET == (FLASH_Status & WIP_Flag));
    // 拉高片选线,结束通信
    SPI_FLASH_NSS_HIGH();
}
int main(void)
{
    /* USER CODE BEGIN 1 */

    /* USER CODE END 1 */

    /* MCU Configuration--------------------------------------------------------*/

    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    HAL_Init();

    /* USER CODE BEGIN Init */

    /* USER CODE END Init */

    /* Configure the system clock */
    SystemClock_Config();

    /* USER CODE BEGIN SysInit */

    /* USER CODE END SysInit */

    /* Initialize all configured peripherals */
    MX_GPIO_Init();
    MX_SPI5_Init();
    MX_USART1_UART_Init();
    /* USER CODE BEGIN 2 */
    // 进入4字节地址模式
    SPI_FLASH_FOUR_MODE();
    printf("W25Q256 SPI readwrite test!!!\r\n");
    device_ID = SPI_FLASH_ReadID();
    printf("device_ID = 0x%x\r\n", device_ID);
    SPI_FLASH_SectorErase(0x00); // 擦除扇区数据
    // 读取擦除后的数据
    SPI_FLASH_BufferRead(ReadBuff, 0x00, 4096);
    printf("*****************读取擦出后的数据*****************\r\n");
    for (int i = 0; i < 4096; i++)
    {
        printf("ReadBuff[%d] = 0x%02x\t", i, ReadBuff[i]);
        if (0 == (i + 1) % 8 && (i + 1) >= 8)
        {
            printf("\r\n");
        }
    }
    for (int i = 0; i < 256; i++)
    {
        WriteBuff[i] = i;
    }
    SPI_FLASH_BufferWrite(WriteBuff, 0xFF, 256);
    SPI_FLASH_WaitForOperaEnd(); // 等待操作完成
    // 读数据
    SPI_FLASH_BufferRead(ReadBuff, 0xFF, 256);
    SPI_FLASH_WaitForOperaEnd(); // 等待操作完成
    printf("*****************读取写入后的数据*****************\r\n");
    for (int i = 0; i < 256; i++)
    {
        printf("ReadBuff[%d] = 0x%02x\t", i, ReadBuff[i]);
        if (0 == (i + 1) % 8 && (i + 1) >= 8)
        {
            printf("\r\n");
        }
    }
    /* USER CODE END 2 */

    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    while (1)
    {
        /* USER CODE END WHILE */

        /* USER CODE BEGIN 3 */
        LED_TIME();
    }
    /* USER CODE END 3 */
}

6、实验现象

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/872436.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

爬虫小白-如何辨别请求头referer/origin反爬

目录 一、网站分析二、最终代码一、网站分析 1、网站,研究这块数据从哪个接口来的 2、反爬参数:请求头referer/origin校验和x-api-key 3、详细分析流程,看b站十一姐时一视频, 或者知识星球时光漫漫图文文章 二、最终代码 # -*- coding: utf-8 -*- # @Time : 2023-08-13

为了监控上厕所次数,我开发了一个软件

背景 最近整了一个好玩的东西&#xff0c;一个快捷指令&#xff0c;实现点击之后显示当前的日期&#xff0c;同时后台将这个时间记录到一个文件里。文件在icloud上&#xff0c;实现多个设备的同步。话不多说&#xff0c;先看看效果吧。 这个是我的“软件”图标&#xff1a; 怎…

网络安全 Day30-容器架构上

容器架构上 1. 容器架构1.1 什么是容器1.2 容器 vs 虚拟机(化) :star::star:1.3 Docker极速上手指南1&#xff09;使用rpm包安装docker2) docker下载镜像加速的配置3) 载入镜像大礼包&#xff08;老师资料包中有&#xff09; 1.4 Docker使用案例1&#xff09; 案例01&#xff1…

第12集丨Vue 江湖 —— 内置指令

目录 一、v-text二、v-html2.1 基本使用2.2 cookie原理2.2.1 登入成功后cookies的信息2.2.2 手动增加cookie值2.2.3 cookie edit 三、v-cloak3.1 案例 四、v-once五、v-pre 到本节为止&#xff0c;我们学过的指令: v-bind &#xff1a;单向绑定解析表达式v-model &#xff1a;…

idea生成springboot单元测试用例

1、找到需要生成单元测试的类型&#xff0c;右键Go To -> Test 2、选择JUnit4 和勾选需要测试的方法 3、查看自动生成的文件 public class CategoryMapperTest {Testpublic void findById() {}Testpublic void queryById() {} } 4、添加测试代码 RunWith(SpringRunner.cla…

【JavaEE】懒人的福音-MyBatis框架—[单表]增删改查等常规操作

【JavaEE】MyBatis框架要点总结&#xff08;2&#xff09; 文章目录 【JavaEE】MyBatis框架要点总结&#xff08;2&#xff09;1. 单表查看操作1.1 (条件查询)通过id查找用户1.1.1 接口上声明方法1.1.2 xml文件中去实现方法1.1.3 测试 1.2 传递参数的重点问题&#xff1a;sql注…

【LeetCode周赛】LeetCode第358场周赛

LeetCode第358场周赛 数组中的最大数对和翻倍以链表形式表示的数字限制条件下元素之间的最小绝对差 数组中的最大数对和 给你一个下标从0开始的整数数组nums。请你从nums中找出和最大的一对数&#xff0c;且这两个数数位上最大的数字相等。 返回最大和&#xff0c;如果不存在满…

手机商城网站的分析与设计(论文+源码)_kaic

目录 摘 要 1 1 绪论 2 1.1选题背景意义 2 1.2国内外研究现状 2 1.2.1国内研究现状 2 1.2.2国外研究现状 3 1.3研究内容 3 2 网上手机商城网站相关技术 4 2.1.NET框架 4 2.2Access数据库 4 2.3 JavaScript技术 4 3网上手机商城网站分析与设…

基于grpc从零开始搭建一个准生产分布式应用(3) - GRPC实现

本章开始会进入GRPC子专题&#xff0c;先实现前面章节中提到的例子。然后就使用的知识点展开全面的描述。本章代码任务&#xff1a;1、实现一个简单的GRPC服务&#xff1b;2、实现GRPC拦截器。 本章的代码承接上一章的代码进行迭代。因模块间存在相互依赖关系&#xff0c;读者一…

SpringBoot复习:(42)WebServerCustomizer的customize方法是在哪里被调用的?

ServletWebServletAutoConfiguration类定义如下&#xff1a; 可以看到其中通过Import注解导入了其内部类BeanPostProcessorRegister。 BeanPostProcessor中定义的registerBeanDefinition方法会被Spring容器调用。 registerBeanDefinitions方法调用了RegistrySyntheticBeanIf…

【MongoDB】一文带你快速掌握MongoDB数据库和集合基础操作

文章目录 前言一、案例需求二、数据库操作1. 选择和创建数据库2. 数据库的删除 三、集合操作1. 集合的显式创建&#xff08;了解&#xff09;2. 集合的隐式创建3. 集合的删除 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xff0c;方便…

pycorrector一键式文本纠错工具,整合了BERT、MacBERT、ELECTRA、ERNIE等多种模型,让您立即享受纠错的便利和效果

pycorrector&#xff1a;一键式文本纠错工具&#xff0c;整合了Kenlm、ConvSeq2Seq、BERT、MacBERT、ELECTRA、ERNIE、Transformer、T5等多种模型&#xff0c;让您立即享受纠错的便利和效果 pycorrector: 中文文本纠错工具。支持中文音似、形似、语法错误纠正&#xff0c;pytho…

激活函数总结(七):激活函数补充(Softsign、Threshold、Sinc)

激活函数总结&#xff08;七&#xff09;&#xff1a;激活函数补充 1 引言2 激活函数2.1 Softsign激活函数2.2 Threshold (Unit step activation function) 激活函数2.3 Sinc激活函数 3. 总结 1 引言 在前面的文章中已经介绍了介绍了一系列激活函数 (Sigmoid、Tanh、ReLU、Lea…

Java-运算符和控制语句(下)(基于c语言的补充)

输出到控制台 System.out.println(msg); // 输出一个字符串, 带换行 System.out.print(msg); // 输出一个字符串, 不带换行 System.out.printf(format, msg); // 格式化输出 从键盘输入 使用 Scanner 读取字符串/整数/浮点数 首先需要导入util包 自动导入util包 这里把回车看…

21-因子个数

题目 一个正整数可以分解成一个或多个数组的积。例如362*2*3*3&#xff0c;即包含2和3两个因子。NowCoder最近在研究因子个数的分布规律&#xff0c;现在给出一系列正整数&#xff0c;他希望你开发一个程序输出每个正整数的因子个数。 输入描述: 输入包括多组数据。 每组数…

Ubuntu22开机后正上方弹出“Printer addded(已添加打印)”等提示框

一、问题描述 Ubuntu22开机后正上方弹出“Printer addded&#xff08;已添加打印&#xff09;”等提示框。如下 二、问题分析 1、列出当前所有开机启动服务 service --status-all msmoshui:~$ service --status-all[ - ] alsa-utils[ - ] anacron[ ] apparmor[ ] app…

预测算法|改进粒子群算法优化极限学习机IDM-PSO-ELM

回归拟合&#xff1a; 分类 本文是作者的预测算法系列的第四篇&#xff0c;前面的文章中介绍了BP、SVM、RF及其优化&#xff0c;感兴趣的读者可以在作者往期文章中了解&#xff0c;这一篇将介绍——极限学习机 过去的几十年里基于梯度的学习方法被广泛用于训练神经网络&am…

全网最详细,Pytest自动化测试框架-Fixture固件实战,你要的都有...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 什么是固件 Fixt…

SpringBoot整合Redis完整篇

SpringBoot整合Redis完整篇 1、在springboot项目的pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schem…

用HARU-Net增强核分割:一种基于混合注意的残差u块网络

文章目录 Enhancing Nucleus Segmentation with HARU-Net: A Hybrid Attention Based Residual U-Blocks Network摘要本文方法损失函数后处理消融实验 Enhancing Nucleus Segmentation with HARU-Net: A Hybrid Attention Based Residual U-Blocks Network 摘要 核图像分割是…