基于STM32的DAC简易信号发生器设计(HAL库)

news2024/10/6 16:31:27

前言:本文为手把手教学制造 DAC 简易信号发生器的教程,本教程的 MCU 使用 STM32F103ZET6 。以 HAL 库的 DAC 函数作为代码基础进行编程,使得信号发生器可以产生各种类型的信号波,包括:方波、三角波、正弦波和噪声波,该博客提供了各样的 API 函数供读者朋友直接使用,函数可以使得 STM32 的 DAC 输出规定频率的各类波形(频率范围有一定局限性)。DAC 与信号发生器都是嵌入式工作中十分常见的,希望这篇博文能给读者朋友的工程项目给予些许帮助。(代码开源!

实验硬件:STM32F103ZET6;手持小型示波器

项目实物:

项目效果图:

引脚连接:

STM32 与 示波器 引脚:

STM32.PA4->示波器

一、DAC概述

DAC(Digital-to-Analog Converter),即数字模拟转换器,是将数字信号转换为模拟信号的电路。DAC 的主要组成部分是数字信号处理模块、数字模数转换模块、数字信号输出模块和模拟信号处理模块。其中,数字信号处理模块负责对输入的数字信号进行处理,如滤波、放大、数字信号处理算法等,数字模数转换模块将数字信号转换为模拟信号,数字信号输出模块将数字信号输出到数字模数转换模块,模拟信号处理模块负责对输出的模拟信号进行滤波、放大等处理。

STM32 的 DAC 模块(数字/模拟转换模块)是12位数字输入,电压输出型的 DAC(0~3.3V)。DAC 可以配置为 8 位或 12 位模式,也可以与 DMA 控制器配合使用。DAC 工作在 12 位模式时,数据可以设置成左对齐或右对齐。DAC 模块有 2 个输出通道,每个通道都有单独的转换器。在双 DAC 模式下,2 个通道可以独立地进行转换,也可以同时进行转换并同步地更新 2 个通道的输出。DAC 可以通过引脚输入参考电压 VREF+ 以获得更精确的转换结果。

STM32 的 DAC 模块特点有:

(1) 2 个 DAC 转换器:每个转换器对应 1 个输出通道

(2) 8 位或者 12 位单调输出

(3) 12 位模式下数据左对齐或者右对齐

(4) 同步更新功能

(5) 噪声波形生成

(6) 三角波形生成

(7) 双 DAC 通道同时或者分别转换

(8) 每个通道都有 DMA 功能

二、简易信号发生器

简易信号发生器是一种基本的电子测试设备,用于生成各种电信号,通常用于电子工程、通信系统测试以及教育等领域。它能够产生正弦波、方波、三角波等不同类型的波形,以及不同频率和幅度的信号。

信号发生器通常具有以下特点:

  1. 紧凑的设计:简易信号发生器体积小巧,便于携带和使用。
  2. 易于操作:设备上配有旋钮、开关等,用于调节输出信号的频率、幅度和其他参数。
  3. 多功能性:尽管是简易型,但许多信号发生器仍能提供多种波形输出,以满足不同测试需求。
  4. 经济实惠:相比于专业级的信号发生器,简易信号发生器价格更加亲民,适合预算有限的用户。

在教育领域,简易信号发生器常用于教授电子学基础知识,帮助学生更好地理解信号处理和电路工作原理。在业余电子爱好者和电子工程技术人员中,它也是一个实用的工具,用于电路调试和性能测试。 

三、CubeMX配置

1、RCC配置外部高速晶振(精度更高)——HSE;

2、SYS配置:Debug设置成Serial Wire(否则可能导致芯片自锁);

3、DAC配置:将DAC设置为TIM2触发事件更新;

4、TIM配置:将TIM2的时钟频率设置为2MHz,且触发事件更新;

5、时钟树配置:

6、工程配置:

四、各种类型DAC输出代码

STM32 的 DAC 不仅可以输出可调电压(0~3.3v),还可以输出各种类型的信号波。该博客提供的信号源包括:方波、正弦波、三角波以及噪声波。使用的函数拟合手段进行数据点拟合出需要的信号源,优点:可以自动计算出波形所需要的数据值;缺点:需要消耗CPU资源进行计算。

4.1 可调输出电压

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

	
  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DAC_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start(&htim2);         		/* 开启定时器2 */
  HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 2048);	//可调输出电压		
  }
  /* USER CODE END 3 */
}

