本帖最后由 乘风飞扬 于 2024-10-16 11:38 编辑
8051U
【DMA-P2P, 外设直接送到外设】,CPU 彻底去修仙@8051U !
AI 单片机从 8051U开始增加了【DMA, P2P外设到外设功能】。
后续的 8052U / 32G144K256的DMA也会支持 P2P
DMA-P2P将源头外设获得的数据直接送往目标外设输出,
不需要经过CPU/RAM缓存, 是独立并行处理。
DMA支持P2P的外设有:
USART1, USART2, UART3, USART4,
SPI,I2C,ADC,I2S,
QSPI,I2S音频接口,
i8080/M6800接口-TFT彩屏/LCD12864
- #define P2P_SRC_UR1RX 0x10
- #define P2P_SRC_UR2RX 0x20
- #define P2P_SRC_UR3RX 0x30
- #define P2P_SRC_UR4RX 0x40
- #define P2P_SRC_SPIRX 0x50
- #define P2P_SRC_I2CRX 0x60
- #define P2P_SRC_LCMRX 0x70
- #define P2P_SRC_QSPIRX 0x80
- #define P2P_SRC_ADCRX 0x90
- #define P2P_SRC_I2SRX 0xA0
-
- #define P2P_DEST_UR1TX 0x01
- #define P2P_DEST_UR2TX 0x02
- #define P2P_DEST_UR3TX 0x03
- #define P2P_DEST_UR4TX 0x04
- #define P2P_DEST_SPITX 0x05
- #define P2P_DEST_I2CTX 0x06
- #define P2P_DEST_LCMTX 0x07
- #define P2P_DEST_QSPITX 0x08
- #define P2P_DEST_I2STX 0x0A
复制代码
DMA P2P支持2组外设同时工作:
- DMA_P2P_CR1 = P2P_SRC_UR1RX | P2P_DEST_UR1TX; //将UART1_RX接收到的数据从UART1_TX发送出去
- DMA_P2P_CR2 = P2P_SRC_UR1RX | P2P_DEST_UR2TX; //将UART1_RX接收到的数据从UART2_TX发送出去
复制代码
使用串口助手给MCU UART1发送数据时,UART1收到的数据会同时从UART1、UART2传出:
DMA_xxxx_AMTH, DMA_xxxx_AMT设置P2P透传数据字节数,透传数据量达到设置的数据个数(小于65536)就会产生DMA中断,并停止源外设的DMA接收功能,需要重新启动才能继续接收。
如果DMA_xxxx_AMTH, DMA_xxxx_AMT设置为0xFFFF,则DMA P2P无限透传。
DMA_xxx_ITVH, DMA_xxx_ITVL设置每个字节数据的DMA传输间隔时间。
使用P2P的话,目标外设的发送速度必需比源外设的接收速度快,否则可能导致数据丢失。
附件例子供参考,需要选择其它源外设时,可在对应的项目文件处右键选择“Options for File...”:
勾选“Include in Target Build”选项,并取消其它外设文件的这个选项:
最后重新编译。
|