我有 UART TX 与 DMA 和基本传输类型一起工作。 有时、我必须执行大于1024个周期的 DMA 周期。 为了解决硬件限制问题、我在主源和备用源之间拆分数据并使用 PNGPPONG 模式。 DMA 传输第一次工作、发送全部1288字节。 我在 UART 上接收数据、但 DMA 在该数据之后不执行任何传输。 切换回基本模式也不再起作用。 在基本模式下、DMA 中断触发。 在 pingpong 期间、中断会触发两次、一次是主中断、一次是备用中断、然后再也不会触发。
//使用乒乓 void Telemetry_pop (void)发送数据{ //Half HRT to Primary Channel (//半 HRT 至主通道) DICE_TX_BUSY=1; MAP_DMA_setChannelTransfer (DMA_CH4_EUSCIA2TX | UDMA_PRI_SELECT、UDMA_MODE_PINGONG、 TLM_BUF.buffer[TLM_BUF.tail].all_8、(void*) DICE_TX、HRT_MESSAGE/2); MAP_DMA_setChannelTransfer (DMA_CH4_EUSCIA2TX | UDMA_ALT_SELECT、UDMA_MODE_PINGONG、 &TLM_BUF.buffer[TLM_BUF.tail].all_8[HRT_MESSAGE_SIZE/2]、(void*) DICE_TX、HRT_MESSAGE/2); TLM_BUF.tail=(TLM_BUF.tail+1)%TLM_BUF_SIZE; TLM_BUF.packet_count--; MAP_DMA_enableChannel (4); MAP_DMA_enableInterrupt (DMA_INT1); } //发送基本 情况下的数据 HS_DATA: MAP_DMA_setChannelTransfer (DMA_CH4_EUSCIA2TX | UDMA_PRI_SELECT、UDMA_MODE_BASIC、 priority_BUF.HS_DATA_BUF.buffer[priority_BUF.HS_DATA_BUF.tail].all_8、(void*) DICE_TX、HS_DATA_SIZE); priority_BUF.HS_DATA_BUF.tail=(priority_BUF.HS_DATA_BUF.tail+1)%hsdata_buf_size; priority_BUF.HS_DATA_BUF.packet_count--; 中断; } MAP_DMA_enableChannel (4); MAP_DMA_enableInterrupt (DMA_INT1); // DMA 配置 map_dma_enableModule(); MAP_DMA_setControlBase (MSP_EXP432P401RLP_DMAControlTable); MAP_DMA_assignChannel (DMA_CH4_EUSCIA2TX);//将 DMA 通道4分配给 EUSCI_A2_TX MAP_DMA_disableChannelAttribute (DMA_CH4_EUSCIA2TX、UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIOR| UDMA_ATTR_REQMASK); MAP_DMA_setChannelControl (DMA_CH4_EUSCIA2TX | UDMA_PRI_SELECT、UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARB_1); MAP_DMA_setChannelControl (DMA_CH4_EUSCIA2TX | UDMA_ALT_SELECT、UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARB_1); MAP_DMA_赋 值中断(DMA_INT1、4); MAP_DMA_clearInterruptFlag (4); MAP_Interrupt_enableInterrupt (DMA_INT1); //DMA_INT1处理程序 void DMA_INT1_IRQHandler (void){ uint32_t ui32modeA、ui32modeB; ui32ModeA=MAP_DMA_getChannelMode (DMA_CH4_EUSCIA2TX | UDMA_PRI_SELECT); ui32ModeB=MAP_DMA_getChannelMode (DMA_CH4_EUSCIA2TX | UDMA_ALT_SELECT); if (ui32modeA=udma_mode_stop && ui32modeB=udma_mode_stop) { DICE_TX_BUSY=0; MAP_DMA_disableInterrupt (DMA_INT1); } MAP_DMA_clearInterruptFlag (4); }