当前位置: 首页 > news >正文

STM32-DMA数据转运


注:DMA对应的库函数文件讲解


DMA_GetITStatus(uint32_t DMAy_IT) 是一个用于检查DMA(直接存储器访问)中断状态的库函数。它通常在使用STM32系列微控制器及其标准外设库时被调用。此函数的主要作用是返回指定DMA通道的特定中断标志的状态,以帮助开发者确定是否发生了特定类型的DMA事件。

参数 uint32_t DMAy_IT 用来指定你想要检查的DMA中断类型和对应的DMA流或通道。这个参数是一个组合值,通常由两个部分组成:

  1. DMAx:指明哪个DMA控制器(例如DMA1或DMA2),因为一些STM32芯片可能有多个DMA控制器。
  2. IT(Interrupt Type):指明具体的中断类型,比如传输完成(Transfer Complete, TC)、半传输完成(Half Transfer, HT)、传输错误(Transfer Error, TE)等。

函数会返回一个位标志,表明所选中断状态是设置(即事件发生)还是清除(即事件未发生)。这对于编写中断服务程序(ISR)非常重要,因为在ISR中你需要知道是什么类型的事件触发了中断,以便可以适当地处理它。

例如,如果你正在等待DMA传输完成中断,你可以使用 DMA_GetITStatus 来检查该中断是否已经发生。如果函数返回值表示中断已被设置,那么你可以安全地假设DMA传输已完成,并且可以继续执行后续的操作,如启动新的DMA传输、处理接收到的数据等。


DMA_ClearITPendingBit(uint32_t DMAy_IT) 是一个用于清除DMA(直接存储器访问)中断挂起位的库函数。在STM32系列微控制器中,当DMA传输过程中发生特定事件(如传输完成、半传输完成或传输错误),DMA硬件会设置相应的中断标志位,并可能触发中断请求。

然而,一旦这些事件被软件处理后,就需要清除相应的中断标志位,以确保相同的中断不会再次被误触发。这就是 DMA_ClearITPendingBit 函数的作用:它允许你手动清除指定DMA通道的特定中断挂起位,表明该事件已经被处理完毕。

参数 uint32_t DMAy_IT 用来指定要清除的DMA中断类型和对应的DMA流或通道。这个参数是一个组合值,通常由两个部分组成:

  1. DMAx:指明哪个DMA控制器(例如DMA1或DMA2)。
  2. IT(Interrupt Type):指明具体的中断类型,比如传输完成(Transfer Complete, TC)、半传输完成(Half Transfer, HT)、传输错误(Transfer Error, TE)等。

使用此函数是确保DMA中断系统正确工作的关键步骤之一。如果不清除这些标志位,可能会导致中断不断重复触发,或者新的相同类型的中断无法被正确识别。因此,在你的中断服务程序(ISR)中,你应该在检查并响应了某个DMA事件之后调用 DMA_ClearITPendingBit 来清除对应的中断挂起位。


定义:


DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输,无须CPU干预,节省了CPU的资源 12个独立可配置的通道: DMA1(7个通道), DMA2(5个通道) 每个通道都支持软件触发和特定的硬件触发 STM32F103C8T6 DMA资源:DMA1(7个通道)


SRAM可以读也可以写 



 DMA基本结构




1.0 数据宽度与对齐


 在DMA中是如何解决数据宽度不一致的问题的,如果源端的数据大于目标端的数据,那么将读取出来的高位舍弃掉,然后只取低位。


 2.0 ADC与DMA数据转运

 连续扫描转运模式


3.0 手册解读



4.0 程序实现


注:本次程序主要实现的是DMA从存储器到存储器的数据转运,使用软件触发的方式

4.0.1 DMA初始化

初始化:主要包括RCC时钟初始化,GPIO初始化

 函数初始化实现

