我正在使用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[] = "rnrn*** Written by DMA ***rnrn";
//----------------------------------------------------------------------
// 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寄存器时,源地址会复制到"当前源"寄存器。等待一秒钟后,"当前源"寄存器不会增加,终端计数仍然是原始传输大小。
我不确定启用DMA和UART0的顺序。我尝试先启用DMA,然后再启用UART0 TXDMAEN,但没有出现任何字符。我尝试先启用UART0 TXDMAEN,然后再启用DMA,但没有出现任何字符。
我正在寻找一个在NXP LH79524处理器上使用DMA将数据传输到UART0的C语言示例。任何指示都会有所帮助。
CTS和RTS与DMA多路复用。
- 确保CTS和RTS已启用(CTSEN/RSEN)
- 监视PB0和PB1状态(nDACK0/CTS0)(nDREQ/RS0)
在启动DMA操作时,应在设置RXDMAEN或TXDMAEN位之前设置DMAC:CTRL:ENABLE位。