【联盛德W806上手笔记】九、DMA

目录

  • DMA 控制器
  • 功能概述
  • 功能描述
    • DMA 通道
    • DMA 数据流
    • DMA 循环模式
    • DMA 传输模式
    • DMA 外设选择
    • DMA 链表模式
    • DMA 中断
    • 中断请求
  • 库函数
    • 函数
    • 参数
  • 应用

Windows 10 20H2
HLK-W806-V1.0-KIT
WM_SDK_W806_v0.6.0


       摘自《W806 MCU 芯片规格书 V2.0》、《WM_W800_寄存器手册 V2.1》

DMA 控制器

       最多支持 8 通道,16 个 DMA 请求源,支持链表结构与寄存器控制。

Amba2.0 标准总线接口,8 路 DMA 通道
支持基于存储器链表结构的 DMA 操作
软件配置 16 个硬件请求源
支持 1,4-burst 操作模式
支持 byte、half-word,word 操作
源、目的地址不变或顺序递增可配置或在预定义地址范围内循环操作
同步 DMA 请求和 DMA 响应硬件接口时序

功能概述

       DMA 用于在外设与存储器之间以及存储器与存储器之间提供高速数据传输。可以在无需任何 CPU 操作的情况下通过 DMA 快速移动数据。这样节省的 CPU 资源,不影响 CPU 进行其他指令的操作。
       DMA 挂载在 AHB 总线上,最多支持 8 通道,16 个硬件外设请求源,支持链表结构与寄存器控制。

功能描述

DMA 通道

       W800 共支持 8 路 DMA 通道,DMA 通道互相不干涉,可以同时运行。请求不同的数据流可以选择不同的 DMA 通道。
       每个 DMA 通道分配在不同的寄存器地址偏移段,可以直接选择相应通道的地址段进行配置使用即可。不同通道的寄存器配置方式完全一致。
在这里插入图片描述

DMA 数据流

       8 路 DMA 通道能够实现源和目的之间单向数据传输链路。
       DMA 的源和目的地址可以设置为每次 DMA 操作完成之后不变、递增或循环三种模式:

DMA_CTRL[2:1]控制源地址每次 DMA 操作后变化方式;
DMA_CTRL[4:3]控制目的地址每次 DMA 操作后变化方式。

       DMA 可以设置 byte、half-word、word 的搬运单位,最终搬运数据的数量是搬运单位的整数倍,通过DMA_CTRL[6:5]来设置。
       DMA 可以通过 burst 设置每次搬运多少个单位的数据,通过 DMA_CTRL[7]来选择一次搬运 1 或 4 个单位的数据,如果 DMA_CTRL[6:5]设置为 word,burst 设置为 4,则每次搬运 4 个 word 的数据。
       DMA 可以设置每次启动 DMA 传输的 Byte 个数,最大 65535 Byte,通过 DMA_CTRL[23:8]来设置。

DMA 循环模式

       DMA 循环地址模式是指设置 DMA 的源和目的地址之后,数据搬运达到设定的循环边界之后,会跳转到循环起始地址,如此循环执行,直到到达设定的传输字节。
       循环地址模式的源和目的地址需要用 SRC_WRAP_ADDR 和 DEST_WRAP_ADDR 寄存器来设定,并通过WRAP_SIZE 来设定循环的长度值。

DMA 传输模式

DMA 支持 3 种传输模式:
内存到内存
       源地址和目的地址均配置成需要传输的内存地址,DMA_MODE[0]设置为 0,软件方式。
内存到外设
       源地址设置为内存地址,目的地址设置成外设地址,DMA_MODE[0]设置为 1,硬件方式,
DMA_MODE[5:2]选择所使用的外设。
外设到内存
       源地址设置为外设地址,目的地址设置成内存地址,DMA_MODE[0]设置为 1,硬件方式,DMA_MODE[5:2]选择所使用的外设。

DMA 外设选择

       当使用外设到内存或者内存到外设这种传输方式的时候,除了相应的外设需要设置为 DMA TX 或 RX 外,DMA_MODE[5:2]也需要选择对应的外设。
       注意:因为 UART 口共有 3 个,在 UART 使用 DMA 的时候,还需要通过 UART_CH[1:0]来选择对应的UART。