DAC 输出的模拟电压(DAC 的数字范围0~4095,代码预设为2048):

Value = 2048/4095*3.3 = 1.65v

4.2 方波

方波是一种非正弦曲线的波形,通常会与电子和讯号处理时出现。理想方波只有“高”和“低”这两个值。电流或电压的波形为矩形的信号即为矩形波信号,高电平在一个波形周期内占有的时间比值称为占空比,也可理解为电路释放能量的有效释放时间与总释放时间的比值。占空比为50%的矩形波称之为方波,方波有低电平为零与为负之分。必要时,可加以说明“低电平为零”、“低电平为负”。

★本篇博客的频率方波的产生原理:

利用 Delay_us 函数用来制造出 us 级的延迟,通过 HAL_DAC_SetValue 函数周期性设置 DAC 的输出电压数值进行方波模拟。

/**
 * @brief       产生频率方波
 * @note        方波频率存在局限性!
 * @param       maxval : 最大值(0 < maxval < 4095)
 * @param       frequency: 方波的频率
 * @retval      无
 */
void Frequency_square_wave(uint16_t maxval, uint16_t frequency)
{
		HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, maxval);
		Delay_us(1000000/(2*frequency));
		HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0);
		Delay_us(1000000/(2*frequency));
}

/* 毫秒级延迟(系统版) */
void Delay_us(uint32_t udelay)
{
		uint32_t startval,tickn,delays,wait;
 
		startval = SysTick->VAL;
		tickn = HAL_GetTick();
		//sysc = 72000;  //SystemCoreClock / (1000U / uwTickFreq);
		delays =udelay * 72; //sysc / 1000 * udelay;
		if(delays > startval)
    {
      while(HAL_GetTick() == tickn)
        {
 
        }
      wait = 72000 + startval - delays;
      while(wait < SysTick->VAL)
        {
 
        }
    }
		else
    {
      wait = startval - delays;
      while(wait < SysTick->VAL && HAL_GetTick() == tickn)
        {
 
        }
    }
}

main函数: 

Frequency_square_wave(2048,600);						/* 频率方波 */		

代码预设的方波电压值应该为:1.66V左右,频率为:600Hz

手持小型示波器的输出:

4.3 正弦波

STM32 的 DAC 是没有直接输出正弦波的功能,所以只能模拟一个正弦波,并且进行输出。

本篇博客使用正点原子的正弦波产生函数进行数据拟合,以此来产生需要的正弦波 DAC 数值。

正弦波,也称为 Sin 波,是最基本也是最常见的波形之一。它是一种连续变化的波形,其特点是电压或电流随时间呈现出平滑的、周期性的正弦变化。正弦波在科学和工程中有广泛的应用。在交流电(AC)系统中,正弦波是电压和电流的主要波形。在信号处理和通信领域,正弦波因其简单的数学特性而被用作基础信号,用于分析和合成复杂的信号。此外,正弦波在声学、振动分析和许多其他物理现象的研究中也非常重要。

 y = 2048*sin((2\pi /samples)*x)+2048

使用上式可以模拟出一个正弦函数所需要的采样点数值,即 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, uint16_t time)
{
    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无法输出负电压,所以需要将曲线向上偏移一个峰值的量,让整个曲线都落在正数区域
			   * 由于sin函数消耗CPU时间较长,结合DAC频率与sin函数,每次触发DAC设置大概耗时0.00004s(可根据自己实际情况测试)
         */
        outdata = maxval * sin(inc * i) + maxval;
        if(outdata > 4095)
           outdata = 4095; /* 上限限定 */
				HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, outdata);
				Delay_us(time);
    }
}

/**
 * @brief       产生频率正弦波
 * @note        需保证: maxval > samples/2, 且产生的频率受限
 * @param       maxval : 最大值(0 < maxval < 2048)
 * @param       frequency: 正弦波的频率
 * @retval      无
 */
void Frequency_sin_wave(uint16_t maxval, uint16_t frequency)
{
		int time;
		time = 5000/frequency-43;
		DAC_creat_sin_buf(maxval,200,time);	
}

main函数: 

Frequency_sin_wave(2000,20);								/* 频率的正弦波 */

手持小型示波器的输出:

