SGM41511电源管理芯片与STM32L496通讯源码虚拟I2C协议实测成功读写cubemx设置裸机和freertos操作系统源码通用

news2024/12/23 2:13:00

不用它的I2C设置,容易出错不通讯,只打开GPIO输出就可以;

如果是RTOS的话请打开系统定时器提供参考时间基准,那个定时器都行;

以下是经过验证的代码,同样适用于SGM同类系列电源管理芯片;

准备好jlink进行RTT打印观测:

SGM41511.c

/******************************************************************************
 * Description : SGM41511 电源管理芯片驱动
 * Author      :
 * Date        : 2021.01.22
 ******************************************************************************/
#include "SGM41511.h"
#include "SEGGER_RTT.h"


/*******************************************************************************
 * Function Name : delay_us
 * Description   : us延时
 * Input         : None
 * Output        : None
 * Return        : None
 ******************************************************************************/
void delay_us(unsigned short time)
{
    unsigned short i = 0;
    while(time--)
    {
        i = 100;
        while(i--);
    }
}

/*******************************************************************************
 * Function Name : SGM41511_IIC_Init
 * Description   : IIC初始化
 * Input         : None
 * Output        : None
 * Return        : None
 ******************************************************************************/
void SGM41511_IIC_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    
    /* 使能GPIOB时钟 */
    __HAL_RCC_GPIOB_CLK_ENABLE();
    __HAL_RCC_GPIOE_CLK_ENABLE();
		
    /* 配置SCL和SDA引脚 */
    GPIO_InitStruct.Pin = SCL_PIN | SDA_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    
		    /* 配置BAT_NCS引脚 */
    GPIO_InitStruct.Pin = BAT_NCS_PIN|BAT_Psel_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
		
		
    /* 初始化SCL和SDA为低电平 */
    SCL_H();
    SDA_H();
		
	  BAT_NCS_L();
//		BAT_Psel_L();
	  SEGGER_RTT_printf(0,"SGM41511_IIC_Init!\n");
}

/*******************************************************************************
 * Function Name : IIC_Sda_Mod
 * Description   : SDA输入输出选择
 * Input         : mod - SDA输入输出选择
 * Output        : None
 * Return        : None
 ******************************************************************************/
void IIC_Sda_Mod(unsigned char mod)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    
    /* 配置SCL引脚 */
    GPIO_InitStruct.Pin = SCL_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    
    if(mod != 0) // mod = 1, SDA输出模式
    {
        GPIO_InitStruct.Pin = SDA_PIN;
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
    }
    else // mod = 0, SDA输入模式
    {
        GPIO_InitStruct.Pin = SDA_PIN;
        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    }
    
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

/*******************************************************************************
 * Function Name : IIC_Start
 * Description   : 产生IIC起始信号
 * Input         : None
 * Output        : None
 * Return        : None
 ******************************************************************************/
void IIC_Start(void)
{
    IIC_Sda_Mod(1); // SDA设置为输出
    SCL_H();
    SDA_H();
    delay_us(4);
    SDA_L();
    delay_us(4);
    SCL_L();
    
}

/*******************************************************************************
 * Function Name : IIC_Stop
 * Description   : 产生IIC停止信号
 * Input         : None
 * Output        : None
 * Return        : None
 ******************************************************************************/
void IIC_Stop(void)
{
    IIC_Sda_Mod(1); // SDA设置为输出
    SCL_L();
    SDA_L();
    delay_us(4);
    SCL_H();
    SDA_H();
    delay_us(4);
}

/*******************************************************************************
 * Function Name : IIC_Wait_Ack
 * Description   : 等待应答信号到来
 * Input         : None
 * Output        : None
 * Return        : 0 - 接收应答成功, 1 - 接收应答失败
 ******************************************************************************/