DMA 链表模式

       DMA 支持链表工作模式。 通过链表模式,我们在 DMA 搬运当前链表内存数据的时候,可以提前向下一个链表中填充数据,DMA 搬完当前链表之后,判断到下一个链表有效,可以直接搬运下一个链表的数据。通过链表的方式可以有效的提高 DMA 和 CPU 配合的效率。
       链表操作方式:通过 DMA_MODE[1]寄存器设置 DMA 为链表工作方式,再将 DESC_ADDR 寄存器设置为链表结构的起始地址,然后再通过 CHNL_CTRL 寄存器使能 DMA。当 DMA 处理完成当前内存的搬移后,软件通过设置有效标志,通知 DMA 链表中依然存在有效的数据,DMA 依据链表的有效标志处理下一个待搬移数据。

DMA 中断

       DMA 传输完成或者 burst 均可以产生中断,INT_MASK 寄存器可以屏蔽 DMA 通道对应的中断。当 DMA 相应中断产生后,可以通过 INT_SRC 寄存器查询当前中断的状态,指示当前是什么产生的中断,相应的状态位需要软件写 1 清 0。

中断请求

值得注意的是,SPI的DMA是LSPI的:
在这里插入图片描述

库函数

打开wm_dma.h,有如下内容:

函数

HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma);
HAL_StatusTypeDef HAL_DMA_DeInit (DMA_HandleTypeDef *hdma);
HAL_StatusTypeDef HAL_DMA_Start (DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint16_t DataLength);
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint16_t DataLength);
HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma);
HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma);
HAL_StatusTypeDef HAL_DMA_PollForTransfer(DMA_HandleTypeDef *hdma, uint32_t CompleteLevel, uint32_t Timeout);
void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma);HAL_DMA_StateTypeDef HAL_DMA_GetState(DMA_HandleTypeDef *hdma);
uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma);

参数

结构体和枚举类型

typedef enum
{HAL_DMA_STATE_RESET		= 0x00U,HAL_DMA_STATE_READY		= 0x01U,HAL_DMA_STATE_BUSY		= 0x02U,HAL_DMA_STATE_TIMEOUT	= 0x03U
}HAL_DMA_StateTypeDef;typedef struct
{uint32_t Direction;				/* 	Specifies if the data will be transferred from memory to peripheral,from peripheral to memory or from memmory to memory.This parameter can be a value of @ref DMA_DATA_TRANSFER_DIRECTION*/uint32_t DestInc;				/*  Specifies weather the destination address should be incremented or not.When mode is DMA_MODE_NORMAL_CIRCULAR and destination address need increment,must choose DMA_DINC_CIRCULAR.This parameter can be a value of @ref DMA_DEST_ADDR_INCREMENT*/uint32_t SrcInc;				/* 	Specifies weather the source address should be incremented or not.When mode is DMA_MODE_NORMAL_CIRCULAR and Source address need increment,must choose DMA_SINC_CIRCULAR.This parameter can be a value of @ref DMA_SRC_ADDR_INCREMENT*/uint32_t DataAlignment;			/*  Specifies the transport unit.This parameter can be a value of @ref DMA_DATAALIGN*/uint32_t Mode;					/*  Specifies the operation mode of the DMA channelx. When you need to use half-complete interrupts, you must use link mode.This parameter can be a value of @ref DMA_MODE*/uint32_t RequestSourceSel;		/*  Specifies the request source of DMA.This parameter can be a value of @ref DMA_REQUEST_SOURCE*/uint32_t RequestUartSel;		/*  Specifies the UART number when the RequestSourceSel is DMA_REQUEST_SOURCE_UART_RXor DMA_REQUEST_SOURCE_UART_TX. This parameter can be a value of @ref DMA_UART_CHANNEL_SEL*/} DMA_InitTypeDef;/* The descriptor structure is used internally by the driver layer,and the user layer does not need to be assigned. */
typedef struct __DMA_LinkDescriptor
{uint32_t Valid;					/*  According to the Bit31 to indicate whether the data pointed to by the descriptor is valid. Bit31 equal to 1 means valid, equal to 0 means invalid */uint32_t Control;				/*  Equal to the value of register CR2[23:1] */uint32_t SrcAddr;				/*  Data source address */uint32_t DestAddr;				/*  Data destinathion address */struct __DMA_LinkDescriptor *Next;	/*	Point to the address of the next descriptor structure */} DMA_LinkDescriptor;typedef enum
{HAL_DMA_HALF_TRANSFER = 0,HAL_DMA_FULL_TRANSFER = 1
} HAL_DMA_LevelCompleteTypeDef;typedef struct __DMA_HandleTypeDef
{DMA_Channel_TypeDef		*Instance;		/* Register base address of the channel used. Need user layer assignment.*/DMA_InitTypeDef			Init;			/* DMA communication parameters. Need user layer assignment*/HAL_LockTypeDef			Lock;			/* DMA locking object. */HAL_DMA_StateTypeDef	State;			/* DMA transfer state. */void					*Parent;		/* Parent object state. Need user layer assignment*/void					(* XferHalfCpltCallback)( struct __DMA_HandleTypeDef * hdma); /* DMA transfer complete callback. */void					(* XferCpltCallback)( struct __DMA_HandleTypeDef * hdma);	/* DMA Half transfer complete callback. */void					(* XferAbortCallback)( struct __DMA_HandleTypeDef * hdma);	/* DMA transfer abort callback. */DMA_TypeDef				*DmaBaseAddress;	/* DMA register base address. */uint32_t				ChannelIndex;		/* DMA Channel Index. */__IO uint32_t			ErrorCode;			/* DMA error code. */DMA_LinkDescriptor		*LinkDesc;			/* Points to the descriptor address. When user need to use the DMA half-completed interrupt, assign a value in the user layer.E.g DMA_LinkDescriptor desc[2], Size must be 2. */uint32_t				offset;				/* For internal use, the user does not need to assign a value. */} DMA_HandleTypeDef;

