1 DMA怎么知道外设接收缓冲区有新的数据到来?
也就是外设怎么通知DMA接收缓冲区有新的数据了?
比如SPI接收的数据,通过DMA搬运到内存里面,DMA怎么知道SPI的缓冲区里面有新的数据到来
解答:在SPI的寄存器中有这样的标志位,当这些标志位位置位的时候就会自动触发DMA进行相应的动作
TXDMAEN:发送缓冲区DMA使能
当该位被设置时,TXE标志一旦被置位就发出DMA请求
0:禁止发送缓冲区DMA
1:启动发送缓冲区DMA
RXDMAEN:接收缓冲区DMA使能
当该位被设置时,RXNE标志一旦被置位就发出DMA请求
0:禁止接收缓冲区DMA
1:启动接收缓冲区DMA
2 DMA怎么知道外设的发送缓冲区是空,或者是未满的呢?
也就是外设怎么通知DMA发送缓冲区可以发送数据了
比如SPI发送数据,DMA怎么知道SPI的发送缓冲区是未满的呢?
解答:如问题1中的解答
实际测试,使用DMA发送串口数据时,能正确的从串口发送出正确数据,说明DMA和串口之间是有发送缓冲区空的判断的,这些都是由硬件来判断的
3 DMA的传输应该是不需要中断的参与的,如果有中断参与的话,就失去了DMA的意义了
解答:如上问题1和2中的解答,DMA的数据的搬运不需要外设中断的参与,只需要相关的标志位置位了就会触发DMA动作
4 每一次DMA的传输启动是在哪里进行的呢?
解答:在循环发送中,只需要启动一次
在单次发送中,只需要把数据填充完了就可以启动一次发送
5 启动了一次DMA 外设到内存的传输,不管外设的接收缓冲区有没有新的数据到来都回去读数据吗?
还是说系统自己内部有同步机制来保证当外设有新的数据到来的时候,DMA才去读数据
解答:如问题1和2中的描述
6 同一通道,一个时刻只能对应一个源地址和目标地址. 不能对应多个的. 以你最后设置为准.
7 stm32的dma能不能直接由外设到外设传输
8 在内存到内存的方式中,那个存外设地址的寄存器,就变为了一个存放内存地址的寄存器
9 stm32 dma 触发源
解答:如问题1和2中的解答,都是SPI,但是也有TEX和RXNE两个标志位可以触发DMA,
所以一个外设也有多个触发DMA的方式
也就是外设怎么通知DMA接收缓冲区有新的数据了?
比如SPI接收的数据,通过DMA搬运到内存里面,DMA怎么知道SPI的缓冲区里面有新的数据到来
解答:在SPI的寄存器中有这样的标志位,当这些标志位位置位的时候就会自动触发DMA进行相应的动作
TXDMAEN:发送缓冲区DMA使能
当该位被设置时,TXE标志一旦被置位就发出DMA请求
0:禁止发送缓冲区DMA
1:启动发送缓冲区DMA
RXDMAEN:接收缓冲区DMA使能
当该位被设置时,RXNE标志一旦被置位就发出DMA请求
0:禁止接收缓冲区DMA
1:启动接收缓冲区DMA
2 DMA怎么知道外设的发送缓冲区是空,或者是未满的呢?
也就是外设怎么通知DMA发送缓冲区可以发送数据了
比如SPI发送数据,DMA怎么知道SPI的发送缓冲区是未满的呢?
解答:如问题1中的解答
实际测试,使用DMA发送串口数据时,能正确的从串口发送出正确数据,说明DMA和串口之间是有发送缓冲区空的判断的,这些都是由硬件来判断的
3 DMA的传输应该是不需要中断的参与的,如果有中断参与的话,就失去了DMA的意义了
解答:如上问题1和2中的解答,DMA的数据的搬运不需要外设中断的参与,只需要相关的标志位置位了就会触发DMA动作
4 每一次DMA的传输启动是在哪里进行的呢?
解答:在循环发送中,只需要启动一次
在单次发送中,只需要把数据填充完了就可以启动一次发送
5 启动了一次DMA 外设到内存的传输,不管外设的接收缓冲区有没有新的数据到来都回去读数据吗?
还是说系统自己内部有同步机制来保证当外设有新的数据到来的时候,DMA才去读数据
解答:如问题1和2中的描述
6 同一通道,一个时刻只能对应一个源地址和目标地址. 不能对应多个的. 以你最后设置为准.
7 stm32的dma能不能直接由外设到外设传输
8 在内存到内存的方式中,那个存外设地址的寄存器,就变为了一个存放内存地址的寄存器
9 stm32 dma 触发源
解答:如问题1和2中的解答,都是SPI,但是也有TEX和RXNE两个标志位可以触发DMA,
所以一个外设也有多个触发DMA的方式