DMA学习笔记—直接存储器访问 理论部分

理论部分

功能框图

简介
DMA: Data Memory Access,直接存储器访问。
主要功能是可以把数据从一个地方搬到另外一个地方,而且不占用CPU。不用CPU暂存数据
DMA1: 有7个通道,可以实现 P->M, M->P,M->M
DMA2: 有7个通道,可以实现 P->M, M->P,M->M

M:Memery P:Peripheral
P->M:ADC

DMA功能框图
1-DMA请求
2-通道
3-仲裁器
在这里插入图片描述
仲裁器
多个DMA请求一起来,怎么办?
 1、软件阶段, DMA_CCRx: PL[1:0]。00/01/10/11
 2、硬件阶段,通道编号小的优先级大, DM1的优先级高于DMA2的优先级。

固件库函数

DMA结构体:

typedef struct
{
//数据从哪里来,到哪里去
  uint32_t DMA_PeripheralBaseAddr; /*!<外设地址 Specifies the peripheral base address for DMAy Channelx. */

  uint32_t DMA_MemoryBaseAddr;     /*!<存储器地址 Specifies the memory base address for DMAy Channelx. */

  uint32_t DMA_DIR;                /*!<传输方向 Specifies if the peripheral is the source or destination.
                                        This parameter can be a value of @ref DMA_data_transfer_direction */
//传多少数据
  uint32_t DMA_BufferSize;         /*!<传输数目 Specifies the buffer size, in data unit, of the specified Channel. 
                                        The data unit is equal to the configuration set in DMA_PeripheralDataSize
                                        or DMA_MemoryDataSize members depending in the transfer direction. */

  uint32_t DMA_PeripheralInc;      /*!<外设地址是否递增 Specifies whether the Peripheral address register is incremented or not.
                                        This parameter can be a value of @ref DMA_peripheral_incremented_mode */

  uint32_t DMA_MemoryInc;          /*!<存储器地址是否递增 Specifies whether the memory address register is incremented or not.
                                        This parameter can be a value of @ref DMA_memory_incremented_mode */

  uint32_t DMA_PeripheralDataSize; /*!<外设数据宽度 Specifies the Peripheral data width.
                                        This parameter can be a value of @ref DMA_peripheral_data_size */

  uint32_t DMA_MemoryDataSize;     /*!<存储器数据宽度 Specifies the Memory data width.
                                        This parameter can be a value of @ref DMA_memory_data_size */
//什么时候结束
  uint32_t DMA_Mode;               /*!<模式选择 Specifies the operation mode of the DMAy Channelx.
                                        This parameter can be a value of @ref DMA_circular_normal_mode.
                                        @note: The circular buffer mode cannot be used if the memory-to-memory
                                              data transfer is configured on the selected Channel */

  uint32_t DMA_Priority;           /*!<通道优先级 Specifies the software priority for the DMAy Channelx.
                                        This parameter can be a value of @ref DMA_priority_level */
//memory to memory
  uint32_t DMA_M2M;                /*!<存储器到存储器模式 Specifies if the DMAy Channelx will be used in memory-to-memory transfer.
                                        This parameter can be a value of @ref DMA_memory_to_memory */
}DMA_InitTypeDef;

固件库函数

void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx);
void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct);
void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct);
void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState);
void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState);
void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber); 
uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx);
FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG);
void DMA_ClearFlag(uint32_t DMAy_FLAG);
ITStatus DMA_GetITStatus(uint32_t DMAy_IT);
void DMA_ClearITPendingBit(uint32_t DMAy_IT);

*下一节开始编程。

猜你喜欢

转载自blog.csdn.net/weixin_37676403/article/details/90483828