#include "stm32f10x.h" // Device headeruint16_t MyDMA_Size;/*** @brief  DMA初始化,包括时钟等* @param  ADDRA起始地址* @param  ADDRB结束地址* @param  SIZE大小* @return 无返回值*/
void MyDMA_Init(uint32_t AddrA, uint32_t AddrB, uint16_t Size)
{MyDMA_Size = Size;// RCC时钟初始化RCC_APB1PeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);// DMA 结构体初始化DMA_InitTypeDef DMA_InitStructure;// 起始地址DMA_InitStructure.DMA_PeripheralBaseAddr = AddrA;// 数据大小DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;// 是否自增DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;// 接收地址【目的地址】DMA_InitStructure.DMA_MemoryBaseAddr = AddrB;// 接收地址数据大小DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;// 地址是否自增DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;// 数据的传输方向,外设传输到存储器DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;// 重装计数器的大小DMA_InitStructure.DMA_BufferSize = Size;// DMA模式DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// 触发方式DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;// DMA优先级,通道的优先级设置为中等DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;// 初始化DMADMA_Init(DMA1_Channel1, &DMA_InitStructure);// 使能DMA,初始化后会立即工作,等后续手动调用后再开始DMA_Cmd(DMA1_Channel1, DISABLE);
}

 4.0.2 数据转运函数

注:该函数的主要作用是,从新设置传输计数器的值

/*** @brief  DMA数据传输,重置* @param  MULL* @param  MULL* @param  SIZE大小* @return 无返回值*/
void MyDMA_Transfer(void)
{// DMA失能,在写入传输计数器之前,需要DMA暂停工作DMA_Cmd(DMA1_Channel1, DISABLE);// 写入传输计数器,指定将要转运的次数DMA_SetCurrDataCounter(DMA1_Channel1, MyDMA_Size);// 使能DMADMA_Cmd(DMA1_Channel1, ENABLE);// 等待DMA工作完成,工作完成标志位设置为1while (DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET);// 清除工作完成标志位DMA_ClearFlag(DMA1_FLAG_TC1);
}

4.0.3 全部程序

#include "stm32f10x.h" // Device headeruint16_t MyDMA_Size;/*** @brief  DMA初始化,包括时钟等* @param  ADDRA起始地址* @param  ADDRB结束地址* @param  SIZE大小* @return 无返回值*/
void MyDMA_Init(uint32_t AddrA, uint32_t AddrB, uint16_t Size)
{MyDMA_Size = Size;// RCC时钟初始化RCC_APB1PeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);// DMA 结构体初始化DMA_InitTypeDef DMA_InitStructure;// 起始地址DMA_InitStructure.DMA_PeripheralBaseAddr = AddrA;// 数据大小DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;// 是否自增DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;// 接收地址【目的地址】DMA_InitStructure.DMA_MemoryBaseAddr = AddrB;// 接收地址数据大小DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;// 地址是否自增DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;// 数据的传输方向,外设传输到存储器DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;// 重装计数器的大小DMA_InitStructure.DMA_BufferSize = Size;// DMA模式DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// 触发方式DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;// DMA优先级,通道的优先级设置为中等DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;// 初始化DMADMA_Init(DMA1_Channel1, &DMA_InitStructure);// 使能DMA,初始化后会立即工作,等后续手动调用后再开始DMA_Cmd(DMA1_Channel1, DISABLE);
}/*** @brief  DMA数据传输,重置* @param  MULL* @param  MULL* @param  SIZE大小* @return 无返回值*/
void MyDMA_Transfer(void)
{// DMA失能,在写入传输计数器之前,需要DMA暂停工作DMA_Cmd(DMA1_Channel1, DISABLE);// 写入传输计数器,指定将要转运的次数DMA_SetCurrDataCounter(DMA1_Channel1, MyDMA_Size);// 使能DMADMA_Cmd(DMA1_Channel1, ENABLE);// 等待DMA工作完成,工作完成标志位设置为1while (DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET);// 清除工作完成标志位DMA_ClearFlag(DMA1_FLAG_TC1);
}

4.0.4 头文件


#ifndef __MYDMA_H
#define __MYDMA_Hvoid MyDMA_Init(uint32_t AddrA, uint32_t AddrB, uint16_t Size);
void MyDMA_Transfer(void);#endif

4.0.5 main函数文件


