查看: 705|回复: 1

[求助] UART DMA中断发送

[复制链接]

该用户从未签到

1

主题

2

帖子

0

注册会员

Rank: 2

积分
120
最后登录
2025-5-6
发表于 2024-12-30 16:30:30 | 显示全部楼层 |阅读模式
最近使用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;
}



我知道答案 目前已有1人回答
回复

使用道具 举报

该用户从未签到

1

主题

2

帖子

0

注册会员

Rank: 2

积分
120
最后登录
2025-5-6
 楼主| 发表于 2024-12-30 17:18:28 | 显示全部楼层
配置应该没问题,刚才看了下硬件,因为我发送信号需要设备断电重启,原JLINK中给芯片供电的线没接,现在接上发现没啥问题了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-27 18:30 , Processed in 0.087914 second(s), 22 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表