DAC实验(DAC 输出三角波实验)(DAC 输出正弦波实验)

DAC 输出三角波实验

本实验我们来学习使用如何让 DAC 输出三角波,DAC 初始化部分还是用 DAC 输出实验 的,所以做本实验的前提是先学习 DAC 输出实验。

使用 DAC 输出三角波,通过 KEY0/KEY1 两个按键,控制 DAC1 的通道 1 输出两种三角 波,需要通过示波器接 PA4 进行观察。LED0 闪烁,提示程序运行。

我们只需要把示波器的探头接到 DAC1 通道 1(PA4)引脚,就可以在示波器上显示 DAC 输出的波形。 

#include "./BSP/DAC/dac.h"
#include "./SYSTEM/delay/delay.h"DAC_HandleTypeDef g_dac_handle;/* DAC初始化函数 */
void dac_init(void)
{DAC_ChannelConfTypeDef dac_ch_conf = {0};g_dac_handle.Instance = DAC;HAL_DAC_Init(&g_dac_handle);/* 初始化 DAC */dac_ch_conf.DAC_Trigger = DAC_TRIGGER_NONE;/* 不使用触发功能,(自动模式) */dac_ch_conf.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE;/* DAC1 输出缓冲关闭 */HAL_DAC_ConfigChannel(&g_dac_handle, &dac_ch_conf, DAC_CHANNEL_1);HAL_DAC_Start(&g_dac_handle, DAC_CHANNEL_1);/* 开启 DAC 通道 1 */
}/* DAC MSP底层初始化函数 */
void HAL_DAC_MspInit(DAC_HandleTypeDef *hdac)
{if(hdac->Instance == DAC){GPIO_InitTypeDef gpio_init_struct = {0};__HAL_RCC_DAC_CLK_ENABLE();/* 使能 DAC1 的时钟 */__HAL_RCC_GPIOA_CLK_ENABLE();;/* 使能 DAC OUT1/2 的 IO 口时钟(都在 PA 口,PA4/PA5) */gpio_init_struct.Pin = GPIO_PIN_4;gpio_init_struct.Mode = GPIO_MODE_ANALOG;HAL_GPIO_Init(GPIOA, &gpio_init_struct);}
}/*** @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);}}
}

该函数用于设置 DAC 通道 1 输出三角波,输出频率 ≈ 1000 / (dt * samples) Khz,形参含 义在源码已经有详细注释。该函数中,我们使用 HAL_DAC_SetValue 函数来设置 DAC 的输出 值,这样得到的三角波在示波器上可以看到。如果有跳动现象(不平稳),是正常的,因为调用 函数,计算等都需要时间,这样就会导致输出的波形是不太稳定的。越高性能的 MCU,得到的 波形会越稳定。而且用 HAL 库函数操作效率没有直接操作寄存器高,所以可以像寄存器版本实 验一样,直接操作 DHR12R1 寄存器,得到的波形会相对稳定些。

由于使用 HAL 库的函数,CPU 花费的时间会更长(因为指令变多了),在时间精度要求比 较高的应用,就不适合用 HAL 库函数来操作了,这一点希望大家明白。所以学 STM32 不是说 只要会 HAL 库就可以了,对寄存器也是需要有一定的理解,最好是熟悉。这里用 HAL 库操作 只是为了演示怎么使用 HAL 库的相关函数。

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/ADC/adc.h"
#include "./BSP/DAC/dac.h"
#include "./BSP/KEY/key.h"int main(void)
{uint8_t t = 0; uint8_t key;HAL_Init();                         /* 初始化 HAL 库 */sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */delay_init(72);                     /* 延时初始化 */usart_init(115200);                 /* 传口初始化 */led_init();                         /* LED初始化 */lcd_init();                         /* LCD初始化 */adc_init();                         /* ADC初始化 */dac_init();                         /* DAC初始化 */key_init();                         /* KEY初始化 */lcd_show_string(30,  50, 200, 16, 16, "STM32", RED);lcd_show_string(30,  70, 200, 16, 16, "DAC Triangular WAVE TEST", RED);lcd_show_string(30,  90, 200, 16, 16, "ATOM@ALIENTEK", RED);lcd_show_string(30, 110, 200, 16, 16, "KEY0:Wave1  KEY1:Wave2", RED);lcd_show_string(30, 130, 200, 16, 16, "DAC None", BLUE); /* 提示无输出 */while(1){t++;key = key_scan(0);                           /* 按键扫描 */if (key == KEY0_PRES)                        /* 高采样率 , 约1Khz波形 */{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)                   /* 低采样率 , 约1Khz波形 */{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);}
}