宏参数

// DMA register base address and channel base address.
#define DMA					((DMA_TypeDef *)DMA_BASE)
#define DMA_Channel0		((DMA_Channel_TypeDef *)DMA_Channel0_BASE)
#define DMA_Channel1		((DMA_Channel_TypeDef *)DMA_Channel1_BASE)
#define DMA_Channel2		((DMA_Channel_TypeDef *)DMA_Channel2_BASE)
#define DMA_Channel3		((DMA_Channel_TypeDef *)DMA_Channel3_BASE)
#define DMA_Channel4		((DMA_Channel_TypeDef *)DMA_Channel4_BASE)
#define DMA_Channel5		((DMA_Channel_TypeDef *)DMA_Channel5_BASE)
#define DMA_Channel6		((DMA_Channel_TypeDef *)DMA_Channel6_BASE)
#define DMA_Channel7		((DMA_Channel_TypeDef *)DMA_Channel7_BASE)// DMA Error Code
#define HAL_DMA_ERROR_NONE			0x0U	// No error
#define HAL_DMA_ERROR_NO_XFER		0x1U	// no ongoing transfer
#define HAL_DMA_ERROR_TIMEOUT		0x2U	// Timout error
#define HAL_DMA_ERROR_NOT_SUPPORTED	0x4U	// Not supported mode// DMA_DATA_TRANSFER_DIRECTION
#define DMA_PERIPH_TO_MEMORY		((uint32_t)DMA_MODE_SHM)	// Peripheral to memory direction
#define DMA_MEMORY_TO_PERIPH		((uint32_t)DMA_MODE_SHM)	// Memory to peripheral direction
#define DMA_MEMORY_TO_MEMORY		0x00000000U					// Memory to memory direction// DMA_DEST_ADDR_INCREMENT
#define DMA_DINC_ENABLE				((uint32_t)DMA_CR2_DINC_ENABLE)		// Destination address increment mode Enable
#define DMA_DINC_DISABLE			((uint32_t)DMA_CR2_DINC_DISABLE)	// Destination address increment mode Disable
#define DMA_DINC_CIRCULAR			((uint32_t)DMA_CR2_DINC_CYCLE)		// Destination address circular mode. Only when Mode = DMA_MODE_NORMAL_CIRCULAR// DMA_SRC_ADDR_INCREMENT
#define DMA_SINC_ENABLE				((uint32_t)DMA_CR2_SINC_ENABLE)		// Source address increment mode Enable
#define DMA_SINC_DISABLE			((uint32_t)DMA_CR2_SINC_DISABLE)	// Source address increment mode Disable
#define DMA_SINC_CIRCULAR			((uint32_t)DMA_CR2_SINC_CYCLE)		// Source address circular mode. Only when Mode = DMA_MODE_NORMAL_CIRCULAR// DMA_DATAALIGN
#define DMA_DATAALIGN_BYTE			((uint32_t)DMA_CR2_TRANS_SIZE_BYTE)			// Memory data alignment: Byte
#define DMA_DATAALIGN_HALFWORD		((uint32_t)DMA_CR2_TRANS_SIZE_HALFWORD)		// Memory data alignment: HalfWord
#define DMA_DATAALIGN_WORD			((uint32_t)DMA_CR2_TRANS_SIZE_WORD)			// Memory data alignment: Word// DMA_MODE
#define DMA_MODE_NORMAL_SINGLE				0x00000000U				// Normal single mode
#define DMA_MODE_NORMAL_CIRCULAR			0x00000001U				// Normal circular mode
#define DMA_MODE_LINK_SINGLE				0x00000002U				// Link	singal mode
#define DMA_MODE_LINK_CIRCULAR				0x00000003U				// Link circular mode// DMA_INTERRUPT_TYPE
#define DMA_FLAG_TF_DONE			DMA_IF_TRANSFER_DONE			// Transfer complete interrupt
#define DMA_FLAG_BURST_DONE			DMA_IF_BURST_DONE				// Burst complete interrupt// DMA_REQUEST_SOURCE
#define DMA_REQUEST_SOURCE_UART_RX		DMA_MODE_CH_UART_RX
#define DMA_REQUEST_SOURCE_UART_TX		DMA_MODE_CH_UART_TX
#define DMA_REQUEST_SOURCE_PWM_CAP0		DMA_MODE_CH_PWM_CAP0
#define DMA_REQUEST_SOURCE_PWM_CAP1		DMA_MODE_CH_PWM_CAP1
#define DMA_REQUEST_SOURCE_SPI_RX		DMA_MODE_CH_LSPI_RX
#define DMA_REQUEST_SOURCE_SPI_TX		DMA_MODE_CH_LSPI_TX
#define DMA_REQUEST_SOURCE_ADC_CH0		DMA_MODE_CH_ADC0
#define DMA_REQUEST_SOURCE_ADC_CH1		DMA_MODE_CH_ADC1
#define DMA_REQUEST_SOURCE_ADC_CH2		DMA_MODE_CH_ADC2
#define DMA_REQUEST_SOURCE_ADC_CH3		DMA_MODE_CH_ADC3
#define DMA_REQUEST_SOURCE_I2S_RX		DMA_MODE_CH_I2SRX
#define DMA_REQUEST_SOURCE_I2S_TX		DMA_MODE_CH_I2STX
#define DMA_REQUEST_SOURCE_SDIO			DMA_MODE_CH_SDIO// DMA_UART_CHANNEL_SEL
#define DMA_UART_CHANNEL_SEL_UART0		DMA_REQCH_UART0
#define DMA_UART_CHANNEL_SEL_UART1		DMA_REQCH_UART1
#define DMA_UART_CHANNEL_SEL_UART2		DMA_REQCH_UART2
#define DMA_UART_CHANNEL_SEL_UART3		DMA_REQCH_UART3
#define DMA_UART_CHANNEL_SEL_UART4		DMA_REQCH_UART4
#define DMA_UART_CHANNEL_SEL_UART5		DMA_REQCH_UART5

