19:HAL—-DAC

news2024/9/21 0:40:56

一:介绍

1:简历

2:简图 

F1,F4,F7的DAC框架图都一样。

触发源:

宏定义补全及解释

#define DAC_TRIGGER_NONE 0x00000000UL /*!< 转换是自动的,一旦DAC1_DHRxxxx寄存器被加载,不由外部触发 */
#define DAC_TRIGGER_T2_TRGO (DAC_CR_TSEL1_2 | DAC_CR_TEN1) /*!< TIM2 TRGO选为DAC通道的外部转换触发 */
#define DAC_TRIGGER_T4_TRGO (DAC_CR_TSEL1_2 | DAC_CR_TSEL1_0 | DAC_CR_TEN1) /*!< TIM4 TRGO选为DAC通道的外部转换触发 */
#define DAC_TRIGGER_T5_TRGO (DAC_CR_TSEL1_1 | DAC_CR_TSEL1_0 | DAC_CR_TEN1) /*!< TIM5 TRGO选为DAC通道的外部转换触发(注意:这里应该是TIM5,而不是TIM3) */
#define DAC_TRIGGER_T6_TRGO (DAC_CR_TEN1) /*!< 转换由软件触发为DAC通道 */
#define DAC_TRIGGER_T7_TRGO (DAC_CR_TSEL1_1 | DAC_CR_TEN1) /*!< TIM7 TRGO选为DAC通道的外部转换触发 */
#define DAC_TRIGGER_T8_TRGO (DAC_CR_TSEL1_0 | DAC_CR_TEN1) /*!< TIM8 TRGO选为DAC通道的外部转换触发 */
#define DAC_TRIGGER_EXT_IT9 (DAC_CR_TSEL1_2 | DAC_CR_TSEL1_1 | DAC_CR_TEN1) /*!< EXTI Line9事件选为DAC通道的外部转换触发 */
#define DAC_TRIGGER_SOFTWARE (DAC_CR_TEN1) /*!< 软件触发DAC转换 */

解释

  • DAC_TRIGGER_NONE:没有外部触发,转换是自动的,一旦DAC的数据寄存器被写入新的数据,就会启动转换。
  • DAC_TRIGGER_T2_TRGO 至 DAC_TRIGGER_T8_TRGO:这些宏定义分别选择TIM2到TIM8的TRGO(触发输出)作为DAC的外部转换触发源。这意味着DAC的转换将由指定定时器的特定事件(如更新事件)来触发。
  • DAC_TRIGGER_EXT_IT9:选择外部中断/事件线9(EXTI Line9)的触发事件作为DAC的外部转换触发源。这允许DAC的转换由外部事件(如按钮按下)触发。
  • DAC_TRIGGER_SOFTWARE:软件触发DAC转换。这意味着可以通过编程方式(即写入一个特定的寄存器值)来启动DAC的转换,而不是依赖于外部事件或定时器。

请注意,对于DAC_TRIGGER_T5_TRGO的注释中提到的TIM3可能是一个错误,因为根据宏定义中的位操作,它实际上对应的是TIM5的TRGO(假设DAC_CR_TSEL1_1DAC_CR_TSEL1_0分别对应于选择触发源的位字段)。此外,DAC_TRIGGER_T6_TRGO实际上并不直接对应于任何定时器的TRGO,而是直接由软件触发(即DAC_CR_TEN1位被设置),这与DAC_TRIGGER_SOFTWARE相同,但通常DAC_TRIGGER_SOFTWARE的命名更直接地表达了其意图。

具体的TRGO可以参考我的:

11:HAL--定时器代码总结-CSDN博客

3:输入/出电压

 可以参考我们写的ADC的:

15:HAL----ADC模数转化器-CSDN博客

4:工作原理

5:电压计算

 

Vref+一般为3.3V

6:配置

 

想要注意的寄存器:

使用DAC1右对齐输出电压的时候,实际就是对于下面寄存器的写入。

使用不同的ADC和不同的对齐方式,它对于的寄存器不同

7:HAL配置

 

二:案列

下面的案列全部使用stm32F407VEt6做的

A:DAC简单输出

#include "stm32f4xx.h"                  // Device header
#include "LED.h"
#include "UART.h"
#include <stdarg.h>
#include "stdio.h"
DAC_HandleTypeDef g_dac_handle;