4.4 三角波

STM32 的 DAC 是可以直接输出一个三角波的,但是可操作性偏低,本篇博客使用函数拟合出频率三角波。

三角波(Triangle wave)是一种非正弦波,其波形类似于数学中的三角函数,但更具体地,它的形状类似于直角三角形的斜边。三角波的数学表达式可以通过积分正弦波或方波来得到,也可以通过线性组合傅里叶级数来构造。三角波在电子学、音乐合成和信号处理等领域有应用。例如,在模拟电子音乐合成器中,三角波是一种常用的波形,因为它可以产生丰富的谐波结构。

三角波的输入计算推导如下:

输出频率 = 1000/(dt * samp),即可 Frequency = 10000/dt。值得注意的是:当 dt 数值偏小时,譬如 dt 小于 5us 时,延迟函数本身精度将不准确,导致产生的三角波频率也会不准确,所以应该尽可能保证延迟时间的适当性!

/**
 * @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(samples > ((maxval + 1) * 2))return ;    /* 数据不合法 */
        
    incval = (maxval + 1) / (samples / 2);      /* 计算递增量 */
    
    for(j = 0; j < n; j++)
    { 
        Curval = 0;
        HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, Curval);    /* 先输出0 */
        for(i = 0; i < (samples / 2); i++)      /* 输出上升沿 */
        {
            Curval  +=  incval;                 /* 新的输出值 */
            HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, Curval);
            Delay_us(dt);
        }
        for(i = 0; i < (samples / 2); i++)      /* 输出下降沿 */
        {
            Curval  -=  incval;                 /* 新的输出值 */
            HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, Curval);
            Delay_us(dt);
        }
    }
}

/**
 * @brief       产生频率三角波
 * @note        需保证: maxval > samples/2,且产生的频率受限
 * @param       maxval : 最大值(0 < maxval < 4095)
 * @param       frequency: 三角波频率
 * @retval      无
 */
void Frequency_triangular_wave(uint16_t maxval, uint16_t frequency)
{
		int time;
		time = 10000/frequency;
		DAC_triangular_wave(maxval, time, 100,1000);
}

main函数: 

Frequency_triangular_wave(2000,50);            /* 频率的三角波 */

手持小型示波器的输出:

4.5 噪声波

噪声波,通常简称为噪声,是指在信号传输、处理或生成过程中引入的不希望有的、无规律的波动。噪声可以源自各种不同的原因,包括电子设备的电子迁移、热噪声、电磁干扰、机械振动等。在信号处理和通信领域,噪声通常被视为不必要的信息,它会干扰有用信号的传输和解释。 

/**
 * @brief       产生噪声波
 * @param       maxval : 最大值(0 < maxval < 4095)
 * @retval      无
 */
void DAC_noise_wave(uint16_t maxval)
{
		int val = 0;								/* 噪声幅值 */
		val = rand()%maxval;				/* 随机制造噪声幅值 */
		HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, val);
}

main函数: 

DAC_noise_wave(2000);						/* 噪声波 */

手持小型示波器的输出:

4.6  完整代码

signal.h:

#ifndef __SIGNAL_H
#define __SIGNAL_H

#include "stm32f1xx.h"

/* Signal Generator */
void DAC_creat_sin_buf(uint16_t maxval, uint16_t samples, uint16_t time);
void DAC_triangular_wave(uint16_t maxval, uint16_t dt, uint16_t samples, uint16_t n);
void DAC_noise_wave(uint16_t maxval);
void Frequency_square_wave(uint16_t maxval, uint16_t frequency);
void Frequency_sin_wave(uint16_t maxval, uint16_t frequency);
void Frequency_triangular_wave(uint16_t maxval, uint16_t frequency);
void Delay_us(uint32_t udelay);

#endif

signal.c:

/********************************* (C) COPYRIGHT **********************************
* File Name						: signal.c
* Author						: 混分巨兽龙某某
* Version						: V1.0.0
* Data							: 2024/01/03
* Contact						: QQ:1178305328
* Description					: Signal generator function file
***********************************************************************************/
#include "signal.h"
#include "math.h"
#include "dac.h"
#include "stdlib.h"

/**
 * @brief       产生正弦波序列函数
 * @note        需保证: maxval > samples/2
 * @param       maxval : 最大值(0 < maxval < 2048)
 * @param       samples: 采样点的个数
 * @retval      无
 */
