I2C(一):存储器模式:stm32作为主机对AT24C02写读数据

news2025/1/6 17:52:45

存储器模式:在HAL库中,I2C有专门对存储器外设设置的库函数

I2C(一):存储器模式的使用

  • 1、I2C轮询式写读AT24C02一页数据
  • 2、I2C轮询式写读AT24C02多页数据
  • 3、I2C中断式写读AT24C02一页数据
  • 4、I2C使用DMA式写读AT24C02一页数据

1、I2C轮询式写读AT24C02一页数据

AT24C02 是一款常见的 2 Kbit(256 字节)I²C 接口的 EEPROM(电可擦可编程只读存储器)。它的存储结构如下:

存储容量:AT24C02 的总存储容量为 2 Kbit(即 256 字节)
页(Page)大小:AT24C02 的每一页(Page)的大小为 8 字节。
写数据时,最多一次型写入1页(8字节),超过即会从页的开头覆盖
读数据时,没有限定字节数。

①I2C.c文件的代码如下

#include "I2C.h"

/**
 * @brief:I2C1初始化函数
 */
I2C_HandleTypeDef hi2c1;                            //I2C初始化结构体
void I2C1_Init(void)
{
    /* 1、对I2C1进行初始化 */
    __HAL_RCC_I2C1_CLK_ENABLE();                    //使能I2C1的时钟
    hi2c1.Instance = I2C1;                          //选择I2C1
    hi2c1.Init.ClockSpeed = 100000;                 //通信速率100K,标志模式
    HAL_I2C_Init(&hi2c1);
}

/**
 * @brief:HAL_I2C_Init()调用此函数
 */
void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c)
{
    GPIO_InitTypeDef GPIO_Init;                     //IO口初始化结构体
    if(hi2c->Instance == I2C1)
    {
        /* I2C1引脚的初始化:PB6 = SCL,PB7 = SDA*/
        __HAL_RCC_GPIOB_CLK_ENABLE();              //使能GPIOB的时钟
        GPIO_Init.Mode = GPIO_MODE_AF_OD;           //复用开漏输出
        GPIO_Init.Pin = GPIO_PIN_6 | GPIO_PIN_7;    //PB6和PB7
        GPIO_Init.Speed = GPIO_SPEED_FREQ_LOW;      //最大输出速度:低
        HAL_GPIO_Init(GPIOB, &GPIO_Init);
    }else if(hi2c->Instance == I2C2)
    {
        
    }
}

②I2C.h文件的代码如下

#ifndef __I2C_H
#define __I2C_H

#include "stm32f1xx_hal.h"
extern I2C_HandleTypeDef hi2c1;                            //I2C初始化结构体
void I2C1_Init(void);

#endif

③main.c文件的代码如下

#include "stm32f1xx_hal.h"
#include "STM32_RCC_Init.h"
#include "UART.h"
#include "I2C.h"

#define AT24C02_Address 0xA0

uint8_t WriteData[8] = {1,2,3,4,5,6,7,88};
uint8_t ReadData[8];

int main(void){
    
	HAL_Init();
	HSE_RCC_Init(); 
	UART1_Init(115200);
    I2C1_Init();
	printf("启动判断!\r\n");
    
    /* 存储器模式:对AT24C02第一页进行写 */
    HAL_I2C_Mem_Write(&hi2c1, AT24C02_Address, 0, I2C_MEMADD_SIZE_8BIT, WriteData, 8, 1000);
                     //I2C1,从机地址,从机内部地址,每次传输的数据大小,需要写入的数据缓冲区,需要写入多少个数据
    
    /* 查询从机知否准备就绪 */
    if(HAL_I2C_IsDeviceReady(&hi2c1, AT24C02_Address, 20, 1000) == HAL_OK)//I2C1,从机地址,查询次数,超时时间
    {
        /* 存储器模式:向从机第一页读取数据 */
        HAL_I2C_Mem_Read(&hi2c1, AT24C02_Address, 0, I2C_MEMADD_SIZE_8BIT, ReadData, 8, 1000);
    }
    else
    {
         printf("芯片忙碌!\r\n");
    }
    
    /* 将读取到的数据通过串口打印 */
    for(uint8_t i = 0; i<8; i++)
    {
        printf("ReadData[%d] = %d\r\n",i,ReadData[i]);
    }
        
	while(1){
       
	}	
}

