微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > KL25在设置UART0和UART1的时候有什么不同点呢?

KL25在设置UART0和UART1的时候有什么不同点呢?

时间:10-02 整理:3721RD 点击:
Freesclae KL25黑色的那块开发板,用UART0可以实现DMA方式的发送,但是UART1不行,请问在设置UART0和UART1的时候有什么不同点呢?
下面是代码,请大神帮忙看一下

  1. //====================UART初始化===============================
  2. if (COM1==comX)
  3.         {
  4. #ifndef USE_UART1_DMA_FT
  5.             ASSERT(0);
  6. #endif            
  7.             // Enable Uart1 Clock
  8.             SIM_SCGC4 |= SIM_SCGC4_UART1_MASK;
  9.             SIM_SCGC5 |= SIM_SCGC5_PORTE_MASK;
  10.             
  11.             if (PTE0 == UART1_TX_PORT)
  12.             {// Enable the UART_TXD function on PTE0
  13.                 PORTE_PCR0 = PORT_PCR_MUX(0x3);
  14.             }
  15.             if (PTE1 == UART1_RX_PORT)
  16.             {// Enable the UART_RXD function on PTE1
  17.                 PORTE_PCR1 = PORT_PCR_MUX(0x3);
  18.             }
  19.         }
  20.         else
  21.         {
  22. #ifndef USE_UART2_DMA_FT
  23.             ASSERT(0);
  24. #endif            
  25.             // Enable Uart2 Clock
  26.             SIM_SCGC4 |= SIM_SCGC4_UART2_MASK;
  27.             SIM_SCGC5 |= SIM_SCGC5_PORTD_MASK;
  28.             
  29.             if (PTD3 == UART2_TX_PORT)
  30.             {// Enable the UART_TXD function on PTD3
  31.                 PORTD_PCR3 = PORT_PCR_MUX(0x3);
  32.             }
  33.             if (PTD2 == UART2_RX_PORT)
  34.             {// Enable the UART_RXD function on PTD2
  35.                 PORTD_PCR2 = PORT_PCR_MUX(0x3);
  36.             }
  37.         }

  38.         // Diable Uart1 Tx Rx
  39.         UART_C2_REG(m_uart_arr[comX]) &= ~(UART_C2_TE_MASK | UART_C2_RE_MASK);
  40.         // Configure the uart for 8-bit mode, no parity
  41.         UART_C1_REG(m_uart_arr[comX]) = 0x00;

  42.         // Baundrate setting
  43.         l_sbr = (uint16_t)((periph_clk_khz*1000)/(boundRate * 16));
  44.         l_temp = UART_BDH_REG(m_uart_arr[comX]) & ~(UART_BDH_SBR(0x1F));
  45.         UART_BDH_REG(m_uart_arr[comX]) = l_temp |  UART_BDH_SBR(((l_sbr & 0x1F00) >> 8));
  46.         UART_BDL_REG(m_uart_arr[comX]) = (uint8_t)(l_sbr & UART_BDL_SBR_MASK);
  47.         
  48.         // Enable RX,IDLE Interrupt
  49.         UART_C2_REG(m_uart_arr[comX]) |= UART_C2_ILIE_MASK | UART_C2_RIE_MASK;
  50.         // Enable Uart1 DMA
  51.         UART_C4_REG(m_uart_arr[comX]) |= UART_C4_TDMAS_MASK;
  52.         enable_irq(UART0SE_irq_no+comX);
  53.         // Enable Tx & Rx
  54.         UART_C2_REG(m_uart_arr[comX]) |= (UART_C2_TE_MASK | UART_C2_RE_MASK);
  55. //====================UART初始化===============================

  56. //====================DMA初始化===============================
  57. static void dma_init(Uart_Com_Typedef comX)
  58. {
  59.     ASSERT(IS_UART_COM(comX));

  60.     // Enable dma clock
  61.     SIM_SCGC6 |= SIM_SCGC6_DMAMUX_MASK;
  62.     SIM_SCGC7 |= SIM_SCGC7_DMA_MASK;
  63.     // Config DMA Mux for UART operation
  64.     // Disable DMA Mux channel
  65.     DMAMUX_CHCFG_REG(DMAMUX0_BASE_PTR, comX) &= ~DMAMUX_CHCFG_ENBL_MASK;
  66.       
  67.     // Clear pending errors and/or the done bit
  68.     if (((DMA_DSR_BCR_REG(DMA_BASE_PTR, comX) & DMA_DSR_BCR_DONE_MASK) == DMA_DSR_BCR_DONE_MASK)
  69.        || ((DMA_DSR_BCR_REG(DMA_BASE_PTR, comX) & DMA_DSR_BCR_BES_MASK) == DMA_DSR_BCR_BES_MASK)
  70.        || ((DMA_DSR_BCR_REG(DMA_BASE_PTR, comX) & DMA_DSR_BCR_BED_MASK) == DMA_DSR_BCR_BED_MASK)
  71.        || ((DMA_DSR_BCR_REG(DMA_BASE_PTR, comX) & DMA_DSR_BCR_CE_MASK) == DMA_DSR_BCR_CE_MASK))
  72.     {
  73.         DMA_DSR_BCR_REG(DMA_BASE_PTR, comX) |= DMA_DSR_BCR_DONE_MASK;
  74.     }

  75.     // Clear Source size and Destination size fields.  
  76.     DMA_DCR_REG(DMA_BASE_PTR,comX) &= ~(DMA_DCR_SSIZE_MASK
  77.                 | DMA_DCR_DSIZE_MASK
  78.                 );

  79.     // Set DMA as follows:
  80.     //     Source size is byte size
  81.     //     Destination size is byte size
  82.     //     D_REQ cleared automatically by hardware
  83.     //     Destination address will be incremented after each transfer
  84.     //     Cycle Steal mode
  85.     //     External Requests are enabled
  86.     //     Asynchronous DMA requests are enabled.
  87.     //     Enable DMA Interrupt
  88.     DMA_DCR_REG(DMA_BASE_PTR,comX)|= (
  89.                  DMA_DCR_SSIZE(1)
  90.                | DMA_DCR_DSIZE(1)
  91.                | DMA_DCR_SINC_MASK
  92.                | DMA_DCR_CS_MASK
  93.           //     | DMA_DCR_ERQ_MASK
  94.                | DMA_DCR_EINT_MASK
  95.                );
  96.    
  97.     // Set destination Address (this is the UARTx_D register)
  98.     if (COM0==comX)
  99.     {
  100.         DMA_DAR_REG(DMA_BASE_PTR,comX) = UART0_D_ADDRESS;
  101.     }
  102.     else if (COM1==comX)
  103.     {
  104.         DMA_DAR_REG(DMA_BASE_PTR,comX) = UART1_D_ADDRESS;
  105.     }
  106.     else
  107.     {
  108.         DMA_DAR_REG(DMA_BASE_PTR,comX) = UART2_D_ADDRESS;
  109.     }

  110.     // Set source address
  111.     DMA_SAR_REG(DMA_BASE_PTR,comX) = (uint32_t)&(m_uart_tx_buf[comX][0]);

  112.     // Select the DMA Channel Source  
  113.     DMAMUX_CHCFG_REG(DMAMUX0_BASE_PTR,comX) = 0x03+2*comX;
  114.     DMAMUX_CHCFG_REG(DMAMUX0_BASE_PTR,comX) |= DMAMUX_CHCFG_ENBL_MASK;

  115.     // Enable DMA interrupt
  116.     enable_irq(DMA0_irq_no+comX);
  117. }
  118. //=================DMA初始化==================================

  119. //=================发送==============================
  120. uint8_t uart_send_data(Uart_Com_Typedef comX, uint8_t *pData, uint32_t len)
  121. {
  122.     uint32_t i=0;
  123.    
  124.     ASSERT(IS_UART_COM(comX) && pData && len>0 && len<UART_TXBUF_SIZE);

  125.     m_transmit_complete_flag[comX] = 0;

  126.     // Set BCR to know how many bytes to transfer
  127.     DMA_DSR_BCR(comX) = DMA_DSR_BCR_BCR(len);

  128.     memset(m_uart_tx_buf[comX], 0x00, sizeof(m_uart_tx_buf[comX]));
  129.     memcpy(m_uart_tx_buf[comX], pData, len);

  130.     // Enables the DMA channel
  131.     //DMAMUX_CHCFG_REG(DMAMUX0_BASE_PTR, comX) |= DMAMUX_CHCFG_ENBL_MASK;
  132.     DMA_DCR_REG(DMA_BASE_PTR,comX) |= DMA_DCR_ERQ_MASK;

  133.     while (i++<0xffffff && !m_transmit_complete_flag[comX]);

  134.     if (m_transmit_complete_flag[comX])
  135.     {
  136.         return len;
  137.     }
  138.    
  139.     return 0;
  140. }
  141. //==========================================================

  142. //================DMA中断======================================
  143. void DMA1_IRQHandler(void)
  144. {
  145.     // Clear pending errors or the done bit
  146.     if (((DMA_DSR_BCR1 & DMA_DSR_BCR_DONE_MASK) == DMA_DSR_BCR_DONE_MASK)
  147.        || ((DMA_DSR_BCR1 & DMA_DSR_BCR_BES_MASK) == DMA_DSR_BCR_BES_MASK)
  148.        || ((DMA_DSR_BCR1 & DMA_DSR_BCR_BED_MASK) == DMA_DSR_BCR_BED_MASK)
  149.        || ((DMA_DSR_BCR1 & DMA_DSR_BCR_CE_MASK) == DMA_DSR_BCR_CE_MASK))
  150.     {
  151.         // Enable DMA1
  152.         DMA_DCR_REG(DMA_BASE_PTR,COM1) &= ~DMA_DCR_ERQ_MASK;
  153.         // Set source address
  154.         DMA_SAR_REG(DMA_BASE_PTR,COM1) = (uint32_t)&(m_uart_tx_buf[COM1][0]);
  155.         DMA_DSR_BCR1 |= DMA_DSR_BCR_DONE_MASK;
  156.     }
  157.    
  158.     // Set transmit ok flag
  159.     m_transmit_complete_flag[COM1] = 1;
  160. }

复制代码



需要将UART1的发送中断也开启了,详解Uart1_C4寄存器的配置TDMAS的配置。
D7(TDMAS)—发送器DMA选择。如果TIE①被置位,TDMAS将配置发送数据寄存器空标志位(TDRE②)来形成中断或者DMA请求。说明:如果UART_C2[TIE]被清零,那TDRE DMA和TDRE中断信号在TDRE标志置位时无效,并且无视TDMAS的状态。如果TIE和TDMAS同时被置位,然后UART_C2[TCIE]必须被清零。并且UART_D在服务一个DMA请求时不能被写入。TDMAS=0,如果TIE和TDRE标志位被置位,TDRE中断信号触发中断服务例程;TDMAS=1,如果TIE被置位而且TDRE标志位被置位,TDRE DMA请求信号将会请求一个DMA传输器。

好厉害   好厉害

好厉害   好厉害

能不能看一下你UART0的DMA

学习一下,分析的好

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top