【STM32项目实战系列】基于STM32G474的FDCAN驱动配置

前言:本周工作中用到了CANFD的驱动,由于以前都是用到的CAN2.0,所以过程并不是特别的顺利,所以中间遇到几个比较小的问题导致自己卡住了一段时间,特此记录一下并完全奉上自己的配置的源码。


1,CANFD配置与简介

先简单介绍一下CANFD:

FDCAN(Flexible Data-Rate CAN,灵活数据速率 CAN)是 CAN-FD(CAN with Flexible Data-Rate)协议的实现,支持更高的传输速率和更大的数据负载。FDCAN 通信主要由 仲裁域(Arbitration Phase)数据域(Data Phase) 组成,它们在波特率和位定时参数上有所不同。

这里配置的FDCAN外设的时钟为100MHZ

1,相较于传统的CAN,CANFD仲裁域与数据域的波特率可以不同也可以相同,

  • 仲裁阶段:与传统 CAN 相同(≤ 1 Mbps)
  • 数据阶段:可以使用更高的速率(典型值 2 Mbps、5 Mbps,甚至 8 Mbps

2,数据传输特点:

  • 传输 更长的数据(64 字节),减少协议开销,提高带宽利用率。
  • 数据阶段 速率更快,提升整车网络通信性能。

3,仲裁域特点:

  • 低 ID 优先级高(0 优先级高于 1)。
  • 发送过程中,如果节点检测到比自己更低的 ID(更高优先级),则自动停止发送。
  • 传统 CAN 与 CAN FD 可以共存,但 如果 CAN FD 设备检测到传统 CAN 帧,会降级为传统 CAN 模式

4,波特率的计算方式

Baud_rate = FDCAN_Clock / (Prescaler * (Seg_1 + Seg_2 + Sync_Jump_Width))

  • FDCAN_Clock(FDCAN 时钟)
  • Prescaler(分频系数)
  • Phase Segment 1(相位段 1)
  • Phase Segment 2(相位段 2,用于接收器同步和误差修正)
  • Sync_Jump_Width(同步跳宽)

5,采样率的计算方式

  • sampling_rate = (Seg_1 + 1) / (1 + Seg_1 + Seg_2)


2,FDCAN代码生成

这里先用的CUBEMX生成的源驱动代码,但是烧录进板子里面发现无法使用,后面就有改了一下,同样的把这个源码也搬过来

fdcan.c

/* USER CODE BEGIN Header */
/********************************************************************************* @file    fdcan.c* @brief   This file provides code for the configuration*          of the FDCAN instances.******************************************************************************* @attention** Copyright (c) 2025 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "fdcan.h"/* USER CODE BEGIN 0 *//* USER CODE END 0 */FDCAN_HandleTypeDef hfdcan1;/* FDCAN1 init function */
void MX_FDCAN1_Init(void)
{/* USER CODE BEGIN FDCAN1_Init 0 *//* USER CODE END FDCAN1_Init 0 *//* USER CODE BEGIN FDCAN1_Init 1 *//* USER CODE END FDCAN1_Init 1 */hfdcan1.Instance = FDCAN1;hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1;hfdcan1.Init.FrameFormat = FDCAN_FRAME_FD_BRS;hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;hfdcan1.Init.AutoRetransmission = DISABLE;hfdcan1.Init.TransmitPause = DISABLE;hfdcan1.Init.ProtocolException = DISABLE;hfdcan1.Init.NominalPrescaler = 5;hfdcan1.Init.NominalSyncJumpWidth = 1;hfdcan1.Init.NominalTimeSeg1 = 15;hfdcan1.Init.NominalTimeSeg2 = 4;hfdcan1.Init.DataPrescaler = 5;hfdcan1.Init.DataSyncJumpWidth = 1;hfdcan1.Init.DataTimeSeg1 = 2;hfdcan1.Init.DataTimeSeg2 = 1;hfdcan1.Init.StdFiltersNbr = 28;hfdcan1.Init.ExtFiltersNbr = 8;hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK){Error_Handler();}/* USER CODE BEGIN FDCAN1_Init 2 *//* USER CODE END FDCAN1_Init 2 */}void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef* fdcanHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};if(fdcanHandle->Instance==FDCAN1){/* USER CODE BEGIN FDCAN1_MspInit 0 *//* USER CODE END FDCAN1_MspInit 0 *//** Initializes the peripherals clocks*/PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_FDCAN;PeriphClkInit.FdcanClockSelection = RCC_FDCANCLKSOURCE_PCLK1;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK){Error_Handler();}/* FDCAN1 clock enable */__HAL_RCC_FDCAN_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/**FDCAN1 GPIO ConfigurationPA11     ------> FDCAN1_RXPA12     ------> FDCAN1_TX*/GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN1;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/* FDCAN1 interrupt Init */HAL_NVIC_SetPriority(FDCAN1_IT0_IRQn, 0, 0);HAL_NVIC_EnableIRQ(FDCAN1_IT0_IRQn);HAL_NVIC_SetPriority(FDCAN1_IT1_IRQn, 0, 0);HAL_NVIC_EnableIRQ(FDCAN1_IT1_IRQn);/* USER CODE BEGIN FDCAN1_MspInit 1 *//* USER CODE END FDCAN1_MspInit 1 */}
}void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef* fdcanHandle)
{if(fdcanHandle->Instance==FDCAN1){/* USER CODE BEGIN FDCAN1_MspDeInit 0 *//* USER CODE END FDCAN1_MspDeInit 0 *//* Peripheral clock disable */__HAL_RCC_FDCAN_CLK_DISABLE();/**FDCAN1 GPIO ConfigurationPA11     ------> FDCAN1_RXPA12     ------> FDCAN1_TX*/HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11|GPIO_PIN_12);/* FDCAN1 interrupt Deinit */HAL_NVIC_DisableIRQ(FDCAN1_IT0_IRQn);HAL_NVIC_DisableIRQ(FDCAN1_IT1_IRQn);/* USER CODE BEGIN FDCAN1_MspDeInit 1 *//* USER CODE END FDCAN1_MspDeInit 1 */}
}/* USER CODE BEGIN 1 *//* USER CODE END 1 */