该部分代码功能是,按下 KEY0 后,DAC 输出三角波 1,按下 KEY1 后,DAC 输出三角波 2,将 dac_triangular_wave 的形参代入公式:输出频率 ≈ 1000 / (dt * samples) KHz,得到三角 波 1 和三角波 2 的频率都是 0.1KHz。

下载代码后,可以看到 LED0 不停的闪烁,提示程序已经在运行了。LCD 显示如图 33.3.4.1 所示:

没有按下任何按键之前,LCD 屏显示 DAC None,当按下 KEY0 后,DAC 输出三角波 1, LCD 屏显示 DAC Wave1 ,三角波 1 输出完成后 LCD 屏继续显示 DAC None,当按下 KEY1后,DAC 输出三角波 2,LCD 屏显示 DAC Wave2,三角波 2 输出完成后 LCD 屏继续显示 DAC None。

其中三角波 1 和三角波 2 在示波器的显示情况如下图所示:

由上面两副测试图可以知道,三角波 1 的频率是 64.5Hz,三角波 2 的频率是 99.5Hz。三角 波 2 基本接近我们算出来的结果 0.1KHz,三角波 1 有较大误差,在介绍 dac_triangular_wave 函 数时也说了原因,加上三角波 1 的采样率比较高,所以误差就会比较大。 

DAC 输出正弦波实验

本实验我们来学习使用如何让 DAC 输出正弦波。实验将用定时器 7 来触发 DAC 进行转换 输出正弦波,以 DMA 传输数据的方式。

使用 DAC 输出正弦波,通过 KEY0/KEY1 两个按键,控制 DAC1 的通道 1 输出两种正弦 波,需要通过示波器接 PA4 进行观察。LED0 闪烁,提示程序运行。

我们只需要把示波器的探头接到 DAC1 通道 1(PA4)引脚,就可以在示波器上显示 DAC 输出的波形。PA4 在 P7 已经引出,硬件连接如图 33.4.2.1 所示:

HAL库函数 

 代码