在这里插入图片描述

2、I2C轮询式写读AT24C02多页数据

①I2C.c文件的代码如下

#include "I2C.h"

/**
 * @brief:I2C1初始化函数
 */
I2C_HandleTypeDef hi2c1;                            //I2C初始化结构体
void I2C1_Init(void)
{
    /* 1、对I2C1进行初始化 */
    __HAL_RCC_I2C1_CLK_ENABLE();                    //使能I2C1的时钟
    hi2c1.Instance = I2C1;                          //选择I2C1
    hi2c1.Init.ClockSpeed = 100000;                 //通信速率100K,标志模式
    HAL_I2C_Init(&hi2c1);
}

/**
 * @brief:HAL_I2C_Init()调用此函数
 */
void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c)
{
    GPIO_InitTypeDef GPIO_Init;                     //IO口初始化结构体
    if(hi2c->Instance == I2C1)
    {
        /* I2C1引脚的初始化:PB6 = SCL,PB7 = SDA*/
        __HAL_RCC_GPIOB_CLK_ENABLE();              //使能GPIOB的时钟
        GPIO_Init.Mode = GPIO_MODE_AF_OD;           //复用开漏输出
        GPIO_Init.Pin = GPIO_PIN_6 | GPIO_PIN_7;    //PB6和PB7
        GPIO_Init.Speed = GPIO_SPEED_FREQ_LOW;      //最大输出速度:低
        HAL_GPIO_Init(GPIOB, &GPIO_Init);
    }else if(hi2c->Instance == I2C2)
    {
        
    }
}

②I2C.h文件的代码如下

#ifndef __I2C_H
#define __I2C_H

#include "stm32f1xx_hal.h"
extern I2C_HandleTypeDef hi2c1;                            //I2C初始化结构体
void I2C1_Init(void);

#endif

③main.c文件的代码如下

#include "stm32f1xx_hal.h"
#include "STM32_RCC_Init.h"
#include "UART.h"
#include "I2C.h"

#define AT24C02_Address 0xA0

uint8_t WriteData[16] = {1,2,3,4,5,6,7,8,
                         8,7,6,5,4,3,2,1};
uint8_t ReadData[16];

int main(void){
    
	HAL_Init();
	HSE_RCC_Init(); 
	UART1_Init(115200);
    I2C1_Init();
	printf("启动判断!\r\n");
    
    uint8_t i = 0;
    
    for(i = 0; i<2; i++)
    {
        /* 存储器模式:对AT24C02的页进行写 */
        HAL_I2C_Mem_Write(&hi2c1, AT24C02_Address, i*8, I2C_MEMADD_SIZE_8BIT, &WriteData[i*8], 8, 1000);
        //while(HAL_I2C_IsDeviceReady(&hi2c1, AT24C02_Address, 20, 1000) != HAL_OK);
        HAL_Delay(10);
    }
    
    /* 查询从机知否准备就绪 */
    if(HAL_I2C_IsDeviceReady(&hi2c1, AT24C02_Address, 20, 1000) == HAL_OK)//I2C1,从机地址,查询次数,超时时间
    {
        /* 存储器模式:向从机读取数据 */
        HAL_I2C_Mem_Read(&hi2c1, AT24C02_Address, 0, I2C_MEMADD_SIZE_8BIT, ReadData, 16, 1000);
    }
    else
    {
         printf("芯片忙碌!\r\n");
    }
    
    /* 将读取到的数据通过串口打印 */
    for(i = 0; i<16; i++)
    {
        printf("ReadData[%d] = %d\r\n",i,ReadData[i]);
    }
        
	while(1){
       
	}	
}