fdcan.h

/* USER CODE BEGIN Header */
/********************************************************************************* @file    fdcan.h* @brief   This file contains all the function prototypes for*          the fdcan.c file******************************************************************************* @attention** Copyright (c) 2025 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __FDCAN_H__
#define __FDCAN_H__#ifdef __cplusplus
extern "C" {
#endif/* Includes ------------------------------------------------------------------*/
#include "main.h"/* USER CODE BEGIN Includes *//* USER CODE END Includes */extern FDCAN_HandleTypeDef hfdcan1;/* USER CODE BEGIN Private defines *//* USER CODE END Private defines */void MX_FDCAN1_Init(void);/* USER CODE BEGIN Prototypes *//* USER CODE END Prototypes */#ifdef __cplusplus
}
#endif#endif /* __FDCAN_H__ */

改进后的代码,增加一个发送与接收CAN报文的接口与一些驱动接口。尝试之后就可以发送与接收到报文了,亲测有效。另外,当数据域设置成最大的时候,使用CAN工具设置数据域的那个波特率都是可以接受到报文的。

 fdcan.c

/* USER CODE BEGIN Header */
/********************************************************************************* @file    fdcan.c* @brief   This file provides code for the configuration*          of the FDCAN instances.******************************************************************************* @attention** Copyright (c) 2025 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "fdcan.h"/* USER CODE BEGIN 0 */
RxDataLen_t RxData_len[16] = {{SEND_BYTES_0, 0}, {SEND_BYTES_1, 1}, {SEND_BYTES_2, 2}, {SEND_BYTES_3, 3},{SEND_BYTES_4, 4}, {SEND_BYTES_5, 5}, {SEND_BYTES_6, 6}, {SEND_BYTES_7, 7},{SEND_BYTES_8, 8}, {SEND_BYTES_12, 12}, {SEND_BYTES_16, 16}, {SEND_BYTES_20, 20},{SEND_BYTES_24, 24}, {SEND_BYTES_32, 32}, {SEND_BYTES_48, 48}, {SEND_BYTES_64, 64}
};
/* USER CODE END 0 */FDCAN_HandleTypeDef hfdcan1;/* FDCAN1 init function */
void MX_FDCAN1_Init(void)
{FDCAN_FilterTypeDef sFilterConfig = {0};/* USER CODE BEGIN FDCAN1_Init 0 *//* USER CODE END FDCAN1_Init 0 *//* USER CODE BEGIN FDCAN1_Init 1 *//* USER CODE END FDCAN1_Init 1 */// 仲裁域波特率为1Mbps 80%  数据域波特率为5Mbps 75%// 波特率 Baud rate = FDCAN Clock / (Prescaler * (Seg_1 + Seg_2 + Sync_Jump_Width))// 采样率 sampling rate = (Seg_1 + 1) / (1 + Seg_1 + Seg_2)hfdcan1.Instance = FDCAN1;hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1;  // 外设时钟分频hfdcan1.Init.FrameFormat = FDCAN_FRAME_FD_BRS; // 使用FD BRS格式hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;  			 // 正常模式hfdcan1.Init.AutoRetransmission = DISABLE;     // 禁止自动重发hfdcan1.Init.TransmitPause = DISABLE;          // 禁止暂停传输hfdcan1.Init.ProtocolException = DISABLE;      // 禁用协议异常hfdcan1.Init.NominalPrescaler = 5;             // 仲裁域分频系数(1Mbps)hfdcan1.Init.NominalSyncJumpWidth = 1;         // 同步跳跃宽度hfdcan1.Init.NominalTimeSeg1 = 15;             // 时间段1hfdcan1.Init.NominalTimeSeg2 = 4;              // 时间段2hfdcan1.Init.DataPrescaler = 5;                // 数据域分频系数hfdcan1.Init.DataSyncJumpWidth = 1;            // 数据同步跳跃宽度hfdcan1.Init.DataTimeSeg1 = 2;                 // 数据时间段1hfdcan1.Init.DataTimeSeg2 = 1;                 // 数据时间段2hfdcan1.Init.StdFiltersNbr = 28;               // 标准过滤器数量hfdcan1.Init.ExtFiltersNbr = 8;                // 扩展过滤器数量hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;  // 发送FIFO操作模式if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK){printf("Error_Handler:HAL_FDCAN_Init\r\n");Error_Handler();}sFilterConfig.IdType = FDCAN_STANDARD_ID;sFilterConfig.FilterIndex = 0;sFilterConfig.FilterType = FDCAN_FILTER_RANGE;sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;sFilterConfig.FilterID1 = 0x00;sFilterConfig.FilterID2 = 0x7FF;if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK){Error_Handler();}sFilterConfig.IdType = FDCAN_EXTENDED_ID;sFilterConfig.FilterIndex = 0;sFilterConfig.FilterType = FDCAN_FILTER_RANGE;sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;sFilterConfig.FilterID1 = 0x00;sFilterConfig.FilterID2 = 0x1FFFFFFF;if (HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig) != HAL_OK){Error_Handler();}/* Configure global filter on both FDCAN instances:Filter all remote frames with STD and EXT IDReject non matching frames with STD ID and EXT ID */if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, FDCAN_FILTER_REMOTE, FDCAN_FILTER_REMOTE) != HAL_OK){Error_Handler();}/* Activate Rx FIFO 0 new message notification on both FDCAN instances */if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK){Error_Handler();}if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_BUS_OFF, 0) != HAL_OK){Error_Handler();}/* Configure and enable Tx Delay Compensation, required for BRS mode.TdcOffset default recommended value: DataTimeSeg1 * DataPrescalerTdcFilter default recommended value: 0 */HAL_FDCAN_ConfigTxDelayCompensation(&hfdcan1, hfdcan1.Init.DataPrescaler * hfdcan1.Init.DataTimeSeg1, 0);HAL_FDCAN_EnableTxDelayCompensation(&hfdcan1);HAL_FDCAN_Start(&hfdcan1);/* USER CODE END FDCAN1_Init 2 */
}void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef* fdcanHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};if(fdcanHandle->Instance==FDCAN1){/* USER CODE BEGIN FDCAN1_MspInit 0 *//* USER CODE END FDCAN1_MspInit 0 *//** Initializes the peripherals clocks*/PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_FDCAN;PeriphClkInit.FdcanClockSelection = RCC_FDCANCLKSOURCE_PCLK1;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK){Error_Handler();}/* FDCAN1 clock enable */__HAL_RCC_FDCAN_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/**FDCAN1 GPIO ConfigurationPA11     ------> FDCAN1_RXPA12     ------> FDCAN1_TX*/GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN1;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/* FDCAN1 interrupt Init */HAL_NVIC_SetPriority(FDCAN1_IT0_IRQn, 0, 0);HAL_NVIC_EnableIRQ(FDCAN1_IT0_IRQn);HAL_NVIC_SetPriority(FDCAN1_IT1_IRQn, 0, 0);HAL_NVIC_EnableIRQ(FDCAN1_IT1_IRQn);/* USER CODE BEGIN FDCAN1_MspInit 1 *//* USER CODE END FDCAN1_MspInit 1 */}
}void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef* fdcanHandle)
{if(fdcanHandle->Instance==FDCAN1){/* USER CODE BEGIN FDCAN1_MspDeInit 0 *//* USER CODE END FDCAN1_MspDeInit 0 *//* Peripheral clock disable */__HAL_RCC_FDCAN_CLK_DISABLE();/**FDCAN1 GPIO ConfigurationPA11     ------> FDCAN1_RXPA12     ------> FDCAN1_TX*/HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11|GPIO_PIN_12);/* FDCAN1 interrupt Deinit */HAL_NVIC_DisableIRQ(FDCAN1_IT0_IRQn);HAL_NVIC_DisableIRQ(FDCAN1_IT1_IRQn);/* USER CODE BEGIN FDCAN1_MspDeInit 1 *//* USER CODE END FDCAN1_MspDeInit 1 */}
}// /* USER CODE BEGIN 1 *//* FDCAN发送报文函数 */
HAL_StatusTypeDef FDCAN_SendMessage(uint32_t id, uint8_t Txdata[], FDCAN_DLC_T dataLength)
{FDCAN_TxHeaderTypeDef TxHeader = {0};TxHeader.Identifier = id;  // 设置CAN报文的ID  // 检查发送帧ID的有效性if(id < 0x800) {TxHeader.IdType = FDCAN_STANDARD_ID;}else {TxHeader.IdType = FDCAN_EXTENDED_ID;if(id > 0x1FFFFFFF) {printf("Error_Handler:id > 0x1FFFFFFF\r\n");return HAL_ERROR;}}// CAN发送格式的识别if (dataLength > FDCAN_DLC_BYTES_8) {TxHeader.FDFormat = FDCAN_FD_CAN;}else {TxHeader.FDFormat = FDCAN_CLASSIC_CAN;}TxHeader.TxFrameType = FDCAN_DATA_FRAME;  // 数据帧 FDCAN_REMOTE_FRAME//FDCAN_DATA_FRAME// 数据长度(0-8字节,还有12,16,20,24,32,48,64)TxHeader.DataLength = dataLength; TxHeader.BitRateSwitch = FDCAN_BRS_OFF;  // 不使用数据速率切换// 发送报文if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, Txdata) != HAL_OK){printf("FDCAN send msg fail\r\n");return HAL_ERROR;  // 发送失败}return HAL_OK;  // 发送成功
}// FDCAN1 中断接收回调函数
void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
{FDCAN_RxHeaderTypeDef RxHeader = {0};uint8_t RxData[64] = {0};  // 支持最大64字节数据uint8_t len = 0;           // 接收到的数据长度// 从FIFO0中读取接收到的消息if (HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK){Error_Handler();}for(int i = 0; i < (sizeof(RxData_len)/sizeof(RxData_len[0])); i++) {if (RxData_len[i].dataLength == RxHeader.DataLength) {len = RxData_len[i].datalen_num;}}#if 1printf("id: %d, DataLength: %d\r\n", RxHeader.Identifier, len);printf("Received Data: ");for (uint8_t i = 0; i < len; i++){printf("0x%02X ", RxData[i]);}printf("\n");
#endif// 可以根据需要检查其他中断标志位进行不同的处理// 如果接收FIFO0已满if ((RxFifo0ITs & FDCAN_IT_RX_FIFO0_FULL) != RESET){// 处理FIFO满的情况printf("FIFO 0 is full\n");}// 如果接收FIFO0消息丢失if ((RxFifo0ITs & FDCAN_IT_RX_FIFO0_MESSAGE_LOST) != RESET){// 处理消息丢失的情况printf("Message lost in FIFO 0\n");}
}/* USER CODE END 1 */

  fdcan.h