unsigned char IIC_Wait_Ack(void)
{
    unsigned char ucErrTime = 0;
    
    IIC_Sda_Mod(0); // SDA设置为输入
    SDA_H();
    delay_us(1);
    SCL_H();
    delay_us(1);
    
    while(HAL_GPIO_ReadPin(IIC_PORT, SDA_PIN))
    {
        ucErrTime++;
        if(ucErrTime > 250)
        {
            IIC_Stop();
            return 1;
        }
    }
    
    SCL_L();
    return 0;
}

/*******************************************************************************
 * Function Name : IIC_Ack
 * Description   : 产生IIC应答信号
 * Input         : None
 * Output        : None
 * Return        : None
 ******************************************************************************/
void IIC_Ack(void)
{
    SCL_L();
    IIC_Sda_Mod(1); // SDA设置为输出
    SDA_L();
    delay_us(2);
    SCL_H();
    delay_us(2);
    SCL_L();
}

/*******************************************************************************
 * Function Name : IIC_NAck
 * Description   : 产生IIC非应答信号
 * Input         : None
 * Output        : None
 * Return        : None
 ******************************************************************************/
void IIC_NAck(void)
{
    SCL_L();
    IIC_Sda_Mod(1); // SDA设置为输出
    SDA_H();
    delay_us(2);
    SCL_H();
    delay_us(2);
    SCL_L();
}

/*******************************************************************************
 * Function Name : IIC_Send_Byte
 * Description   : IIC发送一个字节
 * Input         : txd - 要发送的字节
 * Output        : None
 * Return        : None
 ******************************************************************************/
void IIC_Send_Byte(unsigned char txd)
{
    unsigned char t;
    
    IIC_Sda_Mod(1); // SDA设置为输出
    SCL_L();
    
    for(t = 0; t < 8; t++)
    {
        if((txd & 0x80) >> 7)
            SDA_H();
        else
            SDA_L();
        
        txd <<= 1;
        delay_us(2);
        SCL_H();
        delay_us(2);
        SCL_L();
        delay_us(2);
    }
}

/*******************************************************************************
 * Function Name : IIC_Read_Byte
 * Description   : IIC读取一个字节
 * Input         : ack - 是否发送ACK
 * Output        : None
 * Return        : 读取到的字节
 ******************************************************************************/
unsigned char IIC_Read_Byte(unsigned char ack)
{
    unsigned char i, receive = 0;
    
    IIC_Sda_Mod(0); // SDA设置为输入

    for(i = 0; i < 8; i++)
    {
        SCL_L();
        delay_us(2);
        SCL_H();
        receive <<= 1;
        if(HAL_GPIO_ReadPin(IIC_PORT, SDA_PIN))
        {
            receive++;
        }
        delay_us(1);
    }
    
    if(!ack)
        IIC_NAck();
    else
        IIC_Ack();
    
    return receive;
}

/*******************************************************************************
 * Function Name : SgmWriteByte
 * Description   : IIC写一个字节
 * Input         : reg - 寄存器地址, data - 要写入的数据
 * Output        : None
 * Return        : 0 - 正常, 1 - 错误
 ******************************************************************************/
unsigned char SgmWriteByte(unsigned char reg, unsigned char data)
{
    IIC_Start();
    IIC_Send_Byte(SGM_WRITE_ADDR); // 发送写命令
    if(IIC_Wait_Ack())
    {
        IIC_Stop();
        return 1;
    }
    IIC_Send_Byte(reg); // 写寄存器地址
    IIC_Wait_Ack();
    IIC_Send_Byte(data);
    if(IIC_Wait_Ack())
    {
        IIC_Stop();
        return 1;
    }
    IIC_Stop();
    return 0;
}

/*******************************************************************************
 * Function Name : SgmReadByte
 * Description   : IIC读取一个字节
 * Input         : reg - 寄存器地址
 * Output        : None
 * Return        : 读到的数据
 ******************************************************************************/