#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "MyDMA.h"uint8_t DataA[] = {0x01, 0x02, 0x03, 0x04}; // 定义测试数组DataA,为数据源
uint8_t DataB[] = {0, 0, 0, 0};				// 定义测试数组DataB,为数据目的地int main(void)
{/*模块初始化*/OLED_Init(); // OLED初始化MyDMA_Init((uint32_t)DataA, (uint32_t)DataB, 4); // DMA初始化,把源数组和目的数组的地址传入/*显示静态字符串*/OLED_ShowString(1, 1, "DataA");OLED_ShowString(3, 1, "DataB");/*显示数组的首地址*/OLED_ShowHexNum(1, 8, (uint32_t)DataA, 8);OLED_ShowHexNum(3, 8, (uint32_t)DataB, 8);while (1){DataA[0]++; // 变换测试数据DataA[1]++;DataA[2]++;DataA[3]++;Delay_ms(1000); // 延时1s,观察转运前的现象MyDMA_Transfer();OLED_ShowHexNum(2, 1, DataA[0], 2); // 显示数组DataAOLED_ShowHexNum(2, 4, DataA[1], 2);OLED_ShowHexNum(2, 7, DataA[2], 2);OLED_ShowHexNum(2, 10, DataA[3], 2);OLED_ShowHexNum(4, 1, DataB[0], 2); // 显示数组DataBOLED_ShowHexNum(4, 4, DataB[1], 2);OLED_ShowHexNum(4, 7, DataB[2], 2);OLED_ShowHexNum(4, 10, DataB[3], 2); // 使用DMA转运数组,从DataA转运到DataBOLED_ShowHexNum(2, 1, DataA[0], 2); // 显示数组DataAOLED_ShowHexNum(2, 4, DataA[1], 2);OLED_ShowHexNum(2, 7, DataA[2], 2);OLED_ShowHexNum(2, 10, DataA[3], 2);OLED_ShowHexNum(4, 1, DataB[0], 2); // 显示数组DataBOLED_ShowHexNum(4, 4, DataB[1], 2);OLED_ShowHexNum(4, 7, DataB[2], 2);OLED_ShowHexNum(4, 10, DataB[3], 2);Delay_ms(1000); // 延时1s,观察转运后的现象}
}

......


5.0 DMA多通道


5.0.1 RCC时钟初始化

	// RCC 开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);  // 开启ADC1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 开启GPIOA时钟RCC_APB2PeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);	  // 开启AHB的时钟RCC_ADCCLKConfig(RCC_PCLK2_Div6);

5.0.2 GPIO初始化

	// GPIO初始化GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);

5.0.3 通道初始化

	// GPIO初始化GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);

5.0.4 ADC结构体初始化

	ADC_InitTypeDef ADC_InitStructure;									// ADC 初始化ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;					// ADC 独立模式ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;				// 数据对齐方式右对齐ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 外部触发模式,使用软件触发,而不使用硬件触发ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;					// 连续转换,每转换完一次之后立即开始下一次的转换,使能ADC_InitStructure.ADC_ScanConvMode = ENABLE;						// 使能扫描模式,扫描规则组前面的4个通道ADC_InitStructure.ADC_NbrOfChannel = 4;								// 通道数为4个扫描规则组前面的4个通道ADC_Init(ADC1, &ADC_InitStructure);									// ADC结构体初始化

5.0.5 DMA结构体初始化

	// DMA初始化DMA_InitTypeDef DMA_InitStructure;// 起始地址,转运数据寄存器里面的数值DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)AD_Value;DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;DMA_InitStructure.DMA_BufferSize = 4;DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;DMA_Init(DMA1_Channel1, & DMA_InitStructure);

5.0.6 DMA使能与校准

	// DMA和ADC使能DMA_Cmd(DMA1_Channel1, ENABLE);			// DMA1通道使能ADC_DMACmd(ADC1, ENABLE);				// ADC1触发DMA1的信号使能ADC_Cmd(ADC1, ENABLE);					// ADC1使能// ADC校准ADC_ResetCalibration(ADC1);// 获取ADC转换标志位while (ADC_GetResetCalibrationStatus(ADC1) == SET);// 开启ADC转换ADC_StartCalibration(ADC1);// 获取ADC转换状态while (ADC_GetCalibrationStatus(ADC1) == SET);// ADC触发ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 软件触发ADC开始工作,由于ADC处于连续转换模式,故触发一次后ADC就可以一直连续不断地工作

对应程序文件:

AD.C文件

