c - 如何通过DMA传输数据到UART0 NXP LH79524?

标签 c embedded arm uart dma

我正在使用 NXP LH79524 ARM7TDMI SOC 处理器开发嵌入式设备。
我的任务是将通过UART0传输的工作数据转换为使用DMA。

我们有一个 2k 的格式化 ASCII 数据缓冲区,我希望 DMA 将此数据传输到 UART0。我们将对系统进行概要分析,看看它是否比现有系统更快,以及它是否释放了执行时间。

我在网上搜索了示例,但没有找到适用于 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。

当通过监 window 口查看 DMA 寄存器时,源地址被复制到“当前源”寄存器。等待一秒钟后,'current source' 寄存器没有递增,Terminal Count 仍然是原始传输大小。

我不确定启用 DMA 和 UART0 的顺序。我尝试先启用 DMA,然后启用 UART0 TXDMAEN,但没有字符出来。我尝试先启用 UART0 TXDMAEN,然后启用 DMA,但没有字符出来。

我正在寻找一个在 NXP LH79524 处理器上使用 DMA 将数据传输到 UART0 的工作 C 语言示例。任何指针都会有所帮助。

最佳答案

CTS 和 RTS 与 DMA 复用。

  1. 确保 CTS 和 RTS 已启用 (CTSEN/RTSEN)
  2. 观察 PB0 和 PB1 状态 (nDACK0/CTS0) (nDREQ/RTS0)

启动 DMA 操作时,应在设置 RXDMAEN 或 TXDMAEN 位之前设置 DMAC:CTRL:ENABLE 位。

关于c - 如何通过DMA传输数据到UART0 NXP LH79524?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17280605/

相关文章:

ubuntu - ARM Ubuntu : how way to run code in privileged mode?

c - 为什么我们需要地址运算符来访问二维字符串元素

c - SEEK_HOLE 始终指向文件末尾

c++ - IDD_ABOUT : undeclared identifier

c - 确定 C 中动态分配内存的大小

c - 如何避免使用 "extern"在 C 中的多个文件之间共享一个实例?

c++ - 递归函数中在堆上分配与在堆栈上分配

c - 我怎样才能让这个循环运行得更快?

c - 跳转到重置 vector

c++ - Eclipse CDT 显示...未解决 ARM neon 内在函数的错误,但生成二进制文件