工程师STM32单片机学习基础手记(4):用PWM实现荧火虫灯(五)
1脚不接时出现的画面
DMA初步
DMA有什么用?
直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。
有多少个DMA资源
有两个DMA控制器,DMA1有7个通道,DMA2有5个通道。
数据从什么地方送到什么地方?
外设到SRAM(I2C/UART等获取数据并送入SRAM);
SRAM的两个区域之间;
外设到外设(ADC读取数据后送到TIM1控制其产生不同的PWM占空比);
SRAM到外设(SRAM中预先保存的数据送入DAC产生各种波形);
……还有一些目前还搞不清楚的。
DMA可以传递多少数据?
传统的DMA的概念是用于大批量数据的传输,但是我理解,在STM32中,它的概念被扩展了,也许更多的时候快速是其应用的重点。数据可以从1~65535个。
通道是如何分配的?
见下面的这个表:
如何来用DMA?
确定数据来源,确定数据目的地,选择使用哪个通道,设定传输多少个数据,设定数据传递模式等等就可以了。且读一下STM32提供给我们的例子。
//////////////////////////////////////////
……
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)TIM1_CCR3_Address;
//设定外围设备的地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SRC_Buffer;
//设定内存地址,SRC_Buffer是前面定义的一个数组
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //方向控制
DMA_InitStructure.DMA_BufferSize = 3; //缓冲区大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外围地址增量控制
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址增量控制
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
//DMA_PeripheralDataSize_HalfWord的值为0x100,后一个为0x400,在在stm32f10x_dma.h中定义,用于决定存储器数据宽度
*/
- STM32的曼彻斯特编译码系统设计(02-04)
- STM32学习:ADC/DMA/USART(07-25)
- 采用ARM Cortex-M3单片机和DSP的逆变电源设计(06-24)
- STM32 ADC的采样周期确定(02-22)
- 基于STM32F103RB和CC1101的无线数传模块设计(07-23)
- 详解GPIO在STM32中的几种工作模式(09-24)