STM32F407ZGT6驱动TCA9535扩展16路IO

news2025/2/23 7:33:41

目录

  • 一、TCA9535 I/O 扩展器
    • 1、TCA9535 的 I2C 地址
    • 2、TCA9535 的读写操作
    • 3、TCA9535 的控制寄存器
    • 4、输入寄存器 0/1
    • 5、输出寄存器 0/1
    • 6、极性反转寄存器 0/1
    • 7、配置寄存器 0/1
  • 二、硬件设计
    • 1、接线说明
    • 2、硬件参考
  • 三、程序设计
    • 1、tca9535_softiic.c
    • 2、tca9535_softiic.h
    • 3、main.c
  • 四、功能展示 - 串口显示

一、TCA9535 I/O 扩展器

  • TCA9535 由两个 8 位配置(输入或输出可选)、输入端口、输出端口和极性反转(高电平有效或低电平有效运行)寄存器组成。可为两线双向 I2C 总线或(SMBus)协议提供 16 位通用并行输入和输出(I/O)扩展。
  • 在上电时,I/O 被配置为输入。系统控制器可通过写入 I/O 配置位将 I/O 启用为输入或输出。
  • TCA9535 通常用于控制 LED(用于反馈或状态灯)、控制其他设备的启用或重置信号,甚至读取其他设备或按钮的输出。
  • 三个硬件引脚(A0、A1 和 A2)用于编程和改变固定 I2C 地址,并允许最多 8 个设备共享同一个 I2C 总线或 SMBus。

1、TCA9535 的 I2C 地址

  • TCA9535 具有 3 个硬件地址引脚(A0、A1 和 A2)。用户通过将每个引脚拉至 VCC 或 GND 来选择设备的 I2C 地址,以表示地址中的位值。这样最多可以将 8 个 TCA9535 设备连接到同一总线上而不会发生地址冲突。
  • TCA9535 设备通电时 3 个硬件地址引脚上的电压不得改变,以防止由于传输过程中设备地址更改而导致可能的 I2C 故障。
  • TCA9535 设备的 3 个硬件地址引脚都必须连接到 VCC 或 GND,不能悬空。
  • 目标地址的最后一位定义要执行的操作(读取或写入)。高电平(1)选择读取操作,而低电平(0)选择写入操作。
  • 本文所使用模块将 A2、A1、A0 都接到 GND,即 8 位写地址:‘0100’0000’ (0x40);8 位读地址:‘0100’0001’ (0x41)。

2、TCA9535 的读写操作

  • 数据通过写入和读取命令在控制器和 TCA9535 之间交换,这是通过读取或写入目标设备中的寄存器来实现的。
图 7-3. 启动和停止条件的定义
图 7-4. 位传输
  • 仅当总线空闲时才可以启动数据传输。如果 SDA 和 SCL 线在 STOP 条件后都为高电平,则认为总线处于空闲状态。
  • 如果控制器想要向 TCA9535 发送数据:
    1. 控制器会在总线上发送一个 START 条件,然后发送目标的地址,以及设置为 0 的最后一位(R/W 位),这表示写入;
    2. 在目标发送确认位后,控制器会发送它希望写入的寄存器的寄存器地址;
    3. 目标再次确认,让控制器知道它已准备就绪;
    4. 控制器开始将寄存器数据发送到目标,直到控制器发送了所有必要的数据(有时只有一个字节);
    5. 最后控制器使用 STOP 条件终止传输。
  • 如果控制器想要从 TCA9535 读取数据:
    1. 控制器会在总线上发送一个 START 条件,然后发送目标的地址,以及设置为 0 的最后一位(R/W 位),这表示写入;
    2. 在目标发送确认位后,控制器会发送它希望写入的寄存器的寄存器地址;
    3. 目标再次确认,让控制器知道它已准备就绪;
    4. 控制器再次发送 START 条件,然后发送 R/W 位设置为 1 的目标地址(表示读取);
    5. 目标确认读取请求,控制器继续发出时钟脉冲,但释放 SDA 线,以便目标可以传输数据;
    6. 在每个数据字节结束时,控制器向目标发送 ACK,让目标知道它已准备好接收更多数据;
    7. 当控制器收到预期的字节数时,它会发送 NACK,向目标发出信号以停止通信并释放总线。
    8. 控制器随后会发送 STOP 条件。

