rp2040 DMA通道挂起,裸金属



我正试图触发DMA通道以在SRAM内执行内存到内存的传输。通道抛出忙碌标志,但传输计数没有变化。

我有以下代码:

    ;reset dma
    ldr r0, *resets_clr ;clear reset
    mov r1, 4
    str r1, (r0, 0)
    
    ldr r0, *resets_rw ;confirm reset clear
*rst_dma
    ldr r2, (r0, 2)
    and r2, r1
    beq *rst_dma
    
    ;start dma channel
    ldr r0, *dma_rw
    adr r1, *var
    str r1, (r0, 0) ;read addr
    
    ldr r1, *sram_addr
    str r1, (r0, 1) ;write addr
    
    mov r1, 8
    str r1, (r0, 2) ;trans count
    
    mov r1, 47 ;incr_write | size_word | high_priority | en
    str r1, (r0, 3) ;ctrl trig
    
    ;wait for transfer marked complete
    mov r2, 1
    lsl r2, r2, 24
*busy_dma
    ldr r1, (r0, 3)
    and r1, r2
    bne *busy_dma
    
    ;test
    ldr r0, *sram_addr
    ldr r1, (r0, 0)
    mov lr, pc
    cmp r1, 7
    beq  *led_on

具有以下单词大小的值:

resets_rw 0x4000c000
resets_clr 0x4000f000
var 7
dma_rw 0x50000000
sram_addr 0x20001000

芯片在rst_dma环路中挂起,该环路等待通道放下其忙标志。如果没有循环,内存测试就会失败。通道没有抛出AHB错误。

我已经把问题打出来了,所以不妨回答一下。

通道控制寄存器有一个选择传输请求信号(TREQ_SEL)的字段,它复位到第一个数据请求通道DREQ_PIO0_TX0。如果您没有将DMA与外设一起使用,并且不关心传输速度的计时,那么对于无节奏传输,您应该将该字段设置为0x3f

    mov r1, 63 ;treq_sel unpaced transfer
    lsl r1, r1, 15
    add r1, 47 ;inc_write | size_word | en
    str r1, (r0, 3) ;ctrl trig

如果没有这个,DMA将只是坐在那里,等待一个不存在的信号。

相关内容

  • 没有找到相关文章

最新更新