OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4998|回复: 3

《分享》有关DMA配置问题(还请原子哥审核一下@正点原子)

[复制链接]

10

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2013-6-11
在线时间
0 小时
发表于 2014-3-25 13:37:14 | 显示全部楼层 |阅读模式
#define ADC1_DR_Address ((uint32_t)0x4001244C) // ADC1外设的地址
__IO uint16_t ADC_ConvertedValue[16] = {0};              // 自定义的DMA数据传输的内存地址,也就是说DMA传输的数据存到这个数组里(这里定义的数组长度为16,数据类型为uint16)

void DMA_InitConf(void)
{
DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(DMA1_Channel1);                                                  // 将DMA1_Channel1设为缺省值(也就是重置或复位一下)
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; // 外设地址,也就是上面定义的ADC1外设地址,DMA从这里取数据,然后通过DMA传输到内存地址里
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertedValue; // 内存地址,也就是上面定义的那个数组,DMA传输的数据存在这里,取数据就直接读这个数组里的数据就行
                                                                                                                 前面的(u32)是将地址扩展为32位长度,因为DMA_InitStructure.DMA_MemoryBaseAddr  在库里的定义                                                                                                                  就是32位长度的地址



DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; // DMA的数据传输方向,这里定义外设(ADC1)为数据源,从外设传输数据到内存
DMA_InitStructure.DMA_BufferSize = 16;  // 缓冲区大小,用来暂时存储ADC转换的数据,这里与数组的长度一致
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 外设地址是否递增,这里数据源只是ADC1,所以外设地址固定
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 内存地址是否递增,这里我们设置成内存地址递增,因为我们的内存地址是数组,所以地址要递增,否则就只往首地                                                                                                                                                                                                                                                      址里写
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; // 外设数据长度,也就是ADC转换出来的数据的长度,这里设置为半字,也就是16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; // 内存数据长度,也就是存数据所用的内存地址的长度,这里设置为半字,也是16位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // DMA的传输方式为循环方式,即不断的传输数据
DMA_InitStructure.DMA_Priority = DMA_Priority_High; // 所使用的通道的优先级,这里设置为高
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // M2M 即 memory_to_memory方式,我们一般不用,选择关闭
DMA_Init(DMA1_Channel1, &DMA_InitStructure); // 完成DMA的配置,同时选择DMA的通道1。因为映射表中ADC1 对应与DMA1的channel_1
        DMA_Cmd(DMA1_Channel1, ENABLE);  // 使能DMA1的通道1




        DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE); // DMA1 的中断控制,可以选择中断条件,这里选择的是完全传输完成中断,就是在数据完全传输完成后,产生中断,用户可以                                                                                          在中断函数中区数据清除中断标志位等操作,中断函数如下:

                                 void DMA1_Channel1_IRQHandler()
                                 {
                                          ..................... ;
                                  DMA_ClearITPendingBit(DMA1_IT_TC1);
                                 }

}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2014-3-25 14:37:16 | 显示全部楼层
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-3-25 15:23:06 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

10

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2013-6-11
在线时间
0 小时
 楼主| 发表于 2014-3-25 15:40:52 | 显示全部楼层
回复【3楼】正点原子:
-----------------------------
还是要谢谢原子哥的,这么忙还抽出时间帮我们解答问题!^0^
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-13 07:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表