在这里插入图片描述

3、I2C中断式写读AT24C02一页数据

实验要求:连接PB0的按键按下后,单片机主机向从机AT24C02写入数据。连接PB1的按键按下后,主机向从机AT24C02读取数据,然后通过串口打印。

①Key.c文件的代码如下

#include "Key.h"

/**
 * 按键引脚的初始化,使用PB0和PB1
 */
void Key_GPIO_Init(void)
{
    /* 1、开启GPIOB的时钟 */
   __HAL_RCC_GPIOB_CLK_ENABLE();
    
    /* 2、对GPIOB0进行配置 */
    GPIO_InitTypeDef GPIO_Init;
    GPIO_Init.Pin = GPIO_PIN_0|GPIO_PIN_1;      //选择PB0
    GPIO_Init.Mode = GPIO_MODE_INPUT;           //选择输入模式
    GPIO_Init.Pull = GPIO_PULLUP;               //选择上拉模式
    HAL_GPIO_Init(GPIOB, &GPIO_Init);
}

/**
 * @brief:判断是按键1按下还是按键2按下
 */
uint8_t Key_Scan(void)
{
    uint8_t Key_Num = 0;
    if(PB0_IN == GPIO_PIN_RESET)        //PB0按下
    {
        HAL_Delay(10);                  //延时消抖
        while(PB0_IN == GPIO_PIN_RESET);
        Key_Num =  1;
    }
    if(PB1_IN == GPIO_PIN_RESET)        //PB1按下
    {
        HAL_Delay(10);                  //延时消抖
        while(PB1_IN == GPIO_PIN_RESET);
        Key_Num =  2;
    }  
    return Key_Num;
}

①I2C.c文件的代码如下

#include "I2C.h"

/**
 * @brief:I2C1初始化函数
 */
I2C_HandleTypeDef hi2c1;                            //I2C初始化结构体
void I2C1_Init(void)
{
    /* 1、对I2C1进行初始化 */
    __HAL_RCC_I2C1_CLK_ENABLE();                    //使能I2C1的时钟
    hi2c1.Instance = I2C1;                          //选择I2C1
    hi2c1.Init.ClockSpeed = 100000;                 //通信速率100K,标志模式
    HAL_I2C_Init(&hi2c1);
    
    /* 配置I2C1的NVIC */
    HAL_NVIC_SetPriority(I2C1_EV_IRQn,3,0);
    HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);
}

/**
 * @brief:HAL_I2C_Init()调用此函数
 */
void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c)
{
    GPIO_InitTypeDef GPIO_Init;                     //IO口初始化结构体
    if(hi2c->Instance == I2C1)
    {
        /* I2C1引脚的初始化:PB6 = SCL,PB7 = SDA*/
        __HAL_RCC_GPIOB_CLK_ENABLE();              //使能GPIOB的时钟
        GPIO_Init.Mode = GPIO_MODE_AF_OD;           //复用开漏输出
        GPIO_Init.Pin = GPIO_PIN_6 | GPIO_PIN_7;    //PB6和PB7
        GPIO_Init.Speed = GPIO_SPEED_FREQ_LOW;      //最大输出速度:低
        HAL_GPIO_Init(GPIOB, &GPIO_Init);
    }else if(hi2c->Instance == I2C2)
    {
        
    }
}

②I2C.h文件的代码如下

#ifndef __I2C_H
#define __I2C_H

#include "stm32f1xx_hal.h"
extern I2C_HandleTypeDef hi2c1;                            //I2C初始化结构体
void I2C1_Init(void);

#endif

③main.c文件的代码如下