在这里插入图片描述
在这里插入图片描述

3、TCA9535 的控制寄存器

  • 成功确认地址字节后,总线控制器将发送表 7-3 所示的命令字节,该命令字节存储在 TCA9535 的控制寄存器中。

在这里插入图片描述

4、输入寄存器 0/1

  • 输入端口寄存器(寄存器 0 和 1)反映了引脚的输入逻辑电平,无论引脚是否由配置寄存器定义为输入或输出。
  • 输入端口寄存器只对读取操作起作用,写入这些寄存器不起作用。
  • 默认值 X 由外部应用的逻辑电平决定。

在这里插入图片描述

5、输出寄存器 0/1

  • 输出端口寄存器(寄存器 2 和 3)显示了由配置寄存器定义为输出的引脚的传出逻辑电平。
  • 此寄存器中的位值对定义为输入的引脚没有影响。反过来,从此寄存器读取的值反映了控制输出选择的触发器中的值,而不是实际的引脚值。

在这里插入图片描述

6、极性反转寄存器 0/1

  • 极性反转寄存器(寄存器 4 和 5)允许对配置寄存器定义为输入的引脚进行极性反转。
  • 如果设置极性反转寄存器中的某个位(写入 1),则相应引脚的极性将反转。
  • 如果清除此寄存器中的某个位(写入 0),则相应引脚的原始极性将保留。

在这里插入图片描述

7、配置寄存器 0/1

  • 配置寄存器(寄存器 6 和 7)配置 I/O 引脚的方向。
  • 如果此寄存器中的某个位设置为 1,则相应的端口引脚将启用为具有高阻抗输出驱动器的输入。
  • 如果此寄存器中的某个位清除为 0,则相应的端口引脚将启用为输出。

在这里插入图片描述

二、硬件设计

1、接线说明

TCA9535STM32F407ZGT6引脚定义
GGND电源负极 GND
V3.3V电源正极 VCC
SCLB9IIC 接口 SDA 数据引脚
SDAB8IIC 接口 SCL 时钟引脚

2、硬件参考

  • TCA9535 具有标准双向 I2C 接口,该接口由控制器设备控制,以便配置或读取此设备的状态。
  • I2C 接口由串行时钟 (SCL) 和串行数据 (SDA) 线组成,SDA 和 SCL 线都必须通过上拉电阻连接到 VCC。
  • INT 具有开漏结构。INT 需要一个合适的上拉电阻到 VCC(通常约为 10 kΩ)。

在这里插入图片描述

在这里插入图片描述

三、程序设计

  • 程序说明:配置端口 P00 ~ P03 为输出,控制 P00 ~ P03 引脚输出高低电平。

1、tca9535_softiic.c

#include "./SYSTEM/delay/delay.h"
#include "./SYSTEM/usart/usart.h"

#include "./BSP/SoftIIC/softiic.h"
#include "./BSP/TCA9535/tca9535_softiic.h"


/**
 * @brief       初始化TCA9535
 * @param       无
 * @retval      无
 */
void TCA9535_Init_SoftIIC(void)
{
    SoftIIC_Init();                                     /* 初始化软件IIC接口 */
    
    TCA9535_ReadAllReg_Data(TCA9535_Address_Read0);     /* 读取TCA9535输出和配置寄存器的数据 */
    
    TCA9535_Set_Cfg(TCA9535_Address_Write0, TCA9535_Output_Port_0|TCA9535_Output_Port_1
                    |TCA9535_Output_Port_2|TCA9535_Output_Port_3);                          /* 设置TCA9535配置寄存器0、1 */
    TCA9535_Set_Output(TCA9535_Address_Write0, TCA9535_Output_Port_ALL_OFF);                /* 设置TCA9535输出寄存器0、1 */
}

