Перейти к содержанию
    

proming

Участник
  • Постов

    5
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. Спасибо, попробую в этом направлении покопать (запуск аппаратный).
  2. Подскажите кто знает. STM32F303, настроено ADC - DMA, все работает если запускать не из прерывания (например таймера), в прерывании просто поднимаю флаг, а запускаю по флагу из основного цикла. Нужно запустить из прерывания, программа виснет. // Обработка прерываний 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) { } Вот рабочий вариант // Обработка прерываний 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; } }
  3. Вопрос снят. Дело в очередности запуска DMA и ADC, в дебагере все работало, а без были перебои. Всем спасибо.
  4. Возможно кто то сталкивался с похожей проблемой. Просто не знаю за что уцепиться. Пока методом исключения, можно сказать, что порт читает данные правильно. Пока грешу, что DMA по разному работает в режиме отладчика и без него. Ищу дальше. По результату отпишусь.
  5. Проблема в следующем: ADC -> DMA -> массив данных, тип q15_t, такой тип был выбран для удобства последующей обработки arm_conv_q15. Массив, в который складывает DMA, и массив результата последующей обработки обновляется с каждым циклом DMA. (5 мс 5000 отсчетов) Здесь проблем нет, все видно в отладчике Keil. Далее пытаемся читать данные по usart. Здесь проблема! Если читаем данные с включенным отладчиком Keil, то все в порядке, каждый цикл чтения по USART приходят обновленные данные, если все тоже самое, но без отладчика Keil, то данные не обновляются. После ресета процессора приходят (через usart) обновленные данные, последующие чтения данные не обновляются, если прочитать по другому адресу, данные другие. Если требуются фрагменты кода могу предоставить. Спасибо всем кто откликнится.
×
×
  • Создать...