Diving into the STM32 HAL-----DAC笔记

        根据所使用的系列和封装,STM32微控制器通常只提供一个具有一个或两个专用输出的DAC,除了STM32F3系列中的少数零件编号实现两个DAC,第一个具有两个输出,另一个只有一个输出。STM32G4 系列的一些较新的 MCU 甚至提供多达 5 个独立的 DAC 模块,但只有前两个具有输出 I/O:其他 MCU 可以馈送 OPAMP、比较器和 ADC 等内部外设(如果支持)。

        DAC 通道可以配置为在 8/12 位模式下工作,两个通道的转换可以独立或同时执行:最后一种模式在必须生成两个独立但同步信号的应用(例如,在音频应用中)非常有用。与 ADC 外设一样,甚至 DAC 也可以由专用定时器触发,以产生给定频率的模拟信号。

        本章简要介绍了该外设最相关的特性。像往常一样,我们现在将简要说明 DAC 控制器的工作原理。

1、DAC 外设简介

        DAC 是一种将数字转换为模拟信号的器件,模拟信号与提供的参考电压 VREF 成正比(见下图)。

        DAC 有很多类。其中一些包括脉宽调制器 (PWM)、插值、Σ-Δ DC 和高速 DAC。我们在前面分析了如何使用 STM32 定时器生成 PWM 信号,并在 RC 低通滤波器的帮助下使用此功能生成输出正弦波。

        STM32微控制器中的DAC外设基于常见的R-2R梯形电阻网络。电阻梯是由电阻器的重复单元制成的电路,使用由高精度电阻器制成的重复电阻器网络进行数模转换是一种廉价且简单的方法。该网络充当参考电压和接地之间的可编程分压器。

        上图显示了一个 8 位 R-2R 电阻梯形网络。DAC 的每个位都由数字逻辑门驱动。理想情况下,这些门在 V = 0 (逻辑 0)和 V = VREF (逻辑 1)之间切换输入位。R–2R 网络使这些数字位在它们对输出电压 VOUT 的贡献中进行加权。

        对于具有 N 位和 0V /VREF 逻辑电平的 R–2R DAC 的给定数值 D,输出电压 VOUT 为:

例如,如果 N = 12(因此 2^N = 4096)和 VREF = 3.3 V(STM32 MCU 中的典型模拟电源电压),则 VOUT 将在 0V (VAL = 0 = 00000000) 和最大值 (VAL = 4095 = 11111111) 之间变化: VOUT = 3.3 × 4095 / 4096 ≈ 3.29V,步长(对应于 VAL = 1):∆VOUT = 3.3 × 1 / 4096 ≈ 0.0002V。

        但是,请始终记住,DAC 输出的精度和稳定性在很大程度上受到 VDDA 电源域质量和 PCB 布局的影响。

        在 STM32 微控制器中,DAC 模块的精度为 12 位,但也可以配置为在 8 位工作。在 12 位模式下,数据可以左对齐或右对齐。根据销售类型和使用的封装,DAC 有两个输出通道,每个通道都有自己的转换器。在双 DAC 通道模式下,当两个通道组合在一起进行同步更新操作时,可以独立或同时进行转换。输入参考引脚 VREF+ (与其他模拟外设共享)可用于更好的分辨率。与 ADC 外设一样,甚至 DAC 也可以与 DMA 控制器结合使用,以在给定的固定频率下产生可变输出电压。这在音频应用中非常有用,或者当我们想要生成在给定载波频率下工作的模拟信号时。正如我们将在本章后面看到的那样,STM32 DAC 能够产生噪声波和三角波。

        最后,STM32 MCU中实现的DAC为每个通道集成了一个输出缓冲器(见上图),可用于降低输出阻抗并直接驱动外部负载,而无需添加外部运算放大器。每个 DAC 通道输出缓冲器都可以启用和禁用。

2、HAL_DAC 模块

        为了操作 DAC 外设,HAL 定义了 C 结构体DAC_HandleTypeDef,其定义方式如下:

