STM32H7双路CAN踩坑记录

news2024/11/28 12:45:02

STM32H7双路CAN踩坑记录

目录

  • STM32H7双路CAN踩坑记录
    • 1 问题描述
    • 2 原因分析
    • 3 解决办法
    • 4 CAN配置参考代码

1 问题描述

STM32的CAN1和CAN2无法同时使用。
注:MCU使用的是STM32H743,其他型号不确定是否一样,本文只以STM32H743举例说明。

2 原因分析

经过测试分析,双路CAN无法同时使用与CAN的消息RAM配置有关。

在这里插入图片描述

在这里插入图片描述

其中问题就出现在上图的RAM配置,STM32H7系列的两路CAN是共用同一块RAM的,并且把这块内存空间的分配交给了用户,也没有检查内存分配是否合理的操作,这点其实挺坑的,稍不注意就掉进去了。
我之前用过STM32其他的系列,它们芯片内部就定义好了哪部分RAM给哪个CAN,是使用不允许用户自由分配的,因此就吃了这个亏。我原本两路CAN的配置基本都是一致的,其中也包括消息RAM这一点,因此,在初始化之后,先初始化的那路CAN就会被覆盖导致不能使用。

3 解决办法

CAN1的消息RAM从地址偏移0开始,而CAN2则从CAN1消息RAN结束的位置开始,这样就先保证了CAN1有足够的RAM空间使用,也保证了CAN2的RAM不会跟CAN1冲突。具体代码配置参考如下:

FDCAN2_Handler.Init.MessageRAMOffset = FDCAN1_Handler.msgRam.EndAddress - SRAMCAN_BASE;  // CAN1消息RAM的结束地址 - 消息RAM的起始地址 = CAN1实际使用的内存大小,把这个作为CAN2的内存偏移地址

注:当然,你也可以先计算一下或用串口打印一下CAN1具体使用了多少内存空间,然后在这个基础上做偏移,只要保证两路CAN有足够的内存并且内存不重叠就可以了。

4 CAN配置参考代码

/**
 * @brief       FDCAN初始化
 * @param       presc   : 分频值,取值范围1~512;
 * @param       tsjw    : 重新同步跳跃时间单元.范围:1~128;
 * @param       ntsg1   : 时间段1的时间单元.取值范围2~256;
 * @param       ntsg2   : 时间段2的时间单元.取值范围2~128;
 * @param       mode    : FDCAN_MODE_NORMAL,普通模式; 
                          FDCAN_MODE_INTERNAL_LOOPBACK,内部回环模式;
                          FDCAN_MODE_EXTERNAL_LOOPBACK,外部回环模式;
                          FDCAN_MODE_RESTRICTED_OPERATION,限制操作模式
                          FDCAN_MODE_BUS_MONITORING,总线监控模式
 * @note        以上5个参数, 除了模式选择其余的参数在函数内部会减1, 所以, 任何一个参数都不能等于0
 *              FDCAN其输入时钟频率为 Fpclk1 = 20Mhz
 *              波特率 = Fpclk1 / ((ntsg1 + ntsg2 + 1) * presc);
 *              我们设置 fdcan_init(10, 8, 31, 8, 1), 则CAN波特率为:
 *              20M / ((31 + 8 + 1) * 10) = 500Kbps
 * @retval      0,  初始化成功; 其他, 初始化失败;
 */