#include "stm32f1xx_hal.h"
#include "STM32_RCC_Init.h"
#include "UART.h"
#include "I2C.h"
#include "Key.h"

#define AT24C02_Address 0xA0

uint8_t WriteData[8] = {1,2,3,4,5,6,7,8};
uint8_t ReadData[8];

int main(void){
    
	HAL_Init();
	HSE_RCC_Init(); 
	UART1_Init(115200);
    I2C1_Init();
    Key_GPIO_Init();
	printf("启动判断!\r\n");
    
	while(1){
        switch(Key_Scan())
        {
            case 1://按键PB0按下
                if(HAL_I2C_IsDeviceReady(&hi2c1, AT24C02_Address, 20, 1000) == HAL_OK)
                {
                    /* 存储器模式:对AT24C02的页进行写,且开启写入完成中断 */
                    HAL_I2C_Mem_Write_IT(&hi2c1, AT24C02_Address, 0, I2C_MEMADD_SIZE_8BIT, WriteData, 8);
                }
                break;
            case 2://按键PB1按下
                if(HAL_I2C_IsDeviceReady(&hi2c1, AT24C02_Address, 20, 1000) == HAL_OK)
                {
                    /* 存储器模式:对AT24C02的页进行读,且开启读取完成中断 */
                    HAL_I2C_Mem_Read_IT(&hi2c1, AT24C02_Address, 0, I2C_MEMADD_SIZE_8BIT, ReadData, 8);
                }
            break;      
        }
	}	
}

④stm32f1xx_it.c文件的代码如下

#include "stm32f1xx_hal.h"   
#include "stm32f1xx_it.h" 
#include "I2C.h" 
#include "UART.h"

/**
 * I2C1中断服务函数 
 */
void I2C1_EV_IRQHandler(void)
{
    HAL_I2C_EV_IRQHandler(&hi2c1);//中断服务总函数
}

/******************* 下面的中断的回调函数 ***************************/
/**
 * 存储器模式:I2C1主机发送完成中断回调函数
 */
void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c)
{
  if(hi2c->Instance == I2C1)
  {
      printf("发送完成了!\r\n");
  }else if(hi2c->Instance == I2C2)
  {
  
  }
}

/**
 * 存储器模式:I2C1主机读取完成中断回调函数
 */
extern uint8_t ReadData[8];
void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c)
{
  if(hi2c->Instance == I2C1)
  {
      printf("读取完成了!\r\n");
      for(uint8_t i = 0; i<8; i++)
      {
          printf("ReadData[%d] = %d\r\n",i,ReadData[i]);
      }
  }else if(hi2c->Instance == I2C2)
  {
  
  }
}

在这里插入图片描述

4、I2C使用DMA式写读AT24C02一页数据

实验要求:连接PB0的按键按下后,单片机主机向从机AT24C02写入数据。连接PB1的按键按下后,主机向从机AT24C02读取数据,然后通过串口打印。
在这里插入图片描述I2C的DMA非常的难用,需要配置I2C的NVIC中断和配置I2C的中断函数。才会调用I2C的DMA中断。还不知直接使用I2C的中断回调函数。
①I2C.c文件的代码如下

#include "I2C.h"

/**
 * @brief:I2C1初始化函数
 */
I2C_HandleTypeDef hi2c1;                            //I2C初始化结构体
void I2C1_Init(void)
{
    /* 1、对I2C1进行初始化 */
    __HAL_RCC_I2C1_CLK_ENABLE();                    //使能I2C1的时钟
    hi2c1.Instance = I2C1;                          //选择I2C1
    hi2c1.Init.ClockSpeed = 100000;                 //通信速率100K,标志模式
    HAL_I2C_Init(&hi2c1);
    
    /* 配置I2C1的NVIC */
    HAL_NVIC_SetPriority(I2C1_EV_IRQn,3,0);
    HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);
}

/**
 * @brief:HAL_I2C_Init()调用此函数
 */