typedef struct {DAC_TypeDef *Instance; /* Pointer to DAC descriptor */__IO HAL_DAC_StateTypeDef State; /* DAC communication state */HAL_LockTypeDef Lock; /* DAC locking object */DMA_HandleTypeDef *DMA_Handle1; /* Pointer DMA handler for channel 1 */DMA_HandleTypeDef *DMA_Handle2; /* Pointer DMA handler for channel 2 */__IO uint32_t ErrorCode; /* DAC Error code */
} DAC_HandleTypeDef;

        • Instance:是指向我们将要使用的 DAC 描述符的指针。例如,DAC1 是第一个 DAC 外设的描述符。

        • DMA_Handle{1,2}:这是指向配置为在 DMA 模式下执行 D/A 转换的 DMA 处理程序的指针。在具有两个 output 通道的 DACs 中,存在两个独立的 DMA 处理程序,用于为每个通道执行转换。

        DAC_HandleTypeDef 结构体与目前使用的其他处理程序描述符不同。事实上,它没有提供专用的 Init 参数,让HAL_DAC_Init() 函数使用它来配置 DAC。这是因为 DAC 的有效配置是在通道级别执行的,并且需要结构体DAC_ChannelConfTypeDef,其定义方式如下:

typedef struct {uint32_t DAC_Trigger; /* Specifies the external trigger for the selected DAC channel */uint32_t DAC_OutputBuffer;/* Specifies whether the DAC channel output buffer is enabled or disabled */
} DAC_ChannelConfTypeDef;

        • DAC_Trigger:指定用于触发 DAC 转换的源。值DAC_TRIGGER_NONE 表示当使用 HAL_DAC_SetValue() 函数手动驱动 DAC;值DAC_TRIGGER_SOFTWARE表示当 DAC 在 DMA 模式下驱动而没有定时器来“计时”;值 DAC_TRIGGER_Tx_TRGO 表示由专用定时器驱动。

        • DAC_OutputBuffer:启用专用输出缓冲区。

        要配置 DAC 通道,我们使用函数:

HAL_StatusTypeDef HAL_DAC_ConfigChannel(DAC_HandleTypeDef* hdac, DAC_ChannelConfTypeDef* sConfig, uint32_t Channel);

它接受指向 DAC_HandleTypeDef 结构体实例的指针,指向之前看到的 DAC_ChannelConfTypeDef 结构体实例的指针,以及宏DAC_CHANNEL_1来配置第一个通道并DAC_CHANNEL_2配置第二个通道。

        在一些较新的 STM32 微控制器中,如 STM32L476 或 STM32G474,DAC 还提供额外的低功耗功能。例如,可以启用采样保持电路,即使 DAC 断电,也可以保持输出电压稳定。这在电池供电应用中非常有用。在这些 MCU 中, DAC_ChannelConfTypeDef 结构的结构不同,以允许配置这些附加功能。

2.1、手动驱动 DAC

        外设可以手动驱动,也可以使用 DMA 和触发源(例如,专用定时器)驱动。我们现在要分析第一种方法,当我们不需要高频转换时使用。第一步包括通过调用函数

HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef* hdac, uint32_t Channel);

该函数接受指向 DAC_HandleTypeDef 结构体实例的指针,以及要激活的通道(DAC_CHANNEL_1 或 DAC_CHANNEL_2)。

        启用 DAC 通道后,我们可以通过调用函数来执行转换:

HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data);

其中,Alignment 参数可以假设DAC_ALIGN_8B_R以 8 位模式驱动 DAC 的值,DAC_ALIGN_12B_L 或 DAC_ALIGN_12B_R 以 12 位模式驱动 DAC,分别传递左对齐或右对齐的输出值。

        以下示例设计展示了如何手动驱动 DAC 外设。该示例基于以下事实:板中DAC一个输出通道对应于连接到 LED 的 PA5 引脚。这允许我们使用 DAC 渐变 LED 的 ON/OFF。

        代码很简单。配置 DAC,以便将通道 2 用作输出通道。因此,PA5 配置为模拟输出。请注意,由于我们将手动驱动 DAC 转换,因此通道触发源设置为 DAC_TRIGGER_NONE。最后,main() 只不过是一个无限循环,它增加/减少输出电压,使 LED 渐变开/关。