/* DAC初始化函数 */
void dac_init(void)
{
    DAC_ChannelConfTypeDef dac_ch_conf;

    g_dac_handle.Instance = DAC1;
    HAL_DAC_Init(&g_dac_handle);                                        /* 初始化DAC */

    dac_ch_conf.DAC_Trigger = DAC_TRIGGER_NONE;                         /* 不使用触发功能 */
    dac_ch_conf.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE;            /* DAC输出缓冲关闭 */

    HAL_DAC_ConfigChannel(&g_dac_handle, &dac_ch_conf, DAC_CHANNEL_1);  /* 配置DAC通道1 */
    HAL_DAC_Start(&g_dac_handle, DAC_CHANNEL_1);                        /* 开启DAC通道1 */
	
	
}

/* DAC MSP初始化函数 */
void HAL_DAC_MspInit(DAC_HandleTypeDef *hdac)
{
    if (hdac->Instance == DAC1)
    {
        GPIO_InitTypeDef gpio_init_struct;

        __HAL_RCC_DAC_CLK_ENABLE();
        __HAL_RCC_GPIOA_CLK_ENABLE();

        gpio_init_struct.Pin = GPIO_PIN_4;
        gpio_init_struct.Mode = GPIO_MODE_ANALOG;  //模拟输入
        HAL_GPIO_Init(GPIOA, &gpio_init_struct);
			
    }
}

/* 设置通道输出电压 
vol:想要设置的电压,单位MV
DAC的输出电压=(DORX/4096)*Vref+ ---->Vref+一般为3.3V
DORX=DAC的输出电压/Vref*4096;
*/
void dac_set_voltage(float vol)
{
    float temp = vol;
    temp /= 1000;
    temp = temp * 4096.0 / 3.3;      //temp-->DORX寄存器的值

    if (temp >= 4096)temp = 4095;   /* 如果值大于等于4096, 则取4095 */
		
    HAL_DAC_SetValue(&g_dac_handle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, temp); /* 12位右对齐数据格式设置DAC值 */

}

#include "stm32f4xx.h"                  // Device header
#include "sys.h"
#include "delay.h"
#include "LED.h"
#include "UART.h"
#include <stdarg.h>
#include "stdio.h"
#include "adc.h"
#include "DAC.h"



extern DAC_HandleTypeDef g_dac_handle;
uint16_t  adc_Value;
int main(void)
{		
	
	
    HAL_Init();                                 /* 初始化HAL库 */        
		Clock_HSE_Init(8,336,RCC_PLLP_DIV2,7);      /* 设置时钟,168Mhz */
    delay_init(168);                            /* 延时初始化 */
          
		Uart_Init(115200);
		adc_init();
		dac_init();  

			dac_set_voltage(2200); //设置DAC的电压为2200MV=2.2
    while(1)
    {
			
		
			printf("DORX:%d\r\n",HAL_DAC_GetValue(&g_dac_handle,DAC_CHANNEL_1));
			adc_Value=adc_get_result();
		
			printf("电压:%f %2d\r\n",(float)adc_Value*(3.3/4096),adc_Value);
			delay_ms(1000);
			
				
		}
}

可以直接属于我们的万用表测量电压。

也可以使用我们的ADC测量电压,使用ADC时,注意我们的数据类型。

B:输出三角波

和上面的A实验一样,什么都没有改变,只有增加了一个 dac_triangular_wave()函数。

#include "stm32f4xx.h"                  // Device header
#include "LED.h"
#include "UART.h"
#include <stdarg.h>
#include "stdio.h"
#include "delay.h"
DAC_HandleTypeDef g_dac_handle;

/* DAC初始化函数 */
void dac_init(void)
{
    DAC_ChannelConfTypeDef dac_ch_conf;

    g_dac_handle.Instance = DAC1;
    HAL_DAC_Init(&g_dac_handle);                                        /* 初始化DAC */

    dac_ch_conf.DAC_Trigger = DAC_TRIGGER_NONE;                         /* 不使用触发功能 */
    dac_ch_conf.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE;            /* DAC输出缓冲关闭 */

    HAL_DAC_ConfigChannel(&g_dac_handle, &dac_ch_conf, DAC_CHANNEL_1);  /* 配置DAC通道1 */
    HAL_DAC_Start(&g_dac_handle, DAC_CHANNEL_1);                        /* 开启DAC通道1 */
	
	
}