/* USER CODE BEGIN Header */
/********************************************************************************* @file    fdcan.h* @brief   This file contains all the function prototypes for*          the fdcan.c file******************************************************************************* @attention** Copyright (c) 2025 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __FDCAN_H__
#define __FDCAN_H__#ifdef __cplusplus
extern "C" {
#endif/* Includes ------------------------------------------------------------------*/
#include "main.h"/* USER CODE BEGIN Includes *//* USER CODE END Includes */extern FDCAN_HandleTypeDef hfdcan1;/* USER CODE BEGIN Private defines */
typedef enum {SEND_BYTES_0 = FDCAN_DLC_BYTES_0,SEND_BYTES_1 = FDCAN_DLC_BYTES_1,SEND_BYTES_2 = FDCAN_DLC_BYTES_2,SEND_BYTES_3 = FDCAN_DLC_BYTES_3,SEND_BYTES_4 = FDCAN_DLC_BYTES_4,SEND_BYTES_5 = FDCAN_DLC_BYTES_5,SEND_BYTES_6 = FDCAN_DLC_BYTES_6,SEND_BYTES_7 = FDCAN_DLC_BYTES_7,SEND_BYTES_8 = FDCAN_DLC_BYTES_8,SEND_BYTES_12 = FDCAN_DLC_BYTES_12,SEND_BYTES_16 = FDCAN_DLC_BYTES_16,SEND_BYTES_20 = FDCAN_DLC_BYTES_20,SEND_BYTES_24 = FDCAN_DLC_BYTES_24,SEND_BYTES_32 = FDCAN_DLC_BYTES_32,SEND_BYTES_48 = FDCAN_DLC_BYTES_48,SEND_BYTES_64 = FDCAN_DLC_BYTES_64
} FDCAN_DLC_T;typedef struct {FDCAN_DLC_T dataLength;uint8_t datalen_num;
} RxDataLen_t;
/* USER CODE END Private defines *//* USER CODE BEGIN Prototypes */void MX_FDCAN1_Init(void);
HAL_StatusTypeDef FDCAN_SendMessage(uint32_t id, uint8_t Txdata[], FDCAN_DLC_T dataLength);/* USER CODE END Prototypes */#ifdef __cplusplus
}
#endif#endif /* __FDCAN_H__ */