2.2、使用定时器在 DMA 模式下驱动 DAC

        DAC 外设最常见的用途是生成具有给定频率的模拟波形(例如,在音频应用中)。如果是这种情况,那么驱动 DAC 的最佳方法是使用 DMA 和定时器来触发转换。

        要启动 DAC 并在 DMA 模式下执行传输,我们需要配置相应的 DMA 通道/流对并使用以下功能:

HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t* pData, uint32_t Length, uint32_t Alignment);

它接受指向 DAC_HandleTypeDef 结构实例的指针、要激活的通道(DAC_CHANNEL_1 或 DAC_CHANNEL_2)、指向要在 DMA 模式下传输的值数组的指针、其长度以及内存中输出值的对齐方式,它可以假设值DAC_ALIGN_8B_R以 8 位模式驱动 DAC, DAC_ALIGN_12B_L 或 DAC_ALIGN_12B_R 以 12 位模式驱动 DAC,分别将输出值左对齐或右对齐。

        例如,我们可以使用 DAC 轻松生成正弦波。在以前,我们分析了如何使用定时器的 PWM 模式来产生正弦波。如果我们的 MCU 提供 DAC,那么同样的操作可以更容易地进行。此外,根据具体的应用,通过使能 output buffer,我们可以完全驱动外部元件。

        为了生成以给定频率运行的正弦波,我们必须将整个周期分为多个步骤。通常,超过 200 步是输出波的良好近似值。这意味着,如果我们想生成 50Hz 的正弦波,那么我们执行一次转换的间隔为: fsinewave = 50Hz ∗ 200 = 10kHz。

        由于 STM32 DAC 的分辨率为 12 位,我们必须使用以下公式将对应于最大输出电压的值 4095 除以 200 步:

其中 ns 是样本数,在我们的示例中为 200。

        使用上述公式,我们可以生成一个初始化向量,以 DMA 模式馈送 DAC。与 ADC 外设一样,我们可以使用配置为以 10kHz 给出的频率触发 TRGO 线路的定时器。以下示例说明如何在 STM32F072 MCU 中使用 DAC 生成 50Hz 正弦波。

#define PI 3.14159
#define SAMPLES 200/* Private variables ---------------------------------------------------------*/
DAC_HandleTypeDef hdac;
TIM_HandleTypeDef htim6;
DMA_HandleTypeDef hdma_dac_ch1;/* Private function prototypes -----------------------------------------------*/
static void MX_DAC_Init(void);
static void MX_TIM6_Init(void);int main(void) {uint16_t IV[SAMPLES], value;HAL_Init();SystemClock_Config();/* Initialize all configured peripherals */MX_GPIO_Init();MX_DMA_Init();MX_DAC_Init();MX_TIM6_Init();for (uint16_t i = 0; i < SAMPLES; i++) {value = (uint16_t) rint((sinf(((2*PI)/SAMPLES)*i)+1)*2048);IV[i] = value < 4096 ? value : 4095;}HAL_DAC_Init(&hdac);HAL_TIM_Base_Start(&htim6);HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)IV, SAMPLES, DAC_ALIGN_12B_R);while(1);
}/* DAC init function */
void MX_DAC_Init(void) {DAC_ChannelConfTypeDef sConfig;GPIO_InitTypeDef GPIO_InitStruct;__HAL_RCC_DAC1_CLK_ENABLE();/**DAC Initialization */hdac.Instance = DAC;HAL_DAC_Init(&hdac);/**DAC channel OUT1 config */sConfig.DAC_Trigger = DAC_TRIGGER_T6_TRGO;sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1);/**DAC GPIO ConfigurationPA4 ------> DAC_OUT1*/GPIO_InitStruct.Pin = GPIO_PIN_4;GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/* Peripheral DMA init*/hdma_dac_ch1.Instance = DMA1_Channel3;hdma_dac_ch1.Init.Direction = DMA_MEMORY_TO_PERIPH;hdma_dac_ch1.Init.PeriphInc = DMA_PINC_DISABLE;hdma_dac_ch1.Init.MemInc = DMA_MINC_ENABLE;hdma_dac_ch1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;hdma_dac_ch1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;hdma_dac_ch1.Init.Mode = DMA_CIRCULAR;hdma_dac_ch1.Init.Priority = DMA_PRIORITY_LOW;HAL_DMA_Init(&hdma_dac_ch1);__HAL_LINKDMA(&hdac,DMA_Handle1,hdma_dac_ch1);
}/* TIM6 init function */
void MX_TIM6_Init(void) {TIM_MasterConfigTypeDef sMasterConfig;__HAL_RCC_TIM6_CLK_ENABLE();htim6.Instance = TIM6;htim6.Init.Prescaler = 0;htim6.Init.CounterMode = TIM_COUNTERMODE_UP;htim6.Init.Period = 4799;HAL_TIM_Base_Init(&htim6);sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig);
}

        函数 MX_DAC_Init() 配置 DAC,以便在生成 TIM6 TRGO 线路时,第一个通道执行转换。此外,DMA 也进行了相应的配置,将其设置为循环模式,以便它连续传输 DAC 数据寄存器中初始化向量的内容。MX_TIM6_Init() 函数设置 TIM6,使其以等于 10kHz 的频率溢出,从而触发内部连接到 DAC 的 TRGO 线。最后,根据上面公式生成初始化向量。然后,其内容用于馈送 DAC,在 TIM6 启用后,DAC 以 DMA 模式启动。

        通过将示波器探头连接到板子的 PA4 引脚,我们可以看到 DAC 产生的输出正弦波(见上图)。如果我们想知道 DMA 模式下的 DAC 转换何时完成,我们可以实现回调函数:

void HAL_DACEx_ConvCpltCallbackChX(DAC_HandleTypeDef* hdac);

它由 HAL_DMA_IRQHandler() 例程自动调用,该例程从与 DAC 外设关联的 DMA 通道的 ISR 调用。函数名称中的最后一个 X 必须替换为 1 或 2,具体取决于所使用的通道。

        请注意,在 STM32G4 系列中,DAC 外设寄存器必须通过字(32 位)访问。因此,上面的代码中 IV 数组和值变量应被定义为 unit32_t。

2.3、三角波生成

        在一些音频应用程序中,生成三角波很有用。虽然使用前面的 DMA 技术完全可以生成三角波,但 STM32 DAC 允许在硬件中生成三角形的波。

        上图显示了定义三角波形状的三个参数。让我们分析一下它们。

        • Amplitude:这是一个介于 0 到 0xFFF 之间的值,它决定了波的最大高度。它与 offset 值直接相关。Amplitude 不能是任意值,但它是固定值列表的一部分。

        • Offset:最小输出值,代表波浪的最低点。偏移量和振幅之和不能超过最大值 0xFFF。这意味着波的最大振幅将由amplitude - offset给出。

        • Frequency:是波的频率,它由连接到 DAC 的定时器的更新频率决定。定时器的更新频率由下面的公式确定。

这意味着,如果我们想产生幅度等于 2047 的 50Hz 三角波,则需要将运行在 48MHz 的定时器的预分频器配置为 234。

        为了生成三角波形,我们使用函数

HAL_StatusTypeDef HAL_DACEx_TriangleWaveGenerate(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t Amplitude);

它接受要使用的 DAC 通道和所需的幅度。offset 是使用 HAL_DAC_SetValue() 例程配置的。生成三角波的完整过程如下:

        • 配置用于生成波形的 DAC 通道。

        • 配置与 DAC 关联的定时器,并根据上面公式配置其预分频器(应该是period才对)。

        • 使用 HAL_DAC_Start() 函数启动 DAC。

        • 使用 HAL_DAC_SetValue() 例程配置所需的偏移值。

        • 通过调用 HAL_DACEx_TriangleWaveGenerate() 函数开始三角波生成。