/* DAC MSP初始化函数 */
void HAL_DAC_MspInit(DAC_HandleTypeDef *hdac)
{
    if (hdac->Instance == DAC1)
    {
        GPIO_InitTypeDef gpio_init_struct;

        __HAL_RCC_DAC_CLK_ENABLE();
        __HAL_RCC_GPIOA_CLK_ENABLE();

        gpio_init_struct.Pin = GPIO_PIN_4;
        gpio_init_struct.Mode = GPIO_MODE_ANALOG;  //模拟输入
        HAL_GPIO_Init(GPIOA, &gpio_init_struct);
			
    }
}

/* 设置通道输出电压 
vol:想要设置的电压,单位MV
DAC的输出电压=(DORX/4096)*Vref+ ---->Vref+一般为3.3V
DORX=DAC的输出电压/Vref*4096;
*/
void dac_set_voltage(float vol)
{
    float temp = vol;
    temp /= 1000;
    temp = temp * 4096.0 / 3.3;      //temp-->DORX寄存器的值

    if (temp >= 4096)temp = 4095;   /* 如果值大于等于4096, 则取4095 */
		
    HAL_DAC_SetValue(&g_dac_handle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, temp); /* 12位右对齐数据格式设置DAC值 */

}



/**
 * @brief       设置DAC_OUT1输出三角波
 *   @note      输出频率 ≈ 1000 / (dt * samples) Khz, 不过在dt较小的时候,比如小于5us时, 由于delay_us
 *              本身就不准了(调用函数,计算等都需要时间,延时很小的时候,这些时间会影响到延时), 频率会偏小.
 * 
 * @param       maxval : 最大值(0 < maxval < 4096), (maxval + 1)必须大于等于samples/2
 * @param       dt     : 每个采样点的延时时间(单位: us)
 * @param       samples: 采样点的个数, samples必须小于等于(maxval + 1) * 2 , 且maxval不能等于0
 * @param       n      : 输出波形个数,0~65535
 *
 * @retval      无
 */
void dac_triangular_wave(uint16_t maxval, uint16_t dt, uint16_t samples, uint16_t n)
{
    uint16_t i, j;
    float incval;           /* 递增量 */
    float Curval;           /* 当前值 */
    
    if((maxval + 1) <= samples) return ;    /* 数据不合法 */
        
    incval = (maxval + 1) / (samples / 2);  /* 计算递增量 */
    
    for(j = 0; j < n; j++)
    { 
        Curval = 0;
        HAL_DAC_SetValue(&g_dac_handle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, Curval);    /* 先输出0 */
        for(i = 0; i < (samples / 2); i++)  /* 输出上升沿 */
        {
            Curval  +=  incval;             /* 新的输出值 */
            HAL_DAC_SetValue(&g_dac_handle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, Curval);
            delay_us(dt);
        } 
        for(i = 0; i < (samples / 2); i++)  /* 输出下降沿 */
        {
            Curval  -=  incval;             /* 新的输出值 */
            HAL_DAC_SetValue(&g_dac_handle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, Curval);
            delay_us(dt);
        }
    }
}


#include "stm32f4xx.h"                  // Device header
#include "sys.h"
#include "delay.h"
#include "LED.h"
#include "UART.h"
#include <stdarg.h>
#include "stdio.h"
#include "adc.h"
#include "DAC.h"



extern DAC_HandleTypeDef g_dac_handle;
uint16_t  adc_Value;
int main(void)
{		
	
	
    HAL_Init();                                 /* 初始化HAL库 */        
		Clock_HSE_Init(8,336,RCC_PLLP_DIV2,7);      /* 设置时钟,168Mhz */
    delay_init(168);                            /* 延时初始化 */
          
		Uart_Init(115200);
		adc_init();
		dac_init();  

			dac_set_voltage(2200); //设置DAC的电压为2200MV=2.2
    while(1)
    {
			
		
				dac_triangular_wave(4095, 5, 2000, 100);    /* 幅值4095, 采样点间隔5us, 2000个采样点, 100个波形 */
			
				
		}
}






//        t++;
//        key = key_scan(0);      /* 按键扫描 */