DMA_HandleTypeDef hdma1_I2C_Tx;                     //DMA1配置结构体
DMA_HandleTypeDef hdma1_I2C_Rx;                     //DMA1配置结构体
void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c)
{
    GPIO_InitTypeDef GPIO_Init;                     //IO口初始化结构体
    if(hi2c->Instance == I2C1)
    {
        /* I2C1引脚的初始化:PB6 = SCL,PB7 = SDA*/
        __HAL_RCC_GPIOB_CLK_ENABLE();               //使能GPIOB的时钟
        GPIO_Init.Mode = GPIO_MODE_AF_OD;           //复用开漏输出
        GPIO_Init.Pin = GPIO_PIN_6 | GPIO_PIN_7;    //PB6和PB7
        GPIO_Init.Speed = GPIO_SPEED_FREQ_LOW;      //最大输出速度:低
        HAL_GPIO_Init(GPIOB, &GPIO_Init);
        
        /* 2、初始化DMA1的通道6 */
        __HAL_RCC_DMA1_CLK_ENABLE();                                   //使能DMA1的时钟
        hdma1_I2C_Tx.Instance = DMA1_Channel6;                         //选择DMA1的通道6
        hdma1_I2C_Tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;   //外设站点数据宽度,8位
        hdma1_I2C_Tx.Init.PeriphInc = DMA_PINC_DISABLE;                //外设地址是否递增,选择不自增
        hdma1_I2C_Tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;      //内存站点数据宽度,8位
        hdma1_I2C_Tx.Init.MemInc = DMA_MINC_ENABLE;                    //内存地址是否递增,选择自增
        hdma1_I2C_Tx.Init.Direction = DMA_MEMORY_TO_PERIPH;            //传输方向:这里选择内存---->寄存器
        hdma1_I2C_Tx.Init.Mode = DMA_NORMAL;                           //计数器传输模式:选择不自动重装
        hdma1_I2C_Tx.Init.Priority = DMA_PRIORITY_MEDIUM;              //通道1传输优先级,选择中等
        __HAL_LINKDMA(&hi2c1,hdmatx,hdma1_I2C_Tx);                     //将I2C1_TX和DMA1通道6连接起来
        HAL_DMA_Init(&hdma1_I2C_Tx);
        
        /* 配置DMA1通道6的NVIC */
        HAL_NVIC_SetPriority(DMA1_Channel6_IRQn,3,0);
        HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn);
        
        /* 3、配置DMA1的通道7 */
        hdma1_I2C_Rx.Instance = DMA1_Channel7;                         //选择DMA1的通道7
        hdma1_I2C_Rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;   //外设站点数据宽度,8位
        hdma1_I2C_Rx.Init.PeriphInc = DMA_PINC_DISABLE;                //外设地址是否递增,选择不自增
        hdma1_I2C_Rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;      //内存站点数据宽度,8位
        hdma1_I2C_Rx.Init.MemInc = DMA_MINC_ENABLE;                    //内存地址是否递增,选择自增
        hdma1_I2C_Rx.Init.Direction = DMA_PERIPH_TO_MEMORY;            //传输方向:这里选择寄存器---->内存
        hdma1_I2C_Rx.Init.Mode = DMA_NORMAL;                           //计数器传输模式:选择不自动重装
        hdma1_I2C_Rx.Init.Priority = DMA_PRIORITY_MEDIUM;              //通道1传输优先级,选择中等
        __HAL_LINKDMA(&hi2c1,hdmarx,hdma1_I2C_Rx);                     //将I2C1_RX和DMA1通道7连接起来
        HAL_DMA_Init(&hdma1_I2C_Rx);
        
        /* 配置DMA1通道6的NVIC */
        HAL_NVIC_SetPriority(DMA1_Channel7_IRQn,3,0);
        HAL_NVIC_EnableIRQ(DMA1_Channel7_IRQn);
    }else if(hi2c->Instance == I2C2)
    {
        
    }
}