unsigned char SgmReadByte(unsigned char reg)
{
    unsigned char temp1;
    
    IIC_Start();
    IIC_Send_Byte(SGM_WRITE_ADDR); // 发送写命令
    IIC_Wait_Ack();
    IIC_Send_Byte(reg); // 写寄存器地址
    IIC_Wait_Ack();
    IIC_Start();
    IIC_Send_Byte(SGM_READ_ADDR); // 发送读命令
    IIC_Wait_Ack();
    temp1 = IIC_Read_Byte(0);
    IIC_Stop();
    SEGGER_RTT_printf(0, "SgmReadByte: Reg 0x%02X = 0x%02X\n", reg, temp1);
    return temp1;
}

/*******************************************************************************
 * Function Name : SgmReadLen
 * Description   : IIC连续读取
 * Input         : reg - 寄存器地址, len - 要读取的长度, buf - 读取到的数据存储缓冲区
 * Output        : None
 * Return        : 0 - 正常, 1 - 错误
 ******************************************************************************/
unsigned char SgmReadLen(unsigned char reg, unsigned char len, unsigned char *buf)
{
    IIC_Start();
    IIC_Send_Byte(SGM_WRITE_ADDR); // 发送写命令
    if(IIC_Wait_Ack())
    {
        IIC_Stop();
        return 1;
    }
    IIC_Send_Byte(reg); // 写寄存器地址
    IIC_Wait_Ack();
    IIC_Start();
    IIC_Send_Byte(SGM_READ_ADDR); // 发送读命令
    IIC_Wait_Ack();
    
    while(len)
    {
        if(len == 1)
            *buf = IIC_Read_Byte(0);
        else
            *buf = IIC_Read_Byte(1);
        
        len--;
        buf++;
    }
    
    IIC_Stop();
    return 0;
}

/*******************************************************************************
 * Function Name : SGM41511_ReadAllRegisters
 * Description   : Reads all registers from REG00 to REG0B
 * Input         : None
 * Output        : None
 * Return        : None
 ******************************************************************************/
void SGM41511_ReadAllRegisters(void)
{
    unsigned char reg_values[12];
    
    for (int i = 0; i <= 0x0B; i++)
    {
        reg_values[i] = SgmReadByte(i);
			  SEGGER_RTT_printf(0, "REG%02X: 0x%02X (0B:", i, reg_values[i]);
        
        // Print binary representation
        for (int j = 7; j >= 0; j--)
        {
            SEGGER_RTT_printf(0, "%d", (reg_values[i] >> j) & 1);
        }
        SEGGER_RTT_printf(0, ")\n");
    }
}


void SGM41511_WriteReg00(uint8_t value)
{
    if (SgmWriteByte(REG00_ADDR, value) == 0)
    {
        SEGGER_RTT_printf(0, "Successfully wrote 0x%02X to REG00\n", value);
    }
    else
    {
        SEGGER_RTT_printf(0, "Failed to write to REG00\n");
    }
}


void SGM41511_WriteReg01(uint8_t value)
{
    if (SgmWriteByte(REG01_ADDR, value) == 0)
    {
        SEGGER_RTT_printf(0, "Successfully wrote 0x%02X to REG01\n", value);
    }
    else
    {
        SEGGER_RTT_printf(0, "Failed to write to REG01\n");
    }
}

void SGM41511_WriteReg07(uint8_t value)
{
    if (SgmWriteByte(REG07_ADDR, value) == 0)
    {
        SEGGER_RTT_printf(0, "Successfully wrote 0x%02X to REG07\n", value);
    }
    else
    {
        SEGGER_RTT_printf(0, "Failed to write to REG07\n");
    }
}

void SGM41511_WriteReg06(uint8_t value)
{
    if (SgmWriteByte(REG06_ADDR, value) == 0)
    {
        SEGGER_RTT_printf(0, "Successfully wrote 0x%02X to REG06\n", value);
    }
    else
    {
        SEGGER_RTT_printf(0, "Failed to write to REG06\n");
    }
}