#define IS_DMA_ALL_INSTANCE(INSTANCE)	(((INSTANCE) == DMA_Channel0) || \((INSTANCE) == DMA_Channel1) || \((INSTANCE) == DMA_Channel2) || \((INSTANCE) == DMA_Channel3) || \((INSTANCE) == DMA_Channel4) || \((INSTANCE) == DMA_Channel5) || \((INSTANCE) == DMA_Channel6) || \((INSTANCE) == DMA_Channel7))#define IS_DMA_DIRECTION(DIRECTION)		(((DIRECTION) == DMA_PERIPH_TO_MEMORY) || \((DIRECTION) == DMA_MEMORY_TO_PERIPH) || \((DIRECTION) == DMA_MEMORY_TO_MEMORY))#define IS_DMA_DEST_INC_STATE(STATE)	(((STATE) == DMA_DINC_ENABLE) || \((STATE) == DMA_DINC_DISABLE))#define IS_DMA_SRC_INC_STATE(STATE)		(((STATE) == DMA_SINC_ENABLE) || \((STATE) == DMA_SINC_DISABLE))#define IS_DMA_DATA_SIZE(SIZE)			(((SIZE) == DMA_DATAALIGN_BYTE) || \((SIZE) == DMA_DATAALIGN_HALFWORD) || \((SIZE) == DMA_DATAALIGN_WORD))#define IS_DMA_MODE(MODE)				(((MODE) == DMA_MODE_NORMAL_SINGLE) || \((MODE) == DMA_MODE_NORMAL_CIRCULAR) || \((MODE) == DMA_MODE_LINK_SINGLE) || \((MODE) == DMA_MODE_LINK_CIRCULAR))#define IS_DMA_REQUEST_SOURCE(SEL)		(((SEL) == DMA_REQUEST_SOURCE_UART_RX) || \((SEL) == DMA_REQUEST_SOURCE_UART_TX) || \((SEL) == DMA_REQUEST_SOURCE_PWM_CAP0) || \((SEL) == DMA_REQUEST_SOURCE_PWM_CAP1) || \((SEL) == DMA_REQUEST_SOURCE_SPI_RX) || \((SEL) == DMA_REQUEST_SOURCE_SPI_TX) || \((SEL) == DMA_REQUEST_SOURCE_ADC_CH0) || \((SEL) == DMA_REQUEST_SOURCE_ADC_CH1) || \((SEL) == DMA_REQUEST_SOURCE_ADC_CH2) || \((SEL) == DMA_REQUEST_SOURCE_ADC_CH3) || \((SEL) == DMA_REQUEST_SOURCE_I2S_RX) || \((SEL) == DMA_REQUEST_SOURCE_I2S_TX) || \((SEL) == DMA_REQUEST_SOURCE_SDIO))#define IS_DMA_UART_CHANNEL(CHANNEL)	(((CHANNEL) == DMA_UART_CHANNEL_SEL_UART0) || \((CHANNEL) == DMA_UART_CHANNEL_SEL_UART1) || \((CHANNEL) == DMA_UART_CHANNEL_SEL_UART2) || \((CHANNEL) == DMA_UART_CHANNEL_SEL_UART3) || \((CHANNEL) == DMA_UART_CHANNEL_SEL_UART4) || \((CHANNEL) == DMA_UART_CHANNEL_SEL_UART5))	#define IS_DMA_BUFFER_SIZE(SIZE)		(((SIZE) >= 0x1U) && ((SIZE) < 0x10000U))#define IS_DMA_SRC_ADDR(SRC)			(((SRC) % 4) == 0)#define IS_DMA_DEST_ADDR(DEST)			(((DEST) % 4) == 0)#define IS_DMA_LENGTH(DATAALIGN, LEN)	((((DATAALIGN) == DMA_DATAALIGN_BYTE) && (((LEN) % 1) == 0)) || \(((DATAALIGN) == DMA_DATAALIGN_HALFWORD) && (((LEN) % 2) == 0)) || \(((DATAALIGN) == DMA_DATAALIGN_WORD) && (((LEN) % 4) == 0)))#define IS_DMA_LINK_LENGTH(LEN)			(((LINK) % 8) == 0)#define IS_DMA_COMPLETELEVEL(LEVEL)		(((LEVEL) == HAL_DMA_HALF_TRANSFER) || ((LEVEL) = HAL_DMA_FULL_TRANSFER))#define __HAL_DMA_ENABLE(__HANDLE__)	(SET_BIT((__HANDLE__)->Instance->CR1, DMA_CR1_START))#define __HAL_DMA_DISABLE(__HANDLE__)	do {													 \SET_BIT((__HANDLE__)->Instance->CR1, DMA_CR1_STOP);  \while ((__HANDLE__)->Instance->CR1 & DMA_CR1_START); \} while (0)#define __HAL_DMA_ENABLE_IT(__HANDLE__, __INTERRUPT__)	(CLEAR_BIT((__HANDLE__)->DmaBaseAddress->IM, (__INTERRUPT__)))#define __HAL_DMA_DISABLE_IT(__HANDLE__, __INTERRUPT__)	(SET_BIT((__HANDLE__)->DmaBaseAddress->IM, (__INTERRUPT__)))#define __HAL_DMA_GET_FLAG(__HANDLE__, __FLAG__)	(((__HANDLE__)->DmaBaseAddress->IF) & (__FLAG__))#define __HAL_DMA_CLEAR_FLAG(__HANDLE__, __FLAG__)	(SET_BIT((__HANDLE__)->DmaBaseAddress->IF, (__FLAG__)))

