DMA的外设地址简单说明

来源:互联网 发布:java泛型的通配符 编辑:程序博客网 时间:2024/05/21 17:28
说成外设寄存器地址不就完了么,和内核的总线地址又容易混起来,总之dma的源和目的地址,涉及到外设的,就是外设寄存器,iis数据要从总线跑到外设寄存器上,dma才能亮剑

关于在STM32的DMA中使用外设地址

在使用的DMA的时候,有时候需要将外设的地址作为源地址或者目的地址,对于初学者来说这个地址在哪边确定有点犯难,这篇文章就来告诉大家如何快速找到你需要的地址。

我们先看一个DMA初始化的例子:

//DMA初始化函数
void UsartDMA_Init(void)
{
DMA_InitTypeDef DMA_InitStructure;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//使能DMA时钟

DMA_DeInit(DMA1_Channel7);//串口2的DMA传输通道是通道7

DMA_InitStructure.DMA_PeripheralBaseAddr = USART2_DR_Base;
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//外设作为DMA的目的端
DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;//传输大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址不增加
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//内存地址自增1
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//DMA_Mode_Normal(只传送一次), DMA_Mode_Circular (不停地传送)
DMA_InitStructure.DMA_Priority = DMA_Priority_High;//(DMA传送优先级为中等)
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel7, &DMA_InitStructure);
}

在上述代码中有一个USART2_DR_Base,这个就是我们需要的地址,也就是USART2的DR寄存器地址,这个地址有两种方法得到:

第一种:

//串口2DR寄存器的地址#define USART2_DR_Base (u32)&USART2->DR


这种方法比较讨巧,使用起来也方便,学过寄存器操作STM32的亲们还是很容易理解为什么这样可以得到我们想要的结果。

第二种:

//串口2DR寄存器的地址#define USART2_DR_Base (u32)0x40004404


这就是自己通过手册来查找到这个寄存器的地址,输入一大串数字,这种方法比较费时费事。

那么亲们会问,如何快速的找到这个寄存器的地址,首先打开参考手册,移动到2.3节---寄存器映像,也就是第28页,这里列出了STM32内部地址的划分,找到你要的外设基地址,例如USART2的基地址为0x40004400。然后再你需要的外设关于寄存器的地方找到寄存器的偏移地址,如USART的DR寄存器的偏移地址为04,基地址加偏移地址就得到这个寄存器的地址了。

其它外设一样查找,个人还是建议使用第一种方法。
辛辛苦苦敲了那么多字,望大家支持支持,觉得实用就给个回复,亲~~

0 0
原创粉丝点击