u8 FDCAN1_Mode_Init(uint16_t presc, uint8_t tsjw, uint16_t ntsg1, uint8_t ntsg2, uint32_t mode) 
{
    FDCAN_FilterTypeDef fdcan_filterconfig;

    HAL_FDCAN_DeInit(&FDCAN1_Handler);                              /* 先清除以前的设置 */
    FDCAN1_Handler.Instance = FDCAN1; 
    FDCAN1_Handler.Init.FrameFormat = FDCAN_FRAME_FD_BRS;           /* 位速率变换FDCAN模式 */
    FDCAN1_Handler.Init.Mode = mode;                                /* 模式设置  */
    FDCAN1_Handler.Init.AutoRetransmission = ENABLE;                /* 使能自动重传!传统模式下一定要关闭!!! */
    FDCAN1_Handler.Init.TransmitPause = ENABLE;                     /* 使能传输暂停 */
    FDCAN1_Handler.Init.ProtocolException = DISABLE;                /* 关闭协议异常处理 */
    /* FDCAN中仲裁段位速率最高1Mbit/s, 数据段位速率最高8Mbit/s */
    /* 数据段通信速率(仅FDCAN模式需配置) = 20M / (1 + dseg1 + dseg2) = 20M / (2 + 1 + 1) = 5 Mbit/s */
    FDCAN1_Handler.Init.DataPrescaler = 10;                         /* 数据段分频系数范围:1~32  */
    FDCAN1_Handler.Init.DataSyncJumpWidth = 16;                     /* 数据段重新同步跳跃宽度1~16 */
    FDCAN1_Handler.Init.DataTimeSeg1 = 2;                           /* 数据段dsg1范围:1~32  5 */
    FDCAN1_Handler.Init.DataTimeSeg2 = 1;                           /* 数据段dsg2范围:1~16  1 */
    
    /* 仲裁段通信速率(FDCAN与传统CAN均需配置) = 20M / (1 + ntsg1 + ntsg2) = 20M / (31 + 8 + 1) = 500Kbit/s */
    FDCAN1_Handler.Init.NominalPrescaler = presc;                   /* 分频系数 */
    FDCAN1_Handler.Init.NominalSyncJumpWidth = tsjw;                /* 重新同步跳跃宽度 */
    FDCAN1_Handler.Init.NominalTimeSeg1 = ntsg1;                    /* tsg1范围:2~256 */
    FDCAN1_Handler.Init.NominalTimeSeg2 = ntsg2;                    /* tsg2范围:2~128 */
    
    FDCAN1_Handler.Init.MessageRAMOffset = 0;                       /* 信息RAM偏移(使用2路CAN时非常重要) */
    FDCAN1_Handler.Init.StdFiltersNbr = 28;                         /* 标准信息ID滤波器编号 */
    FDCAN1_Handler.Init.ExtFiltersNbr = 8;                          /* 扩展信息ID滤波器编号 */
    FDCAN1_Handler.Init.RxFifo0ElmtsNbr = 1;                        /* 接收FIFO0元素编号 */
    FDCAN1_Handler.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_64;       /* 接收FIFO0元素大小:最大64字节 */
    FDCAN1_Handler.Init.RxBuffersNbr = 0;                           /* 接收FIFO0元素编号 */
    FDCAN1_Handler.Init.TxEventsNbr = 0;                            /* 发送事件编号 */
    FDCAN1_Handler.Init.TxBuffersNbr = 0;                           /* 发送缓冲编号 */
    FDCAN1_Handler.Init.TxFifoQueueElmtsNbr = 1;                    /* 发送FIFO序列元素编号 */
    FDCAN1_Handler.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;  /* 发送FIFO序列模式 */
    FDCAN1_Handler.Init.TxElmtSize = FDCAN_DATA_BYTES_64;            /* 发送大小:最大64字节 */

    if (HAL_FDCAN_Init(&FDCAN1_Handler) != HAL_OK) 
    {
        return 1;   /* 初始化 */
    }

    /* 配置CAN过滤器 */
    fdcan_filterconfig.IdType = FDCAN_STANDARD_ID;                   /* 标准ID */
    fdcan_filterconfig.FilterIndex = 0;                              /* 滤波器索引 */
    fdcan_filterconfig.FilterType = FDCAN_FILTER_MASK;               /* 滤波器类型 */
    fdcan_filterconfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;       /* 过滤器0关联到FIFO0 */
    fdcan_filterconfig.FilterID1 = 0x0000;                           /* 32位ID */
    fdcan_filterconfig.FilterID2 = 0x0000;                           /* 如果FDCAN配置为传统模式的话,这里是32位掩码 */
    
    /* 过滤器配置 */
    if (HAL_FDCAN_ConfigFilter(&FDCAN1_Handler, &fdcan_filterconfig) != HAL_OK) 
    {
        return 2;                                                    /* 滤波器初始化 */
    }
    /* 配置全局过滤器,拒收所有不匹配的标准帧或扩展帧 */
    if (HAL_FDCAN_ConfigGlobalFilter(&FDCAN1_Handler, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)
    {
        return 3;
    }
    /* 启动CAN外围设备 */
    if (HAL_FDCAN_Start(&FDCAN1_Handler) != HAL_OK)
    {
        return 4;
    }

    HAL_FDCAN_ActivateNotification(&FDCAN1_Handler, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0);

    return 0;
}

/**
 * @brief       FDCAN初始化
 * @param       presc   : 分频值,取值范围1~512;
 * @param       tsjw    : 重新同步跳跃时间单元.范围:1~128;
 * @param       ntsg1   : 时间段1的时间单元.取值范围2~256;
 * @param       ntsg2   : 时间段2的时间单元.取值范围2~128;
 * @param       mode    : FDCAN_MODE_NORMAL,普通模式; 
                          FDCAN_MODE_INTERNAL_LOOPBACK,内部回环模式;
                          FDCAN_MODE_EXTERNAL_LOOPBACK,外部回环模式;
                          FDCAN_MODE_RESTRICTED_OPERATION,限制操作模式
                          FDCAN_MODE_BUS_MONITORING,总线监控模式
 * @note        以上5个参数, 除了模式选择其余的参数在函数内部会减1, 所以, 任何一个参数都不能等于0
 *              FDCAN其输入时钟频率为 Fpclk1 = 20Mhz
 *              波特率 = Fpclk1 / ((ntsg1 + ntsg2 + 1) * presc);
 *              我们设置 fdcan_init(10, 8, 31, 8, 1), 则CAN波特率为:
 *              20M / ((31 + 8 + 1) * 10) = 500Kbps
 * @retval      0,  初始化成功; 其他, 初始化失败;
 */
u8 FDCAN2_Mode_Init(uint16_t presc, uint8_t tsjw, uint16_t ntsg1, uint8_t ntsg2, uint32_t mode) 
{
    FDCAN_FilterTypeDef fdcan_filterconfig;

    HAL_FDCAN_DeInit(&FDCAN2_Handler);                              /* 先清除以前的设置 */
    FDCAN2_Handler.Instance = FDCAN2; 
    FDCAN2_Handler.Init.FrameFormat = FDCAN_FRAME_FD_BRS;           /* 位速率变换FDCAN模式 */
    FDCAN2_Handler.Init.Mode = mode;                                /* 模式设置  */
    FDCAN2_Handler.Init.AutoRetransmission = ENABLE;                /* 使能自动重传!传统模式下一定要关闭!!! */
    FDCAN2_Handler.Init.TransmitPause = ENABLE;                     /* 使能传输暂停 */
    FDCAN2_Handler.Init.ProtocolException = DISABLE;                /* 关闭协议异常处理 */
    /* FDCAN中仲裁段位速率最高1Mbit/s, 数据段位速率最高8Mbit/s */
    /* 数据段通信速率(仅FDCAN模式需配置) = 20M / (1 + dseg1 + dseg2) = 20M / (2 + 1 + 1) = 5 Mbit/s */
    FDCAN2_Handler.Init.DataPrescaler = 10;                         /* 数据段分频系数范围:1~32  */
    FDCAN2_Handler.Init.DataSyncJumpWidth = 16;                     /* 数据段重新同步跳跃宽度1~16 */
    FDCAN2_Handler.Init.DataTimeSeg1 = 2;                           /* 数据段dsg1范围:1~32  5 */
    FDCAN2_Handler.Init.DataTimeSeg2 = 1;                           /* 数据段dsg2范围:1~16  1 */
    
    /* 仲裁段通信速率(FDCAN与传统CAN均需配置) = 20M / (1 + ntsg1 + ntsg2) = 20M / (31 + 8 + 1) = 500Kbit/s */
    FDCAN2_Handler.Init.NominalPrescaler = presc;                   /* 分频系数 */
    FDCAN2_Handler.Init.NominalSyncJumpWidth = tsjw;                /* 重新同步跳跃宽度 */
    FDCAN2_Handler.Init.NominalTimeSeg1 = ntsg1;                    /* tsg1范围:2~256 */
    FDCAN2_Handler.Init.NominalTimeSeg2 = ntsg2;                    /* tsg2范围:2~128 */
    
    FDCAN2_Handler.Init.MessageRAMOffset = FDCAN1_Handler.msgRam.EndAddress - SRAMCAN_BASE;/* 信息RAM偏移(使用2路CAN时非常重要)  */
    FDCAN2_Handler.Init.StdFiltersNbr = 32;                         /* 标准信息ID滤波器编号 */
    FDCAN2_Handler.Init.ExtFiltersNbr = 1;                          /* 扩展信息ID滤波器编号 */
    FDCAN2_Handler.Init.RxFifo1ElmtsNbr = 1;                        /* 接收FIFO1元素编号 */
    FDCAN2_Handler.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_64;       /* 接收FIFO1元素大小:最大64字节 */
    FDCAN2_Handler.Init.RxBuffersNbr = 1;                           /* 接收FIFO1元素编号 */
    FDCAN2_Handler.Init.TxEventsNbr = 1;                            /* 发送事件编号 */
    FDCAN2_Handler.Init.TxBuffersNbr = 1;                           /* 发送缓冲编号 */
    FDCAN2_Handler.Init.TxFifoQueueElmtsNbr = 2;                    /* 发送FIFO序列元素编号 */
    FDCAN2_Handler.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;  /* 发送FIFO序列模式 */
    FDCAN2_Handler.Init.TxElmtSize = FDCAN_DATA_BYTES_64;            /* 发送大小:最大64字节 */

    if (HAL_FDCAN_Init(&FDCAN2_Handler) != HAL_OK) 
    {
        return 1;   /* 初始化 */
    }

    /* 配置CAN过滤器 */
    fdcan_filterconfig.IdType = FDCAN_STANDARD_ID;                   /* 标准ID */
    fdcan_filterconfig.FilterIndex = 1;                              /* 滤波器索引 */
    fdcan_filterconfig.FilterType = FDCAN_FILTER_MASK;               /* 滤波器类型 */
    fdcan_filterconfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO1;       /* 过滤器1关联到FIFO1 */
    fdcan_filterconfig.FilterID1 = 0x0000;                           /* 32位ID */
    fdcan_filterconfig.FilterID2 = 0x0000;                           /* 如果FDCAN配置为传统模式的话,这里是32位掩码 */
    
    /* 过滤器配置 */
    if (HAL_FDCAN_ConfigFilter(&FDCAN2_Handler, &fdcan_filterconfig) != HAL_OK) 
    {
        return 2;                                                    /* 滤波器初始化 */
    }
    /* 配置全局过滤器,拒收所有不匹配的标准帧或扩展帧 */
    if (HAL_FDCAN_ConfigGlobalFilter(&FDCAN2_Handler, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK)
    {
        return 3;
    }
    /* 启动CAN外围设备 */
    if (HAL_FDCAN_Start(&FDCAN2_Handler) != HAL_OK)
    {
        return 4;
    }

    HAL_FDCAN_ActivateNotification(&FDCAN2_Handler, FDCAN_IT_RX_FIFO1_NEW_MESSAGE, 0);

    return 0;
}

static uint32_t HAL_RCC_FDCAN_CLK_ENABLED=0;

//FDCAN底层驱动,引脚配置,时钟使能
//HAL_FDCAN_Init()调用
//hsdram:FDCAN1句柄
void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef* hfdcan)
{
    GPIO_InitTypeDef GPIO_Initure;
    RCC_PeriphCLKInitTypeDef FDCAN_PeriphClk;
    
    if(hfdcan->Instance==FDCAN1)
    {
        //FDCAN时钟源配置为PLL1Q
        FDCAN_PeriphClk.PeriphClockSelection=RCC_PERIPHCLK_FDCAN;
        FDCAN_PeriphClk.FdcanClockSelection=RCC_FDCANCLKSOURCE_PLL;
        if (HAL_RCCEx_PeriphCLKConfig(&FDCAN_PeriphClk) != HAL_OK)
        {
            printf("can1 init failed.\n");
        }

        /* Peripheral clock enable */
        HAL_RCC_FDCAN_CLK_ENABLED++;
        if(HAL_RCC_FDCAN_CLK_ENABLED==1)
        {
            __HAL_RCC_FDCAN_CLK_ENABLE();
        }

        // FDCAN1
        __HAL_RCC_GPIOD_CLK_ENABLE();			        //开启GPIOD时钟
        GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1;    
        GPIO_Initure.Mode=GPIO_MODE_AF_PP;              //推挽复用
        GPIO_Initure.Pull=GPIO_PULLUP;                  //上拉
        GPIO_Initure.Speed=GPIO_SPEED_FREQ_MEDIUM;      //超高速
        GPIO_Initure.Alternate=GPIO_AF9_FDCAN1;         //复用为CAN1
        HAL_GPIO_Init(GPIOD,&GPIO_Initure);             //初始化
    
    #if FDCAN1_RX0_INT_ENABLE     
        HAL_NVIC_SetPriority(FDCAN1_IT0_IRQn,1,2);
        HAL_NVIC_EnableIRQ(FDCAN1_IT0_IRQn);
    #endif	
    }
    else if(hfdcan->Instance==FDCAN2)
    {
        FDCAN_PeriphClk.PeriphClockSelection = RCC_PERIPHCLK_FDCAN;
        FDCAN_PeriphClk.FdcanClockSelection = RCC_FDCANCLKSOURCE_PLL;
        if (HAL_RCCEx_PeriphCLKConfig(&FDCAN_PeriphClk) != HAL_OK)
        {
            printf("can2 init failed.\n");
        }

        /* Peripheral clock enable */
        HAL_RCC_FDCAN_CLK_ENABLED++;
        if(HAL_RCC_FDCAN_CLK_ENABLED==1)
        {
            __HAL_RCC_FDCAN_CLK_ENABLE();
        }

        // FDCAN2
        __HAL_RCC_GPIOB_CLK_ENABLE();			        //开启GPIOB时钟
        GPIO_Initure.Pin=GPIO_PIN_5|GPIO_PIN_6;
        GPIO_Initure.Mode=GPIO_MODE_AF_PP;              //推挽复用
        GPIO_Initure.Pull=GPIO_PULLUP;                  //上拉
        GPIO_Initure.Speed=GPIO_SPEED_FREQ_MEDIUM;      //超高速
        GPIO_Initure.Alternate=GPIO_AF9_FDCAN2;         //复用为CAN2
        HAL_GPIO_Init(GPIOB,&GPIO_Initure);             //初始化
    
    #if FDCAN2_RX0_INT_ENABLE     
        HAL_NVIC_SetPriority(FDCAN2_IT0_IRQn,1,2);
        HAL_NVIC_EnableIRQ(FDCAN2_IT0_IRQn);
    #endif	
    }
}

//此函数会被HAL_FDCAN_DeInit调用
//hfdcan:fdcan句柄
void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef* hfdcan)
{
    /* Peripheral clock disable */
    if(hfdcan->Instance==FDCAN1)
    {
        HAL_RCC_FDCAN_CLK_ENABLED--;
        if(HAL_RCC_FDCAN_CLK_ENABLED==0)
        {
        __HAL_RCC_FDCAN_CLK_DISABLE();
        }

        HAL_GPIO_DeInit(GPIOD, GPIO_PIN_0|GPIO_PIN_1);

    #if FDCAN1_RX0_INT_ENABLE   
        HAL_NVIC_DisableIRQ(FDCAN1_IT0_IRQn);
    #endif
    }
    else if(hfdcan->Instance==FDCAN2)
    {
        /* Peripheral clock disable */
        HAL_RCC_FDCAN_CLK_ENABLED--;
        if(HAL_RCC_FDCAN_CLK_ENABLED==0)
        {
        __HAL_RCC_FDCAN_CLK_DISABLE();
        }

        HAL_GPIO_DeInit(GPIOB, GPIO_PIN_5|GPIO_PIN_6);

    #if FDCAN2_RX0_INT_ENABLE   
        HAL_NVIC_DisableIRQ(FDCAN2_IT0_IRQn);
    #endif
    }
}

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

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