②I2C.h文件的代码如下

#ifndef __I2C_H
#define __I2C_H

#include "stm32f1xx_hal.h"
extern I2C_HandleTypeDef hi2c1;                            //I2C初始化结构体
extern DMA_HandleTypeDef hdma1_I2C_Tx;                     //DMA1配置结构体
extern DMA_HandleTypeDef hdma1_I2C_Rx;                     //DMA1配置结构体
void I2C1_Init(void);

#endif

③main.c文件的代码如下

#include "stm32f1xx_hal.h"
#include "STM32_RCC_Init.h"
#include "UART.h"
#include "I2C.h"
#include "Key.h"

#define AT24C02_Address 0xA0

uint8_t WriteData[8] = {1,2,3,4,5,6,7,8};
uint8_t ReadData[8];

int main(void){
    
	HAL_Init();
	HSE_RCC_Init(); 
	UART1_Init(115200);
    I2C1_Init();
    Key_GPIO_Init();
	printf("启动判断!\r\n");
    
	while(1){
        switch(Key_Scan())
        {
            case 1://按键PB0按下
                if(HAL_I2C_IsDeviceReady(&hi2c1, AT24C02_Address, 20, 1000) == HAL_OK)
                {
                    /* 存储器模式:对AT24C02的页进行写,且开启DMA写入完成中断 */
                    HAL_I2C_Mem_Write_DMA(&hi2c1, AT24C02_Address, 0, I2C_MEMADD_SIZE_8BIT, WriteData, 8);
                }
                break;
            case 2://按键PB1按下
                if(HAL_I2C_IsDeviceReady(&hi2c1, AT24C02_Address, 20, 1000) == HAL_OK)
                {
                    /* 存储器模式:对AT24C02的页进行读,且开启DMA读取完成中断 */
                    HAL_I2C_Mem_Read_DMA(&hi2c1, AT24C02_Address, 0, I2C_MEMADD_SIZE_8BIT, ReadData, 8);
                }
            break;      
        }
	}	
}

④stm32f1xx_it.c文件的代码如下

#include "stm32f1xx_hal.h"   
#include "stm32f1xx_it.h" 
#include "I2C.h" 
#include "UART.h"

/**
 * I2C1中断服务函数 
 */
void I2C1_EV_IRQHandler(void)
{
    HAL_I2C_EV_IRQHandler(&hi2c1);//中断服务总函数
}
/**
 * DMA1通道6的中断服务函数 
 */
void DMA1_Channel6_IRQHandler(void)
{
    HAL_DMA_IRQHandler(&hdma1_I2C_Tx);
}

/**
 * DMA1通道7的中断服务函数 
 */
void DMA1_Channel7_IRQHandler(void)
{
    HAL_DMA_IRQHandler(&hdma1_I2C_Rx);
}
/******************* 下面的中断的回调函数 ***************************/
/**
 * 存储器模式:I2C1的DMA发送完成中断回调函数
 */
void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c)
{
  if(hi2c->Instance == I2C1)
  {
      printf("发送完成了!\r\n");
  }else if(hi2c->Instance == I2C2)
  {
  
  }
}

/**
 * 存储器模式:I2C1的DMA读取完成中断回调函数
 */
extern uint8_t ReadData[8];
void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c)
{
  if(hi2c->Instance == I2C1)
  {
      printf("读取完成了!\r\n");
      for(uint8_t i = 0; i<8; i++)
      {
          printf("ReadData[%d] = %d\r\n",i,ReadData[i]);
      }
  }else if(hi2c->Instance == I2C2)
  {
  
  }
}

在这里插入图片描述

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

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

相关文章

Ansys Discovery 中的网格划分方法:探索模式