#include "stm32f10x.h" // Device headeruint16_t AD_Value[4]; // 定义用于存放AD转换结果的全局数组void AD_Init(void)
{// RCC 开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);  // 开启ADC1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 开启GPIOA时钟RCC_APB2PeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);	  // 开启AHB的时钟RCC_ADCCLKConfig(RCC_PCLK2_Div6);// GPIO初始化GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);// 配置规则组通道ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); // 规则组序列1的位置ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5); // 规则组序列2的位置ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5); // 规则组序列3的位置ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_55Cycles5); // 规则组序列4的位置ADC_InitTypeDef ADC_InitStructure;									// ADC 初始化ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;					// ADC 独立模式ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;				// 数据对齐方式右对齐ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 外部触发模式,使用软件触发,而不使用硬件触发ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;					// 连续转换,每转换完一次之后立即开始下一次的转换,使能ADC_InitStructure.ADC_ScanConvMode = ENABLE;						// 使能扫描模式,扫描规则组前面的4个通道ADC_InitStructure.ADC_NbrOfChannel = 4;								// 通道数为4个扫描规则组前面的4个通道ADC_Init(ADC1, &ADC_InitStructure);									// ADC结构体初始化// DMA初始化DMA_InitTypeDef DMA_InitStructure;// 起始地址,转运数据寄存器里面的数值DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)AD_Value;DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;DMA_InitStructure.DMA_BufferSize = 4;DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;DMA_Init(DMA1_Channel1, & DMA_InitStructure);// DMA和ADC使能DMA_Cmd(DMA1_Channel1, ENABLE);			// DMA1通道使能ADC_DMACmd(ADC1, ENABLE);				// ADC1触发DMA1的信号使能ADC_Cmd(ADC1, ENABLE);					// ADC1使能// ADC校准ADC_ResetCalibration(ADC1);// 获取ADC转换标志位while (ADC_GetResetCalibrationStatus(ADC1) == SET);// 开启ADC转换ADC_StartCalibration(ADC1);// 获取ADC转换状态while (ADC_GetCalibrationStatus(ADC1) == SET);// ADC触发ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 软件触发ADC开始工作,由于ADC处于连续转换模式,故触发一次后ADC就可以一直连续不断地工作
}

AD.H文件

#ifndef __AD_H
#define __AD_Hextern uint16_t AD_Value[4];void AD_Init(void);#endif

MAIN.C文件

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "AD.h"int main(void)
{/*模块初始化*/OLED_Init();				//OLED初始化AD_Init();					//AD初始化/*显示静态字符串*/OLED_ShowString(1, 1, "AD0:");OLED_ShowString(2, 1, "AD1:");OLED_ShowString(3, 1, "AD2:");OLED_ShowString(4, 1, "AD3:");while (1){OLED_ShowNum(1, 5, AD_Value[0], 4);		//显示转换结果第0个数据OLED_ShowNum(2, 5, AD_Value[1], 4);		//显示转换结果第1个数据OLED_ShowNum(3, 5, AD_Value[2], 4);		//显示转换结果第2个数据OLED_ShowNum(4, 5, AD_Value[3], 4);		//显示转换结果第3个数据Delay_ms(100);							//延时100ms,手动增加一些转换的间隔时间}
}

......

相关文章:

STM32-DMA数据转运

注:DMA对应的库函数文件讲解 DMA_GetITStatus(uint32_t DMAy_IT) 是一个用于检查DMA(直接存储器访问)中断状态的库函数。它通常在使用STM32系列微控制器及其标准外设库时被调用。此函数的主要作用是返回指定DMA通道的特定中断标志的状态&…...

ASP.NET Core 实现微服务 - Elastic APM

这次要给大家介绍的是Elastic APM ,一款应用程序性能监控组件。APM 监控围绕对应用、服务、容器的健康监控,对接口的调用链、性能进行监控。在我们实施微服务后,由于复杂的业务逻辑,服务之间的调用会像蜘蛛网一样复杂。有了调用链…...

Stable Diffusion本地部署教程(附安装包)

想使用Stable Diffusion需要的环境有哪些呢? python3.10.11(至少也得3.10.6以上):依赖python环境NVIDIA:GPUgit:从github上下载包(可选,由于我已提供安装包,你可以不用git)Stable Diffusion安装包工具包: NVIDIA:https://developer.nvidia.com/cuda-toolkit-archiv…...

图片和短信验证码(头条项目-06)

