搜索
查看: 3637|回复: 8

[已解决] 关于stm32f407的三重DMA模式

[复制链接]

该用户从未签到

8

主题

25

帖子

0

蝴蝶豆

初级会员

最后登录
1970-1-1
发表于 2014-12-16 15:59:30 | 显示全部楼层 |阅读模式
FLGKRKUN%W9TST6KU93(@J2.jpg
请问大侠,这边手册说的生成3个DMA请求不知道是哪个DMA通道生成的。ADC1 、ADC2 、ADC3不是在DMA2模块中不是都有对应的相应的数据流和通道。
1、是否是ADC1、ADC2、ADC3只要一个ADC设置相应的DMA通道,并启动。如,设置ADC1相对应的DMA通道,并启动。当ADC1装换完成时,ADC1对应的DMA通道是不是就会发出3个DMA请求?
2、是否是ADC1、ADC2、ADC3每个ADC都要设置相应的DMA通道,并启动。如,要设置ADC1、ADC2、ADC3相对应的通道,并启动。当ADC1转换完成时,就生成一个ADC1相对应的DMA请求,当ADC2转换完成时,就生成一个ADC2相对应的DMA请求,当ADC3转换完成时,就生成一个ADC3相对应的DMA请求?
不知道是上面的哪种情况,还是都不是?


回复

使用道具 举报

该用户从未签到

4

主题

33

帖子

0

蝴蝶豆

高级会员

最后登录
2020-12-7
发表于 2014-12-16 18:31:51 | 显示全部楼层
希望有用
QQ截图20141216183056.png
回复

使用道具 举报

该用户从未签到

93

主题

2542

帖子

4

蝴蝶豆

论坛元老

最后登录
2021-5-9
发表于 2014-12-18 14:17:16 | 显示全部楼层
DMA传输有三个步骤:

1.    从外设数据寄存器或者内存中取出数据,外设数据寄存器地址和内存地址分别由DMA_SxPAR寄存器和DMA_SxM0AR寄存器给出

2.   将取出的数据进行存储

3.   DMA_SxNDTR寄存器的自减,DMA_SxNDTR寄存器里的值表示还需要传输的数据个数

通道选择:

每个数据流的通道可以通过DMA_SxCR寄存器中的CHSEL[2:0] 设置。通道和数据流的映射祥参数据手册
回复 支持 反对

使用道具 举报

该用户从未签到

15

主题

232

帖子

0

蝴蝶豆

金牌会员

最后登录
2019-11-11
发表于 2014-12-18 15:03:31 | 显示全部楼层
是情况二,每个ADC通道转换结束都会产生一个DMA请求,产生DMA请求的同时会判断DMA[1:0]位是否为01,是01则一次性完成三个DMA数据传输到SRAM,如果不是会继续按照既定设置ADC采样。
回复 支持 反对

使用道具 举报

该用户从未签到

8

主题

25

帖子

0

蝴蝶豆

初级会员

最后登录
1970-1-1
 楼主| 发表于 2014-12-18 15:38:54 | 显示全部楼层
奔跑小蜗牛 发表于 2014-12-18 15:03
是情况二,每个ADC通道转换结束都会产生一个DMA请求,产生DMA请求的同时会判断DMA[1:0]位是否为01,是01则 ...

没听明白,能否说的详细点。一次性完成三个DMA数据传输到SRAM,这三个DMA请求是不是让一个同一个DMA通道传输三次。还是怎么?
回复 支持 反对

使用道具 举报

该用户从未签到

10

主题

206

帖子

0

蝴蝶豆

金牌会员

最后登录
2020-7-18
发表于 2014-12-19 09:07:43 | 显示全部楼层
  • /***DMA设置***/
  • void ADC_DMA_Config(void)
  • {
  •   RCC->AHB1ENR |= (1<<22); //使能DMA2时钟
  •   ADC3->CR2 &= ~(1<<8);//ADC3 dma发送模式除能
  •   DMA2_Stream0->CR &= 0xFFFFFFFE; //除能DMA2_Stream0
  •   while(DMA2_Stream0->CR & 0x00000001);//确保DMA可以被设置
  •   DMA2->LIFCR |= 0x0000003D;//传送前清空DMA2_Stream0所有中断标志
  •   DMA2_Stream0->PAR = (uint32_t)&ADC->CDR;//设置外设地址
  •   DMA2_Stream0->M0AR = (uint32_t)ADCConvertedVault; //设置内存地址
  •   DMA2_Stream0->CR |= 0x0002800;//16位数据
  •   DMA2_Stream0->NDTR = 10000; //设置dma传输数据的数量
  •   /*
  •     设置dma2通道0,即ADC1
  •     优先级Medium
  •     传输方向外设到内存
  •     内存递增模式
  •     循环模式
  •     传输完成中断
  •   */
  •   DMA2_Stream0->CR |= ( 0x00000000 | 0x00010000 | 0x0 | (1<<10) | (1<<8) | (1<<4) );
  •   NVIC->IP[56] = 0xB0;
  •   NVIC->ISER[1] |= (1<<(56-32));
  •   DMA2_Stream0->CR |= 1; //DMA2数据流0使能
  • }
  • 这是三重ADC转换时DMA设置的函数,不过是寄存器写的, DMA2_Stream0->PAR = (uint32_t)&ADC->CDR;//设置外设地址,DMA2数据流0外设地址指向了ADC->CDR寄存器地址

回复 支持 反对

使用道具 举报

该用户从未签到

307

主题

3432

帖子

0

蝴蝶豆

论坛元老

最后登录
2020-7-17
发表于 2014-12-22 13:41:47 | 显示全部楼层
楼主问题是否解决了呢?谢谢楼上几位朋友回答
回复 支持 反对

使用道具 举报

该用户从未签到

8

主题

25

帖子

0

蝴蝶豆

初级会员

最后登录
1970-1-1
 楼主| 发表于 2014-12-24 15:11:01 | 显示全部楼层
谢谢大家的知道,问题已经解决
回复 支持 反对

使用道具 举报

该用户从未签到

8

主题

25

帖子

0

蝴蝶豆

初级会员

最后登录
1970-1-1
 楼主| 发表于 2014-12-24 15:14:41 | 显示全部楼层
沐紫 发表于 2014-12-22 13:41
楼主问题是否解决了呢?谢谢楼上几位朋友回答

管理员大虾,我在写程序的时候,用的双重规则同时模式,发现一旦adc转换设定为定时器触发,软件触发便触发不了adc转换。是程序问题还是单片机自身限制。查阅芯片手册没有发现关于这个的说明。谢谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-29 04:43 , Processed in 1.205769 second(s), 44 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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