Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F103T8
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
AndreyKeil
Прошу помощи. 1111493779.gif
Не возникает прерывание от DMA- первого канала. Настраиваю АЦП:
Цитата
RCC->CFGR&= ~0x000C000; //(предделитель PLCK2 АЦП = 2)
RCC->CFGR|= 0x0008000; //предделитель PLCK2 АЦП = 6
GPIOA->CRL&= ~(0x00000033|//PA0,PA1 как входы
0x000000CC);//PA0,PA1 как аналоговые входы
RCC->APB2ENR|= (0x0001| //разреш альтернативных функций
0x0200);//ADC1EN-разреш.тактирования АЦП
ADC1_SQR1=0x00100000; //длина-две последовательности каналов(0-одна)
ADC1_SQR2= 0x0000;
ADC1_SQR3=
00<<(0*5)| //выбор нулевого канала для преобразования
01<<(1*5)| //выбор первого канала для преобразования
00<<(2*5)| //второй канал не занят
00<<(3*5); //третий канал не занят
ADC1_SMPR2= (0x00000006| //0-канал,время преобраз 71.5циклов
0x00000030);//1-канал,время преобраз 71.5циклов
ADC1_CR1= (0x000100| //SCAN-сканирование каналов
0x000000); //
//0x000020); //EOCIE-прерывание от АЦП разрешено
ADC1_CR2= (0x00100000| //запуск внешним событием рег.каналов
0x000E0000| //SWSTART- программный запуск преобразования
0x00000100| //DMA-вкл.
0x00000001);//ADON-разреш. АЦП

ADC1_CR2|= 0x00400000;//старт преобразования

Затем настраиваю DMA:
Цитата
RCC->AHBENR|= 0x00000001;//разреш.клока DMA1
DMA_CNDTR1= c_InxAdc; //кол-во передаваемых данных
DMA_CPAR1= 0x4001244C; //адрес периферийный &ADC1_DR
DMA_CMAR1= BufAdc; //адрес памяти
DMA_CCR1=0 << 14| //передача память-память
01 << 12| //приоритет-MEDIUM
02 << 10| //1-разрядность памяти 16 бит (2-32 бит)
02 << 8| //1-разрядность периферии 16 бит (2-32 бит)
1 << 7| //инкремент адреса памяти
0 << 6| //инкремент адреса периферии
1 << 5| //циклический режим (по кругу)
0 << 4| //0-чтение с периферии в память(1-наоборот)
1 << 3| //TEIE-прерывание по ошибке передачи
1 << 2| //HTIE-прерывание по половине передачи
1 << 1| //TCIE-прерывание по завершению передачи
1 << 0; //EN-разрешение канала

После запуска проги вижу, что АЦП работает, передаёт данные двух каналов АЦП в DMA, DMA передает данные в озу (массив BufAdc[2]), но прерывание от DMA при этом не возникает. Что я делаю не так?
ISK2010
А NVIC инициализировал? включил в нем канал для этого прерывания?
AndreyKeil
Похоже,нет. rolleyes.gif
Укажи, что надо сделать. Я тут затрудняюсь.
ISK2010
Для первого канала DMA1:
Ты пользуешься STшными библиотеками? Если да, то так:
CODE
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;

NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

А если не пользуешься, то... сам еще так не делал rolleyes.gif
Могу только сказать, что DMA1_Channel1_IRQn=56 на 105ом.
AndreyKeil
Спасибо за помощь!!! Помогло!
Не понял, что означают строчка:
"Могу только сказать, что DMA1_Channel1_IRQn=56 на 105ом."
Что означает число "56 на 105ом" ?
ISK2010
56 прерывание на ST32F105.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.