void SGM41511_WriteReg05(uint8_t value)
{
    if (SgmWriteByte(REG05_ADDR, value) == 0)
    {
        SEGGER_RTT_printf(0, "Successfully wrote 0x%02X to REG05\n", value);
    }
    else
    {
        SEGGER_RTT_printf(0, "Failed to write to REG05\n");
    }
}

void SGM41511_WriteReg04(uint8_t value)
{
    if (SgmWriteByte(REG04_ADDR, value) == 0)
    {
        SEGGER_RTT_printf(0, "Successfully wrote 0x%02X to REG04\n", value);
    }
    else
    {
        SEGGER_RTT_printf(0, "Failed to write to REG04\n");
    }
}

void SGM41511_WriteReg03(uint8_t value)
{
    if (SgmWriteByte(REG03_ADDR, value) == 0)
    {
        SEGGER_RTT_printf(0, "Successfully wrote 0x%02X to REG03\n", value);
    }
    else
    {
        SEGGER_RTT_printf(0, "Failed to write to REG03\n");
    }
}

void SGM41511_WriteReg02(uint8_t value)
{
    if (SgmWriteByte(REG02_ADDR, value) == 0)
    {
        SEGGER_RTT_printf(0, "Successfully wrote 0x%02X to REG02\n", value);
    }
    else
    {
        SEGGER_RTT_printf(0, "Failed to write to REG02\n");
    }
}
void SGM41511_WriteReg0B(uint8_t value)
{
    if (SgmWriteByte(REG0B_ADDR, value) == 0)
    {
        SEGGER_RTT_printf(0, "Successfully wrote 0x%02X to REG0B\n", value);
    }
    else
    {
        SEGGER_RTT_printf(0, "Failed to write to REG0B\n");
    }
}

SGM41511. h

/******************************************************************************
*Description :SGM41511 电源管理芯片驱动
*Author :
*Date :2021.01.22
*******************************************************************************/
#ifndef _SGM41511_H_
#define _SGM41511_H_
#include <stdint.h>
#include "main.h"
#include "stm32l4xx_hal.h"

#define SCL_PIN GPIO_PIN_8
#define SDA_PIN GPIO_PIN_9
#define IIC_PORT GPIOB

#define BAT_NCS_PIN GPIO_PIN_11
#define BAT_NCS_PORT GPIOE

#define BAT_Psel_PIN GPIO_PIN_10
#define BAT_Psel_PORT GPIOE


#define SGM_DEVICE_ADDR 0x6B
#define SGM_WRITE_ADDR ((SGM_DEVICE_ADDR<<1) | 0) // 0X6B <<1 0xD6
#define SGM_READ_ADDR ((SGM_DEVICE_ADDR<<1) | 1) // (0X6B << 1) + 1 0xD7

#define REG00_ADDR 0x00

REG00 (地址0x00):
//控制输入电流限制(IINDPM)
//使能/禁用HIZ模式
//控制STAT引脚功能

#define REG01_ADDR 0x01


#define REG02_ADDR 0x02
#define REG03_ADDR 0x03
#define REG04_ADDR 0x04
#define REG05_ADDR 0x05
#define REG06_ADDR 0x06
#define REG07_ADDR 0x07
#define REG08_ADDR 0x08
#define REG09_ADDR 0x09

#define REG0A_ADDR 0x0A


#define REG0B_ADDR 0x0B

//REG0B (0x14):
//包含芯片ID信息,0x14可能表示这是SGM41511芯片。


#define SDA_H() HAL_GPIO_WritePin(IIC_PORT, SDA_PIN, GPIO_PIN_SET)
#define SDA_L() HAL_GPIO_WritePin(IIC_PORT, SDA_PIN, GPIO_PIN_RESET)
#define SCL_H() HAL_GPIO_WritePin(IIC_PORT, SCL_PIN, GPIO_PIN_SET)
#define SCL_L() HAL_GPIO_WritePin(IIC_PORT, SCL_PIN, GPIO_PIN_RESET)