本篇博客文章将介绍 Ansys Discovery 中可用于在探索模式下进行分析的网格划分方法。我们将在下一篇博客中介绍 Refine 模式下的网格划分技术。 了解 Discovery Explore 模式下的网格划分 网格划分是将几何模型划分为小单元以模拟系统在不同条件下的行为的过程。这是通过创建…

MySQL秘籍之索引与查询优化实战指南

MySQL秘籍之索引与查询优化实战指南 目录 MySQL秘籍之索引与查询优化实战指南相关阅读索引相关EXPLAIN 版本 1. 初级篇1.1 【练体术】基础1.1.1 库操作1.1.1 表操作创建一个表增加表字段 1.1.2 增删改插入一条数据删除一条数据更新一条数据库 1.1.3 查询查询所有数据条件查询&a…

MySQL8.0复制原理和部署配置步骤

1. mysql 主从复制原理 在从库上执行change master to&#xff1b;会将主库的信息保存到从库中的master.info文件中在从库执行start slave;开启io_thread, sql_thread线程;io_thread工作&#xff1b;io_thread通过master.info文件中主库的连接信息去连接主库&#xff1b;连接成…

智联视频超融合平台:电力行业的智能守护者

文章目录 一、远程实时监控与设备状态监测二、提高应急响应能力三、实现无人值守与减员增效四、保障电力设施安全与防范外部破坏五、提升电网运行管理效率与决策科学性六、助力电力企业数字化转型与智能化发展七、智联视频超融合平台 在当今数字化浪潮下&#xff0c;视频联网平…

上传本地项目或文件到SVN服务器(图片讲解,超简单)

上传本地项目或文件到SVN服务器&#xff08;图片讲解&#xff0c;超简单&#xff09; 1、使用TortoiseSVN2、输入SVN远程仓库地址3、添加文件或文件夹 需求&#xff1a;将本地的文件上传到SVN服务器上指定路径。前提&#xff1a;已经安装好TortoiseSVN 1、使用TortoiseSVN 右…

单周期CPU电路设计

1.实验目的 本实验旨在让学生通过设计一个简单的单周期 CPU 电路&#xff0c;深入理解 RISC-V 指令集的子集功能实现&#xff0c;掌握数字电路设计与实现的基本流程&#xff0c;包括指令解析、部件组合、电路设计以及功能仿真等环节&#xff0c;同时培养verilog HDL编程能力和…

ROS功能包开机自启动(2步解决)

为了实现小车在开机后能自动启动相关功能模块需要解决两个问题 1.准备启动脚本文件加载对应的rosnode和roslaunch&#xff0c;整合相关节点按需要顺序进行&#xff0c;防止报错 2.设置开启启动脚本相关内容 既然是自启动&#xff0c;不能避免USB数据传输的一些问题&#xff…

【ArcGISPro/GeoScenePro】解决常见的空间参考和投影问题

修复空间参考缺失的图像 数据 https://arcgis.com/sharing/rest/content/items/535efce0e3a04c8790ed7cc7ea96d02d/data 查看属性坐标 查看属性范围 范围值并不是零或接近于零。 这意味着栅格具有范围,因此其已正确进行

NLP 中文拼写检测纠正论文-08-Combining ResNet and Transformer

拼写纠正系列 NLP 中文拼写检测实现思路 NLP 中文拼写检测纠正算法整理 NLP 英文拼写算法&#xff0c;如果提升 100W 倍的性能&#xff1f; NLP 中文拼写检测纠正 Paper java 实现中英文拼写检查和错误纠正&#xff1f;可我只会写 CRUD 啊&#xff01; 一个提升英文单词拼…

【paddle】初次尝试

张量 张量是 paddlepaddle&#xff0c; torch&#xff0c; tensorflow 等 python 主流机器学习包中唯一通货变量&#xff0c;因此应当了解其基本的功能。 张量 paddle.Tensor 与 numpy.array 的转化 import paddle as paddle import matplotlib.pyplot as plt apaddle.to_t…