应用

在WM_SDK_W806_v0.6.0中,仅有SPI和I2S有具体的DMA实现:
在这里插入图片描述
SPI的应用见【联盛德W806上手笔记】八、SPI及其DMA

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

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

相关文章

SNF快速开发平台MVC-自由排序组件

1. 自由排序功能使用 在一些需要排序优先级的数据进行调整处理&#xff0c;如民族数据&#xff0c;在北方实施的时候汉族比较多&#xff0c;希望把汉族放在第一位。在蒙古实施项目时&#xff0c;蒙古族人最多把蒙古族放在第一选择位。 1.1. 效果展示 图 1.1 1.2. …

【联盛德W806上手笔记】十、ADC

目录ADCADC 电路设计库函数函数参数宏Demo中的例程main.cwm_hal_msp.cwm_it.cWindows 10 20H2 HLK-W806-V1.0-KIT WM_SDK_W806_v0.6.0 摘自《W806 芯片设计指导书 V1.0》、《W806 MCU 芯片规格书 V2.0》 ADC 基于 Sigma-Delta ADC 的采集模块&#xff0c;集成 4 路 16 比特 AD…

【电路补习笔记】8、稳压电路 —— 线性电源及LDO

目录有名的电源芯片品牌DCDC电源分类开关电源vs线性稳压器线性电源参数线性电源工作原理集成稳压器78/79系列&#xff08;固定输出电压&#xff09;正、负对称输出两组电源的稳压电路扩展输出电压扩大输出电流LM317/LM337&#xff08;可调输出电压&#xff09;正、负对称输出两…