//        if (key == KEY0_PRES)   /* 高采样率 , 约100Hz波形 */
//        {
//            lcd_show_string(30, 130, 200, 16, 16, "DAC Wave1 ", BLUE);
//            dac_triangular_wave(4095, 5, 2000, 100);    /* 幅值4095, 采样点间隔5us, 2000个采样点, 100个波形 */
//            lcd_show_string(30, 130, 200, 16, 16, "DAC None  ", BLUE);
//        }
//        else if (key == KEY1_PRES)  /* 低采样率 , 约100Hz波形 */
//        {
//            lcd_show_string(30, 130, 200, 16, 16, "DAC Wave2 ", BLUE);
//            dac_triangular_wave(4095, 500, 20, 100);    /* 幅值4095, 采样点间隔500us, 20个采样点, 100个波形 */
//            lcd_show_string(30, 130, 200, 16, 16, "DAC None  ", BLUE);
//        }

//        if (t == 10)        /* 定时时间到了 */
//        {
//            LED0_TOGGLE();  /* LED0闪烁 */
//            t = 0;
//        }

//        delay_ms(10);
//    }




C:正弦波

#include "stm32f4xx.h"                  // Device header
#include "LED.h"
#include "UART.h"
#include <stdarg.h>
#include "stdio.h"
#include "delay.h"
#include "math.h"
DAC_HandleTypeDef g_dac_handle;
DMA_HandleTypeDef g_dma_dac_handle;
uint16_t g_dac_sin_buf[4096];            /* 发送数据缓冲区 */
/* DAC初始化函数 */
void dac_init(void)
{
    DAC_ChannelConfTypeDef dac_ch_conf;

    g_dac_handle.Instance = DAC1;
    HAL_DAC_Init(&g_dac_handle);                                        /* 初始化DAC */

    dac_ch_conf.DAC_Trigger = DAC_TRIGGER_T5_TRGO;                         /* TIM5触发功能 */
    dac_ch_conf.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE;            /* DAC输出缓冲关闭 */

    HAL_DAC_ConfigChannel(&g_dac_handle, &dac_ch_conf, DAC_CHANNEL_1);  /* 配置DAC通道1 */
		HAL_DAC_Start(&g_dac_handle, DAC_CHANNEL_1);                        /* 开启DAC通道1 */


	
}

/* DAC MSP初始化函数 */
void HAL_DAC_MspInit(DAC_HandleTypeDef *hdac)
{
    if (hdac->Instance == DAC1)
    {
        GPIO_InitTypeDef gpio_init_struct;
				__HAL_RCC_DMA2_CLK_ENABLE();
        __HAL_RCC_DAC_CLK_ENABLE();
        __HAL_RCC_GPIOA_CLK_ENABLE();

        gpio_init_struct.Pin = GPIO_PIN_4;
        gpio_init_struct.Mode = GPIO_MODE_ANALOG;  //模拟输入
        HAL_GPIO_Init(GPIOA, &gpio_init_struct);
			
			
				    
    
   
    
				g_dma_dac_handle.Instance =DMA1_Stream5 ;
				g_dma_dac_handle.Init.Direction = DMA_MEMORY_TO_PERIPH;  /*内存--外设*/
				g_dma_dac_handle.Init.PeriphInc = DMA_PINC_DISABLE;       /*外设不自增*/
				g_dma_dac_handle.Init.MemInc = DMA_MINC_ENABLE;						/*内存自增*/
				g_dma_dac_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;   /*外设16为*/
				g_dma_dac_handle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;     /*内存16为*/
				g_dma_dac_handle.Init.Mode = DMA_CIRCULAR;           /*循环模式*/
				g_dma_dac_handle.Init.Priority = DMA_PRIORITY_MEDIUM;
				HAL_DMA_Init(&g_dma_dac_handle);
    
			__HAL_LINKDMA(&g_dac_handle, DMA_Handle1, g_dma_dac_handle);
					/*
					DstAddress这是目标内存缓冲区的地址:
					*/
				HAL_DMA_Start(&g_dma_dac_handle, (uint32_t)g_dac_sin_buf, (uint32_t)&DAC1->DHR12R1, 0);


			
    }
}

/* 设置通道输出电压 
vol:想要设置的电压,单位MV
DAC的输出电压=(DORX/4096)*Vref+ ---->Vref+一般为3.3V
DORX=DAC的输出电压/Vref*4096;
*/
void dac_set_voltage(float vol)
{
    float temp = vol;
    temp /= 1000;
    temp = temp * 4096.0 / 3.3;      //temp-->DORX寄存器的值

    if (temp >= 4096)temp = 4095;   /* 如果值大于等于4096, 则取4095 */
		
    HAL_DAC_SetValue(&g_dac_handle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, temp); /* 12位右对齐数据格式设置DAC值 */

}