参考文章:

CAN总线采样点原理与测试方法详解-CSDN博客

嵌入式Linux中的CAN(FD)总线——驱动配置 - 知乎 (zhihu.com)

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

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

相关文章

解决git clone下载慢或者超时问题

在网上找了很多办法&#xff0c;直接最简单的使用镜像网站下载。 国内可用的镜像网站有&#xff1a; https://github.com.cnpmjs.org # 服务器位于香港https://gitclone.com # 服务器位于杭州https://doc.fastgit.org # 服务器位于香港 例如&#xff1a;将 git clone https:…

nginx+keepalived负载均衡及高可用

1 项目背景 keepalived除了能够管理LVS软件外&#xff0c;还可以作为其他服务的高可用解决方案软件。采用nginxkeepalived&#xff0c;它是一个高性能的服务器高可用或者热备解决方案&#xff0c;Keepalived主要来防止服务器单点故障的发生问题&#xff0c;可以通过其与Nginx的…

Hive 3.1 在 metastore 运行的 remote threads

Remote threads 是仅当 Hive metastore 作为单独的服务运行是启动&#xff0c;请求需要开启 compactor。 有以下几种&#xff1a; 1. AcidOpenTxnsCounterService 统计当前 open 的事务数 从表 TXNS 中统计状态为 open 的事务。此事务数量可以再 hive metrics 中。 2. Acid…