如何在谷歌浏览器中使用屏幕录制功能

在日常使用电脑的过程中&#xff0c;我们经常会遇到需要记录屏幕操作的情况。无论是制作教学视频、保存游戏过程还是记录会议内容&#xff0c;谷歌浏览器的屏幕录制功能都能帮助我们轻松实现这些需求。那么&#xff0c;如何在谷歌浏览器中启用并使用屏幕录制功能呢&#xff1f;…

万里数据库GreatSQL监控解析

GreatSQL是MySQL的一个分支&#xff0c;专注于提升MGR&#xff08;MySQL Group Replication&#xff09;的可靠性及性能。乐维监控平台可以有效地监控GreatSQL&#xff0c;帮助用户及时发现并解决潜在的性能问题。 通过在GreatSQL服务器上安装监控代理&#xff0c;收集数据库性…

APM 3.0.2 | 聚合B站、油管和MF的音乐播放器,支持歌词匹配

APM&#xff08;Azusa-Player-Mobile&#xff09;是一款基于B站的第三方音频播放器&#xff0c;现已扩展支持YouTube Music、YouTube、本地音乐、AList和MusicFree等平台。它不仅提供视频作为音频播放&#xff0c;还具备排行榜、分区动态等功能。用户可以通过添加Alist地址接入…

HTML——61. 单行文本框和密码输入框(主讲input元素的type属性)

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>单行文本框和密码输入框</title></head><body><!--input元素的type属性&#xff1a;(必须要有)--> <!--单行文本框:1.type"text"2.可…

在Typora中实现自动编号

文章目录 在Typora中实现自动编号1. 引言2. 准备工作3. 自动编号的实现3.1 文章大纲自动编号3.2 主题目录&#xff08;TOC&#xff09;自动编号3.3 文章内容自动编号3.4 完整代码 4. 应用自定义CSS5. 结论 在Typora中实现自动编号 1. 引言 Typora是一款非常流行的Markdown编辑…

微机——计算机中的数制

目录 数制转换&#xff1a; 十进制数转为非十进制数&#xff1a; 二、八、十六进制数之间的转换&#xff1a; 数及字符的表示&#xff1a; 二进制数的加减运算&#xff1a; 无符号数的运算&#xff1a; 带符号数运算中的溢出问题&#xff1a; 计算机中常用的编码&#…

设计心得——流程图和数据流图绘制

一、流程图和数据流图 在软件开发中&#xff0c;画流程图和数据流图可以说是几乎每个人都会遇到。 1、数据流&#xff08;程&#xff09;图 Data Flow Diagram&#xff0c;DFG。它可以称为数据流图或数据流程图。其主要用来描述系统中数据流程的一种图形工具&#xff0c;可以将…

Node 如何生成 RSA 公钥私钥对

一、引入crypto模块 crypto 为node 自带模块&#xff0c;无需安装 const crypto require(crypto);二、封装生成方法 async function generateRSAKeyPair() {return new Promise((resolve, reject) > {crypto.generateKeyPair(rsa, {modulusLength: 2048, // 密钥长度为 …

壁纸样机神器,可以导出高清图片吗?

壁纸样机神器确实支持导出高清图片。根据搜索结果中的信息&#xff0c;壁纸样机神器提供了以下功能&#xff1a; 壁纸样机神器免费体验 高清壁纸上传&#xff1a;壁纸样机神器支持上传您自己的壁纸图片&#xff0c;推荐尺寸为1290 2796&#xff08;9:19.5&#xff09;&#xf…

数据挖掘——神经网络分类

神经网络分类 神经网络分类人工神经网络多层人工神经网络 误差反向传播&#xff08;BP&#xff09;网络后向传播算法 神经网络分类 人工神经网络 人工神经网络主要由大量的神经元以及它们之间的有向连接构成。包含三个方面&#xff1a; 神经元的激活规则 主要是指神经元输入…