Вот мой примерчик, правда, использованные константы не раскрыты - но на то есть даташит

Сигнал запуска преобразования генерит TC0, есть два буфера, после заполнения одного из
буферов дёргается прерывание, в котором заполненный буфер копируется "во вне" и подставляется
в качестве "следующего". На всякий случай скажу, что PDC при работе с ADC считает переданные отсчёты, а не байты.
Настройка ADC
CODE
;
; adc.s - ADC setup and isr
;
INCLUDE common.inc
AREA TEXT, CODE, READONLY
ARM
EXPORT initAdc
EXPORT adcTargetBuffer
initAdc
; здесь надо очистить все буферы и проинициализировать переменные!!!
ldr r0, =adcTargetBuffer
ldr r1, =0
ldr r2, =ADC_BUFFER_COUNT
initAdd_clearLoop
str r1, [r0], #4
subs r2, #1
bne initAdd_clearLoop
; обнулим переключатель буферов
add r2, r0, #(adcBufferFlipFlop - adcTargetBuffer)
str r1, [r2]
; настройка
ldr r0, =ADC_BASE
; setup PDC
ldr r1, =adcFirstBuffer
str r1, [r0, #PDC_RPR]
ldr r1, =adcSecondBuffer
str r1, [r0, #PDC_RNPR]
ldr r1, =ADC_BUFFER_COUNT
str r1, [r0, #PDC_RCR]
str r1, [r0, #PDC_RNCR]
ldr r1, =1 ; RXTEN
str r1, [r0, #PDC_PTCR]
; настроим АЦП
; опорная частота АЦП = 55000000 / ( ( 10 + 1 ) * 2 ) = 2500000 Гц
; время SHTIM = 3 / 2500000 = 1.2 мкс
ldr r1, =0x04170A01 ; триггер по сигналу TIOA0
str r1, [r0, #ADC_MR]
ldr r1, =0xFF
str r1, [r0, #ADC_CHDR]
ldr r1, =(1 << 4)
str r1, [r0, #ADC_CHER]
; enable interrupt for buffer full event
ldr r1, =0x00040000
str r1, [r0, #ADC_IER]
; настроим AIC
ldr r0, =AIC_BASE
ldr r1, =0x00000006
str r1, [r0, #AIC_SMR4]
ldr r1, =adcBufferReaded
str r1, [r0, #AIC_SVR4]
ldr r1, =(1 << 4)
str r1, [r0, #AIC_IECR] ; включаем прерывание от АЦП
; выход
bx LR
; обработчик прерывания от АЦП
adcBufferReaded
stmfd SP!, {r0-r5,r7,r8,LR}
; меняем буфер
ldr r0, =adcFirstBuffer
ldr r7, [r0, #(adcBufferFlipFlop - adcFirstBuffer)]
tst r7, #1
add r7, #1
str r7, [r0, #(adcBufferFlipFlop - adcFirstBuffer)]
; адрес прочитанного буфера помещаем в PDC_RNCR
moveq r8, r0
addne r8, r0, #(adcSecondBuffer - adcFirstBuffer)
ldr r4, =ADC_BASE
str r8, [r4, #PDC_RNPR]
ldr r2, =ADC_BUFFER_COUNT
str r2, [r4, #PDC_RNCR]
; вхреначиваем считанные данные в накопительный буфер
add r5, r0, #(adcTargetBuffer - adcFirstBuffer)
ldr r2, =ADC_BUFFER_COUNT / 8
adcBufferReaded_addToAcc
ldmia r8!, {r1,r3,r4,r7}
stmia r5!, {r1,r3,r4,r7}
subs r2, #1
bne adcBufferReaded_addToAcc
; выход из прерывания
adcBufferReaded_exit
ldr r0, =ADC_BASE
ldr r1, [r0, #ADC_SR]
ldr r0, =AIC_BASE
ldr r1, =(1 << 4)
str r1, [r0, #AIC_EOICR]
ldmfd SP!, {r0-r5,r7,r8,LR}
subs PC, LR, #4
AREA ZDATA, NOINIT, READWRITE
adcFirstBuffer
SPACE ADC_BUFFER_COUNT * 2 ; 10 bits ADC, 2 bytes - one shot
adcSecondBuffer
SPACE ADC_BUFFER_COUNT * 2
adcTargetBuffer
SPACE ADC_BUFFER_COUNT * 2 ; buffer visible for main task
EXPORT adcBufferFlipFlop
adcBufferFlipFlop
SPACE 4 ; флаг переключения буферов и счётчик циклов
END
Настройка таймера TC0 (на TC1 и TC2 внимания не обращать) для пинания ADC:
CODE
; enable clock for TC0, TC1 and TC2
ldr r2, =PMC_BASE
ldr r1, =((1 << 12) + (1 << 13) + (1 << 14))
str r1, [r2, #PMC_PCER]
;
ldr r0, =TC_BASE
ldr r1, =0x00000015
str r1, [r0, #TC_BMR]
; setup TC0 - ADC trigger timer, по CPA сигнал TIOA0 поднимаем, по CPC - бросаем
ldr r1, =0x0009C400
str r1, [r0, #TC0_CMR]
ldr r1, =275
str r1, [r0, #TC0_RC]
ldr r1, =139
str r1, [r0, #TC0_RA]
; setup TC1 - pulse make timer
ldr r1, =0x8343E400
str r1, [r0, #TC1_CMR]
ldr r1, =550 ; 0x01F4
str r1, [r0, #TC1_RC]
ldr r1, =274 ; (RC / 2) - 1
str r1, [r0, #TC1_RB]
add r1, r1, #2
str r1, [r0, #TC1_RA]
; setup TC2 - tracking timer
ldr r1, =0x0000C400
str r1, [r0, #TC2_CMR]
ldr r1, =1100 ; 550 * 2
str r1, [r0, #TC2_RC]
; enable interrupt from TC2 RC compare event
ldr r1, =0x00000010
str r1, [r0, #TC2_IER]
; enable clock for TC0, TC1 and TC2
ldr r1, =0x00000001
str r1, [r0, #TC0_CCR]
str r1, [r0, #TC1_CCR]
str r1, [r0, #TC2_CCR]
; start clock for all TCs
ldr r1, =0x00000001 ; SYNC
str r1, [r0, #TC_BCR] ; start count