eric2013 发表于 2020-5-24 15:46:32

这是什么幺蛾子,F407中DMA1里面的几个定时器UP事件都不可以触发DMA,而DMA2里面的可以



这幺蛾子真是坑死人。

看了下勘误手册里面也没有对应的说明。

莫非那些地方有些特别设置没有注意到。。。。


DMA1里面的都无法正常使用:





而DMA2里面的都正常








eric2013 发表于 2020-5-24 15:48:28

调用就会触发DMA传输错误。
/* Transfer Error Interrupt management ***************************************/
if ((tmpisr & (DMA_FLAG_TEIF0_4 << hdma->StreamIndex)) != RESET)
{
    if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_TE) != RESET)
    {
      /* Disable the transfer error interrupt */
      hdma->Instance->CR&= ~(DMA_IT_TE);
      
      /* Clear the transfer error flag */
      regs->IFCR = DMA_FLAG_TEIF0_4 << hdma->StreamIndex;
      
      /* Update error code */
      hdma->ErrorCode |= HAL_DMA_ERROR_TE;
    }
}


eric2013 发表于 2020-5-24 18:56:45

已经解决,是个超大个的幺蛾子。


这么多年了,才发现STM32F4系统使用DMA1的大坑,只有DMA2才是完全体
http://www.armbbs.cn/forum.php?m ... id=97900&fromuid=58
(出处: 硬汉嵌入式论坛)

落叶凋零 发表于 2020-5-25 10:19:00

感谢分享,那DMA1设置这么多的TIM_UP事件干嘛呢。

eric2013 发表于 2020-5-25 11:44:58

落叶凋零 发表于 2020-5-25 10:19
感谢分享,那DMA1设置这么多的TIM_UP事件干嘛呢。

让大部分定时器都支持上。

平哥 发表于 2023-8-1 16:54:51

我最近也在基于V6调试TIM2(PA3为例)的更新事件触发DMA,使用DMA更新CCR,经过一番折腾是可以的,要点在于TIM2是32Bit,ccr内存值和DMA初始化需要特别注意,
uint32_t ccr[];
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
DMA1仅与APB1是直连的,所以仅可以访问APB1总线下的外设.是不可以访问别的总线上的外设.
DMA2通过总线矩阵访问AHB1,AHB2,SRAM1,SRAM2,FSMC.

页: [1]
查看完整版本: 这是什么幺蛾子,F407中DMA1里面的几个定时器UP事件都不可以触发DMA,而DMA2里面的可以