厦门大学第二讲:DeepSeek大模型赋能高校教学和科研(124页)(文末附下载方法)

厦门大学大数据教学团队林子雨副教授发布&#xff1a; 厦大团队&#xff5c;报告&#xff1a;《读懂大模型概念、技术与应用实践》https://blog.csdn.net/2401_83947004/article/details/145995693?sharetypeblogdetail&sharerId145995693&sharereferPC&sharesou…

解决双系统开机显示gnu grub version 2.06 Minimal BASH Like Line Editing is Supported

找了好多教程都没有用&#xff0c;终于解决了&#xff01;&#xff01;我是因为ubuntu分区的时候出问题了 问题描述&#xff1a; 双系统装好&#xff0c;隔天开机找不到引导项&#xff0c;黑屏显示下列 因为我用的D盘划分出来的部分空闲空间&#xff0c;而不是全部&#xff0c…

从零到一:快速上手 Poetry——Python 项目管理的利器

在 Python 项目开发中&#xff0c;包管理、依赖管理和虚拟环境的创建一直是开发者们经常面对的难题。传统上&#xff0c;开发者通常会使用 pip、virtualenv 或者 conda 来处理这些问题。然而&#xff0c;随着 Python 项目复杂度的增加&#xff0c;传统工具往往显得力不从心&…