/**
 * @brief       读取TCA9535单个寄存器的数据
 * @param       read_address:TCA9535执行读操作时的8位IIC地址
 * @param       reg:要读取的寄存器地址
 * @retval      data:读取到的寄存器数据
 */
uint8_t TCA9535_ReadReg_Data(uint8_t read_address, uint8_t reg)
{
    uint8_t data = 0;                               /* 用于存储读取到的寄存器数据 */
    
    SoftIIC_Start();                                /* 产生软件IIC起始信号 */
    
    SoftIIC_Send_Byte(read_address & ~0x01);        /* 发送设备地址和写命令(最低位为0表示写) */
    SoftIIC_Wait_Ack();                             /* 等待ACK */
    SoftIIC_Send_Byte(reg);                         /* 发送要读取的寄存器地址 */
    SoftIIC_Wait_Ack();                             /* 等待ACK */
    
    SoftIIC_Start();                                /* 再次产生软件IIC起始信号 */
    
    SoftIIC_Send_Byte(read_address);                /* 发送设备地址和读命令(最低位为1表示读) */
    SoftIIC_Wait_Ack();                             /* 等待ACK */
    
    data = SoftIIC_Read_Byte(0);                    /* 读取一个字节的数据,并发送NACK(表示不再读取数据) */
    
    SoftIIC_Stop();                                 /* 产生软件IIC停止信号 */
    
    return data;                                    /* 返回读取到的寄存器数据 */
}

/**
 * @brief       向TCA9535单个寄存器写入数据
 * @param       write_address:TCA9535执行写操作时的8位IIC地址
 * @param       reg:要写入的寄存器地址
 * @param       data:要写入的数据
 * @retval      无
 */
void TCA9535_WriteReg_Data(uint8_t write_address, uint8_t reg, uint8_t data)
{
    SoftIIC_Start();                                /* 产生软件IIC起始信号 */
    
    SoftIIC_Send_Byte(write_address);               /* 发送设备地址和写命令(最低位为0表示写) */
    SoftIIC_Wait_Ack();                             /* 等待ACK */
    SoftIIC_Send_Byte(reg);                         /* 发送要写入的寄存器地址 */
    SoftIIC_Wait_Ack();                             /* 等待ACK */
    SoftIIC_Send_Byte(data);                        /* 发送要写入的数据 */
    SoftIIC_Wait_Ack();                             /* 等待ACK */
    
    SoftIIC_Stop();                                 /* 产生软件IIC停止信号 */
}

/**
 * @brief       读取TCA9535P输出和配置寄存器的数据
 * @param       read_address:TCA9535执行读操作时的8位IIC地址
 * @retval      无
 */
void TCA9535_ReadAllReg_Data(uint8_t read_address)
{
    uint8_t data1,data2,data3,data4;
    
    printf("TCA9535_Output_Port0:");
    data1 = TCA9535_ReadReg_Data(read_address, TCA9535_Output_Port0);              /* 读取TCA9535_Output_Port0寄存器的数据 */
    printf("%X\r\n", data1);
    
    printf("TCA9535_Output_Port1:");
    data2 = TCA9535_ReadReg_Data(read_address, TCA9535_Output_Port1);              /* 读取TCA9535_Output_Port1寄存器的数据 */
    printf("%X\r\n", data2);
    
    printf("TCA9535_Configuration_Port0:");
    data3 = TCA9535_ReadReg_Data(read_address, TCA9535_Configuration_Port0);       /* 读取TCA9535_Configuration_Port0寄存器的数据 */
    printf("%X\r\n", data3);
    
    printf("TCA9535_Configuration_Port1:");
    data4 = TCA9535_ReadReg_Data(read_address, TCA9535_Configuration_Port1);       /* 读取TCA9535_Configuration_Port1寄存器的数据 */
    printf("%X\r\n", data4);
}

