OpenEdv-开源电子网

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

求助!!!!STM32F103的DMA存储器到存储器和外设到外设传输程序如何编写?

[复制链接]

12

主题

48

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2019-7-16
在线时间
59 小时
发表于 2019-7-29 14:31:51 | 显示全部楼层 |阅读模式
1金钱
求助!!!!STM32F103的DMA存储器到存储器和外设到外设传输程序如何编写?
库函数版本的传输方向库里面只给了(((DIR) == DMA_DIR_PeripheralDST) || \((DIR) == DMA_DIR_PeripheralSRC))两个选项,在网上找的例程有DMA_DIR_MemoryToMemory,但是库里面好像没有,一写就报错
还有,存储器到存储器传输的话,应该选择哪个通道?数据手册额里面只写了    当设置了DMA_CCRx寄存器中的MEM2MEM位之后,在软件设置了DMA_CCRx寄存器中的EN位启动DMA通道时, DMA传输将马上开始。当DMA_CNDTRx寄存器变为0时, DMA传输结束  ,没有写选择哪个通道
各位大佬帮帮忙

最佳答案

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

DMA_DIR_PeripheralSRC:从外设读 DMA_DIR_PeripheralDST:从内存读 都没指定去向,可以外设到外设 f4好像指定了只有dma2可以,不过没测试过 参考图203页图25 两个 DMA 控制器的系统实现 DMA_M2M_Enable DMA_M2M_Disable 实际意思是 关闭表示只有事件产生才传输一次数据,开启表示一直传输 也没有别的意思,给字面意思有点差异
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-7-29 14:31:52 | 显示全部楼层
本帖最后由 nashui_sx 于 2019-8-20 10:31 编辑

DMA_DIR_PeripheralSRC:从外设读  DMA_DIR_PeripheralDST:从内存读    都没指定去向,可以外设到外设  f4好像指定了只有dma2可以,不过没测试过 参考图203页图25  两个 DMA 控制器的系统实现

DMA_M2M_Enable  DMA_M2M_Disable   实际意思是  关闭表示只有事件产生才传输一次数据,开启表示一直传输   也没有别的意思,给字面意思有点差异
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-7-30 02:34:49 | 显示全部楼层
看参考手册
回复

使用道具 举报

12

主题

48

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2019-7-16
在线时间
59 小时
 楼主| 发表于 2019-7-30 08:07:21 | 显示全部楼层

我看到参考手册里面有写设置DMA_CCRx寄存器中的MEM2MEM位,那此时DMA_InitStructure.DMA_DIR用库函数怎么设置呢?网上的例程用的是DMA_DIR_MemoryToMemory,但是F1的头文件中并没有这个定义
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2019-7-30 08:30:09 | 显示全部楼层
发一个STM32F103ZET6芯片通过DAM实现USART<->USART,楼主可以参考,代码如下:
void sUSART_Configuration(void)
{
        USART_InitTypeDef USART_InitStructure;
        DMA_InitTypeDef DMA_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
  
        /* USART1 Pins configuration ************************************************/

        /* Enable the USART3 Pins Software Remapping */
        //GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE);
  
        /* Enable the USART2 Pins Software Remapping */
        //GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);  
       
        /* Configure USARTy Tx as alternate function push-pull */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        /* Configure USARTz Rx as input floating */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_InitStructure);  
       
        /* Configure USARTy Tx as alternate function push-pull */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        /* Configure USARTz Rx as input floating */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_InitStructure);  

        /*------------------------------- USART-------------------------------------*/  
        /* USARTx configured as follow:
        - BaudRate = 9600
        - Word Length = USART_WordLength_7b
        - Stop Bit = USART_StopBits_1
        - Parity = USART_Parity_No
        - Hardware flow control disabled (RTS and CTS signals)
        - Receive and transmit enabled
        */
        USART_InitStructure.USART_BaudRate = 9600;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Tx| USART_Mode_Rx;
        USART_Init(USART1, &USART_InitStructure);
        USART_Init(USART2, &USART_InitStructure);

        /*------------------------------- DMA---------------------------------------*/   
        /* Common DMA configuration */
        DMA_InitStructure.DMA_BufferSize = 65535;
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
#if 0
        /* DMA1 Channel4 configuration */
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)(&USART1->DR);
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
        DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART2->DR);
        DMA_Init(DMA1_Channel4, &DMA_InitStructure);
#endif
#if 1
        /* DMA1 Channel5 configuration */
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)(&USART2->DR);
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
        DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART1->DR);
        DMA_Init(DMA1_Channel5, &DMA_InitStructure);
#endif
#if 0
        /* DMA1 Channel7 configuration */
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)(&USART2->DR);
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
        DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART1->DR);
        DMA_Init(DMA1_Channel7, &DMA_InitStructure);
#endif
#if 1
        /* DMA1 Channel6 configuration */
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)(&USART1->DR);
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
        DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART2->DR);
        DMA_Init(DMA1_Channel6, &DMA_InitStructure);
#endif
        /* Enable the USART4 Rx and Tx DMA1 requests */
        USART_DMACmd(USART2, USART_DMAReq_Rx|USART_DMAReq_Tx, ENABLE);
  
        /* Enable the USART1 Rx and Tx DMA1 requests */
        USART_DMACmd(USART1, USART_DMAReq_Tx|USART_DMAReq_Rx, ENABLE);
  
        /* Enable the DMA1 channels */