/**
 * @brief       产生正弦波序列函数
 *   @note      需保证: maxval > samples/2
 * @param       maxval : 最大值(0 < maxval < 2048)
 * @param       samples: 采样点的个数
 * @retval      无
 */
void dac_creat_sin_buf(uint16_t maxval, uint16_t samples)
{
    uint8_t i;
    float outdata = 0;                     /* 存放计算后的数字量 */
    float inc = (2 * 3.1415962) / samples; /* 计算相邻两个点的x轴间隔 */

    if(maxval <= (samples / 2))return ;	   /* 数据不合法 */

    for (i = 0; i < samples; i++)
    {
        /* 
         * 正弦波函数解析式:y = Asin(ωx + φ)+ b
         * 计算每个点的y值,将峰值放大maxval倍,并将曲线向上偏移maxval到正数区域
         * 注意:DAC无法输出负电压,所以需要将曲线向上偏移一个峰值的量,让整个曲线都落在正数区域
         */
        outdata = maxval * sin(inc * i) + maxval;
        if (outdata > 4095)
            outdata = 4095; /* 上限限定 */
        //printf("%f\r\n",outdata);
        g_dac_sin_buf[i] = outdata;
    }
}

// * @param       ndtr        : DMA通道单次传输数据量
void General_timx_int_init(uint16_t arr, uint16_t psc,uint16_t cndtr)
{		
		TIM_IC_InitTypeDef TIM_IC_Init={0};
		 TIM_MasterConfigTypeDef tim_mater_config = {0};
		 
    TIM_Handle.Instance =TIM5;
    TIM_Handle.Init.Prescaler = psc;
    TIM_Handle.Init.Period = arr;
		TIM_Handle.Init.CounterMode=TIM_COUNTERMODE_UP;
		TIM_Handle.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
		TIM_Handle.Init.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_DISABLE;
    HAL_TIM_IC_Init(&TIM_Handle);
		__HAL_TIM_CLEAR_FLAG(&TIM_Handle,TIM_FLAG_UPDATE);
	
		TIM_IC_Init.ICPolarity=TIM_ICPOLARITY_BOTHEDGE;
		TIM_IC_Init.ICSelection=TIM_ICSELECTION_DIRECTTI;
		TIM_IC_Init.ICPrescaler=TIM_ICPSC_DIV1;
		TIM_IC_Init.ICFilter=0x08;
		
		HAL_TIM_IC_ConfigChannel(&TIM_Handle,&TIM_IC_Init,TIM_CHANNEL_2);
		
	
		 tim_mater_config.MasterOutputTrigger = TIM_TRGO_UPDATE;  //更新中断做为TRGO
    tim_mater_config.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
    HAL_TIMEx_MasterConfigSynchronization(&TIM_Handle, &tim_mater_config);
    //CNT==ARR溢出产生的中断
		__HAL_TIM_ENABLE_IT(&TIM_Handle,TIM_IT_UPDATE);
		

		HAL_TIM_IC_Start_IT(&TIM_Handle,TIM_CHANNEL_2);

		
    HAL_DAC_Stop_DMA(&g_dac_handle, DAC_CHANNEL_1);
    HAL_DAC_Start_DMA(&g_dac_handle, DAC_CHANNEL_1, (uint32_t *)g_dac_sin_buf, cndtr, DAC_ALIGN_12B_R);
		
}
#include "stm32f4xx.h"                  // Device header
#include "sys.h"
#include "delay.h"
#include "LED.h"
#include "UART.h"
#include <stdarg.h>
#include "stdio.h"
#include "adc.h"
#include "DAC.h"
#include "tim.h"