相关文章

odoo17 网站内容存在哪了

odoo17 网站内容存在哪了 查数据库内容,却没找到 没理解这些内容到底存在了哪里呢

图文详解ThreadLocal:原理、结构与内存泄漏解析

目录 一.什么是ThreadLocal 二.ThreadLocal的内部结构 三.ThreadLocal带来的内存泄露问题 ▐ key强引用 ▐ key弱引用 总结 一.什么是ThreadLocal 在Java中,ThreadLocal 类提供了一种方式,使得每个线程可以独立地持有自己的变量副本,而…

「黑神话:悟空」狂销 15 亿!高清游戏录制神器助你称霸

短短一天时间 《黑神话:悟空》在Steam上已售出超过300万份 加上wegame、epic和ps平台 目前总销量超过450万份,总销售额超过15亿元。 根据Steam平台实时数据 8月20日晚间20点30分 该平台《黑神话:悟空》同时在线玩家人数突破200万 达到2…

手机怎么把百度网盘里的文件打印出来?

在日常生活中,我们常常需要打印各种文档,比如合同、报告或是学习资料。有时这些文件存储在网盘中,比如百度网盘,这时候如果能够直接从网盘中打印出来,将会极大地提高效率。今天,就让我们来了解一下如何使用…

PL3366C 用0.1+的芯片做过认证5V1A电源

