【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)
相关文章:

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

shell文本处理
shell文本处理 一、grep 过滤来自一个文件或标准输入匹配模式内容。除了 grep 外,还有 egrep、fgrep。egrep 是 grep 的扩展,相当于 grep -E。fgrep 相当于 grep -f,用的比较少。 用法 grep [OPTION]... PATTERN [FILE]...支持的正则描述…...

如何利用客户端双向TLS认证保护云上应用安全
双向TLS(mTLS)通过要求服务器和客户端双方使用数字证书来验证彼此身份,从而扩展了传统TLS的安全性。常规的TLS只会验证服务器的身份(如大家的浏览器在验证网站时的场景),而mTLS确保在任何数据交换发生之前,双方都对彼此持有信任。在本文中&am…...

nlp第十节——LLM相关
一、模型蒸馏技术 本质上是从一个大模型蒸馏出小模型,从小模型训练出来的概率分布(如自回归模型预测下一个字的概率分布)分别与大模型预测的概率分布和ground label求loss。与大模型预测的概率分布用KL散度求loss,与ground label用…...
T-SQL 语言基础: SQL 数据库对象元数据及配置信息获取
目录 介绍目录视图 获取表和架构名称获取列信息 信息架构视图 获取表信息获取列信息 系统存储过程和函数 获取对象列表获取对象详细信息获取约束信息获取数据库属性信息 总结引用 介绍 在 SQL 数据库管理中,获取数据库对象的元数据信息是至关重要的。元数据提供了…...

ue5 创建多列StreeView的方法与理解
创建StreeView的多列样式怎么就像是创建单行单列差不多?貌似就是在单行单列中加入了多列widget? 示例代码 DetailTabWidget #pragma once #include "TreeViewItemBase.h"class SDetailTabWidget : public SCompoundWidget {SLATE_BEGIN_ARGS(SDetailT…...

C# OnnxRuntime部署DAMO-YOLO香烟检测
目录 说明 效果 模型信息 项目 代码 下载 参考 说明 效果 模型信息 Model Properties ------------------------- --------------------------------------------------------------- Inputs ------------------------- name:input tensor:Floa…...

陕西省地标-DB61/T 1121-2018 政务服务中心建设和运营规范
揭秘陕西省智慧政务服务中心新标准:打造高效便捷的服务新体验 随着信息化时代的深入发展,智慧政务已成为提升政府服务效率、优化营商环境的重要举措。陕西省作为全国政务改革的先行者,近期颁布了《陕西省地标-DB61_T 1121-2018 政务服务中心…...

UDP协议(20250303)
1. UDP UDP:用户数据报协议(User Datagram Protocol),传输层协议之一(UDP,TCP) 2. 特性 发送数据时不需要建立链接,节省资源开销不安全不可靠的协议 //一般用在实时性比较高…...

【四.RAG技术与应用】【12.阿里云百炼应用(下):RAG的云端优化与扩展】
在上一篇文章中,我们聊了如何通过阿里云百炼平台快速搭建一个RAG(检索增强生成)应用,实现文档智能问答、知识库管理等基础能力。今天咱们继续深入,聚焦两个核心问题:如何通过云端技术优化RAG的效果,以及如何扩展RAG的应用边界。文章会穿插实战案例,手把手带你踩坑避雷。…...
Docker新手入门(持续更新中)
一、定义 快速构建、运行、管理应用的工具。 Docker可以帮助我们下载应用镜像,创建并运行镜像的容器,从而快速部署应用。 所谓镜像,就是将应用所需的函数库、依赖、配置等应用一起打包得到的。 所谓容器,为每个镜像的应用进程创建…...

【星云 Orbit • STM32F4】08. 用判断数据头来接收据的串口通用程序框架
【星云 Orbit • STM32F4】08. 用判断数据头来接收据的串口通用程序框架 1. 引言 本教程旨在帮助嵌入式开发小白从零开始,学习如何在STM32F407微控制器上实现一个基于串口的数据接收程序。该程序能够通过判断数据头来接收一串数据,并将其存储到缓冲区中…...
HSPF 水文模型建模方法与案例分析实践技术应用
在水文模拟领域,HSPF 模型(Hydrological Simulation Program Fortran)与 SWAT 模型一样,都是备受瞩目的水文模型软件。HSPF 模型因其强大的功能和简便的操作,在全球范围内得到了广泛应用。该模型不仅能够在缺乏测量数据…...

设置 CursorRules 规则
为什么要设置CursorRules? 设置 CursorRules 可以帮助优化代码生成和开发流程,提升工作效率。具体的好处包括: 1、自动化代码生成 :通过定义规则,Cursor 可以根据你的开发需求自动生成符合规定的代码模板,…...

人工智能AI在汽车设计领域的应用探索
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活…...

《当AI生成内容遭遇审核:需求与困境的深度剖析》:此文为AI自动生成
AI 内容审核:数字时代的守门人 在当今数字技术迅猛发展的浪潮中,AI 在内容生成领域取得了令人瞩目的成就,成为了推动创新与变革的核心力量。以 AI 绘画为例,从早期简单粗糙的图像生成,到如今能够创作出细节丰富、风格多…...

【无人机与无人车协同避障】
无人机与无人车协同避障的关键在于点云数据的采集、传输、解析及实时应用,以下是技术实现的分步解析: 1. 点云数据采集(无人机端) 传感器选择: LiDAR:通过激光雷达获取高精度3D点云(精度达厘米…...
ComfyUI AnimeDiff动画参数总结
ComfyUI AnimeDiff动画参数总结 一、动画生成核心参数 参数名称建议值/范围作用说明备注步数(Steps)15-25控制AI计算迭代次数,越高细节越精细,但耗时更长推荐20步,显存不足可降至15步CFG值7.0-8.5提示词对画面的控制…...

No manual entry for printf in section 3
问题描述 在尝试查看 printf 的 C 函数手册页(即 man 3 printf)时遇到了 “No manual entry for printf in section 3” 的错误信息。 解决方案 出现这问题,是由于系统上没有安装对应的部分的手册页,因此安装对应的部分的手册…...
React 之 Redux 第二十八节 学习目标与规划大纲及概要讲述
接下来 开始Redux 全面详细的文档输出,主要基于一下几个方面,欢迎大家补充指正 一、Redux 基础概念 为什么需要 Redux? 前端状态管理的挑战(组件间通信、状态共享) Redux 解决的问题:集中式、可预测的状态…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...