#include "./BSP/DAC/dac.h"DMA_HandleTypeDef g_dma_dac_handle;
DAC_HandleTypeDef g_dac_dma_handle;extern uint16_t g_dac_sin_buf[4096];           /* 发送数据缓冲区 *//* DAC DMA输出波形初始化函数 */
void dac_dma_wave_init(void)
{DAC_ChannelConfTypeDef dac_ch_conf = {0};__HAL_RCC_DMA2_CLK_ENABLE();/* DMA2 时钟使能 */g_dma_dac_handle.Instance = DMA2_Channel3;/* 设置 DMA 通道 */g_dma_dac_handle.Init.Direction = DMA_MEMORY_TO_PERIPH;/* 从存储器到外设模式 */g_dma_dac_handle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;/* 存储器数据长度:16 位 */g_dma_dac_handle.Init.MemInc = DMA_MINC_ENABLE;/* 存储器增量模式 */g_dma_dac_handle.Init.Mode = DMA_CIRCULAR;/* 循环模式 */g_dma_dac_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;/* 外设数据长度:16 位 */g_dma_dac_handle.Init.PeriphInc = DMA_PINC_DISABLE;/* 外设非增量模式 */g_dma_dac_handle.Init.Priority = DMA_PRIORITY_HIGH;/* 优先级 */HAL_DMA_Init(&g_dma_dac_handle);/* 初始化 DMA */__HAL_LINKDMA(&g_dac_dma_handle, DMA_Handle1, g_dma_dac_handle);/* DMA 句柄与 DAC 句柄关联 */g_dac_dma_handle.Instance = DAC;HAL_DAC_Init(&g_dac_dma_handle);dac_ch_conf.DAC_Trigger = DAC_TRIGGER_T7_TRGO;/* 使用 TIM7 TRGO 事件触发 */dac_ch_conf.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE;/* DAC1 输出缓冲关闭 */HAL_DAC_ConfigChannel(&g_dac_dma_handle, &dac_ch_conf, DAC_CHANNEL_1);/* DAC 通道 1 配置 *//* 配置 DMA 传输参数 */HAL_DMA_Start(&g_dma_dac_handle, (uint32_t)g_dac_sin_buf, (uint32_t)&DAC->DHR12R1, 0);
}/* DAC MSP底层初始化函数 */
void HAL_DAC_MspInit(DAC_HandleTypeDef *hdac)
{if(hdac->Instance == DAC){GPIO_InitTypeDef gpio_init_struct = {0};__HAL_RCC_DAC_CLK_ENABLE();/* 使能 DAC1 的时钟 */__HAL_RCC_GPIOA_CLK_ENABLE();/* DAC 通道引脚端口时钟使能 *//* STM32 单片机, 总是 PA4=DAC1_OUT1, PA5=DAC1_OUT2 */gpio_init_struct.Pin = GPIO_PIN_4;gpio_init_struct.Mode = GPIO_MODE_ANALOG;/* 模拟 */HAL_GPIO_Init(GPIOA, &gpio_init_struct);}
}void dac_dma_wave_enable(uint16_t cndtr, uint16_t arr, uint16_t psc)
{TIM_HandleTypeDef tim7_handle = {0};TIM_MasterConfigTypeDef tim7_master_config = {0};__HAL_RCC_TIM7_CLK_ENABLE();/* TIM7 时钟使能 */tim7_handle.Instance = TIM7;/* 选择定时器 7 */tim7_handle.Init.Prescaler = psc;/* 预分频 */tim7_handle.Init.Period = arr;/* 自动装载值 */tim7_handle.Init.CounterMode = TIM_COUNTERMODE_UP; /* 递增计数器 */HAL_TIM_Base_Init(&tim7_handle);tim7_master_config.MasterOutputTrigger = TIM_TRGO_UPDATE;/* 定时器更新事件用于触发 */tim7_master_config.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;HAL_TIMEx_MasterConfigSynchronization(&tim7_handle, &tim7_master_config);/* 配置定时器 7 的更新事件触发 DAC 转换 */HAL_TIM_Base_Start(&tim7_handle);/* 启动定时器 7 */HAL_DAC_Stop_DMA(&g_dac_dma_handle, DAC_CHANNEL_1);/* 先停止之前的传输 */HAL_DAC_Start_DMA(&g_dac_dma_handle, DAC_CHANNEL_1, (uint32_t *)g_dac_sin_buf, cndtr, DAC_ALIGN_12B_R);
}

该函数用于初始化 DAC 用 DMA 的方式输出正弦波。本函数用到的 API 函数起前面都介 绍过,请结合前面介绍过的相关内容来理解源码。这里值得注意的是我们是采用定时器 7 触发 DAC 进行转换输出的。

