Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Запуск ADC из прерывания таймера
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Controlplast
Подскажите кто знает. STM32F303, настроено ADC - DMA, все работает если запускать не из прерывания (например таймера), в прерывании просто поднимаю флаг, а запускаю по флагу из основного цикла. Нужно запустить из прерывания, программа виснет.
CODE
// Обработка прерываний DMA ......
....
void TIM2_IRQHandler(void) //Собственно прерывание по которому хочется запустить цикл ADC c DMA
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);


if (side==0){ //Переставляем банки для результатов ADC
DMA1_Channel1->CMAR = ADMA1;
DMA2_Channel1->CMAR = ADMA2;
side=1;
} else {
DMA1_Channel1->CMAR = BDMA1;
DMA2_Channel1->CMAR = BDMA2;
side=0;
}
bsize1 = 5164;
bsize2 = 5164;
DMA1_Channel1->CNDTR = bsize1;
DMA2_Channel1->CNDTR = bsize2;

DMA1_Channel1->CCR |= DMA_CCR_EN;
ADC1->CR |= ADC_CR_ADSTART; //Если закоментировать эту строку все работает

DMA2_Channel1->CCR |= DMA_CCR_EN;
ADC2->CR |= ADC_CR_ADSTART; //Если закоментировать и эту строку все работает
}

}

while (1) {
}



Вот рабочий вариант

CODE

// Обработка прерываний DMA ......
....
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

ADC_Start = 1;

}

}

while (1) {

if (ADC_Start==1){
if (side==0){ //Переставляем банки для результатов ADC
DMA1_Channel1->CMAR = ADMA1;
DMA2_Channel1->CMAR = ADMA2;
side=1;
} else {
DMA1_Channel1->CMAR = BDMA1;
DMA2_Channel1->CMAR = BDMA2;
side=0;
}
bsize1 = 5164;
bsize2 = 5164;
DMA1_Channel1->CNDTR = bsize1;
DMA2_Channel1->CNDTR = bsize2;

DMA1_Channel1->CCR |= DMA_CCR_EN;
ADC1->CR |= ADC_CR_ADSTART;

DMA2_Channel1->CCR |= DMA_CCR_EN;
ADC2->CR |= ADC_CR_ADSTART;
ADC_Start = 0;
}
}
ViKo
Например, таймер молотит у вас быстрее, чем вы там что-то делаете в прерывании.
Вообще, по таймеру можно запускать АЦП аппаратно. По событию срабатывания таймера.
Controlplast
Спасибо, попробую в этом направлении покопать (запуск аппаратный).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.