void DAC_creat_sin_buf(uint16_t maxval, uint16_t samples, uint16_t time)
{
    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无法输出负电压,所以需要将曲线向上偏移一个峰值的量,让整个曲线都落在正数区域
			   * 由于sin函数消耗CPU时间较长,结合DAC频率与sin函数,每次触发DAC设置大概耗时0.00004s(可根据自己实际情况测试)
         */
        outdata = maxval * sin(inc * i) + maxval;
        if(outdata > 4095)
           outdata = 4095; /* 上限限定 */
				HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, outdata);
				Delay_us(time);
    }
}

/**
 * @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(samples > ((maxval + 1) * 2))return ;    /* 数据不合法 */
        
    incval = (maxval + 1) / (samples / 2);      /* 计算递增量 */
    
    for(j = 0; j < n; j++)
    { 
        Curval = 0;
        HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, Curval);    /* 先输出0 */
        for(i = 0; i < (samples / 2); i++)      /* 输出上升沿 */
        {
            Curval  +=  incval;                 /* 新的输出值 */
            HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, Curval);
            Delay_us(dt);
        }
        for(i = 0; i < (samples / 2); i++)      /* 输出下降沿 */
        {
            Curval  -=  incval;                 /* 新的输出值 */
            HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, Curval);
            Delay_us(dt);
        }
    }
}

/**
 * @brief       产生噪声波
 * @param       maxval : 最大值(0 < maxval < 4095)
 * @retval      无
 */
void DAC_noise_wave(uint16_t maxval)
{
		int val = 0;								/* 噪声幅值 */
		val = rand()%maxval;				/* 随机制造噪声幅值 */
		HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, val);
}

/**
 * @brief       产生频率方波
 * @note        方波频率受限
 * @param       maxval : 最大值(0 < maxval < 4095)
 * @param       frequency: 方波的频率
 * @retval      无
 */
void Frequency_square_wave(uint16_t maxval, uint16_t frequency)
{
		HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, maxval);
		Delay_us(1000000/(2*frequency));
		HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0);
		Delay_us(1000000/(2*frequency));
}

/**
 * @brief       产生频率正弦波
 * @note        需保证: maxval > samples/2, 且产生的频率受限
 * @param       maxval : 最大值(0 < maxval < 2048)
 * @param       frequency: 正弦波的频率
 * @retval      无
 */
void Frequency_sin_wave(uint16_t maxval, uint16_t frequency)
{
		int time;
		time = 5000/frequency-43;
		DAC_creat_sin_buf(maxval,200,time);	
}

/**
 * @brief       产生频率三角波
 * @note        需保证: maxval > samples/2,且产生的频率受限
 * @param       maxval : 最大值(0 < maxval < 2048)
 * @param       frequency: 三角波频率
 * @retval      无
 */
void Frequency_triangular_wave(uint16_t maxval, uint16_t frequency)
{
		int time;
		time = 10000/frequency;
		DAC_triangular_wave(maxval, time, 100,1000);
}

/* 毫秒级延迟(系统版) */
void Delay_us(uint32_t udelay)
{
		uint32_t startval,tickn,delays,wait;
 
		startval = SysTick->VAL;
		tickn = HAL_GetTick();
		//sysc = 72000;  //SystemCoreClock / (1000U / uwTickFreq);
		delays =udelay * 72; //sysc / 1000 * udelay;
		if(delays > startval)
    {
      while(HAL_GetTick() == tickn)
        {
 
        }
      wait = 72000 + startval - delays;
      while(wait < SysTick->VAL)
        {
 
        }
    }
		else
    {
      wait = startval - delays;
      while(wait < SysTick->VAL && HAL_GetTick() == tickn)
        {
 
        }
    }
}

五、博客总结

本篇博客设计的简易信号发生器可以产生各种类型且频率指定的信号波,但受限于代码与硬件等因素,其产生信号的频率进度很一般,只能近似去使用。如果读者朋友需要使用精度很高的信号发生器,建议购买专门的硬件和芯片去设计。

本篇博客的各种类型DAC信号波使用的是数据拟合手段进行,该手段的优势是可以直接在源代码上改频率和幅值即可输出需要的信号波,缺点则是需要消耗CPU资源进行计算。如果,读者朋友有一些特殊情况,需要保证 CPU 的计算速率,可以直接使用 Matlab 去拟合好 DAC 信号波的数值,再使用数组中的数据实现信号波产生。