该函数用于使能波形输出,利用定时器 7 的更新事件来触发 DAC 转换输出。使能定时器 7 的时钟后,调用 HAL_TIMEx_MasterConfigSynchronization 函数配置 TIM7 选择更新事件作为触 发输出 (TRGO),然后调用 HAL_DAC_Stop_DMA 函数停止 DAC 转换以及 DMA 传输,最后 再调用 HAL_DAC_Start_DMA 函数重新配置并启动 DAC 和 DMA。

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/ADC/adc.h"
#include "./BSP/DAC/dac.h"
#include "./BSP/KEY/key.h"
#include "math.h"uint16_t g_dac_sin_buf[4096];           /* 发送数据缓冲区 *//*** @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 inc = (2 * 3.1415962) / samples; /* 计算增量(一个周期DAC_SIN_BUF个点)*/float outdata = 0;for (i = 0; i < samples; i++){outdata = maxval * (1 + sin(inc * i)); /* 计算以dots个点为周期的每个点的值,放大maxval倍,并偏移到正数区域 */if (outdata > 4095)outdata = 4095; /* 上限限定 *///printf("%f\r\n",outdata);g_dac_sin_buf[i] = outdata;}
}int main(void)
{uint8_t t = 0; uint8_t key;HAL_Init();                         /* 初始化 HAL 库 */sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */delay_init(72);                     /* 延时初始化 */usart_init(115200);                 /* 传口初始化 */led_init();                         /* LED初始化 */lcd_init();                         /* LCD初始化 */key_init();                         /* KEY初始化 *//* 初始化DAC通道1 DMA波形输出 */dac_dma_wave_init();lcd_show_string(30,  50, 200, 16, 16, "STM32", RED);lcd_show_string(30,  70, 200, 16, 16, "DAC DMA Sine WAVE TEST", RED);lcd_show_string(30,  90, 200, 16, 16, "ATOM@ALIENTEK", RED);lcd_show_string(30, 110, 200, 16, 16, "KEY0:3Khz  KEY1:30Khz", RED);dac_creat_sin_buf(2048, 100);dac_dma_wave_enable(100, 10 - 1, 72 - 1);/* 100Khz触发频率, 100个点, 得到1Khz的正弦波 */while(1){t++;key = key_scan(0);                           /* 按键扫描 */if (key == KEY0_PRES)                               /* 高采样率 , 约1Khz波形 */{dac_creat_sin_buf(2048, 100);dac_dma_wave_enable(100, 10 - 1, 24 - 1);       /* 300Khz触发频率, 100个点, 得到最高3KHz的正弦波. */}else if (key == KEY1_PRES)                          /* 低采样率 , 约1Khz波形 */{dac_creat_sin_buf(2048, 10);dac_dma_wave_enable(10, 10 - 1, 24 - 1);        /* 300Khz触发频率, 10个点, 可以得到最高30KHz的正弦波. */}if (t == 40)        /* 定时时间到了 */{LED0_TOGGLE();  /* LED0闪烁 */t = 0;}delay_ms(5);}
}

dac_dma_wave_init 函数初始化 DAC 通道 1,并指定 DMA 搬运的数据的开始地址和目标 地址。dac_creat_sin_buf 函数用于产生正弦波序列,并保存在 g_dac_sin_buf 数组中,供给 DAC 转换。在进入wilhe(1)循环之前,dac_dma_wave_enable函数默认配置DAC的采样点个数时100, 并配置定时器 7 的溢出频率为 100KHz。这样就可以输出 1KHz 的正弦波。下面给大家解释一下 为什么是输出 1KHz 的正弦波?

定时器 7 的溢出频率为 100KHz,不记得怎么计算的朋友,请回顾基本定时器的相关内容, 这里直接把公式列出:Tout= ((arr+1)*(psc+1))/Tclk

看到 dac_dma_wave_enable(100, 10 - 1, 72 - 1);这个语句,第二个形参是自动重装载值,第 三个形参是分频系数,那么代入公式,可得:Tout= ((arr+1)*(psc+1))/Tclk= ((9+1)*(71+1))/ 72000000= 0.00001s得到定时器的更新事件周期是 0.00001 秒,即更新事件频率为 100KHz,也就得到 DAC 输 出触发频率为 100KHz。再结合总一个正弦波共有 100 个采样点,就可以得到正弦波的频率为 100KHz/100 = 1KHz。

知道了正弦波的频率怎么来的,下面代码中,按下按键 KEY0,得到 3KHz 的正弦波,按下 按键 KEY1,得到 30KHz 的正弦波,计算方法都一样的。

实验现象