PL3366C是一款原边反激式5W开关电源芯片恒流/恒压电源。PL3366C高度集成了功率开关,无需光耦以及次级控制电路,PL3366C的复合模式的应用使芯片能够实现低静态功耗、低音频噪音、高效率。满载时PL3366C工作在PFM模式,随着负载降低,…

I2C学习:上拉电阻选取

一.I2C简介 I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。I2C总线在使用时,需要接上拉电阻,这是因为I2C接口是开漏输出,如图1所示。 图1 I2C开漏输出 I2C有5种速度模式:标准(100KHz&am…

日志文件的理解

前言 说实在话我一直对于日志不太理解,感觉这词说的这么高大上,不好理解,甚至还有点畏惧这个东西,所以专门去研究了下,最后发现这家伙不就是输出信息嘛,就像C语言中printf输出的信息,C中cout输…

【电子通识】开关上的“|”和“0”到底哪个是开?哪个是关?

有的电器、灯具和插座上带有电源开关,开关上会出现“|”和“O”两个符号。如下所示船型开关上就有“|”和“0”。 也有开关用ON/OFF代表开闭。 如果只看符号判断“|”和“O”到底代表什么含义呢?你又能分清哪个是电路连通,哪个是电路断开…

05.震动控制继电器开关

首先先知道控制器的原理 通过继电器来控制电路,比如智能插座,比如 220V 的灯,比如我们项目不带开关的傻瓜式报警器 当设置继电器为低电平触发时, STC89C52RC 的 IO 输出 低电平,就会导致 COM口和NO口闭合 &#xff0c…

LearnOpenGL——点光源阴影笔记

LearnOpenGL——点光源阴影笔记 点光源阴影一、生成深度立方体贴图1. 创建立方体贴图2. 光空间的变换3. 深度着色器 二、万向阴影贴图三、PCF 点光源阴影 点光阴影(也叫万向阴影贴图(Omnidirectional Shadow Maps,OSM)&#xff0…

【乐吾乐大屏可视化组态编辑器】动画按顺序播放

动画按顺序播放 在线使用:https://v.le5le.com/ 如案例所示,通过连线去串联一组动画图元,动画按照顺序向后执行。 ① 首先给每个图元都配置动画,注意这里的动画播放次数一定要配置有限个(这里配置都是1次&#xff0…

AI在医学领域:FEDMEKI平台实现在隐私约束下将医学知识整合到基础模型

基础模型已在众多领域掀起了一场革命性的变革,它们在处理多样化模态和复杂任务方面展现出了卓越的能力。以GPT-3和LLaMA为例,这些模型在众多应用场景中均表现出色。其成功的核心在于接触并学习海量的训练数据,从而深入洞察不同领域。借助这些…

【python与java的区别-04(文件流)】

一、文件和目录的操作 1、IO流(Stream) 通过“流”的形式允许计算机程序使用相同的方式来访问不同的流入/流出源。Stream是从起源(source)到接收(sink)的有序数据。我们把输入/输出源对比成“水桶”,那么流就是“管道…

企业给排水乙级资质续期:人才储备与补充计划

企业给排水乙级资质续期过程中,人才储备与补充计划是至关重要的环节。以下是一个详细的人才储备与补充计划,旨在帮助企业顺利应对资质续期挑战: 一、人才储备计划 1. 提前规划与预测 政策分析:密切关注住建部门或相关权威机构发…

VirtualBox和VMware的虚拟机ip配置为同一网段不使用wlan的网卡(vulnhub打靶前期准备)

打靶前期准备工作,virtualbox和VMware之间的网络互通(即同一个网段下非wlan网卡的设置) 首先在打靶的时候因为vulnhub的靶机都是使用的virtualbox的虚拟机,但是我的kali已经用了很久了一直使用的是VMware,突然转换使用…

面试必刷——二叉树习题/面试题详解

(1)检查两棵树是否相同 题目链接: . - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems…

品质更进阶 长安马自达MAZDA EZ-6通关中国“热极”

继在中国规格最高的重庆垫江测试场完成驾控试炼后,8月20日-22日,长安马自达MAZDA EZ-6“众测先享官—品质更进阶”在中国“热极”吐鲁番再次拉开帷幕。针对电动车用户最关心的酷暑天气用车痛点场景,由长安马自达工程师团队携手用户代表、权威…

云微客短视频矩阵获客有多容易?低成本获客备受好评

数字化时代,短视频矩阵已经成为企业获客的重要渠道之一,云微客短视频矩阵系统为企业解决在短视频营销中的账号搭建、内容生产、账号运营、低成本引流等难题。 短视频矩阵是一种基于抖音、快手、小红书、视频号等短视频平台,通过批量剪辑、批量…

Linux shell编程学习笔记72:tr命令——集合转换工具

0 前言 在大数据时代,我们要面对大量数据,有时需要对数据进行整理和转换。 在Linux中,我们可以使用 tr命令来整理和转换数据,也可以进行简单的加解密。 1 tr命令 的帮助信息,功能,格式,选项和…

图片展示时等比例缩放

通过object-fit进行图片等比例缩放 object-fit 属性有以下几种值: contain:图片等比例缩放以完全填充容器,同时保持图像的宽高比。 cover:图片等比例缩放以完全填充容器,但可能会裁剪图片。 fill:图片拉伸以…