Подскажите кто знает. 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;
}
}
Сообщение отредактировал IgorKossak - May 27 2016, 20:07
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!