AST (12.08.2007 21:39, просмотров: 118) ответил DVK на Помогите примером DMA с двойной буферезацией ( два буфера попеременно ) для SAM7
Вот пример инициализации DMA и АЦП при непрерывном измерении аналогового сигнала. Пользуйтесь атмеловскими библиотеками функций ввода/вывода и читайте их описание. <c>
#define TRGEN (0x1) // Software triggering
#define TRGSEL (0x1) // Without effect in Software triggering
#define LOWRES (0x0) // 10-bit result output format
#define SLEEP (0x0) // Normal Mode (instead of SLEEP Mode)
#define PRESCAL (0x6) // Max value
#define STARTUP (0xc) // This time period must be higher than 20 µs
#define SHTIM (0x3) // Must be higher than 3 ADC clock cycles but depends on output
// impedance of the analog driver to the ADC input
void ADC_init(void)
{
// Clear all previous setting and result
AT91F_ADC_SoftReset (AT91C_BASE_ADC);
// First Step: Set up by using ADC Mode register
AT91F_ADC_CfgModeReg (AT91C_BASE_ADC,
(SHTIM << 24) | (STARTUP << 16) | (PRESCAL << 8) |
(SLEEP << 5) | (LOWRES <<4) | (TRGSEL << 1) | (TRGEN )) ;
// Second Step: Select the active channel
AT91F_ADC_EnableChannel (AT91C_BASE_ADC, (1<<ANALOG_CHANNEL));
// ADC interrupt init
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_ADC, ADC_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, ADC_c_irq_handler);
AT91C_BASE_ADC->ADC_IER = AT91C_ADC_ENDRX; // IRQ enable ENDRX
AT91F_PDC_EnableRx(AT91C_BASE_PDC_ADC) ;
AT91F_PDC_SetRx(AT91C_BASE_PDC_ADC, ADC_bufer, 64); // заряжаем первый буфер
AT91F_PDC_SetNextRx(AT91C_BASE_PDC_ADC, ADC_bufer+128, 64); // заряжаем второй буфер
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_ADC);
}
__thumb void ADC_c_irq_handler(void)
{
AT91F_PDC_SetNextRx(AT91C_BASE_PDC_ADC, (ADC_bufer+((ADC_buf_switch+1)&0xF)*128), 64); // зарядка следующего буфера
//ваш код
}
</c>
код с применением атмеловской библиотеки