1 图形验证码接口设计 将后端⽣成的图⽚验证码存储在redis数据库2号库。 结构: {img_uuid:0594} 1.1 创建验证码⼦应⽤ $ cd apps $ python ../../manage.py startapp verifications # 注册新应⽤ INSTALLED_APPS [django.contrib.admin,django.contrib.auth,…...

天气app的收获

天气app的收获 无论如何,是基于MVC模式,但都是从UI页面开始设计,然后根据输入的城市名称,将其传入到model层,进行相对应的处理。 对于controler层,需要通过一些协议完成一些输入的反馈,例如输…...

软件自动定时启动器

点击添加软件,可以添加可执行文件软件,设置启动的时间,也可以设置关闭的时间 注意,时间为00:00:00 等于没设置,这个时间不在设置范围,其他任何时间都可以 1.1更新 1:修复…...

k8s部署rocketmq踩坑笔记

给团队部署一个rocketmq4.8.0. k8s上部署的broker,注册到nameserver上是自己的pod ip,导致本机连接到的broker的pod ip,这个ip k8s集群外的机器是无法联通的。 nameserver上注册的是这个pod ipv4 尝试将broker的配置brokerIP1修改为注册到na…...

从项目代码看 React:State 和 Props 的区别及应用场景实例讲解

在 React 中,state 和 props 是组件的两个重要概念,它们有不同的作用和应用场景。理解它们之间的区别对于开发 React 应用至关重要。 1. state 和 props 的区别 props (属性): props 是由父组件传递给子组件的数据或函数。props 是只读的&am…...

深度学习中的优化算法

深度学习中的优化算法,是模型训练期间微调神经网络参数的关键元素。其主要作用是最小化模型的误差或损失,从而提高性能。各种优化算法(称为优化器)采用不同的策略来收敛到最佳参数值,从而有效地提高预测效果。 在深度学习的背景下&#xff0c…...

python3GUI--大屏可视化-传染病督导平台 By:PyQt5

文章目录 一.前言二.预览三.软件组成&开发心得1.样式&使用方法2.左侧表格实现3.设计4.学习5.体验效果 四.代码分享1.环形渐变进度组件2.自定义图片的背景组件 五.总结 大小:60.9 M,软件…...

设计模式——单例模式

单例模式 实现单例模式的方法前置条件懒汉式(Lazy Initialization)饿汉式(Eager Initialization)双重锁式(Double-Checked Locking)静态内部类式(Static Inner Class)枚举式&#xf…...

【01】AE特效开发制作特技-Adobe After Effects-AE特效制作快速入门-制作飞机,子弹,爆炸特效以及导出png序列图-优雅草央千澈

【01】AE特效开发制作特技-Adobe After Effects-AE特效制作快速入门-制作飞机,子弹,爆炸特效以及导出png序列图-优雅草央千澈 开发背景 优雅草央千澈所有的合集,系列文章可能是不太适合完全初学者的,因为课程不会非常细致的系统…...

docker一键安装脚本(docker安装)

第一种方法一键安装命令 curl -O --url http://luyuanbo79.south.takin.cc/wenjian/docker_install.sh && chmod x docker_install.sh && ./docker_install.sh 备用方法 curl -O --url https://file.gitcode.com/4555247/releases/untagger_0896d4789937405…...

Python的Matplotlib库应用(超详细教程)

目录 一、环境搭建 1.1 配置matplotlib库 1.2 配置seaborn库 1.3 配置Skimage库 二、二维图像 2.1 曲线(直线)可视化 2.2 曲线(虚线)可视化 2.3 直方图 2.4 阶梯图 三、三维图像 3.1 3D曲面图 3.2 3D散点图 3.3 3D散…...

VS Code的设置功能以及多层级的设置方式与解密

VS Code的Settings功能为用户提供了极大的灵活性和便利性,使得用户可以根据自己的需求和偏好来定制编辑器的行为和外观。 Settings 可以实现的具体功能 VS Code的设置项非常丰富,涵盖了各个方面,包括但不限于: 编辑器选项&…...

怎么理解编码器与解码器?

