ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
25 ноября
96839 Топик полностью
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> код с применением атмеловской библиотеки