东方树叶乌龙茶 发表于 2016-7-21 14:09:09

STM32F407 定时器触发DMA 求助大神

本帖最后由 东方树叶乌龙茶 于 2016-7-21 14:11 编辑

求助大神们,现在想用定时器触发DMA,将一个地址里的数据转移到数组里。每1us转移一次,一共转移30次。也就是说源地址不变,目标地址递增。这个数组最终用了30us存入30个数据。
DMA的配置:
DMA_InitTypeDef       DMA_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
       
DMA_InitStructure.DMA_Channel = DMA_Channel_7;
DMA_InitStructure.DMA_PeripheralBaseAddr =ADDRESS;//设置DMA源
DMA_InitStructure.DMA_Memory0BaseAddr = DMA_Address;//(uint32_t)&Answer_Frame;//内存地址
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToMemory;//方向:内存到内存
DMA_InitStructure.DMA_BufferSize = 1;//传输大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址不增
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//内存地址自增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外设数据单位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//内存数据单位
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//正常模式,只做一次DMA传输
DMA_InitStructure.DMA_Priority = DMA_Priority_High;//优先级:高
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;      
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(DMA2_Stream1, &DMA_InitStructure);

问题是:
BufferSize设置为30,则触发一次后30个数据就全转移完了。
BufferSize设置为1,就只能在数组第一位存入数据其余全是空白的了。
Mode设成Circular也是不对的。定时器那里我只是加了一句:TIM_DMACmd(TIM8,TIM_DMA_Update,ENABLE);
是要定时中断服务程序里面再写什么吗?还是STM32F4的DMA没法直接配置成我想要的这种形式?
请各位大神予以指点!谢谢

东方树叶乌龙茶 发表于 2016-7-21 17:05:26

然后自己解决了....
MemoryToMemory模式不能设置请求源,DMA会直接以总线速率将数据转移。所以要用外设到内存模式

长风破 发表于 2016-11-20 19:46:38

哥们,你的问题解决了吗?是触发一次传一个数据还是一下子全转移完?还有数据个数是怎么设置的?是1还是30?

遇春 发表于 2024-4-8 14:57:30

东方树叶乌龙茶 发表于 2016-7-21 17:05
然后自己解决了....
MemoryToMemory模式不能设置请求源,DMA会直接以总线速率将数据转移。所以要用外设到内 ...

佬,能问下为啥memory to memory 不能被请求啊,是因为产生一个定时器中断也可以在中断处理函数里面进行memore to memory 所以不用DMA多次一举吗。佬,这个不能被请求是从哪里看到的呀
页: [1]
查看完整版本: STM32F407 定时器触发DMA 求助大神