/**
 * @brief       设置TCA9535配置寄存器0、1
 * @param       write_address:TCA9535执行写操作时的8位IIC地址
 * @param       data:16位数据,每一位代表一个端口的方向,0表示输出,1表示输入
 * @retval      无
 */
void TCA9535_Set_Cfg(uint8_t write_address, uint16_t data)
{
    uint8_t Cfg_data[2];                                                                /* 定义一个2字节的数组,用于存储配置数据 */
    
    Cfg_data[0] = (uint8_t)~(data & 0x00FF);                                            /* 获取低8位,并取反存储在Cfg_data[0] */
    Cfg_data[1] = (uint8_t)~((data >> 8) & 0x00FF);                                     /* 获取高8位,并取反存储在Cfg_data[1] */
    
    TCA9535_WriteReg_Data(write_address, TCA9535_Configuration_Port0, Cfg_data[0]);     /* 写入配置寄存器Port 0,配置端口的方向 */
    TCA9535_WriteReg_Data(write_address, TCA9535_Configuration_Port1, Cfg_data[1]);     /* 写入配置寄存器Port 1,配置端口的方向 */
}

/**
 * @brief       设置TCA9535输出寄存器0、1
 * @param       write_address:TCA9535执行写操作时的8位IIC地址
 * @param       data:16位数据,每一位代表一个端口的输出状态,0表示低电平,1表示高电平
 * @retval      无
 */
void TCA9535_Set_Output(uint8_t write_address, uint16_t data)
{
    uint8_t output_data[2];                                                             /* 定义一个2字节的数组,用于存储输出数据 */
    
    output_data[0] = (uint8_t)(data & 0x00FF);                                          /* 获取低8位,存储在output_data[0] */
    output_data[1] = (uint8_t)((data >> 8) & 0x00FF);                                   /* 获取高8位,存储在output_data[1] */
    
    TCA9535_WriteReg_Data(write_address, TCA9535_Output_Port0, output_data[0]);         /* 写入输出寄存器Port 0,设置端口的输出状态 */
    TCA9535_WriteReg_Data(write_address, TCA9535_Output_Port1, output_data[1]);         /* 写入输出寄存器Port 1,设置端口的输出状态 */
}

2、tca9535_softiic.h

#ifndef __TCA9535_SOFTIIC_H
#define __TCA9535_SOFTIIC_H

#include "./SYSTEM/sys/sys.h"


/******************************************************************************************/
/* TCA9535 IIC地址 */

/* 8位TCA9535 IIC器件地址 */
#define TCA9535_Address_Write0       TCA9535_Address_LLL << 1
#define TCA9535_Address_Read0        (TCA9535_Address_LLL << 1) | 0x01

/* 7位TCA9535 IIC器件地址 */                /* 0100 A2 A1 A0 */
#define TCA9535_Address_LLL         0x20    /* 0100 000 */
#define TCA9535_Address_LLH         0x21    /* 0100 001 */
#define TCA9535_Address_LHL         0x22    /* 0100 010 */
#define TCA9535_Address_LHH         0x23    /* 0100 011 */
#define TCA9535_Address_HLL         0x24    /* 0100 100 */
#define TCA9535_Address_HLH         0x25    /* 0100 101 */
#define TCA9535_Address_HHL         0x26    /* 0100 110 */
#define TCA9535_Address_HHH         0x27    /* 0100 111 */

/******************************************************************************************/


/******************************************************************************************/
/* TCA9535 寄存器映射 */

#define TCA9535_Input_Port0                     0x00    /* 输入寄存器0,可读不可写 */
#define TCA9535_Input_Port1                     0x01    /* 输入寄存器1,可读不可写 */

#define TCA9535_Output_Port0                    0x02    /* 输出寄存器0,可读可写 */
#define TCA9535_Output_Port1                    0x03    /* 输出寄存器1,可读可写 */