#if 0
        DMA_Cmd(DMA1_Channel4, ENABLE);
#endif
#if 1
        DMA_Cmd(DMA1_Channel5, ENABLE);
#endif
#if 0
        DMA_Cmd(DMA1_Channel7, ENABLE);
#endif
#if 1
        DMA_Cmd(DMA1_Channel6, ENABLE);
#endif
  
        /* Enable Usart */
        USART_Cmd(USART2, ENABLE);
        USART_Cmd(USART1, ENABLE);
       
        /* Test on Channels DMA_FLAG_TC flag */
#if 0
        while(!DMA_GetFlagStatus(DMA1_FLAG_TC4));
#endif
#if 1
        while(!DMA_GetFlagStatus(DMA1_FLAG_TC5));
#endif
#if 0
        while(!DMA_GetFlagStatus(DMA1_FLAG_TC7));
#endif
#if 1
        while(!DMA_GetFlagStatus(DMA1_FLAG_TC6));
#endif
  
        /* Clear DMA1 TC flags */
#if 0
        DMA_ClearFlag(DMA1_FLAG_TC4);
#endif
#if 1
        DMA_ClearFlag(DMA1_FLAG_TC5);
#endif
#if 0
        DMA_ClearFlag(DMA1_FLAG_TC7);
#endif
#if 1
        DMA_ClearFlag(DMA1_FLAG_TC6);
#endif
  
        /* Disable DMA2 channels */
#if 0
        DMA_Cmd(DMA1_Channel4, DISABLE);
#endif
#if 0
        DMA_Cmd(DMA1_Channel5, DISABLE);
#endif
#if 0
        DMA_Cmd(DMA1_Channel7, DISABLE);
#endif
#if 0
        DMA_Cmd(DMA1_Channel6, DISABLE);
#endif
       
         /* Enable the USARTx Receive interrupt: this interrupt is generated when the
                USARTx receive data register is not empty */
        //USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
        //USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
  
        /* NVIC configuration */
        /* Enable the USART1 Interrupt */
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
       
        /* Enable the USART2 Interrupt */
        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}
一分耕耘一分收获。
回复

使用道具 举报

6

主题

359

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1604
金钱
1604
注册时间
2017-12-18
在线时间
173 小时
发表于 2019-7-30 08:36:40 | 显示全部楼层
加油哦
回复

使用道具 举报

12

主题

48

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2019-7-16
在线时间
59 小时
 楼主| 发表于 2019-7-30 10:48:24 | 显示全部楼层
yklstudent 发表于 2019-7-30 08:30
发一个STM32F103ZET6芯片通过DAM实现USARTUSART,楼主可以参考,代码如下:
void sUSART_Configuration(vo ...

谢谢你的好意,但是不是我要找的资料,而且你确定你这个代码没有问题嘛?我怎么感觉怪怪的
回复

使用道具 举报

12

主题

48

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2019-7-16
在线时间
59 小时
 楼主| 发表于 2019-7-30 13:46:16 | 显示全部楼层
nashui_sx 发表于 2019-7-30 12:06
DMA_DIR_PeripheralSRC:从外设读  DMA_DIR_PeripheralDST:从内存读    都没指定去向,可以外设到外设  f4好 ...

前半部分好像正确,但是后半部分,手册里面说的是使能的话开启内存到内存的传输,不使能的话就关闭内存到内存的传输,
还有一个问题,内存到内存传输的话应该选择通道几呢?
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2019-7-30 14:18:56 | 显示全部楼层
zifeiyu0921 发表于 2019-7-30 10:48
谢谢你的好意,但是不是我要找的资料,而且你确定你这个代码没有问题嘛?我怎么感觉怪怪的

简单测试过没有问题,信不信由你
一分耕耘一分收获。
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2019-7-30 14:20:08 | 显示全部楼层
nashui_sx 发表于 2019-7-30 12:06
DMA_DIR_PeripheralSRC:从外设读  DMA_DIR_PeripheralDST:从内存读    都没指定去向,可以外设到外设  f4好 ...

F4测试过不行
一分耕耘一分收获。
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-7-30 14:46:04 | 显示全部楼层
本帖最后由 nashui_sx 于 2019-7-30 14:47 编辑
zifeiyu0921 发表于 2019-7-30 13:46
前半部分好像正确,但是后半部分,手册里面说的是使能的话开启内存到内存的传输,不使能的话就关闭内存到 ...

DMA_M2M_Disable:非存储器到存储器模式(关闭内存到内存模式)  DMA_M2M_Enable:启动存储器到存储器模式(开启内存到内存模式)

我这么说你能彻底的理解区别,你不就在找内存到内存的通道了;按我刚才说的那句理解就不会找了
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-7-30 14:46:46 | 显示全部楼层

ok  一直没有测试,看手册说不行,下次就不想这个渠道了
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-8-20 10:28:44 | 显示全部楼层
本帖最后由 nashui_sx 于 2019-8-20 10:32 编辑
f1 dma外设到外设肯定可以
f4看手册说dma2可以 外设到外设 ,测试过了 可以,dma1也验证了不能外设到外设
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2019-8-20 13:41:57 | 显示全部楼层
nashui_sx 发表于 2019-8-20 10:28
f1 dma外设到外设肯定可以
f4看手册说dma2可以 外设到外设 ,测试过了 可以,dma1也验证了不能外设到外设

嗯 我也测试的不仔细,实际这么使用的也很少吧
一分耕耘一分收获。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-28 04:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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