int main(void) {HAL_Init();SystemClock_Config();/* Initialize all configured peripherals */MX_GPIO_Init();MX_DMA_Init();MX_DAC_Init();MX_TIM6_Init();while(1);
}/* DAC init function */
void MX_DAC_Init(void) {DAC_ChannelConfTypeDef sConfig;GPIO_InitTypeDef GPIO_InitStruct;__HAL_RCC_DAC1_CLK_ENABLE();/**DAC Initialization */hdac.Instance = DAC;HAL_DAC_Init(&hdac);/**DAC channel OUT1 config */sConfig.DAC_Trigger = DAC_TRIGGER_T6_TRGO;sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1);/**DAC GPIO ConfigurationPA4 ------> DAC_OUT1*/GPIO_InitStruct.Pin = GPIO_PIN_4;GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);HAL_DAC_Start(&hdac, DAC_CHANNEL_1);HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0);HAL_DACEx_TriangleWaveGenerate(&hdac, DAC_CHANNEL_1, DAC_TRIANGLEAMPLITUDE_2047);
}/* TIM6 init function */
void MX_TIM6_Init(void) {TIM_MasterConfigTypeDef sMasterConfig;__HAL_RCC_TIM6_CLK_ENABLE();htim6.Instance = TIM6;htim6.Init.Prescaler = 0;htim6.Init.CounterMode = TIM_COUNTERMODE_UP;htim6.Init.Period = 234;HAL_TIM_Base_Init(&htim6);sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig);HAL_TIM_Base_Start(&htim6);
}

2.4、噪声波生成

        STM32 DAC还能够使用伪随机发生器产生噪声波(见下图)。

这在某些应用领域(如音频应用程序和 RF 系统)中非常有用。此外,它还可用于提高 ADC 外设的精度(https://bit.ly/25lJoqx)。

        为了产生可变幅度的伪噪声,DAC 中提供了一个 LFSR (线性反馈移位寄存器)。这个 register 预加载了 0xAAA 值,它可以部分或全部屏蔽。然后将该值加到 DAC 数据寄存器内容中,而不会溢出,然后将该值用作输出值。

        可以使用 HAL 例程

HAL_StatusTypeDef HAL_DACEx_NoiseWaveGenerate(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t Amplitude);

它接受用于生成波的通道和振幅值,该值被添加到 LFSR 内容中以生成伪随机波。与三角波生成一样,定时器可用于触发转换:这意味着波的频率由定时器的溢出频率决定。

int main(void) {float tempV;uint32_t tempInt;char msg[30];HAL_Init();SystemClock_Config();/* Initialize all configured peripherals */MX_GPIO_Init();MX_DMA_Init();MX_DAC_Init();MX_TIM6_Init();MX_USART1_UART_Init();while (1){tempInt= HAL_DAC_GetValue(&hdac,DAC_CHANNEL_1);tempV=(float)tempInt*(3.3/4096);			sprintf(msg, "ch1 = %.3f \r\n",tempV);HAL_UART_Transmit(&huart1, (uint8_t*) msg, strlen(msg), HAL_MAX_DELAY);	HAL_Delay(100);}
}/* DAC init function */
void MX_DAC_Init(void) {DAC_ChannelConfTypeDef sConfig;GPIO_InitTypeDef GPIO_InitStruct;__HAL_RCC_DAC1_CLK_ENABLE();/**DAC Initialization */hdac.Instance = DAC;HAL_DAC_Init(&hdac);/**DAC channel OUT1 config */sConfig.DAC_Trigger = DAC_TRIGGER_T6_TRGO;sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1);/**DAC GPIO ConfigurationPA4 ------> DAC_OUT1*/GPIO_InitStruct.Pin = GPIO_PIN_4;GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);HAL_DAC_Start(&hdac, DAC_CHANNEL_1);HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0);HAL_DACEx_NoiseWaveGenerate(&hdac, DAC_CHANNEL_1, DAC_LFSRUNMASK_BITS7_0);
}/* TIM6 init function */
void MX_TIM6_Init(void) {TIM_MasterConfigTypeDef sMasterConfig;__HAL_RCC_TIM6_CLK_ENABLE();htim6.Instance = TIM6;htim6.Init.Prescaler = 0;htim6.Init.CounterMode = TIM_COUNTERMODE_UP;htim6.Init.Period = 234;HAL_TIM_Base_Init(&htim6);sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig);HAL_TIM_Base_Start(&htim6);
}

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

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