#define TCA9535_Polarity_Inversion_Port0        0x04    /* 极性反转寄存器0,可读可写 */
#define TCA9535_Polarity_Inversion_Port1        0x05    /* 极性反转寄存器1,可读可写 */

#define TCA9535_Configuration_Port0             0x06    /* 配置寄存器0,可读可写 */
#define TCA9535_Configuration_Port1             0x07    /* 配置寄存器1,可读可写 */

/******************************************************************************************/


/******************************************************************************************/
/* TCA9535 配置为输出端口 */

#define TCA9535_Output_Port_0           0x0001      /* 端口PA0 */
#define TCA9535_Output_Port_1           0x0002      /* 端口PA1 */
#define TCA9535_Output_Port_2           0x0004      /* 端口PA2 */
#define TCA9535_Output_Port_3           0x0008      /* 端口PA3 */
#define TCA9535_Output_Port_4           0x0010      /* 端口PA4 */
#define TCA9535_Output_Port_5           0x0020      /* 端口PA5 */
#define TCA9535_Output_Port_6           0x0040      /* 端口PA6 */
#define TCA9535_Output_Port_7           0x0080      /* 端口PA7 */

#define TCA9535_Output_Port_10          0x0100      /* 端口PB0 */
#define TCA9535_Output_Port_11          0x0200      /* 端口PB1 */
#define TCA9535_Output_Port_12          0x0400      /* 端口PB2 */
#define TCA9535_Output_Port_13          0x0800      /* 端口PB3 */
#define TCA9535_Output_Port_14          0x1000      /* 端口PB4 */
#define TCA9535_Output_Port_15          0x2000      /* 端口PB5 */
#define TCA9535_Output_Port_16          0x4000      /* 端口PB6 */
#define TCA9535_Output_Port_17          0x8000      /* 端口PB7 */

#define TCA9535_Output_Port_ALL_ON      0xFFFF      /* 全部打开 */
#define TCA9535_Output_Port_ALL_OFF     0x0000      /* 全部关闭 */

/******************************************************************************************/


/******************************************************************************************/
/* 函数声明 */

void TCA9535_Init_SoftIIC(void);                                                    /* 初始化TCA9535 */

uint8_t TCA9535_ReadReg_Data(uint8_t read_address, uint8_t reg);                    /* 读取TCA9535寄存器的数据 */
void TCA9535_WriteReg_Data(uint8_t write_address, uint8_t reg, uint8_t data);       /* 向TCA9535寄存器写入数据 */
void TCA9535_ReadAllReg_Data(uint8_t read_address);                                 /* 读取TCA9535P输出和配置寄存器的数据 */

void TCA9535_Set_Cfg(uint8_t write_address, uint16_t data);                         /* 设置TCA9535配置寄存器0/1 */
void TCA9535_Set_Output(uint8_t write_address, uint16_t data);                      /* 设置TCA9535输出寄存器0/1 */

/******************************************************************************************/


#endif  /* __TCA9535_SOFTIIC_H */

3、main.c

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "./SYSTEM/usart/usart.h"

#include "./BSP/TCA9535/tca9535_softiic.h"


int main(void)
{
    HAL_Init();                                 /* 初始化HAL库 */
    sys_stm32_clock_init(336, 8, 2, 7);         /* 设置时钟,168Mhz */
    delay_init(168);                            /* 延时初始化 */
    usart_init(115200);                         /* 串口初始化为115200 */
    
    TCA9535_Init_SoftIIC();                     /* TCA9535软件IIC初始化 */
    
    while(1)
    {
        TCA9535_Set_Output(TCA9535_Address_Write0, TCA9535_Output_Port_0|TCA9535_Output_Port_1|TCA9535_Output_Port_2|
                        TCA9535_Output_Port_3);                                         /* 设置TCA9535使能寄存器0、1 */
        TCA9535_ReadAllReg_Data(TCA9535_Address_Read0);                                 /* 读取TCA9535P所有寄存器的数据 */
        
        delay_ms(2000);
        
        TCA9535_Set_Output(TCA9535_Address_Write0, TCA9535_Output_Port_ALL_OFF);         /* 设置TCA9535控制寄存器0、1 */
        TCA9535_ReadAllReg_Data(TCA9535_Address_Read0);                                 /* 读取TCA9535P所有寄存器的数据 */
        
        delay_ms(5000);
    }
}


