2

NXP LH79524 ARM7TDMI SOCプロセッサを使用して組み込みデバイスに取り組んでいます。
私の仕事は、UART0 を介した作業データ送信を DMA を使用するように変換することです。

フォーマットされた ASCII データの 2k バッファがあり、DMA がこのデータを UART0 に転送するようにします。システムをプロファイリングして、これが既存のシステムよりも高速かどうか、および実行時間を解放するかどうかを確認します。

Web で例を検索しましたが、NXP LH79524 プロセッサに関するものは何も見つかりません。
ユーザー マニュアルでは、データの送信に必要な手順が曖昧です。

これが私のコードです。UART0がすでに文字送信用に設定されていると仮定します:

typedef struct DMA_Data_Stream_Register_struct
{
    uint32_t    Source_Low;
    uint32_t    Source_High;
    uint32_t    Dest_Low;
    uint32_t    Dest_High;
    uint32_t    Maximum_Count;
    uint32_t    Control;
    uint32_t    Current_Srce_Addr_High;
    uint32_t    Current_Srce_Addr_Low;
    uint32_t    Current_Dest_Addr_High;
    uint32_t    Current_Dest_Addr_Low;
    uint32_t    Terminal_Count;
    uint32_t    reserved[4];
} DMA_Data_Stream_Register_t;

// ...
        //----------------------------------------------------------------------
        //  Initialize the DMA controller to use the UART.
        //  This is an experiment.
        //----------------------------------------------------------------------
      DMA_Data_Stream_Register_t volatile * const p_dma_uart_tx   = (DMA_Data_Stream_Register_t *) 0xFFFE10C0U;
      uint32_t volatile * const   p_dma_intr_mask_register        = (uint32_t *) 0xFFFE10F0U;
      uint32_t volatile * const   p_dma_intr_clear_register       = (uint32_t *) 0xFFFE10F4U;
      uint32_t volatile * const   p_dma_status_register           = (uint32_t *) 0xFFFE10F8U;
      uint32_t volatile * const   p_uart0_dma_control_register    = (uint32_t *) 0xFFFC0048U;
      static const char           dma_test_text[] = "\r\n\r\n*** Written by DMA ***\r\n\r\n";

        //----------------------------------------------------------------------
        //  Set up UART0 for DMA transfers
        //----------------------------------------------------------------------
      *p_uart0_dma_control_register = 0x02U; // Enable transmit DMA, a.k.a. TXDMAEN

        //----------------------------------------------------------------------
        //  Set up the source addresses for stream 0.
        //----------------------------------------------------------------------
      uint32_t    source_address = (uint32_t) &dma_test_text[0U];
      uint32_t    source_high = source_address >> 16;
      uint32_t    source_low  = source_address & 0xFFFFU;
      p_dma_uart_tx->Source_Low = source_low;
      p_dma_uart_tx->Source_High = source_high;
      p_dma_uart_tx->Current_Srce_Addr_High = source_high;
      p_dma_uart_tx->Current_Srce_Addr_Low = source_low;
      p_dma_uart_tx->Maximum_Count = sizeof(dma_test_text) - 1U;
      const uint32_t  dma_config =
            0x2000U /* Peripheral is destination */
          | 0x0000U /* DMA to Destination Data width, 0x00 == 1 byte */
          | 0x0000U /* Peripheral Burst Size, single == 0x00 */
          | 0x0002U /* Current Source Register increments */
              ;
      p_dma_uart_tx->Control = dma_config;

        //----------------------------------------------------------------------
        //  Start the DMA transfer.
        //----------------------------------------------------------------------
      p_dma_uart_tx->Control = dma_config | 0x01U;
      *p_uart0_dma_control_register = 0x02U; // Enable transmit DMA, a.k.a. TXDMAEN  

IAR Embedded Workbench コンパイラ/IDE を使用しています。

ウォッチ ウィンドウで DMA レジスタを表示すると、ソース アドレスが「現在のソース」レジスタにコピーされます。1 秒待った後、「現在のソース」レジスタはインクリメントされず、ターミナル カウントは元の送信サイズのままです。

DMA と UART0 を有効にする順序がわかりません。最初に DMA を有効にしてから UART0 TXDMAEN を有効にしようとしましたが、文字は表示されませんでした。最初に UART0 TXDMAEN を有効にしてから DMA を有効にしてみましたが、文字は表示されませんでした。

NXP LH79524 プロセッサで DMA を使用して UART0 にデータを送信する C 言語の実例を探しています。どんなポインタも役に立ちます。

4

1 に答える 1

1

CTS と RTS は DMA と多重化されます。

  1. CTS と RTS が有効になっていることを確認してください (CTSEN/RTSEN)
  2. PB0 と PB1 の状態を監視 (nDACK0/CTS0) (nDREQ/RTS0)

DMA 操作を開始するときは、RXDMAEN ビットまたは TXDMAEN ビットのいずれかがセットされる前に、DMAC:CTRL:ENABLE ビットをセットする必要があります。

于 2013-06-24T17:47:46.567 に答える