基于Windows11的RAGFlow安装方法简介

基于Windows11的RAGFlow安装方法简介 一、下载安装Docker docker 下载地址 https://www.docker.com/ Download Docker Desktop 选择Download for Winodws AMD64下载Docker Desktop Installer.exe 双点击 Docker Desktop Installer.exe 进行安装 测试Docker安装是否成功&#…

基于Android平台的SOME/IP测试模块 EPT-ETS

在汽车产业智能化、网联化的时代浪潮中&#xff0c;汽车电子系统正经历着前所未有的变革。SOME/IP&#xff08;Scalable service-Oriented MiddlewarE over IP&#xff09;协议作为汽车电子通信领域的关键技术&#xff0c;其稳定性、可靠性与高效性对于整车性能的提升起着至关重…

初阶数据结构习题【7】(3顺序表和链表)—— 21. 合并两个有序链表

1. 题目描述 力扣在线OJ——21合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例1 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入&#xff1a;l1…

ESP32 IDF的触摸按键例子

硬件资源 1.ESP32 开发板 2. LED灯&#xff08;-接到GND, 通过10K电阻接到PIN4) 3. 触摸按键&#xff08;接到PIN32,对应触摸通道9) 预期效果&#xff1a; 1. 点动模式&#xff1a;小于1s的触摸&#xff0c;LED交替亮灭 2. 长按模式&#xff1a;大于1s的触摸&#xff0c;…

