发新帖我要提问
12
返回列表
打印
[STM32F4]

大声的问一句关于STM32F407 DMA重启的问题解决了么,快疯了。

[复制链接]
楼主: lee_hwa
手机看帖
扫描二维码
随时随地手机跟帖
21
lee_hwa|  楼主 | 2013-12-19 17:29 | 只看该作者 回帖奖励 |倒序浏览
ticomi 发表于 2013-12-19 09:24
外设是ADC,高速ADC。这段代码是在DMA采集完成的中断里实现的。
先关闭DMA的接收和发送通道,然后清除对 ...

DMA_InitStructure.DMA_Mode =DMA_Mode_Normal; 你用的是这个么?

使用特权

评论回复
22
ticomi| | 2013-12-19 17:34 | 只看该作者
lee_hwa 发表于 2013-12-19 17:29
DMA_InitStructure.DMA_Mode =DMA_Mode_Normal; 你用的是这个么?

是的

DMA_Struc.DMA_Channel             = DMA_Channel_3;                                                        //Channel3 of DMA2 
        DMA_Struc.DMA_PeripheralBaseAddr  = (uint32)(&(SPI1->DR));                  //SPI1 data register(SPI1_BASE+0x0C)
        DMA_Struc.DMA_Memory0BaseAddr     = (uint32)(ADC_RX_Buffer);                //Memory address
        DMA_Struc.DMA_DIR                 = DMA_DIR_PeripheralToMemory;
        DMA_Struc.DMA_BufferSize          = (uint32)(ADC_RX_SIZE);      //Memory buffer size
        DMA_Struc.DMA_PeripheralInc       = DMA_PeripheralInc_Disable;
        DMA_Struc.DMA_MemoryInc           = DMA_MemoryInc_Enable;
        DMA_Struc.DMA_PeripheralDataSize  = DMA_PeripheralDataSize_Byte;
        DMA_Struc.DMA_MemoryDataSize      = DMA_MemoryDataSize_Byte;
        DMA_Struc.DMA_Mode                = DMA_Mode_Normal;
        DMA_Struc.DMA_Priority            = DMA_Priority_High;                                        //Priority_High
        DMA_Struc.DMA_FIFOMode            = DMA_FIFOMode_Disable;                          //Disable FIFO mode        
        DMA_Struc.DMA_FIFOThreshold       = DMA_FIFOThreshold_Full;
        DMA_Struc.DMA_MemoryBurst         = DMA_MemoryBurst_Single;
        DMA_Struc.DMA_PeripheralBurst     = DMA_PeripheralBurst_Single;
        DMA_Init(DMA2_Stream0, &DMA_Struc);

使用特权

评论回复
23
lee_hwa|  楼主 | 2013-12-19 18:10 | 只看该作者
ticomi 发表于 2013-12-19 17:34
是的

今天的成果是:
如果DMA_InitStructure.DMA_Mode =DMA_Mode_Normal;   死活停了中断进不去。
如果  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;可以反复进入中断,但是连续跑采集数据不对。单步调试采集数据是对的。

使用特权

评论回复
24
ticomi| | 2013-12-19 19:07 | 只看该作者
lee_hwa 发表于 2013-12-19 18:10
今天的成果是:
如果DMA_InitStructure.DMA_Mode =DMA_Mode_Normal;   死活停了中断进不去。
如果  DMA_I ...

建议你仔细看下ADC的资料,我也曾经遇到这样的问题,是ADC的问题。

软件设计时尽量不要在中断里做过多的工作,DMA的工作就是节省CPU的工作量,所以尽量使用DMA采集数据,然后处理数据时使用CPU即可。

使用特权

评论回复
25
lee_hwa|  楼主 | 2013-12-20 11:03 | 只看该作者
ticomi 发表于 2013-12-19 19:07
建议你仔细看下ADC的资料,我也曾经遇到这样的问题,是ADC的问题。

软件设计时尽量不要在中断里做过多的 ...

仔细看了文档,找到了一部分问题,就是AD采样的overrun了,所以DMA不响应。现在我把overrun给清了,所以DMA的两个模式都可以响应了。但是overrun以后,AD采样数据就不对了。问题是overrun是怎么造成的呀。我用的是自带的AD,不是外接的高速AD

使用特权

评论回复
26
ticomi| | 2013-12-22 09:47 | 只看该作者
lee_hwa 发表于 2013-12-20 11:03
仔细看了文档,找到了一部分问题,就是AD采样的overrun了,所以DMA不响应。现在我把overrun给清了,所以D ...

建议你看下资料手册,一般会给出建议的采样速度等,根据需求来确定采用速度,如果内部ADC不能满足需要可以考虑采用外部的。

使用特权

评论回复
27
lee_hwa|  楼主 | 2013-12-24 15:41 | 只看该作者
基本解决了:
1.禁止掉所有外设,包括timer和ad,之前不行就是忘了禁止timer。
2.要清Ad的over位,否则还是不行。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则