在线时间14 小时
UID4066141
注册时间2024-11-13
NXP金币28
该用户从未签到
注册会员

- 积分
- 120
- 最后登录
- 2025-5-6
|
最近使用MKV30F64实现UART DMA的收发功能,发现进入接收中断后,会出现没有数据回复。
如果我在中断中添加多个case时,当接收数据变化时会出现回复数据与接受数据错位。求大佬们帮忙解答!!!
/* Definition of peripheral ID */
#define UART0_PERIPHERAL UART0
/* Definition of the clock source frequency */
#define UART0_CLOCK_SOURCE CLOCK_GetFreq(UART0_CLK_SRC)
/* UART0 eDMA source request. */
#define UART0_RX_DMA_REQUEST kDmaRequestMux0UART0Rx
/* Selected eDMA channel number. */
#define UART0_RX_DMA_CHANNEL 2
/* UART0 eDMA source request. */
#define UART0_TX_DMA_REQUEST kDmaRequestMux0UART0Tx
/* Selected eDMA channel number. */
#define UART0_TX_DMA_CHANNEL 3
#define UART_IRQn UART0_RX_TX_IRQn
#define UART_IRQ_PRIORITY 0
#define UART_IRQHandler UART0_RX_TX_IRQHandler
/****************************************************
* UART0 initialization code
****************************************************/
/* clang-format off */
const uart_config_t UART0_config = {
.baudRate_Bps = 2500000UL,
.parityMode = kUART_ParityDisabled,
.txFifoWatermark = 0U,
.rxFifoWatermark = 1U,
.idleType = kUART_IdleTypeStartBit,
.enableTx = true,
.enableRx = true
};
edma_handle_t UART0_RX_Handle;
edma_handle_t UART0_TX_Handle;
uart_edma_handle_t UART0_UART_eDMA_Handle;
/****************************************/
static void UART0_init(void)
{
/* Configure DMAMUX */
DMAMUX_Init(DMA_DMAMUX_BASEADDR);
EDMA_Init(DMA_DMA_BASEADDR, &DMA_config);
UART_Init(UART0_PERIPHERAL, &UART0_config, UART0_CLOCK_SOURCE);
/* Set the source kDmaRequestMux0UART0Rx request in the DMAMUX */
DMAMUX_SetSource(DMA_DMAMUX_BASEADDR, UART0_RX_DMA_CHANNEL, UART0_RX_DMA_REQUEST);
/* Enable the channel 2 in the DMAMUX */
DMAMUX_EnableChannel(DMA_DMAMUX_BASEADDR, UART0_RX_DMA_CHANNEL);
/* Set the source kDmaRequestMux0UART0Tx request in the DMAMUX */
DMAMUX_SetSource(DMA_DMAMUX_BASEADDR, UART0_TX_DMA_CHANNEL, UART0_TX_DMA_REQUEST);
/* Enable the channel 3 in the DMAMUX */
DMAMUX_EnableChannel(DMA_DMAMUX_BASEADDR, UART0_TX_DMA_CHANNEL);
/* Create the eDMA UART0_RX_Handle handle */
EDMA_CreateHandle(&UART0_RX_Handle, DMA_DMA_BASEADDR, UART0_RX_DMA_CHANNEL);
/* Create the eDMA UART0_TX_Handle handle */
EDMA_CreateHandle(&UART0_TX_Handle, DMA_DMA_BASEADDR, UART0_TX_DMA_CHANNEL);
/* Create the UART eDMA handle */
UART_TransferCreateHandleEDMA(UART0_PERIPHERAL, &UART0_UART_eDMA_Handle, UART_UserCallback, NULL, &UART0_TX_Handle, &UART0_RX_Handle);
/* Interrupt vector DMA0_IRQn priority sets in the NVIC.*/
NVIC_SetPriority(DMA_DMA_CH_INT_DONE_0_IRQN, DMA_DMA_CH_INT_DONE_0_IRQ_PRIORITY);
NVIC_SetPriority(UART_IRQn, 0);
UART_EnableInterrupts(UART0_PERIPHERAL, kUART_RxDataRegFullInterruptEnable |kUART_RxOverrunInterruptEnable);
EnableIRQ(UART_IRQn);
}
void UART_IRQHandler(void)
{
uint8_t data = 0;
edma_transfer_config_t sendXferConfig;
if(0 != ((UART0_PERIPHERAL->S1) & UART_S1_RDRF_MASK))
{
//UART_ClearStatusFlags(UART0_PERIPHERAL,(uint32_t)kUART_RxDataRegFullFlag);
data = UART0_PERIPHERAL->D;
switch(data)
{
case 0x92:
{
data_Buffer[0] = 0x92;
data_Buffer[1] = 0x20;
data_Buffer[2] = 0x11;
data_Buffer[3] = 0xA6;
/* 发送长度 */
UART0_UART_eDMA_Handle.txDataSizeAll = 4U;
/* 开启485口 */
NXP485_GPIO->PSOR = GPIO_FIT_REG(1U << NXP485_GPIO_PIN);
/*Uart_DMA Config*/
EDMA_PrepareTransferConfig(&sendXferConfig, data_Buffer, sizeof(uint8_t),sizeof(uint8_t), (uint32_t *)(uint32_t) &(UART0_PERIPHERAL- >D), sizeof(uint8_t), 0 ,sizeof(uint8_t), 4U);
/*Submit transfer.*/
EDMA_SetTransferConfig(UART0_UART_eDMA_Handle.txEdmaHandle->base, UART0_TX_DMA_CHANNEL, &sendXferConfig, NULL);
/* Enable auto disable request feature */
UART0_UART_eDMA_Handle.txEdmaHandle->base->TCD[UART0_TX_DMA_CHANNEL].CSR |= DMA_CSR_DREQ_MASK;
/* Enable major interrupt */
UART0_UART_eDMA_Handle.txEdmaHandle->base->TCD[UART0_TX_DMA_CHANNEL].CSR |= DMA_CSR_INTMAJOR_MASK;
UART0_UART_eDMA_Handle.txEdmaHandle->base->SERQ = DMA_SERQ_SERQ(UART0_TX_DMA_CHANNEL);
/* Enable UART TX EDMA. */
UART0_PERIPHERAL->C5 |= (uint8_t)UART_C5_TDMAS_MASK;
UART0_PERIPHERAL->C2 |= (uint8_t)UART_C2_TIE_MASK;
}
break;
default:
//UART0_PERIPHERAL->C5 &= ~(uint8_t)UART_C5_TDMAS_MASK;
//UART0_PERIPHERAL->C2 &= ~(uint8_t)UART_C2_TIE_MASK;
break;
}
}
else if((kUART_TransmissionCompleteFlag & UART_GetStatusFlags(UART0_PERIPHERAL)) != 0U)
{
UART_ClearStatusFlags(UART0_PERIPHERAL,(uint32_t)kUART_TransmissionCompleteFlag);
/* 关闭485口*/
NXP485_GPIO->PCOR = GPIO_FIT_REG(1UL << NXP485_GPIO_PIN);
}
SDK_ISR_EXIT_BARRIER;
}
|
|