没有按下任何按键之前,默认输出 1KHz(100 个采样点)的正弦波,如下图所示:

当按下 KEY0 后,DAC 输出 3KHz(100 个采样点)的正弦波,如下图所示: 当按下 KEY1 后,DAC 输出 30KHz(10 个采样点)的正弦波,如下图所示:

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

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

相关文章

LinkWeChat V4.9.8 版本发布

LinkWeChat v4.9.8 已经发布&#xff0c;基于企业微信的 SCRM 系统 LinkWeChat 是国内首个基于企业微信的开源 SCRM&#xff0c;在集成了企微强大的开放能力的基础上&#xff0c;进一步升级拓展灵活高效的客户运营能力及多元化精准营销能力&#xff0c;让客户与企业之间建立强…

Nginx反向代理和负载均衡

1.反向代理 反向代理&#xff08;Reverse Proxy&#xff09;方式是指以代理服务器来接受internet上的连接请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;并将从服务器上得到的结果返回给internet上请求连接的客户端&#xff0c;此时代理服务器对外就表现为一…

记录:RK3568显示异常。

最近调一个RK3568的新板子&#xff0c;板子其它接口功能都调试ok。可唯独在适配显示时发现&#xff0c;HDMI和MIPI显示均出现异常。当系统启动要进入桌面时候内核就开始报错。 因为这套源码之前在其它的板子上适配过&#xff0c;所以第一反应就是硬件问题或者是那个电压没配置…

SQL注入1

对sql进行一个小结 还有其他的注入 其他注入:堆叠注入&#xff0c;宽字节注入&#xff0c;二次注入 首先是数值和字符 id1 and 11和id1 and 12 如果这两个语句返回的页面不一样就说明是数字型 id1 and 11#和id1 and 12# 如果这两个语句返回的页面不一样就说明是字符型 常…

【Promise12数据集】Promise12数据集介绍和预处理

【Segment Anything Model】做分割的专栏链接&#xff0c;欢迎来学习。 【博主微信】cvxiayixiao 本专栏为公开数据集的介绍和预处理&#xff0c;持续更新中。 要是只想把Promise12数据集的raw形式分割为png形式&#xff0c;快速导航&#xff0c;直接看2&#xff0c;4标题即可 …

【精选】项目管理工具——Maven详解

Maven简介 Maven是一个项目管理工具。它可以帮助程序员构建工程&#xff0c;管理jar包&#xff0c;编译代码&#xff0c;完成测试&#xff0c;项目打包等等。 Maven工具是基于POM&#xff08;Project Object Model&#xff0c;项目对象模型&#xff09;实现的。在Maven的管理下…

Spring Framework 6.1 正式 GA

Spring Framework 6.1在运行时方面针对 JDK 21 和 Jakarta EE 10 上提供了一级支持&#xff0c;同时保留了 JDK 17 和 Jakarta EE 9 基线。Spring 还通过精细的元数据推理跟踪 GraalVM for JDK 21 的演变&#xff0c;同时暂时保持与 GraalVM 22.3 的兼容性。 主要变化 支持 JD…

Unity在Windows选项下没有Auto Streaming

Unity在Windows选项下没有Auto Streaming Unity Auto Streaming插件按网上说的不太好使最终解决方案 Unity Auto Streaming插件 我用的版本是个人版免费版&#xff0c;版本号是&#xff1a;2021.2.5f1c1&#xff0c;我的里边Windows下看不到Auto Streaming选项,就像下边这张图…

Python-pptx教程之二操作已有PPT模板文件

文章目录 简单的案例找到要修改的元素修改幻灯片中的文本代码使用示例 修改幻灯片的图片代码使用示例 删除幻灯片代码使用示例 获取PPT中所有的文本内容获取PPT中所有的图片总结 在上一篇中我们已经学会了如何从零开始生成PPT文件&#xff0c;从零开始生成较为复杂的PPT是非常消…

Jmeter——循环控制器中实现Counter计数器的次数重置