相关文章

【数据分析】认清、明确

1、什么是数据分析。 - 通过对大量的数据进行科学的分析。 - 得出结论&#xff0c;提出建议&#xff0c;辅助公司企业的决策。2、数据分析分为几步。 - 1.明确目的! - 2.收集数据!自己的数据! 自动化采集的数据! - 3.数据处理! - 4.数据分析!数据分析(业务)数据挖掘(代码算法…

Sentinel服务保护

Sentinel是阿里巴巴开源的一款服务保护框架&#xff0c;目前已经加入SpringCloudAlibaba中。官方网站&#xff1a; home | Sentinel Sentinel 的使用可以分为两个部分: 核心库&#xff08;Jar包&#xff09;&#xff1a;不依赖任何框架/库&#xff0c;能够运行于 Java 8 及以…

elasticsearch介绍和部署

1 elasticsearch介绍 Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。可以很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性。Elasticsearch 的实现原理主要分为以下几个步骤&#xff0c;首先用户将数据提交到Elasticsea…

智能安全配电装置在高校实验室中的应用

​ 摘要&#xff1a;高校实验室是科研人员进行科学研究和实验的场所&#xff0c;通常会涉及到大量的仪器设备和电气设备。电气设备的使用不当或者维护不周可能会引发火灾事故。本文将以一起实验室电气火灾事故为例&#xff0c;对事故原因、危害程度以及防范措施进行分析和总结…

大语言模型---Llama模型文件介绍;文件组成

文章目录 1. 概要2. 文件组成 1. 概要 在使用 LLaMA&#xff08;Large Language Model Meta AI&#xff09;权重时&#xff0c;通常会涉及到与模型权重存储和加载相关的文件。这些文件通常是以二进制格式存储的&#xff0c;具有特定的结构来支持高效的模型操作。以下以Llama-7…

12 —— Webpack中向前端注入环境变量

需求&#xff1a;开发模式下打印语句生效&#xff0c;生产模式下打印语句失效 使用Webpack内置的DefinePlugin插件 const webpack require(webpack) module.exports { plugins: [ new webpack.DefinePlugin({ process.env.NODE_ENV:JSON.stringify(process.env.NODE_ENV) }…

【vba源码】导入excel批注信息

Hi&#xff0c;大家好呀&#xff01; 又到了一周一分享的时间&#xff0c;上周繁忙的我都没有给大家直播&#xff0c;视频也没更新&#xff0c;那这周大家放心&#xff0c;都会给大家更新&#xff0c;今天我们来讲点啥呢&#xff1f;每周找优质的内容给大家更新是我最最痛苦的…

Java设计模式 —— Java七大设计原则详解

文章目录 前言一、单一职责原则1、概述2、案例演示 二、接口隔离原则1、概述2、案例演示 三、依赖倒转原则1、概述2、案例演示 四、里氏替换原则1、概述2、案例演示 五、开闭原则1、概述2、案例演示 六、迪米特法则1、概述2、案例演示 七、合成/聚合复用原则1、概述2、组合3、聚…

服务器数据恢复—DS5300存储硬盘指示灯亮黄灯的数据恢复案例

服务器存储数据恢复环境&#xff1a; 某单位一台某品牌型号为DS5300的服务器存储&#xff0c;1个机头4个扩展柜&#xff0c;底层是2组分别由数十块硬盘组建的RAID5阵列。存储系统上层一共分了11个卷。 服务器存储故障&分析&#xff1a; 存储设备上一组raid5阵列上的2块磁盘…

Cloud Native 云原生后端的开发注意事项

在云原生后端开发里&#xff0c;数据管理和存储这块得好好弄。数据库选型得综合考虑&#xff0c;像关系型数据有复杂查询需求就选 MySQL、PostgreSQL&#xff0c;海量非结构化数据就可以考虑 MongoDB、Cassandra 这些。设计数据库得遵循规范化原则&#xff0c;像设计电商订单表…