#define BAT_NCS_H() HAL_GPIO_WritePin(BAT_NCS_PORT, BAT_NCS_PIN, GPIO_PIN_SET)
#define BAT_NCS_L() HAL_GPIO_WritePin(BAT_NCS_PORT, BAT_NCS_PIN, GPIO_PIN_RESET)

#define BAT_Psel_H() HAL_GPIO_WritePin(BAT_Psel_PORT, BAT_Psel_PIN, GPIO_PIN_SET)
#define BAT_Psel_L() HAL_GPIO_WritePin(BAT_Psel_PORT, BAT_Psel_PIN, GPIO_PIN_RESET)

void SGM41511_IIC_Init(void);
void IIC_Sda_Mod(unsigned char mod);
void IIC_Start(void);
void IIC_Stop(void);
void IIC_Send_Byte(unsigned char txd);
unsigned char IIC_Read_Byte(unsigned char ack);

unsigned char IIC_Wait_Ack(void);
void IIC_Ack(void);
void IIC_NAck(void);
unsigned char SgmWriteByte(unsigned char reg,unsigned char data);
unsigned char SgmReadByte(unsigned char reg);
unsigned char SgmReadLen(unsigned char reg,unsigned char len,unsigned char *buf);
void SGM41511_ReadAllRegisters(void);
void SGM41511_WriteReg00(uint8_t value);
void SGM41511_WriteReg01(uint8_t value);
void SGM41511_WriteReg07(uint8_t value);
void SGM41511_WriteReg06(uint8_t value);
void SGM41511_WriteReg05(uint8_t value);
void SGM41511_WriteReg04(uint8_t value);
void SGM41511_WriteReg03(uint8_t value);
void SGM41511_WriteReg02(uint8_t value);
void SGM41511_WriteReg0B(uint8_t value);
#endif

移植的话你只需把引脚定义改下即可。

freertos任务源码;

void Sgm41511_task(void *argument)
{
  /* USER CODE BEGIN Sgm41511_task */
  /* Infinite loop */
	SGM41511_IIC_Init();
  SGM41511_WriteReg00(0x17); // Write 0x17 to REG00  00010111
	SGM41511_WriteReg07(0xDC) ;// Write 0xDC to REG07  11011100 
	SGM41511_WriteReg06(0x9E) ;// Write 0x9E to REG06  10011110
	SGM41511_WriteReg05(0xB8) ;// Write 0xB8 to REG05  10111000
	SGM41511_WriteReg04(0x5B) ;// Write 0x5B to REG04  01011011
	SGM41511_WriteReg03(0x21) ;// Write 0x21 to REG03  00100001
	SGM41511_WriteReg02(0xE2) ;// Write 0xE2 to REG02  11100010
	SGM41511_WriteReg01(0x7E) ;// Write 0x7E to REG02  01111110
	SGM41511_WriteReg0B(0x94) ;// Write 0x94 to REG0B  10010100
  for(;;)
  {
		SGM41511_ReadAllRegisters();//5s循环读取SGM41511所有寄存器信息
    osDelay(5000);
  }
  /* USER CODE END Sgm41511_task */
}

逻辑main.c简单调用

void main(void)
{

	SGM41511_IIC_Init();
    SGM41511_WriteReg00(0x17); // Write 0x17 to REG00  00010111
	SGM41511_WriteReg07(0xDC) ;// Write 0xDC to REG07  11011100 
	SGM41511_WriteReg06(0x9E) ;// Write 0x9E to REG06  10011110
	SGM41511_WriteReg05(0xB8) ;// Write 0xB8 to REG05  10111000
	SGM41511_WriteReg04(0x5B) ;// Write 0x5B to REG04  01011011
	SGM41511_WriteReg03(0x21) ;// Write 0x21 to REG03  00100001
	SGM41511_WriteReg02(0xE2) ;// Write 0xE2 to REG02  11100010
	SGM41511_WriteReg01(0x7E) ;// Write 0x7E to REG02  01111110
	SGM41511_WriteReg0B(0x94) ;// Write 0x94 to REG0B  10010100
while(1)
  {
   SGM41511_ReadAllRegisters();//5s循环读取SGM41511所有寄存器信息
   HAL_Delay(5000);
  }
 
}

