OpenEdv-开源电子网

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

新手求助DMA

[复制链接]

2

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2017-3-31
在线时间
8 小时
发表于 2017-5-24 09:50:27 | 显示全部楼层 |阅读模式
3金钱
本帖最后由 wqq1104180120 于 2017-5-25 21:44 编辑

目前正在考虑用f103外接AD模块,AD的吞吐率12M/s左右,可以用DMA+GPIO的方式读取数据?数据量不是很大,2K就可以了,求大神解答一下。首先我想测一下DMA的速度最大能达到多少,用GPIO->IDR来做源地址,但是一直获取不到数据很疑惑,我的测试程序如下。

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "key.h"
#include "dma.h"
#include "stm32f10x.h"
#include "delay.h"
u8 Buffer[2048]={0};
u8 Buffer1[4]={1,2,3,4};
void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)//配置DMA1_CHx,第一个参数是开启的DMA通道,第二个参数是外设基地址,但三个参数是存储器基地址,第四个参数是要传输的数据量
{
        
        DMA_InitTypeDef DMA_InitStruct;
        
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//使能DMA时钟

        DMA_DeInit(DMA_CHx);
        
        DMA_InitStruct.DMA_BufferSize=cndtr;
        DMA_InitStruct.DMA_DIR=DMA_DIR_PeripheralSRC;
        DMA_InitStruct.DMA_M2M=DMA_M2M_Disable;
        DMA_InitStruct.DMA_MemoryBaseAddr=cmar;
        DMA_InitStruct.DMA_MemoryDataSize=DMA_MemoryDataSize_Word;
        DMA_InitStruct.DMA_MemoryInc=DMA_MemoryInc_Enable;
        DMA_InitStruct.DMA_Mode=DMA_Mode_Normal;//我们这是一次传输不循环
        DMA_InitStruct.DMA_PeripheralBaseAddr=cpar;
        DMA_InitStruct.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Word;
        DMA_InitStruct.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
        DMA_InitStruct.DMA_Priority=DMA_Priority_Medium;//由于只开启了一个通道,所以优先级随便
        DMA_Init(DMA_CHx, &DMA_InitStruct);
        

  DMA_Cmd(DMA_CHx,ENABLE);
}

void GPIOA_Config()
{
        GPIO_InitTypeDef GPIO_InitStruct;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PA口
        
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_1;
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2;
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_3;
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4;
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5;
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6;
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
        GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7;
        GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStruct);
}


int main(void)
{
        u32 i=0;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
        uart_init(9600);         //串口初始化为9600
        LED_Init();
        delay_init();
        GPIOA_Config();
        MYDMA_Config(DMA1_Channel4,(u32)&GPIOA->IDR,(u32)Buffer,2048);
        while(1)
        {
                LED0=!LED0;
                delay_ms(200);
                if(DMA_GetFlagStatus(DMA1_FLAG_TC4)!=RESET)
                {
                        LED1=!LED1;
                        delay_ms(200);
                        for(i=0;i<2048;i++)
            printf("%d",Buffer);
                }
        }
}

最佳答案

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

dma m2m enable试试,gpio要使用内存到内存
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
450
金钱
450
注册时间
2017-3-31
在线时间
118 小时
发表于 2017-5-24 09:50:28 | 显示全部楼层
wqq1104180120 发表于 2017-5-25 21:46
关键是这个语句if(DMA_GetFlagStatus(DMA1_FLAG_TC4)!=RESET)判断不为真,表示传输还没完成,应该不是清 ...

dma m2m enable试试,gpio要使用内存到内存
回复

使用道具 举报

4

主题

380

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3088
金钱
3088
注册时间
2015-10-17
在线时间
320 小时
发表于 2017-5-24 13:42:17 | 显示全部楼层
dma速度很快的,你这个原理你都没弄清楚;不知你在写什么,你就采样了一个数据,normal模式,又不重开dma。还是多看看书吧,103的资料挺多的。昨天研究030的dma,单次模式中间突然不能dma中断了,花了一天时间百度,才研究出来原因,现在还没搞明白为什么会出现,而103不会出现。
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2017-3-31
在线时间
8 小时
 楼主| 发表于 2017-5-24 15:02:14 | 显示全部楼层
hgr211 发表于 2017-5-24 13:42
dma速度很快的,你这个原理你都没弄清楚;不知你在写什么,你就采样了一个数据,normal模式,又不重开dma。 ...

你好,我这是一个测试程序,我就是想重复采取GPIOA0-GPIOA7的数据,把采集的数据放在一个数组中,然后打印出数组的值,但是一直观察不到数组的值。大神解答一下。
回复

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
450
金钱
450
注册时间
2017-3-31
在线时间
118 小时
发表于 2017-5-24 17:18:49 | 显示全部楼层
DMA外设基地址 的 cpar是什么
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2017-3-31
在线时间
8 小时
 楼主| 发表于 2017-5-24 17:33:15 | 显示全部楼层
Owen 发表于 2017-5-24 17:18
DMA外设基地址 的 cpar是什么

&GPIOA->IDR,是GPIO的输入数据寄存器
回复

使用道具 举报

4

主题

380

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3088
金钱
3088
注册时间
2015-10-17
在线时间
320 小时
发表于 2017-5-25 10:20:14 | 显示全部楼层
原子的列子,好像摄像头那个是不是用的你这个方式,你可以去参考下。你昨天程序,2048那里,我明显看的是1啊,你改了,还是我昨天看花了。你去看下dma的normal模式说明,那个是要重启的。
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2017-3-31
在线时间
8 小时
 楼主| 发表于 2017-5-25 12:01:27 | 显示全部楼层
hgr211 发表于 2017-5-25 10:20
原子的列子,好像摄像头那个是不是用的你这个方式,你可以去参考下。你昨天程序,2048那里,我明显看的是1 ...

程序我昨天修改了一下,开始是1,你没看错,我去看看原子的摄像头教程,看看有没有新发现,谢谢你!
回复

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
450
金钱
450
注册时间
2017-3-31
在线时间
118 小时
发表于 2017-5-25 20:29:27 | 显示全部楼层
6楼说的对,normal模式每次传输完成要重置NDTR寄存器,清DMA_FLAG_TCIF标志位,不然的话即便使能也不会启动
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2017-3-31
在线时间
8 小时
 楼主| 发表于 2017-5-25 21:46:56 | 显示全部楼层
Owen 发表于 2017-5-25 20:29
6楼说的对,normal模式每次传输完成要重置NDTR寄存器,清DMA_FLAG_TCIF标志位,不然的话即便使能也不会启动

关键是这个语句if(DMA_GetFlagStatus(DMA1_FLAG_TC4)!=RESET)判断不为真,表示传输还没完成,应该不是清标志的问题,给我感觉像DMA没启动一样。
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2017-3-31
在线时间
8 小时
 楼主| 发表于 2017-6-15 21:08:02 | 显示全部楼层
Owen 发表于 2017-5-26 11:44
dma m2m enable试试,gpio要使用内存到内存

你说得对,我采用m2m,可以实现了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-18 04:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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