近期在使用Jmeter编写个辅助测试的脚本&#xff0c;用到了多个Loop Controller和Counter。 当时想的思路就是三个可变的数量值&#xff0c;使用循环实现&#xff1b;但第三个可变值的数量次数&#xff0c;是基于第二次循环中得到的结果才能确认最终次数&#xff0c;每次的结果…

爱奇艺大数据离在线混部

混部作为一种提高资源利用率、降低成本的的方案&#xff0c;被业界普遍认可。爱奇艺在云原生化与降本增效的过程中&#xff0c;成功将大数据离线计算、音视频内容处理等工作负载与在线业务进行了混部&#xff0c;并且取得了阶段性收益。本文重点以大数据为例&#xff0c;介绍从…

HDFS、MapReduce原理--学习笔记

1.Hadoop框架 1.1框架与Hadoop架构简介 &#xff08;1&#xff09;广义解释 从广义上来说&#xff0c;随着大数据开发技术的快速发展与逐步成熟&#xff0c;在行业里&#xff0c;Hadoop可以泛指为&#xff1a;Hadoop生态圈。 也就是说&#xff0c;Hadoop指的是大数据生态圈整…

多线程(初阶)

文章目录 一、认识线程&#xff08;Thread&#xff09;1.1 概念1.1.1 什么是线程1.1.2 为什么要有线程1.1.3 进程和线程的区别&#xff08;重要&#xff09;1.1.4 Java的线程和操作系统线程的关系 1.2 第一个多线程 程序1.3 创建线程&#xff08;重要&#xff09;1.3.1 继承 Tr…

iframe渲染后端接口文件和实现下载功能

一&#xff1a;什么是iframe&#xff1f; 1、介绍 iframe 是HTML 中的一种标签&#xff0c;全称为 Inline Frame&#xff0c;即内联框架。它可以在网页中嵌入其他页面或文档&#xff0c;将其他页面的内容以框架的形式展示在当前页面中。iframe的使用方式是通过在HTML文档中插入…

Linux_安装docker

安装包管理工具yum-utils&#xff0c;并设置docker储存库&#xff08;如果已有&#xff0c;不用安装&#xff09; # 安装包管理工具 sudo yum install -y yum-utils # 安装docker储存库 sudo yum-config-manager \--add-repo \http://mirrors.aliyun.com/docker-ce/linux/cen…

react之基于@reduxjs/toolkit使用react-redux

react之基于reduxjs/toolkit使用react-redux 一、配置基础环境二、使用React Toolkit 创建 counterStore三、为React注入store四、React组件使用store中的数据五、实现效果六、提交action传递参数七、异步状态操作 一、配置基础环境 1.使用cra快速创建一个react项目 npx crea…

python图

有向图&#xff1a;图中的每条边都有方向的图叫有向图。此时&#xff0c;边的两个顶点有次序关系&#xff0c;有向边 < u,v>成为从顶点u到顶点v的一条弧&#xff0c;u成为弧尾&#xff08;始点&#xff09;&#xff0c;v成为弧头&#xff08;终点&#xff09;&#xff0c…

我叫:选择排序【JAVA】

1.我是个啥子&#xff1f;&#xff1f; 选择式排序&#xff1a;属于内部排序法,从欲排序的数据中,按指定的规则选出某一元素&#xff0c;再依规定交换位置后达到排序的目的。 2.我的思想 基本思想:第一次从arr[0]~arr[n-1]中选取最小值&#xff0c;与arr[0]交换&#xff0c;第…

【C++】类和对象(7)--友元, static成员

目录 一 友元 1 友元概念 2 友元函数 3 友元类 二 static成员 1 概念 2 用法 3 static成员特性 4 例题 一 友元 1 友元概念 友元提供了一种突破封装的方式&#xff0c;有时提供了便利。但是友元会增加耦合度&#xff0c;破坏了封装&#xff0c;所以 友元不宜多用。 …

2023年高压电工证考试题库及高压电工试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年高压电工证考试题库及高压电工试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大纲随机出的高压…