OpenEdv-开源电子网

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

DMA的地址怎么指向片内RAM?当完成一次传送后怎么才能知道完成了传送

[复制链接]

172

主题

539

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3449
金钱
3449
注册时间
2015-10-5
在线时间
492 小时
发表于 2016-1-26 18:14:11 | 显示全部楼层 |阅读模式
1金钱
DMA的地址怎么执行片内RAM?当完成一次传送后怎么才能知道完成了传送

比如DMA读取了摄像头的数据后,怎么指向片内RAM,或者是不是不能将数据送给片内的RAM,只能送给外设?
当DMA完成了一次传送后怎么得知,完成了传送

最佳答案

查看完整内容[请看2#楼]

你得先定义一个数组, 然后指向这个数组的首地址就行了 传输完成是你先定义一次传送多少个位,DMA转完你指定的数量后,会开启中断,你在DMA中断里处理你需要的数据就行了 比如: u32 ADC_Buf[ADC_SIZE]; //这个存放ADC转换后的值 以下是DMA配置函数 /******************************************************************************************** 函 数 名: DMA1 配置函数 调 用: MYDMA_Config(DMA_Channel_ ...
认真做好笔记....
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

507

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3340
金钱
3340
注册时间
2013-4-10
在线时间
333 小时
发表于 2016-1-26 18:14:12 | 显示全部楼层
你得先定义一个数组, 然后指向这个数组的首地址就行了
传输完成是你先定义一次传送多少个位,DMA转完你指定的数量后,会开启中断,你在DMA中断里处理你需要的数据就行了

比如:   u32 ADC_Buf[ADC_SIZE];                //这个存放ADC转换后的值
以下是DMA配置函数

/********************************************************************************************
函 数 名: DMA1 配置函数
调    用: MYDMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
参    数: *DMA   DMA 结构数据指针
          cpar:外设地址
          cmar:存储器地址
          cndtr:数据传输量   
返 回 值: 无
********************************************************************************************/        
void MYDMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
     {     
     RCC->AHBENR    |= 1<<0;              //开启DMA1时钟,使能DMA传输
     DMA1->IFCR     =  0x0000000F;    //将DMA的通道1寄存器重设为缺省值
     DMA_CHx->CCR   |= 1<<5;          //使能连续模式
     DMA_CHx->CCR   |= 1<<7;          //使能存储器增量模式
     DMA_CHx->CCR   |= 2<<8;          //外设数据宽度为32位
     DMA_CHx->CCR   |= 2<<10;         //存储器数据宽度32位
     DMA_CHx->CCR   |= 2<<12;         //高等优先级
     DMA_CHx->CPAR  = cpar;                //DMA1 外设地址
     DMA_CHx->CMAR  = (u32)cmar;      //DMA1,存储器地址
     DMA_CHx->CNDTR = cndtr;          //DMA1,传输数据量
     DMA_CHx->CCR   |= 1<<0;          //使能ADC TX DMA1 所指示的通道
     delay_ms(5);                      //等待DMA时钟稳定
     adc1_byte.FangXiang = 0;         //方向
     adc1_byte.JiShuQi = 0;           //计数器
     adc1_byte.XiShu = 128;           //滤波系数
     adc2_byte.FangXiang = 0;         //方向
     adc2_byte.JiShuQi = 0;           //计数器
     adc2_byte.XiShu = 128;           //滤波系数   
     MY_NVIC_Init(3,2,DMA1_Channel1_IRQn,4);//配置DMA中断配置
     DMA_CHx->CCR |= 1<<1;            //使能传输完成中断  
     }


这样调用就行了    MYDMA_Config(DMA1_Channel1,(u32)&ADC1->DR,(u32)ADC_Buf,ADC_SIZE);//DMA1通道设置

ADC1->DR  是内是要读到的地址
ADC_Buf,是目的地址

ADC_SIZE  是每次传送的数量

回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2016-1-26 19:31:04 | 显示全部楼层
DMA可以指定源地址和目的地址,都可以指定到RAM中,指定相应的地址就可以了,当完成指定数量数据的传送后,可以选择中断方式告诉应用传送完成
回复

使用道具 举报

172

主题

539

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3449
金钱
3449
注册时间
2015-10-5
在线时间
492 小时
 楼主| 发表于 2016-1-26 19:48:32 | 显示全部楼层
ianhom 发表于 2016-1-26 19:31
DMA可以指定源地址和目的地址,都可以指定到RAM中,指定相应的地址就可以了,当完成指定数量数据的传送后, ...

那具体是怎么设置的,发个文件我研究一下可以吗
认真做好笔记....
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2016-1-26 21:23:50 | 显示全部楼层
飞过漠北的蓝天 发表于 2016-1-26 19:48
那具体是怎么设置的,发个文件我研究一下可以吗

手头没有现成的文件,看看DMA部分的寄存器细节大致就知道如何操作了,论坛里还有很多DMA例程的分享,可以看看
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

172

主题

539

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3449
金钱
3449
注册时间
2015-10-5
在线时间
492 小时
 楼主| 发表于 2016-1-26 23:58:04 | 显示全部楼层
likunxue 发表于 2016-1-26 22:36
你得先定义一个数组, 然后指向这个数组的首地址就行了
传输完成是你先定义一次传送多少个位,DMA转完你指定 ...

好人一生平安
认真做好笔记....
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 03:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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