编码器和解码器是在信息处理、通信、多媒体等众多领域中广泛应用的两个概念,它们的作用相反但又紧密相关。下面从多个角度来帮助你理解这两个概念: 定义 编码器:编码器是一种将输入信息(如模拟信号、文本、图像、声音等&#xf…...

关于智能个人生活助手的一些想法

我感觉未来计算机发展 会变成钢铁侠的贾维斯那样, 每个人有自己的系统 集成ai和其他功能 助力生活和工作 说一下我为什么有这样的想法: 1.ai发展迅猛: 近些年来ai的发展势头越来越猛,不断破圈,越来越多的人了解到ai的强大,并使用ai改变了自己原有的生活或工作方式,熟练使用…...

FFmpeg音视频流媒体,视频编解码性能优化

你是不是也有过这样一个疑问:视频如何从一个简单的文件变成你手机上快速播放的短片,或者是那种占满大屏幕的超高清大片?它背后的法宝,离不开一个神奇的工具——FFmpeg!说它强大,完全不为过,它在…...

页面滚动下拉时,元素变为fixed浮动,上拉到顶部时恢复原状,js代码以视频示例

页面滚动下拉时,元素变为fixed浮动js代码 以视频示例 <style>video{width:100%;height:auto}.div2,#float1{position:fixed;_position:absolute;top:45px;right:0; z-index:250;}button{float:right;display:block;margin:5px} </style><section id"abou…...

Python玩转视频剪辑 - Opencv、Moviepy(附完整案例)

1. 准备工作 1.1 安装Opencv-python、Moviepy pip install opencv-python pip install moviepy 1.2 视频剪辑目标 如图&#xff0c;作者从b站下载了两个视频(仅做代码测试用&#xff0c;不作转载等任何商业用途)&#xff0c;一个是刘初寻的疏远&#xff08;以下简称视频一&a…...

Pulsar客户端如何控制内存使用

Pulsar客户端如何控制内存使用 一、使用场景 在实际应用中&#xff0c;Pulsar客户端的内存使用控制是一个重要的性能优化点。假设有一个搜索类业务需要记录用户搜索请求&#xff0c;以便后续分析搜索热点和优化搜索效果。以下是一个简化的代码示例&#xff1a; PulsarClient…...

接口测试总结(http与rpc)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传…...

Linux:进程概念(二.查看进程、父进程与子进程、进程状态详解)

目录 1. 查看进程 1.1 准备工作 1.2 指令&#xff1a;ps—显示当前系统中运行的进程信息 1.3 查看进程属性 1.4 通过 /proc 系统文件夹看进程 2. 父进程与子进程 2.1 介绍 2.2 getpid() \getppid() 2.3 fork()函数—通过系统调用创建进程 fork()函数疑问 3. 进程状态…...

ubuntu22.04 编译安装libvirt 10.x

环境安装 sudo apt-get update -y sudo apt-get install qemu-system-x86 bridge-utils libyajl-dev -y sudo apt-get install build-essential autoconf automake libtool -y sudo apt-get install libxml2-dev libxslt1-dev libgnutls28-dev libpciaccess-dev libnl-3-de…...

Ubuntu 下载安装 Consul1.17.1

下载 来到 Consul 的下载页面&#xff1a;https://developer.hashicorp.com/consul/install?product_intentconsul 上面标注的地方可以切换你想要的版本&#xff0c;复制下载链接&#xff0c;使用 wget 下载这个文件&#xff1a; wget https://releases.hashicorp.com/consu…...

怎么实现Redis的高可用?

大家好&#xff0c;我是锋哥。今天分享关于【怎么实现Redis的高可用&#xff1f;】面试题。希望对大家有帮助&#xff1b; 怎么实现Redis的高可用&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 为了实现 Redis 的高可用性&#xff0c;我们需要保证在发…...

Domain Adaptation(李宏毅)机器学习 2023 Spring HW11 (Boss Baseline)

1. 领域适配简介 领域适配是一种迁移学习方法,适用于源领域和目标领域数据分布不同但学习任务相同的情况。具体而言,我们在源领域(通常有大量标注数据)训练一个模型,并希望将其应用于目标领域(通常只有少量或没有标注数据)。然而,由于这两个领域的数据分布不同,模型在…...

Chatper 4: mplementing a GPT model from Scratch To Generate Text

4 Implementing a GPT model from Scratch To Generate Text 本章节包含 编写一个类似于GPT的大型语言模型&#xff08;LLM&#xff09;&#xff0c;这个模型可以被训练来生成类似人类的文本。Normalizing layer activations to stabilize neural network training在深度神经网…...

websocket股票行情接口

股票行情区别 交易所出来的数据&#xff0c;不管通过什么渠道&#xff0c;延时一般都不会差太远&#xff0c;估计一般也就几十ms的差别。 但是如果是通过http轮询&#xff0c;不太可能几十ms全部轮询一次。所以&#xff0c;做量化的话&#xff0c;用http协议是最次的选择。 …...

一键部署Netdata系统无需公网IP轻松实现本地服务器的可视化监控

文章目录 前言1.关于Netdata2.本地部署Netdata3.使用Netdata4.cpolar内网穿透工具安装5.创建远程连接公网地址6.固定Netdata公网地址 &#x1f4a1; 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。…...

概率图模型01

机器学习中&#xff0c;线性回归、树、集成和概率图都属于典型的统计学习方法&#xff0c;概率图模型会更深入地体现出‘统计’两字 概率图模型的常见算法 概率图模型中的图 概率图模型如图主要分为两种&#xff0c;即贝叶斯网络和马尔可夫网络&#xff0c;有向图与无向图&…...

oxml中创建CT_Document类

概述 本文基于python-docx源码&#xff0c;详细记录CT_Document类创建的过程&#xff0c;以此来加深对Python中元类、以及CT_Document元素类的认识。 元类简介 元类&#xff08;MetaClass&#xff09;是Python中的高级特性。元类是什么呢&#xff1f;Python是面向对象编程…...

YARN 集群

一、集群角色 1.1 概述 Apache Hadoop YARN是一个标准的Master/Slave集群&#xff08;主从架构&#xff09;。其中ResourceManager&#xff08;RM&#xff09; 为Master&#xff0c; NodeManager&#xff08;NM&#xff09; 为 Slave。常见的是一主多从集群&#xff0c;也可以…...

电机控制的数字化升级:基于DSP和FPGA的仿真与实现

数字信号处理器&#xff08;DSP&#xff0c;Digital Signal Processor&#xff09;在工业自动化领域的应用日益广泛。DSP是一种专门用于将模拟信号转换成数字信号并进行处理的技术&#xff0c;能够实现信号的数字滤波、重构、调制和解调等多项功能&#xff0c;确保信号处理的精…...

homework 2025.01.11 math 6

homework 2025.01.11 math 6 小学6年级数学...

【会话详解】

会话详解 概述 会话&#xff1a; 用户通过浏览器访问多个Web资源的过程&#xff0c;从打开浏览器开始访问特定网站&#xff0c;直到关闭浏览器的过程称为会话&#xff08;Session&#xff09;。会话管理是Web应用中跟踪和存储用户状态的重要机制。 有状态会话&#xff1a; …...

Unity 的 Vector3 与 Babylon.js 的 Vector3:使用上的异同

在 3D 开发中&#xff0c;向量是不可或缺的数学工具&#xff0c;用于表示位置、方向、速度等物理量。Unity 和 Babylon.js 都提供了 Vector3 类来处理三维向量&#xff0c;但它们在实现和使用上有一些异同。本文将详细对比 Unity 的 Vector3 和 Babylon.js 的 Vector…...

【2024年华为OD机试】(A卷,100分)- 单词倒序(Java JS PythonC/C++)

一、问题描述 题目描述 输入单行英文句子&#xff0c;里面包含英文字母&#xff0c;空格以及,.?三种标点符号&#xff0c;请将句子内每个单词进行倒序&#xff0c;并输出倒序后的语句。 输入描述 输入字符串S&#xff0c;S的长度 1 ≤ N ≤ 100 输出描述 输出倒序后的字…...

芯片:CPU和GPU有什么区别?

CPU&#xff08;中央处理器&#xff09;和GPU&#xff08;图形处理单元&#xff09;是计算机系统中两种非常重要的处理器&#xff0c;它们各自有不同的设计理念、架构特点以及应用领域。下面是它们之间的一些主要差异&#xff1a; 1. 设计目的与应用领域 CPU&#xff1a;设计…...

springboot整合mysql

1.首先在pom.xml中添加依赖&#xff1a; <!-- MySQL Driver --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><!-- Druid连接池 -->…...

复合机器人助力手机壳cnc加工向自动化升级

在当今竞争激烈的制造业领域&#xff0c;如何提高生产效率、降低成本、提升产品质量&#xff0c;成为众多企业面临的关键挑战。尤其是在手机壳 CNC 加工这一细分行业&#xff0c;随着市场需求的持续增长&#xff0c;对生产效能的要求愈发严苛。而复合机器人的出现&#xff0c;正…...

深入浅出负载均衡:理解其原理并选择最适合你的实现方式

负载均衡是一种在多个计算资源&#xff08;如服务器、CPU核心、网络链接等&#xff09;之间分配工作负载的技术&#xff0c;旨在优化资源利用率、提高系统吞吐量和降低响应时间。负载均衡的实现方式多种多样&#xff0c;以下是几种常见的实现方式&#xff1a; 1. 硬件负载均衡&…...

征程 6X release版本内核模块安全加载

1.概述 征程 6X 系统在 release 编译时支持内核模块签名验证&#xff0c;仅加载使用正确密钥进行数字签名的内核模块。禁止加载未签名的内核模块或使用错误密钥签名的内核模块&#xff0c;客户需要替换成自己的 key 进行签名。 模块签名启用后&#xff0c;Linux 内核将仅加载…...

uni-app的学习

uni-app 有着跨平台支持、丰富的插件和生态系统、高性能、集成开发工具HBuilderX的配合使用。允许使用者仅通过一套代码发布到多平台使用。 uni-app官网 uni-app 是一个适合开发跨平台移动应用和小程序的框架&#xff0c;能够大幅提高开发效率。 一、了解 1.1 工具准备 从Git…...

国产信创实践(国能磐石服务器操作系统CEOS +东方通TongHttpServer)

替换介绍&#xff1a; 国能磐石服务器操作系统CEOS 对标 Linux 服务器操作系统&#xff08;Ubuntu, CentOS&#xff09; 东方通TongHttpServer 对标 Nginx 负载均衡Web服务器 第一步&#xff1a; 服务器安装CEOS映像文件&#xff0c;可直接安装&#xff0c;本文采用使用VMware …...

前端实时显示当前在线人数的实现

实时显示当前在线人数的实现 本文档提供了在网页上实时显示当前在线人数的多种实现方法&#xff0c;包括使用 WebSocket 实现实时更新和轮询方式实现非实时更新。 方法一&#xff1a;使用 WebSocket 实现实时更新 服务器端设置 通过 Node.js 和 WebSocket 库&#xff08;如 …...

为AI聊天工具添加一个知识系统 之27 支持边缘计算设备的资源存储库及管理器

本文问题 现在我们回到 ONE/TWO/TREE 的资源存储库 的设计--用来指导 足以 支持 本项目&#xff08;为AI聊天工具增加一套知识系统&#xff09;的 核心能力 “语言处理” 中 最高难度系数的“自然语言处理” 中最具挑战性的“含糊性” 问题的解决。--因为足以解决 自然语言中最…...

继续坚持与共勉

经过期末考试后&#xff0c;又要开始学习啦。 当时一直在刷算法题就很少写博客了&#xff0c;现在要继续坚持写博客&#xff0c;将每天对于题的感悟记录下来。 同时我将会在学习Linux操作系统&#xff0c;对于过去学习的内容进行回顾&#xff01;&#xff01; 在此&#xff…...

PHP的扩展Imagick的安装

windows下的安装 下载&#xff1a;Imagick扩展 PECL :: Package :: imagick 3.7.0 for Windows​​​​​​​ 下载&#xff1a;ghostscript&#xff08;PDF提取图片时用到&#xff0c;不处理PDF可以不安装&#xff09; Ghostscript : Downloads 安装扩展 Imagick解压后&…...

【2024年华为OD机试】 (A卷,100分)- 租车骑绿岛(Java JS PythonC/C++)

一、问题描述 题目描述 部门组织绿岛骑行团建活动。租用公共双人自行车&#xff0c;每辆自行车最多坐两人&#xff0c;最大载重 M。 给出部门每个人的体重&#xff0c;请问最多需要租用多少双人自行车。 输入描述 第一行两个数字 m、n&#xff0c;分别代表自行车限重&#…...