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.rhkb.cn/news/198135.html

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

相关文章

论文速览 Arxiv 2023 | DMV3D: 单阶段3D生成方法

注1:本文系“最新论文速览”系列之一,致力于简洁清晰地介绍、解读最新的顶会/顶刊论文 论文速览 Arxiv 2023 | DMV3D: DENOISING MULTI-VIEW DIFFUSION USING 3D LARGE RECONSTRUCTION MODEL 使用3D大重建模型来去噪多视图扩散 论文原文:https://arxiv.org/pdf/2311.09217.pdf…

SQL SERVER 2008安装教程

SQL SERVER 2008安装教程 本篇文章介绍了安装SQL Server 2008企业版的软硬件配置要求&#xff0c;安装过程的详细步骤&#xff0c;以及需要注意的事项。 安装步骤 (1). 在安装文件setup.exe上&#xff0c;单击鼠标右键选择“以管理员的身份运行”&#xff0c;如下图所示&#…

某60区块链安全之不安全的随机数实战一

区块链安全 文章目录 区块链安全不安全的随机数实战一实验目的实验环境实验工具实验原理实验内容攻击过程分析合约源代码漏洞EXP利用 不安全的随机数实战一 实验目的 学会使用python3的web3模块 学会以太坊不安全的随机数漏洞分析及利用 实验环境 Ubuntu18.04操作机 实验工…

基于深度学习的恶意软件检测

恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…

【Go学习之 go mod】gomod小白入门,在github上发布自己的项目(项目初始化、项目发布、项目版本升级等)

参考 Go语言基础之包 | 李文周的博客Go mod的使用、发布、升级 | weiGo Module如何发布v2及以上版本1.2.7. go mod命令 — 新溪-gordon V1.7.9 文档golang go 包管理工具 go mod的详细介绍-腾讯云开发者社区-腾讯云Go Mod 常见错误的原因 | walker的博客 项目案例 oceanweav…

电子学会C/C++编程等级考试2022年03月(一级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…

【论文阅读】2736. 最大和查询-2023.11.17

题目&#xff1a; 2736. 最大和查询 给你两个长度为 n 、下标从 0 开始的整数数组 nums1 和 nums2 &#xff0c;另给你一个下标从 1 开始的二维数组 queries &#xff0c;其中 queries[i] [xi, yi] 。 对于第 i 个查询&#xff0c;在所有满足 nums1[j] > xi 且 nums2[j]…

Angular 由一个bug说起之二:trackBy的一点注意事项

trackBy是angualr优化项目性能的一种方法, 通过返回一个具有绑定性的唯一值, 比如id&#xff0c;手机号&#xff0c;身份证号之类的&#xff0c;来让angular能够跟踪数组的项目&#xff0c;根据数据的变化来重新生成DOM, 这样就节约了性能。 但是如果是使用ngFor循环组件&…

iTerm2+oh-my-zsh搭个Mac电脑上好用好看终端

根据苹果网站上介绍&#xff0c;bash是 macOS Mojave 及更早版本中的默认Shell&#xff0c;从 macOS Catalina 开始&#xff0c;zsh(Z shell) 是所有新建用户帐户的默认Shell。 1. 安装Oh my zsh sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzs…

Spring 配置

配置文件最主要的目的 : 解决硬编码的问题(代码写死) SpringBoot 的配置文件,有三种格式 1.properties 2.yaml 3.yml(是 yaml 的简写) SpringBoot 只支持三个文件 1.application.properties 2.application.yaml 3.application.yml yaml 和 yml 是一样的,学会一个就行…

JAXB的XmlElement注解

依赖 如果基于JAX-WS开发&#xff0c;可以在maven工程的pom.xml文件中增加如下依赖&#xff0c;会将依赖的JAXB库也下载下来&#xff1a; <dependency><groupId>jakarta.xml.ws</groupId><artifactId>jakarta.xml.ws-api</artifactId><vers…

redis三种集群方式

redis有三种集群方式&#xff1a;主从复制&#xff0c;哨兵模式和集群。 1.主从复制 主从复制原理&#xff1a; 从服务器连接主服务器&#xff0c;发送SYNC命令&#xff1b; 主服务器接收到SYNC命名后&#xff0c;开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所…

后端技术知识点内容-全部内容-面试宝典-后端面试知识点

文章目录 -2 flink-1 linux of viewlinux查看占用cup最高的10个进程的命令&#xff1b; 〇、分布式锁 & 分布式事务0-1分布式锁--包含CAP理论模型概述分布式锁&#xff1a;分布式锁应该具备哪些条件&#xff1a;分布式锁的业务场景&#xff1a; 分布式锁的实现方式有&#…

【MySQL--->用户管理】

文章目录 [TOC](文章目录) 一、用户管理表二、基本操作三、用户权限分配给用户某个数据库中某个表的某个权限. grant 权限 on 库.表名 to 用户名主机名. ![在这里插入图片描述](https://img-blog.csdnimg.cn/fe8eb171ef9343c3a09bd64d4f0db5c1.png)分配给用户某个数据库中全部表…

python中Thread实现多线程任务

目录 多线程概括&#xff1a; 使用 Thread 模块创建线程 如果不使用多线程&#xff1a; 多线程概括&#xff1a; 多线程是一种并发执行的编程方式&#xff0c;允许程序同时执行多个独立的线程&#xff0c;每个线程在程序中运行独立的任务。每个线程都是程序的基本执行单元&a…

全新酷盒9.0源码:多功能工具箱软件的最新iapp解决方案

全能工具箱软件酷盒&#xff1a;源码提供iapp解决方案&#xff0c;自定义打造个性化体验 酷盒是一款功能丰富的工具箱软件&#xff0c;内置众多实用功能&#xff0c;并实时更新热门功能。该软件还拥有丰富的资源库&#xff0c;用户可以在线畅玩游戏、免费下载音乐等。 我们提…

k8s的高可用集群搭建,详细过程实战版

kubernetes高可用集群的搭建 前面介绍过了k8s单master节点的安装部署 今天介绍一下k8s高可用集群搭建 环境准备&#xff1a; vip &#xff1a;192.168.121.99 keeplive master01&#xff1a;192.168.121.153 centos7 master02&#xff1a;192.168.121.154 centos7 master03&a…

MongoDB相关基础操作(库、集合、文档)

文章目录 一、库的相关操作1、查看数据库2、查看当前库3、创建数据库4、删除数据库 二、集合的相关操作1、查看库中所有集合2、创建集合2.1、显示创建2.2、隐式创建 3、删除集合 三、文档的相关操作1、插入文档1.1、插入单条文档1.2、插入多条文档1.3、脚本方式 2、查询文档3、…

深入理解注意力机制(下)——缩放点积注意力及示例

一、介绍 在这篇文章中&#xff0c;我们将重点介绍 Transformer 背后的 Scaled Dot-Product Attention&#xff0c;并详细解释其计算逻辑和设计原理。 在文章的最后&#xff0c;我们还会提供一个Attention的使用示例&#xff0c;希望读者看完后能够对Attention有更全面的了解。…

gRPC 四模式之 双向流RPC模式

双向流RPC模式 在双向流 RPC 模式中&#xff0c;客户端以消息流的形式发送请求到服务器端&#xff0c;服务器端也以消息流的形式进行响应。调用必须由客户端发起&#xff0c;但在此之后&#xff0c;通信完全基于 gRPC 客户端和服务器端的应用程序逻辑。 为什么有了双向流模式…