打印

请问,F407的DMA非循环模式下,传输完一次数据如何再重新启动

[复制链接]
2195|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
595818431|  楼主 | 2013-10-10 15:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,困扰好久。试了下,无论是循环还是单次模式,一旦关闭了DMA,就再也无法重新启动了
沙发
610095871| | 2013-10-10 16:21 | 只看该作者


f1系列是这样解决的 ,你可以参考下。
STM32F10x常见应用解析.pdf (2.07 MB)

使用特权

评论回复
板凳
香水城| | 2013-10-10 16:57 | 只看该作者
1楼给出的文档是针对STM32F1的,F4的DMA模块和F2是一样的,和F1是不一样的,因此图中描述的寄存器不能对应。

但是有一个概念是一样,就是:一次DMA传输完毕,对应的“传输数据个数”寄存器就自减为0了。要启动下一次传输,即使重新使能DMA对应通道,如果不重新配置“传输数据个数”寄存器,新的DMA传输无法开始。

使用特权

评论回复
地板
feilusia| | 2013-10-10 17:11 | 只看该作者
给你参考下我的f103的SPI关于使能DMA的程序。
void SPI2_DMA_SEND( u8 *pBuffer,u16 Write_Num )                       
{
        DMA1_Channel5->CCR &= ~(1<<0);                         //关闭DMA通道5
        DMA1_Channel5->CMAR = (u32)pBuffer ;                 //设置DMA存储器地址
        DMA1_Channel5->CNDTR = Write_Num ;                //重设传输长度       
        DMA1_Channel5->CCR |= 1<<0 ;                         //开启DMA发送通道5
}
void SPI2_IRQHandler()//负责接收DMA要接收的数据长度                                                                       
{       
        SPI2->CR2 &= ~(1<<6);  //SPI设备中断失能
        SPI2_DataLength_Receive();//接收DMA的数据长度
        SPI2_DataLength_Judge();//判断接收到的DMA数据长度是否正确,正确则使能DMA的接收通道,错误则报错
}

使用特权

评论回复
5
595818431|  楼主 | 2013-10-10 23:56 | 只看该作者
香水城 发表于 2013-10-10 16:57
1楼给出的文档是针对STM32F1的,F4的DMA模块和F2是一样的,和F1是不一样的,因此图中描述的寄存器不能对应 ...

试了下,还是不行
启动代码如下
void DMA_START()
{
       
DMA_InitTypeDef DMA_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;
/* DMA2 Stream0 channel0 configuration */
DMA_Cmd(DMA2_Stream0, DISABLE);
  DMA_InitStructure.DMA_Channel = DMA_Channel_0;  
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC_CDR_ADDRESS;
  DMA_InitStructure.DMA_Memory0BaseAddr =(uint32_t)AD_Convertval;//(uint32_t)&ADCDualConvertedValue;//

  DMA_InitStructure.DMA_BufferSize = 8000;

  DMA_Init(DMA2_Stream0, &DMA_InitStructure);
       

  DMA_Cmd(DMA2_Stream0, ENABLE);
}

使用特权

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

本版积分规则

4

主题

16

帖子

1

粉丝