四、功能展示 - 串口显示

  • 注意:上电后输出寄存器和配置寄存器的所有位默认值为 1。

在这里插入图片描述

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

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

相关文章

一分钟学习数据安全——数据安全风险的系统化应对思路

数据是组织的重要资产&#xff0c;未经授权的数据访问可能导致数据泄露、数据篡改、隐私侵犯和合规风险等问题。企业可以通过数据访问控制来提高信息系统在数据全生命周期管理中的安全性。企业可以引入IAM系统&#xff0c;来控制身份来管理权限。通过对用户访问权限的管理和合适…

空间计算、物理计算、实时仿真与创造拥有「自主行为」的小狗 | 播客《编码人声》

「编码人声」是由「RTE开发者社区」策划的一档播客节目&#xff0c;关注行业发展变革、开发者职涯发展、技术突破以及创业创新&#xff0c;由开发者来分享开发者眼中的工作与生活。 虚拟世界与现实世界的界限逐渐模糊&#xff0c;已然成为不争的事实。但究竟哪些曾经的幻想已然…

shell脚本(三)

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…

一次封装,解放双手:Requests如何实现0入侵请求与响应的智能加解密

引言 之前写了 Requests 自动重试的文章&#xff0c;突然想到&#xff0c;之前还用到过 Requests 自动加解密请求的逻辑&#xff0c;分享一下。之前在做逆向的时候&#xff0c;发现一般医院的小程序请求会这么玩&#xff0c;请求数据可能加密也可能不加密&#xff0c;但是返回…