extern DAC_HandleTypeDef g_dac_handle;
uint16_t  adc_Value;
int main(void)
{		
	
	
    HAL_Init();                                 /* 初始化HAL库 */        
		Clock_HSE_Init(8,336,RCC_PLLP_DIV2,7);      /* 设置时钟,168Mhz */
    delay_init(168);                            /* 延时初始化 */
          
		Uart_Init(115200);
		dac_init();  
		
	
		/*
		T=((ARR+1)*(PSC+1))/主频
		f=主频/((ARR+1)*(PSC+1))=84000 000 /(10*28)=300,000HZ=300KHZ
		定时器的更新中断的频率也是我们正弦波的频率
		*/
    while(1)
    {
			
					General_timx_int_init(10-1,28-1,100);
					dac_creat_sin_buf(2048, 100);
			
				
		}
}

 

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

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

相关文章

ctfshow-php特性(web123-web150plus)

​web123 <?php error_reporting(0); highlight_file(__FILE__); include("flag.php"); $a$_SERVER[argv]; $c$_POST[fun]; if(isset($_POST[CTF_SHOW])&&isset($_POST[CTF_SHOW.COM])&&!isset($_GET[fl0g])){if(!preg_match("/\\\\|\/|\~|…

AI模型的未来之路:全能与专精的博弈与共生

人工智能(AI)领域正迅速发展,伴随着技术的不断进步,AI模型的应用范围也在不断扩展。当前,AI模型的设计和使用面临两个主要趋势:全能型模型和专精型模型。这两者之间的博弈与共生将塑造未来的AI技术格局。本文将从以下七个方面探讨AI模型的未来之路,并提供实用的代码示例…

软考-高级架构师Keywords(上半部分)

概述 本文用于备考时自查知识点掌握情况&#xff0c; 知识点只以关键词方式提点出来&#xff0c;算是对照考纲的细碎化转化。 太简单的知识点不会收录。特别适合 通过中级-软件设计师的同学 / 八股文爱好者 / 408选手 计算机硬件 码距&#xff1a;改变n位成为另一个编码所需要…

业务资源管理模式语言09

示例&#xff1a; 图13 表示了QuoteTheMaintenance 模式的一个实例&#xff0c;在汽车修理店系统中&#xff0c;其中“Vehicle”扮演“Resource”&#xff0c;“Repair Quotation”扮演“Maintenance Quotation”&#xff0c;“Repair shop branch”扮演“Source-party”&…

halcon图像怎么显示在我们指定的区域

要想搞明白这个问题,首先我们要了解句柄的传递关系. halcon生成图像,会产生一个图像句柄,只要把该句柄传递给我们需要显示的组件就可以了. 简单说,就是一个句柄的传递关系. 下面这个例子简单说明句柄传递关系: 我们获取一个图像控件的句柄,把图像句柄传递给halcon的图像窗口句…

BN于神经网络调优

目录 一:神经网络调优 1.算法层面: 2.网络层面 二:调参技巧: 2.合理的参数设置: 3.运行: 三:批标准化(Batch Normalizetion) 1.批标准化公式: 2.过程图: 3.为什么标准化能够是优化过程变得简单: 一:神经网络调优 参数调优也称为超参数调优 1.算法层面…

JS手写实现深拷贝

手写深拷贝 一、通过JSON.stringify二、函数库lodash三、递归实现深拷贝基础递归升级版递归---解决环引用爆栈问题最终版递归---解决其余类型拷贝结果 一、通过JSON.stringify JSON.parse(JSON.stringify(obj))是比较常用的深拷贝方法之一 原理&#xff1a;利用JSON.stringif…

刘诗诗现身纽约两场活动,演绎极具松弛感的优雅,生图状态绝美

近期&#xff0c;纽约迎来了时装周&#xff0c;还有奢侈品牌活动陆续举办&#xff0c;演员刘诗诗也现身部分活动现场&#xff0c;以绝佳好状态收获大量关注和好评。 纽约时间9月4日&#xff0c;刘诗诗现身Bobbi Brown芭比波朗「IN MY SKIN GLOBALEVENT」活动&#xff0c;身穿裸…

ubuntu 和windows用samba服务器实现数据传输

1&#xff0c;linux安装samba服务器 sudo apt-get install samba samba-common 2&#xff0c;linux 配置权限&#xff0c;修改目录权限&#xff0c;linux下共享的文件权限设置。 sudo chmod 777 /home/lark -R 3. 添加samba用户 sudo smbpasswd -a lark 4&#xff0c;配置共享…

【AcWing】853. 有边数限制的最短路(bellman-ford贝尔曼福特算法)

存储&#xff1a; 这个算法存边不一定要写成邻接表&#xff0c;随便存&#xff0c;只要能遍历到所有边即可&#xff0c;结构体数组。 过程&#xff1a; 负权边、负权回路&#xff1a; 贝尔曼福特算法处理有负权边的图。(注意&#xff0c;有负权回路的话&#xff0c;最短路径就不…

AI预测福彩3D采取888=3策略+和值012路或胆码测试9月7日新模型预测第80弹

经过近80期的测试&#xff0c;当然有很多彩友也一直在观察我每天发的预测结果&#xff0c;得到了一个非常有价值的信息&#xff0c;那就是9码定位的命中率非常高&#xff0c;70多期一共只错了8次&#xff0c;这给喜欢打私房菜的朋友提供了极高价值的预测结果~当然了&#xff0c…

2024PyCharm专业版详细安装激活教程

如果你正在学习Python&#xff0c;那么你需要的话可以&#xff0c;点击这里&#x1f449;Python重磅福利&#xff1a;入门&进阶全套学习资料、电子书、软件包、项目源码等等免费分享&#xff01; 前言 PyCharm是由JetBrains公司开发的一款强大的Python集成开发环境&#…

11--kubernetes的Ingress应用

前言&#xff1a;本章主要记录ingress暴露服务方式&#xff0c;会详细解释其原理及两种网络模式应用实操。 1、Ingress概念详解 Kubernetes 暴露服务的方式目前只有三种&#xff1a;LoadBlancer Service、NodePort Service、Ingress&#xff0c;Service属于4层负载均衡&#…

MySQL数据库的SQL注入漏洞解析

说明:本文仅是用于学习分析自己搭建的SQL漏洞内容和原理,请勿用在非法途径上,违者后果自负,与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》‌及其相关法规内容【学法时习之丨网络安全在身边一图了解网络安全法_中央网络安全和信息化委员会办公室】 …

FreeRTOS内部机制学习01(任务创建的细节以及任务调度的内部机制)

文章目录 前言&#xff1a;首先要谢谢韦东山老师的无私奉献&#xff0c;让我学到了很多东西&#xff0c;我做这个笔记是害怕我会忘记&#xff0c;所以就记录了下来&#xff0c;希望对大家有帮助&#xff01;关于寄存器CPU内部的寄存器这些寄存器到底要保存一些什么&#xff1f;…

Leetcode67---二进制求和

https://leetcode.cn/problems/add-binary/description/ 给出的两个二进制&#xff0c;我们可以从最后开始往前运算。 给当前短的一位前面补充0即可。 class Solution {public String addBinary(String a, String b) {//给的就是二进制字符串 最后一位开始遍历 如果没有就补充…

SAP学习笔记 - 开发02 - BTP实操流程(账号注册,BTP控制台,BTP集成开发环境搭建)

上一章讲了 BAPI的概念&#xff0c;以及如何调用SAP里面的既存BAPI。 SAP学习笔记 - 开发01 - BAPI是什么&#xff1f;通过界面和ABAP代码来调用BAPI-CSDN博客 本章继续讲开发相关的内容&#xff0c;主要就是BTP的实际操作流程&#xff0c;比如账号注册&#xff0c;登录&#…

Dify.ai:部署自己的 AI 应用、知识库机器人,简单易用

Dify.ai:部署自己的 AI 应用、知识库机器人,简单易用 今天,来分享下 Dify.AI 这个产品,一句话介绍:可供普通人简单易用的部署生成出一个 AI 应用。这是一种使用人工智能技术来帮助团队开发和运营 AI 应用的工具。 什么是 Dify.ai Dify.ai 是一个易于使用的 LLMOps 平台…

资料分析系统课-刘文超老师

1、考试大纲 2、解题的问题->解决方法 3、统计术语 基期量与现期量&#xff1a;作为对比参照的时期称为基期&#xff0c;而相对于基期的称为现期。描述具体数值时我们称之为基期量和现期量。 增长量&#xff1a;是指基期量与现期量增长(或减少)的绝对量。增长量是具体值&…

如何将代理IP设置为ISP:详细指南

在当今互联网时代&#xff0c;代理IP已经成为许多用户保护隐私和提升网络体验的重要工具。而ISP&#xff08;Internet Service Provider&#xff09;的代理IP更是因为其高质量和稳定性备受青睐。本文将详细介绍如何将代理IP设置为ISP&#xff0c;让你在网络世界中享受更优质的上…