Mac vscode 激活列编辑模式

列编辑模式在批量处理多行文本时&#xff0c;非常有效&#xff0c;但 vscode 默认情况下&#xff0c;又没有激活&#xff0c;因此记录一下启动方法&#xff1a; 激活列编辑模式 然后就可以使用 Alt&#xff08;Mac 上是 Option 或 Command 键&#xff09; 鼠标左键 滑动选择了…

c#使用高版本8.0步骤

一、找到项目所在怒路&#xff0c;记事本打开.proj文件。 二、记事本打开此文件&#xff0c;<PropertyGroup>后面加入如下语句&#xff1a; <LangVersion>8.0</LangVersion> 关闭并保存。 根据提示全部重新加载即可。

【蓝桥杯C/C++】深入解析I/O高效性能优化:std::ios::sync_with_stdio(false)

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: 蓝桥杯C/C 文章目录 &#x1f4af;前言&#x1f4af;C 语言与 C 语言的输入输出对比1.1 C 语言的输入输出1.2 C 语言的输入输出 &#x1f4af; std::ios::sync_with_stdio(false) 的作用与意义2.1 什么是 std::ios::sync_with_st…

浏览器的事件循环机制

一、请简述浏览器的事件循环机制&#xff08;Event Loop&#xff09;基本原理 浏览器的事件循环机制是用于协调处理 JavaScript 中的异步任务与同步任务执行顺序的一种机制&#xff0c;它确保了代码能够按照合理的顺序执行&#xff0c;避免阻塞页面渲染等情况。其基本原理如下…

GaussDB 华为高斯数据库

GaussDB 是华为推出的一款企业级分布式数据库&#xff0c;旨在为企业提供高效、可靠、安全的数据库服务。GaussDB 基于华为在数据库领域的多年积累&#xff0c;结合人工智能技术和分布式架构&#xff0c;支持多种场景的数据存储与管理需求&#xff0c;是云计算、大数据、人工智…

【Word】一键批量引用论文上标——将正文字体改为上标格式

【Word】一键批量引用论文上标——将正文字体改为上标格式 写在最前面Word一键批量引用论文上标技巧分享核心思路&#xff1a;Word 替换功能 通配符步骤详解1. 打开 Word 替换功能2. 输入通配符模式3. 设置替换格式为上标4. 批量替换 实际效果展示技巧扩展 &#x1f308;你好呀…

SAP 零售方案 CAR 系统的介绍与研究

前言 当今时代&#xff0c;零售业务是充满活力和活力的业务领域之一。每天&#xff0c;由于销售运营和客户行为&#xff0c;它都会生成大量数据。因此&#xff0c;公司迫切需要管理数据并从中检索见解。它将帮助公司朝着正确的方向发展他们的业务。 这就是为什么公司用来处理…

【深度学习之一】2024最新pytorch+cuda+cudnn下载安装搭建开发环境

兵马未动&#xff0c;粮草先行。作为深度学习的初学者&#xff0c;快速搭建一个属于自己的开发环境就是头等大事&#xff0c;可以让我们节省许多的时间。这一期我们主要讲一讲2024年最新pytorchcudacudnn下载安装搭建开发环境&#xff0c;以及安装过程中可能遇到的一些问题以及…

STM32-- 串口介绍

rs485、rs232、rs422 rs485使用&#xff1a; max3485&#xff1a;3.3v左右驱动 max485&#xff1a;5v左右驱动&#xff0c;不过有时候3.3v驱动也可以使用&#xff0c;具体有什么问题或者通过电路规避问题还没有了解过。 rs485和rs422有相同的地方&#xff0c;485满足422的规…

python oa服务器巡检报告脚本的重构和修改(适应数盾OTP)有空再去改

Two-Step Vertification required&#xff1a; Please enter the mobile app OTPverification code: 01.因为巡检的服务器要双因子认证登录&#xff0c;也就是登录堡垒机时还要输入验证码。这对我的巡检查服务器的工作带来了不便。它的机制是每一次登录&#xff0c;算一次会话…