我正试图触发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将只是坐在那里,等待一个不存在的信号。