我试图触发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错误。
发布于 2022-11-07 20:24:55
我已经把问题打出来了,所以最好还是回答吧。
所述信道控制寄存器具有用于选择传输请求信号(TREQ_SEL)的字段,该字段将所述传输请求信号( DREQ_PIO0_TX0 )重置为第一数据请求信道(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就会坐在那里,等待一个不存在的信号。
https://stackoverflow.com/questions/74352534
复制相似问题