《2025软件测试工程师面试》功能测试篇

什么是功能测试? 功能测试是通过验证产品功能是否满足用户需求的过程,主要关注软件的功能是否符合需求规格说明,包括软件的各种功能、特性、性能、安全性和易用性等。 功能测试的流程包括哪些步骤? 需求分析:明确软件需求,确定测试范围。测试计划:制定详细的测试计划,…

python官方文档阅读整理(一)

2.2 解释器的运行环境 2.2.1 源文件的字符编码 默认情况下&#xff0c;python源码文件的编码是UTF-8。 3.Python速览 Python注释以#开头&#xff0c;直到该物理行结束。注释可以在行开头&#xff0c;或空白符与代码之后&#xff0c;但不能在字符串里面。 3.1 Python用作计…

队列的顺序结构—循环队列的判断条件(rear + 1) % MAXSIZE分析

一、为什么需要牺牲一个空间&#xff1f; 循环队列通过 front 和 rear 指针的位置关系来判断队列的空和满。但如果不牺牲一个空间&#xff0c;会导致以下问题&#xff1a; 1. 队空和队满的冲突 队空条件&#xff1a;front rear。队满条件&#xff1a;如果允许队列完全填满&…

Baklib内容中台赋能企业智管

内容中台构建全场景智管 现代企业数字化运营中&#xff0c;全域内容管理能力已成为核心竞争力。通过智能知识引擎驱动的内容中台架构&#xff0c;企业能够实现跨部门、多形态数据的统一归集与动态调度。以某制造企业为例&#xff0c;其利用中台系统将分散在CRM、ERP及内部文档…

大模型学习--微调

模型微调是一种在已有预训练模型的基础上&#xff0c;通过使用特定任务的数据集进行进一步训练的技术。这种方法允许模型在保持其在大规模数据集上学到的通用知识的同时&#xff0c;适应特定任务的细微差别。使用微调模型&#xff0c;可以获得以下好处&#xff1a; 提高性能&a…

【C++】模板编程入门指南:零基础掌握泛型编程核心(初阶)

文章目录 一、泛型编程二、函数模板1. 函数模板的概念和格式2. 函数模板的原理3. 函数模板的实例化隐式实例化显式实例化 三、类模板 一、泛型编程 泛型编程就是编写与类型无关的通用代码&#xff0c;是代码复用的一种手段&#xff0c;模板是泛型编程的基础&#xff0c;可能不太…

IO学习day2

一、思维导图 IO标准函数 问&#xff1a; printf\fprintf\sprintf\snprintf之间的区别&#xff1f; 1. printf&#xff1a;格式串输出&#xff0c;会在当前终端打印输出结果 2. fprintf&#xff1a;文件的写入&#xff0c;可以写入不同的数据类型&#xff08;int&#xff0c…

python-leetcode 47.路径总和III

题目&#xff1a; 给定一个二叉树的根结点root,和一个整数targetSum,求该二叉树力节点值之和等于targetSum的路径数目。 路径不需要从根节点开始&#xff0c;也不需要在叶子节点结束&#xff0c;但是路径方向必须是向下的&#xff08;只能从父节点到子节点&#xff09; 方法一…

加油站小程序实战教程06地图多站点显示

目录 引言功能设计与开发步骤第一步&#xff1a;初始化项目与地图第二步&#xff1a;动态切换城市地图第三步&#xff1a;标记加油站位置第四步&#xff1a;获取用户位置并计算最近加油站第五步&#xff1a;城市名称解析完整代码总结 引言 在上一篇《加油站小程序实战05&#…

【vue-echarts】——04.配置项---legend

文章目录 一、配置项-legend图例二、显示结果一、配置项-legend图例 图例组件展现了不同系列的标记,颜色和名字。可以通过点击图例控制哪些系列不显示。 代码如下 Demo4View.vue <template><div class="about">