六、代码开源

代码地址: 基于STM32的DAC简易信号发生器设计代码资源-CSDN文库

如果积分不够的朋友,点波关注评论区留下邮箱,作者无偿提供源码和后续问题解答。求求啦关注一波吧 !!!

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

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

相关文章

Oracle解析exp、imp及常见的问题

前言 在工作中经常需要不同数据库的导入和导出。exp和imp可以实现数据的迁移。 exo会转储产生对应的二进制文件,里面包括数据的定义信息、数据内容等,即为dump文件。 下面是使用exp和imp的一些场景 exp和imp主要有4中模式: 1)数据库模式 数据库模式也就是我们说的全备…

Pytorch 计算深度模型的大小

计算模型大小的方法 卷积 时间复杂度 与 空间复杂度 的计算方式&#xff1a; C 通道的个数&#xff0c;K卷积核大小&#xff0c;M特征图大小&#xff0c;C_l-1是输入通道的个数&#xff0c;C_l是输出通道的个数 1 模型大小 MB 计算模型的大小的原理就是计算保存模型所需要…

sprinboot+人大金仓配置

1. .yml 配置 spring:datasource:type: com.alibaba.druid.pool.DruidDataSource#driverClassName: dm.jdbc.driver.DmDriver## todo 人大金仓driverClassName: com.kingbase8.Driverdruid:## todo 人大金仓master:url: jdbc:kingbase8://111.111.111.111:54321/dbname?cu…

区块链钱包开发——专业区块链开发

随着区块链技术的发展&#xff0c;钱包开发成为了一项至关重要的任务。本文将探讨区块链钱包开发的重要性&#xff0c;分析当前面临的挑战&#xff0c;并展望未来的发展趋势。 一、区块链钱包概述 区块链钱包是一种用于存储和管理数字货币的软件工具。它为用户提供了一个安全的…

巧用断点设置查找bug【debug】

默认设置的断点&#xff0c;当代码运行到断点处MCU就会被挂起&#xff0c;从而停在断点处。 但在某些情况下&#xff0c;如调试FCCU时&#xff0c;如果设置断点&#xff0c;MCU停下后将会导致 FCCU 配置WDG超时。或在调试类似电机控制类的应用时&#xff0c;不适当的断点会导 致…

中科院1区TOP ! 影响因子8.5,稳定检索33年口碑老刊,另附同领域SCI,录用快,手慢无!

【SciencePub学术】今天小编给大家带来了一本计算机类的高分优刊解读&#xff0c;隶属于Elsevier出版社&#xff0c;JCR1区&#xff0c;中科院1区TOP&#xff0c;影响因子高达8.5&#xff0c;领域相符的学者可考虑&#xff01; Expert Systems With Applications 1 期刊概况 …

代码随想录算法训练营第四十八天| LeetCode198.打家劫舍、213.打家劫舍II、337.打家劫舍III

一、LeetCode198.打家劫舍&#xff08;线性&#xff09; 题目链接/代码讲解/视频讲解&#xff1a;https://programmercarl.com/0198.%E6%89%93%E5%AE%B6%E5%8A%AB%E8%88%8D.html 状态&#xff1a;已解决 1.思路 这个题的关键就在于想清楚如何抉择某个房间偷不偷的问题。根据题…

Axure RP 9 for Mac/win:打造极致交互体验的原型设计神器

在数字化浪潮席卷全球的今天&#xff0c;原型设计作为产品开发的关键环节&#xff0c;其重要性不言而喻。Axure RP 9&#xff0c;作为一款专为设计师和开发者打造的原型设计软件&#xff0c;以其出色的交互设计能力和高效的协作体验&#xff0c;赢得了广大用户的青睐。 Axure …

不同语种下的应用该如何测试?

在测试的过程中&#xff0c;我们有时候会遇到不同语种的页面&#xff0c;通常涉及到国际化&#xff08;Internationalization, i18n&#xff09;和本地化&#xff08;Localization, l10n&#xff09;&#xff0c;在测试的过程中如何保障不同语种软件或应用质量&#xff0c;值得…

xgp会员一年多少钱?xgp一个月多少钱?微软商店xgp会员价格指南