ajax代码整理

$.ajax({ type: "post", 【以POST或GET的方式请求。默认GET。PUT和DELETE也可以用&#xff0c;有的浏览器不支持】 url: url, 【请求的目的地址&#xff0c;须是一个字符串。】 contentType: "application/json", 【以哪种数据类型发送请求】 data: data, …

创建一个简单的WCF程序

为了使读者对基于WCF的编程模型有一个直观的映像&#xff0c;我将带领读者一步一步地创建一个完整的WCF应用。本应用功能虽然简单&#xff0c;但它涵盖了一个完整WCF应用的基本结构。对那些对WCF不是很了解的读者来说&#xff0c;这个例子将带领你正式进入WCF的世界。 在这个例…

深圳IO —— 一个汇编编程小游戏

目录简介数据手册接口简单 I/OXBus简单 I/O 对比 XBus语言参考程序结构注释标签寄存器accdatp0、p1、x0、x1、x2、x3null 伪寄存器指令操作数确保进行足够的睡眠 (slp)&#xff01;基本指令算法指令条件指令隐藏指令游戏界面DIY版本&#xff1a; 简介 以下介绍摘自未来软件园 …

unity shader 编辑器扩展类 ShaderGUI

这应该unity5才出的新功能了&#xff0c;今天看文档时刚巧看到了&#xff0c;就来尝试了一下。 效果如图&#xff1a; shader 的编辑器扩展分为2种方法&#xff1a; 是通过UnityEditor下的ShaderGUI类来实现的&#xff0c;形式比较近似于我们一般对unity编辑器的扩展方式。是通…

【电路补习笔记】9、电容式开关电源(电荷泵)

目录分类原理电荷泵基础开关电容稳压器的细调功能电荷泵的电压增益调节输出电容&#xff08;Co&#xff09;优点电容式开关稳压器减小纹波相关应用老师的主页&#xff1a;唐老师讲电赛 视频地址&#xff1a; 电源大师3——电容式开关电源&#xff08;电荷泵&#xff09;工作原理…

CPU 硬盘性能到底相差多少

本文以一个现代的、实际的个人电脑为对象&#xff0c;分析其中CPU&#xff08;Intel Core 2 Duo 3.0GHz&#xff09;以及各类子系统的运行速度——延迟和数据吞吐量。通过粗略的估算PC各个组件的相对运行速度&#xff0c;希望能给大家留下一个比较直观的印象。本文中的数据来自…

【电路补习笔记】10、电感式开关电源(BUCK 降压电路)

目录分类封装焊线式覆晶式开关电源三种基本的非隔离开关电源纹波&#xff08;ripple&#xff09;开关电源的元件构成有源开关肖特基二极管或快恢复二极管不使用普通硅二极管的原因电感电容分压电阻&#xff08;输出电压设置&#xff09;工作原理工作模式连续模式&#xff08;co…

php中Session的生成机制、回收机制和存储机制探究

转载:http://www.jb51.net/article/53938.htm这篇文章主要介绍了php中Session的生成机制、回收机制和存储机制探究,可以帮助大家对Session有一个全面的了解,需要的朋友可以参考下1、php中session的生成机制我们先来分析一下PHP中是怎么生成一个session的。设计出session的目的是…

wsl2 Ubuntu 18.04 安装 ROS

目录前期准备安装ROS初始化rosdep测试前期准备 WSL的安装见旧版 WSL 的手动安装步骤从步骤4开始弄。 图形界面安装见在WSL中使用GPU&#xff1a;WSL2 Ubuntu 18.04 CUDA Gnome图形界面环境配置 界面汉化见WSL-Ubuntu安装中文语言 这里使用鱼香ROS大佬的一键安装脚本&…

GPU CUDA 经典入门指南

转自&#xff1a;http://luofl1992.is-programmer.com/posts/38830.html CUDA编程中&#xff0c;习惯称CPU为Host&#xff0c;GPU为Device。编程中最开始接触的东西恐怕是并行架构&#xff0c;诸如Grid、Block的区别会让人一头雾水&#xff0c;我所看的书上所讲述的内容比较抽象…

用PyQt实现透明桌面时钟小部件

2019独角兽企业重金招聘Python工程师标准>>> #!/usr/bin/env python # -*- coding: utf-8 -*-Created on 2012-4-6author: wangxiaoimport sys from PyQt4 import QtGui, QtCore from PyQt4.QtCore import Qt from PyQt4.QtCore import QPoint from PyQt4.QtCore…

实现织梦dedecms百度主动推送(实时)网页抓取

做百度推广的时候&#xff0c;如何让百度快速收录呢&#xff0c;下面提供了三种方式&#xff0c;今天我们主要讲的是第一种。 如何选择链接提交方式 1、主动推送&#xff1a;最为快速的提交方式&#xff0c;推荐您将站点当天新产出链接立即通过此方式推送给百度&#xff0c;以保…

【RK3399Pro学习笔记】十八、点亮LED灯(python、C语言、bash)

目录GPIOpython3python-peripherypython2RPiC语言SysFs方式编写gpiolib.cgpiolib.hmain.c编译测试wiringPibash平台&#xff1a;华硕 Thinker Edge R 瑞芯微 RK3399Pro 固件版本&#xff1a;Tinker_Edge_R-Debian-Stretch-V1.0.4-20200615 GPIO (机翻)下表显示了座子的引脚&am…

Linux中python、C++和C语言的多线程用法整理(_thread、threading、thread和pthread)

目录python3开始学习Python线程_thread常量和函数&#xff1a;锁对象试用基本功能试用线程同步threading函数常量类线程本地数据线程对象锁对象递归锁对象条件对象信号量对象Semaphore 例子事件对象定时器对象栅栏对象在 with 语句中使用锁、条件和信号量测试Cstd::threadstd::…

Swing-BoxLayout用法-入门

注&#xff1a;本文内容源于http://www.java3z.com/cwbwebhome/article/article20/200016.html?id4797&#xff1b;细节内容根据笔者理解有修改。 BoxLayout 可以把控件依次进行水平或者垂直排列布局&#xff0c;这是通过参数 X_AXIS、Y_AXIS 来决定的。X_AXIS 表示水平排列&a…

Python开发利器之UliPad

一、安装Ulipad 因为ulipad编辑器使用的是wxpython编写的gui&#xff0c;所以我们需要第三方库wxpython的支持&#xff0c;先讲一下Ulipad在Windows系统环境下的安装&#xff1a; 1. 确实自己的windows版本&#xff0c;32位还是64位的。2. 查看自己安装的 Python版本&#xff0…

flask接收前台的form数据

html 记得访问从服务里打开 表单html 不能直接打开表单html https://www.cnblogs.com/wanghaonull/p/6340096.html