SGM41511 寄存器各个的深度含义请在我的发布文章里找;

完整例程代码请下载:

通过网盘分享的文件:charge_iic.rar
链接: https://pan.baidu.com/s/1M393qc0XidG8LWjDKJmqAQ?pwd=4syw 提取码: 4syw

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

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

相关文章

HTML5好看的花店商城源码1

文章目录 1.设计来源1.1 主界面1.2 界面效果11.3 界面效果21.4 界面效果31.5 界面效果41.6 界面效果51.7 界面效果61.8 界面效果7 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh…

【补-网络安全】日常运维(二)终端端口占用排查

文章目录 一、利用ipconfig、netstat 命令行统计二 、策略封禁IP 引言:检查频繁,第一步我们梳理完资产,第二步应该对资产终端进行一个排查,诊断把脉,了解清楚系统的端口占用及开放情况 一、利用ipconfig、netstat 命令行统计 1.先用ipconfig定位该终端的IP地址 2.明确IP地址后…

9.2(C++ Day 4)

一、作业 完成算术运算符重载&#xff0c;实现至少两个运算符的成员函数和全局函数的版本 1.&#xff08;1&#xff09;成员函数实现算术运算符&#xff08;-&#xff09;重载 const 类名 operator#(const 类名 &R) const {} #include <iostream>using namespac…

三级_网络技术_56_应用题

一、 请根据下图所示网络结构回答下列问题。 1.填写RG的路由表项。 目的网络/掩码长度输出端口__________S0&#xff08;直接连接&#xff09;__________S1&#xff08;直接连接&#xff09;__________S0__________S1__________S0__________S1 (2)在不改变路由表项的前提下&…

mysql安装和使用

文章目录 下载mysqlmysql安装检验mysqlpython、vscode插件 下载mysql 进入官网&#xff0c;选择下载。mysql官网是 https://www.mysql.com/ 。 选择社区版 选择windows版 选择离线包 让你登陆&#xff0c;我们谢绝登录 ojbk。开始下载。 mysql安装 选自定义安装。 “Server…

「漏洞复现」WookTeam searchinfo SQL注入漏洞

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…

用Python导入CSV和Excel表格数据到Word表格

在不同格式的文档之间进行数据传输是非常重要的操作。例如将CSV和Excel表格数据导入到Word文档中&#xff0c;不仅可以实现数据的有效整合与展示&#xff0c;还能极大地提升工作效率和文档的专业性。无论是生成报告、制作统计分析还是编制业务文档&#xff0c;熟练掌握用Python…

Java简单实现服务器客户端通信

目录 Socket 概述Socket 通信模型Socket 编程流程DEMO服务器端客户端 在Java中实现服务器和客户端的通信&#xff0c;可以使用Java Socket编程。 Socket 概述 Socket 指的是“插座”&#xff0c;是应用层与传输层之间的桥梁&#xff0c;用于在网络上进行双向通信。在 Socket …

Ceph-deploy搭建ceph集群

Ceph介绍及安装 一、Ceph介绍1.1 ceph说明1.2 Ceph架构1.3 Ceph逻辑组织架构1.3.1 Pool1.3.2 PG1.3.3 PGP 二、部署Ceph集群2.1 部署方式&#xff1a;2.2 服务器准备monitor、mgr、radosgw&#xff1a;MDS&#xff08;相对配置更高一个等级&#xff09;OSD节点 CPU&#xff1a;…

文献阅读(218)EHP

题目&#xff1a;A Research Retrospective on the AMD Exascale Computing Journey时间&#xff1a;2023会议&#xff1a;ISCA研究机构&#xff1a;AMD 题目&#xff1a;Realizing the AMD Exascale Heterogeneous Processor Vision时间&#xff1a;2024会议&#xff1a;ISCA研…

