启用流后,DMA_SxNDTR会将自身设置为最大值(65535)

时间:2018-10-10 10:43:56

标签: dma stm usart

我正在尝试将DMA与USART1一起使用,以接收stm32f205xx系列中的数据。在初始化序列之后,我读取了NDTR寄存器,它的值为4,与我放置的值完全相同。但是,在启用流后,NDTR的值为65535。

RCC->AHB1ENR |= RCC_AHB1ENR_DMA2EN;
DMA2_Stream2->CR &= ~DMA_SxCR_EN;
while(DMA2_Stream2->CR & DMA_SxCR_EN);
DMA2_Stream2->PAR = (uint32_t)&(USART1->DR);
DMA2_Stream2->M0AR = (uint32_t)&test_array[0];
DMA2_Stream2->NDTR = 4;
uint32_t temp = DMA2_Stream2->NDTR; // HERE 4
DMA2_Stream2->CR |= (4<<25);        //ch4 for stream 2
DMA2_Stream2->CR |= (3<<16);        //very high priority
DMA2_Stream2->CR |= (1<<10);        //increment memory
DMA2_Stream2->CR |= (1<<5);         //flow control
DMA2_Stream2->CR |= (1<<4);         //transmit complete interrupt enable
DMA2_Stream2->CR |= (1<<2)|(1<<1);  //all interrupts available
DMA2_Stream2->FCR |= (1<<7);  //all interrupts available

NVIC_EnableIRQ(DMA2_Stream2_IRQn);
uart1_init();
DMA2_Stream2->CR |= DMA_SxCR_EN;


temp = DMA2_Stream2->NDTR; //HERE 65535

2 个答案:

答案 0 :(得分:1)

这是将DMA配置寄存器设置为外围设备流量控制而不是“常规”流量控制的症状。

  • 在“正常”流控制中,DMA_SxNDTR设置要传输的数据块数,并且每次传输项目时都会减少。 DMA_SxNDTR达到0时传输完成。
  • 使用“外围”流量控制时,外围设备通过其他方式向DMA控制器发送传输结束信号。

摘自STM32F767参考手册 RM0410第8.2节(适用于其他MCU,但具有相似的外围硬件)

  

– DMA流量控制器:要传输的数据项的数量是软件可编程的   从1到65535

     

–外围流量控制器:要传输的数据项的数量未知   并由发出信号结束的源或目标外围设备控制   硬件转移

另请参见同一手册中的 8.3.16流量控制器部分

答案 1 :(得分:0)

这是错误的 DMA2_Stream2-> CR | =(1 << 5); //流量控制 阅读参考手册Flow Control