历史上的今天
今天是:2024年11月03日(星期日)
2021年11月03日 | DMA的外设地址简单说明
2021-11-03 来源:eefocus
说成外设寄存器地址不就完了么,和内核的总线地址又容易混起来,总之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,基地址加偏移地址就得到这个寄存器的地址了。
其它外设一样查找,个人还是建议使用第一种方法。
上一篇:关于DMA传输外设地址的说明
史海拾趣
|
随着视频监控技术的高速发展,用户对于视频监控产品的要求也在不断提高,功能要求更加完善、稳定,性能要求更加清晰、准确。如何能够迅速准确的找到目标……?所有这些问题都需要高清视频监控产品来解决。高清化,从我做起——彩色,液晶,大屏拼接 ...… 查看全部问答> |
|
请教如何用tornado编写类似windows下的dll文件 请教如何用tornado编写类似windows下的dll文件,然后在vxworks下被主程序调用。 具体如下:我想用tornado写一个算法,然后封装成类似windows下的dll,然后供vxworks平台下的主程序调用,请教如何实现,请大家提供一点思路,谢谢!… 查看全部问答> |
|
VB中,sItem = Split(s, \",\") CString s; CString sItem[13]; byte pItem; byte p1, p2; s += \",\"; p1 = 0; pItem = 0; for (p2 = 0; p2 < s.GetLength(); p2++) { if (s.GetAt(p2) == \',\') &nb ...… 查看全部问答> |




