主题中讨论的其他器件: TM4C129ENCPDT、 TM4C123
我们的 UART ISR 会被触发、但当我们调用时:
//了解触发中断的原因 UINT32_t 状态= MAP_UARTIntStatus (UART6_BASE、1);
调试器显示状态为0。
为什么触发中断?
我们正在与 DMA 进行 UART 通信、并尝试接收一个8字节的块。 我们期望中断使用 UART_INT_DMARX 触发、并设置指示 DMA 已完成的标志。 相反、状态为0、我们从不对接收到的数据执行操作。
UART 和 DMA 初始化:
到#if defined (ewarm)#pragma DATA_ALIGNing=1024 uint8_t DmaControlTable[1024];#Elif Defined (CCS)#pragma DATA_ALIGN (DmaControlTable、1024) uint8_t DmaControlTable[1024];#else uint8_t DmaCtlDmaControlTable[1024](Dma_attl)#pragma DATA_aligned (dma_uint_u_t );在 dma (Uta_sys_delt_eUST_dma_eDt_dma (Utl)期间启用)中断(Ut_dma_dma_dma_dma_dma_dma_dma_dma_dma_dma_dma_dma_dma_dma_dma_dma_dma_dma_dma_dma_dma_dma_dma_dma_dma_dma_dma_dma_dma_dma_dma_dma_dma_dma //指向控制表以用于通道控制结构 map_uDMAControlBaseSet (DmaControlTable);
MAP_SysCtlPeripheralDisable (SYSCTL_Periph_UART6); MAP_SysCtlPeripheralReset (SYSCTL_Periph_UART6); MAP_SysCtlPeripheralEnable (SYSCTL_Periph_UART6); while (MAP_SysCtlPeripheralReady (SYSCTL_Periph_UART4_UART6_UART6* ));GPTOP_TOP_UART4_UART4_RETP_UART6_UART4_RETP_UART4_RE_TRUART6_TRUTOP= UTP_TOP_ IN_TOP_ UART_UART4_RE_TOP_ UART4_RE_TOP_ UART_UARTHREST_UART_UARTHREST_UARTHREST_UARTHREST_UART_UART_UAR global.SysClockFreqHz、u->Baud、(UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE | UART_CONFIG_WLEN_8); //将 UART Tx 和 Rx FIFO 触发阈值设置为4 MAP_UARTFIFOEnable (UART6_BASE);MAP_UART6_UART4_UART6_UART6_DRQ_TX_RTO_RTO_R0_RTO_RTO_RTO_RTO_R0_RTO_RTO_RTO_R0_R0_RTO_RTO_UART8/ UART6UART6_UART8_RTO_RTO_RTO_RTO_RTO_RTO_RTO_RTO_RTO_RTO_RTO_RTO_RTO_RTO_RTO_RTO_RTO //确保不需要的 Rx 通道 DMA 属性为 map_uDMAChannelAttributeDisable ( UDMA_CH10_UART6RX、UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIOR| UDMA_ATTR_REQMASK)之外; //设置 源结构/数据大小- 0 始终指向 UART Rx 数据寄存 器//-目标地址增量为字节(8位) //-仲裁大小为4以匹配 UART Rx FIFO 触发阈 值//-如果可能,DMA 将使用4字节突发传输来实现效率 MAP_uDMAChannelControlSet ( UDMA_CH10_UART6RX | UDMA_PRI_SELECT、 UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 | UDMA_ARB_4 ); //确保不需要的 Tx 通道 DMA 属性为 MAP_uDMAChannelAttributeDisable ( UDMA_CH11_UART6TX、UDMA_ATTR_ALTSEL| UDMA_TR_PRIOR/ 启用 UDMA_TR_TR_TR_TR_USTR/从 UARTK_TR_TR_TR_TR_TRF/高优先级 传输时启用 UDMA_TR_TR_TR_TR_URTDMA_TR_TR_TR_TR_TRF/以启用 UARTDMA_TR MAP_uDMAChannelAttributeEnable (UDMA_CH11_UART6TX、UDMA_ATTR_USEBURST); //设置 Tx DMA 主控制结构: //-数据大小8位 //-源地址增量为字节(8位) //-目标地址不递增; 始终指向 UART Tx 数据寄存 器//-仲裁大小为4以匹配 UART Tx FIFO 触发阈值 MAP_uDMAChannelControlSet ( UDMA_CH11_UART6TX | UDMA_PRI_SELECT、 UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UART_MAP_4 ); 启用 UART6中断/ INT_INT_MASTER
开始接收数据块:
//设置 Rx DMA 主控结构传输参数: //-模式设置为基本(不是乒乓)。 //-源是 UART 数据寄存器 //-目标是接收存储器缓冲 区//-传输大小设置为与缓冲区大小匹配 // map_uDMAChannelTransferSet ( UDMA_CH10_UART6RX | UDMA_PRI_SELECT、 UDMA_MODE_BASIC、 (void *)(UART6_BASE + UART_O_BuxFDR 、UARTxBuf) //启用通道,因为它在每次传输完成时被禁用 MAP_uDMAChannelEnable (UDMA_CH10_UART6RX); //启用 DMA Rx 中断 MAP_UARTDMAEnable (UART6_BASE、UART_DMA_RX); MAP_UARTIntEnable (UART6_BASE、UART_INT_DMARX);
中断:
void IsrUart6Handler (void) { uint32_t Status; //找出触发中断的原因 Status = MAP_UARTIntStatus (UART6_BASE、TRUE); //清除暂挂状态 MAP_UARTIntClear (UART6_BASE、Status); if (Status & UART_INT_DMARX){ RxDONE = UART6_BASE ;UART6_UART6_BASE = UARTDAT_DAT_UART6_UART6_UARTMCUART_UART_UART6_BASE;UART0_UART6_UART6_UART6_ }
当我们在调试器中检查未屏蔽的 UART 中断状态时、它是0xF;这些置位中的三个位被保留、一个是我们未使用的 CTSRIS。 屏蔽后的中断状态为0。