xgp是xbox游戏平台。xgp是类似于steam、epic等&#xff0c;拥有丰富游戏资源的平台。该平 台的全称为“XBox Game Pass”&#xff0c;俗称为“西瓜皮”。xgp是会员订阅模式&#xff0c;开启会员后&#xff0c;所有游戏资源都为你开放。pc版的&#xff0c;第一个月10港币&#x…

1688代采系统:解决全球化采购难题的技术创新

跨境寻源通&#xff08;1688代采系统&#xff09;是面向全球化采购市场的一项技术创新&#xff0c;它旨在帮助企业更高效、便捷和安全地进行跨境采购。以下是这项服务的几个关键特点&#xff1a; 多语言支持&#xff1a;跨境采购往往面临语言障碍问题&#xff0c;而跨境寻源通…

XxlJob外网访问

Xxl-Job使用外网访问 服务注册中心配置 ### web server.port8088 server.servlet.context-path/xxl-job-admin### actuator management.server.base-path/actuator management.health.mail.enabledfalse### resources spring.mvc.servlet.load-on-startup0 spring.mvc.static…

大功率回馈式直流电子负载箱优点和应用

大功率回馈式直流电子负载箱是先进的电力设备&#xff0c;它能够模拟各种复杂的负载情况&#xff0c;对电源进行测试和校准。这种设备具有许多优点&#xff0c;被广泛应用于各种领域。 大功率回馈式直流电子负载箱具有高精度和高稳定性。它能够精确地模拟各种负载情况&#xff…

CISC和RISC

CISC&#xff08;Complex Instruction Set Computer&#xff09;和RISC&#xff08;Reduced Instruction Set Computer&#xff09;是两种不同的计算机架构哲学&#xff0c;它们在指令集的设计、性能优化、硬件复杂度以及应用领域上有着根本的区别。 CISC&#xff08;复杂指令…

皮带机巡检解决方案

在化工行业中、皮带机人工巡检存在的疲劳安全、巡检质量、数据分析等问题&#xff0c;通过以智能巡检机器人为中心的设备生命周期运维管理系统&#xff0c;完成对皮带机的巡检巡逻和排查预警&#xff0c;有效降低人员和设备的安全隐患&#xff0c;更助力企业运维水平和智能化作…

极快!宝藏EI,2-4周录用,接受范围广!

本周投稿推荐 SSCI • 2/4区经管类&#xff0c;2.5-3.0&#xff08;录用率99%&#xff09; SCIE&#xff08;CCF推荐&#xff09; • 计算机类&#xff0c;2.0-3.0&#xff08;最快18天录用&#xff09; SCIE&#xff08;CCF-C类&#xff09; • IEEE旗下&#xff0c;1/2…

后端程序员利用 AI 给网站制作专业 favicon

看看你的 Chrome 浏览器顶部的标签页&#xff0c;每个标签页前面有一个小小的图标&#xff0c;这个就是 favicon&#xff0c;如果你将网页保存到收藏夹&#xff0c;前面也会是这个小图标。这个图标有时候就是网站的 Logo&#xff0c;有时候也不太一样。 上面截图中&#xff0c…

leetcode 每日一题目 (树的直径 +DFS的深刻理解)

如下是题目的简单描述&#xff1a; 给你一棵二叉树的根节点 root &#xff0c;二叉树中节点的值 互不相同 。另给你一个整数 start 。在第 0 分钟&#xff0c;感染 将会从值为 start 的节点开始爆发。 每分钟&#xff0c;如果节点满足以下全部条件&#xff0c;就会被感染&…

代码随想录算法训练营第四十九天| LeetCode121. 买卖股票的最佳时机、122.买卖股票的最佳时机II

一、LeetCode121. 买卖股票的最佳时机 题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/0121.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BA.html 状态&#xff1a;已解决 1.思路 学了双指针的同学可能会下…

LeetCode 热题 100 Day06

矩阵相关题型 Leetcode 48. 旋转图像【中等】 题意理解&#xff1a; 将一个矩阵顺时针旋转90度&#xff0c;返回旋转后的矩阵。 要求&#xff1a; 在原地修改&#xff0c;不借助额外的空间 如果可以使用辅助数组来实现转置,则有 matrix_new[i][j]matrix[j][row-i-1]; 解…