基于Springboot+Vue的救灾物资调动系统 (含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 这个系…

『 Linux 』网络层 - IP协议(一)

文章目录 IP协议报文格式IP协议报文如何进行报头与有效载荷分离 网段划分CIDR特殊的IP地址 IP地址的数量限制私有IP和公网IP理解运营商 IP协议报文格式 IP协议报文格式与TCP协议的报文格式类似; IP报文的宽度也是32位; 对应的IP的实际报头为20字节为定长报头(固定长度); 版本 …

[cg] vulkan external_memory

最近在写硬件编码的代码&#xff0c;渲染器渲染出的RT需要给到编码器做硬编&#xff0c;有两种方法能做。 一是通过 map的方式&#xff0c;把显存里的数据读到cpu&#xff0c;拷贝一份cpu data给编码器&#xff0c;但这种方式会有内存拷贝的开销。所以&#xff0c;我们思考是否…

springboot课程答疑系统(代码+数据库+LW)

摘要 随着信息互联网信息的飞速发展&#xff0c;无纸化作业变成了一种趋势&#xff0c;针对这个问题开发一个专门适应师生交流形式的网站。本文介绍了课程答疑系统的开发全过程。通过分析企业对于课程答疑系统的需求&#xff0c;创建了一个计算机管理课程答疑系统的方案。文章…

# issue 4 进程控制函数

目录 一、进程控制函数一 二、进程控制函数二 启动进程&#xff1a;&#xff08;exec系列&#xff09; 创建新进程&#xff1a; 测试代码&#xff1a; 测试结果&#xff1a; 三、进程控制函数三 结束进程&#xff1a; 测试代码&#xff1a; 测试结果&#xff1a; 四、…

Linux|进程程序替换

目录 什么是进程替换 替换原理 exec函数 exec* 函数的共性 什么是进程替换 进程程序替换是指将一个进程中正在运行的程序替换为另一个全新的程序的过程&#xff0c;但替换不是创建新进程&#xff0c;只是将对应程序的代码和数据进行替换。具体来说&#xff0c;这个替换过程涉…

2024 APMCM亚太数学建模C题 - 宠物行业及相关产业的发展分析和策略(详细解题思路)

在当下&#xff0c; 日益发展的时代&#xff0c;宠物的数量应该均为稳步上升&#xff0c;在美国出现了下降的趋势&#xff0c; 中国 2019-2020 年也下降&#xff0c;这部分变化可能与疫情相关。需要对该部分进行必要的解释说明。 问题 1: 基于附件 1 中的数据及您的团队收集的…

人工智能(AI)与机器学习(ML)基础知识

目录 1. 人工智能与机器学习的核心概念 什么是人工智能&#xff08;AI&#xff09;&#xff1f; 什么是机器学习&#xff08;ML&#xff09;&#xff1f; 什么是深度学习&#xff08;DL&#xff09;&#xff1f; 2. 机器学习的三大类型 &#xff08;1&#xff09;监督式学…

【从零开始的LeetCode-算法】3233. 统计不是特殊数字的数字数量

给你两个 正整数 l 和 r。对于任何数字 x&#xff0c;x 的所有正因数&#xff08;除了 x 本身&#xff09;被称为 x 的 真因数。 如果一个数字恰好仅有两个 真因数&#xff0c;则称该数字为 特殊数字。例如&#xff1a; 数字 4 是 特殊数字&#xff0c;因为它的真因数为 1 和…

web——sqliabs靶场——第十二关——(基于错误的双引号 POST 型字符型变形的注入)

判断注入类型 a OR 1 1# 发现没有报错 &#xff0c;说明单引号不是闭合类型 测试别的注入条件 a) OR 1 1# a)) OR 1 1# a" OR 11 发现可以用双引号闭合 发现是")闭合 之后的流程还是与11关一样 爆破显示位 先抓包 是post传参&#xff0c;用hackbar来传参 unam…

IDEA 下载源码很慢,Download Source使用阿里云镜像仓库

参考&#xff1a; IDEA maven本地仓库、中心仓库、远程仓库配置 在观看第三方jar包的api时&#xff0c;有时候需要下载源码看下注释。 这个时候用idea 上的提示的Download Source会发现一直下载不下来。 因此就怀疑用的是apache的maven仓库&#xff0c;不是我们用的 aliyun 镜…

1+X应急响应(网络)病毒与木马的处置:

病毒与木马的处置&#xff1a; 病毒与木马的简介&#xff1a; 病毒和木马的排查与恢复&#xff1a;

2024年亚太地区数学建模大赛D题-探索量子加速人工智能的前沿领域

量子计算在解决复杂问题和处理大规模数据集方面具有巨大的潜力&#xff0c;远远超过了经典计算机的能力。当与人工智能&#xff08;AI&#xff09;集成时&#xff0c;量子计算可以带来革命性的突破。它的并行处理能力能够在更短的时间内解决更复杂的问题&#xff0c;这对优化和…

一个小的可编辑表格问题引起的思考

11.21工作中遇到的问题 预期&#xff1a;当每行获取红包金额的时候若出现错误&#xff0c;右侧当行会出现提示 结果&#xff1a;获取红包金额出现错误&#xff0c;右侧对应行并没有出现错误提示 我发现&#xff0c;当我们设置readonly的时候&#xff0c;其实render函数依旧是…

【Linux课程学习】:进程描述---PCB(Process Control Block)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux课程学习 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 1.基本概念&#xff1a; &#x1f95d;进程的…

java基础概念36:正则表达式1

一、正则表达式的作用 作用一&#xff1a;校验字符串是否满足规则&#xff1b;作用二&#xff1a;在一段文本中查找满足要求的内容。——爬虫 二、正则表达式 2-1、字符类 示例&#xff1a; public static void main(String[] args) {System.out.println("a".matc…