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
这就是自己通过手册来查找到这个寄存器的地址,输入一大串数字,这种方法比较费时费事。
关于在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
- DMA的外设地址简单说明
- 关于DMA传输外设地址的说明
- STM32 DMA外设地址的计算问题
- 关于IDE DMA的简单说明.
- 6410外设的地址确定
- 计算机cpu和外设的平等性--DMA简述
- 计算机cpu和外设的平等性--DMA简述
- DMA 简单的介绍
- EFM32外设--DMA之SPI+DMA
- EFM32外设--DMA之Timer+DMA+DAC
- 【整理】嵌入式外设之DMA
- STM32外设DMA使用总结
- STM32借用固件库使用外设的说明
- 如何判断外设使用的地址空间
- DMA简单的测试代码
- Zynq DMA 的简单介绍
- STM32的ADC(DMA)读取电位器外设的电压值
- 接上板子上的外设,怎么确定它的地址?
- 匈牙利算法
- boost::asio译文
- html document.getElement(s)By..
- Android 组件间的解耦
- 蓝桥杯 - 兰顿蚂蚁 (模拟)
- DMA的外设地址简单说明
- Android 百度地图 SDK v3.0.0 (四) 引入离线地图功能
- 【问题】html列表项,内容随着鼠标移动而变化的页面,怎样实现?
- PCI驱动程序(国嵌笔记)
- JPA
- 视觉SLAM漫淡 - 半闲居士
- 机器视觉标定以及标定板在机器视觉系统标定中的作用
- oracle 日期相减
- win32 用户自定义消息范围