【人工智能 | 机器学习】神经网络

文章目录 1. 神经元模型2. 感知机与多层网络3. 误差逆传播算法&#xff08;BP)4. 全局最小与局部极小5. 其他常见神经网络6. 深度学习 1. 神经元模型 神经网络&#xff1a;具有适应性的 简单单元&#xff08;神经元&#xff09;组成的广泛并行互连的网络&#xff0c;其组织能够…

微服务组件----网关

小编目前大一&#xff0c;刚开始着手学习微服务的相关知识&#xff0c;小编会把它们整理成知识点发布出来。我认为同为初学者&#xff0c;我把我对知识点的理解以这种代码加观点的方式分享出来不仅加深了我的理解&#xff0c;或许在某个时候对你也有所帮助&#xff0c;同时也欢…

KTV包房开台必点套餐--SAAS本地化及未来之窗行业应用跨平台架构

一、源码 var 未来之窗app_通用ID"";CyberWin_Dialog.layer(url,{type:"url",title:title,move:false,width:"700px",height:"400px",id:未来之窗app_通用ID,mask:true,align:59,hideclose:false}); 二、解释 以下是用修仙手法为您改…

深度学习系列69:tts技术原理

tts为text-to-speech&#xff0c;asr为Automatic Speech Recognition&#xff0c;即speech-to-text。 1. 常用基础模型 下面介绍的deep voice是端到端生成语音的模型&#xff0c;后面两个是生成Mel谱&#xff0c;然后再使用vocoder生成语音的模型。 1.1 Deep voice 目前端到…

Ubuntu安装boost,protobuf、moduo

一、Ubuntu安装muduo muduo库是基于boost开发的&#xff0c;确保先安装了boost&#xff08;对boost版本有要求&#xff09;&#xff0c;还需要先安装protobuf&#xff0c;curl库 库版本boost1.70.0protobuf3.14.0curl7.74.0muduo2.0.2 1、Ubuntu安装boost # 更新资源列表 s…

【2024-2025源码+文档+调试讲解】微信小程序的城市公交查询系统

摘 要 当今社会已经步入了科学技术进步和经济社会快速发展的新时期&#xff0c;国际信息和学术交流也不断加强&#xff0c;计算机技术对经济社会发展和人民生活改善的影响也日益突出&#xff0c;人类的生存和思考方式也产生了变化。传统城市公交查询管理采取了人工的管理方法…

【第0005页 · 贪心】非递减数列

【前言】本文以及之后的一些题解都会陆续整理到目录中&#xff0c;若想了解全部题解整理&#xff0c;请看这里&#xff1a; 第0005页 非递减数列 今天我们来看一道 LeetCode 上“广泛好评”的一道 Easy 题&#xff01;&#xff01;&#xff01;&#xff08;蓝色是 OJ 平台&…

CentOS 7 升级 OpenSSH 9.8p1

背景 OpenSSH 官方发布安全通告&#xff0c;披露CVE-2024-6387 OpenSSH Server远程代码执行漏洞。 环境 操作系统内核openssh 版本openssl 版本7.8.20033.10.0-11277.4p11.0.2k-fips 安装编译软件和下载 OpenSSH9.8p1 软件包 mkdir -p /data/software cd /data/software/…

安卓13 鼠标右键作返回键,鼠标事件修改

总纲 android13 rom 开发总纲说明 前言 目录 1.前言2.问题分析3.代码分析4.代码修改5.编译1.前言 像有些设备是使用鼠标操作的,但是默认的android 鼠标右键并不是像电脑一样,能够做到,左键是确定,右键是返回

足球比分预测分析理论

走进一个充满欢呼声的体育场&#xff0c;空气中充满了对即将到来的两支强大足球队之间对决的期待。一个引人入胜的问题浮现出来&#xff1a;我们可以在比赛开始之前预测比赛的结果吗&#xff1f; 本文提出了一个基于概率和统计的模型&#xff0c;通过考虑每支队伍的进攻和防守能…