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

DimaK

Members
  • Постов

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

  • Посещение

Весь контент DimaK

  1. DimaK

    STM32 для чайника

    Кажется разобрался! У меня просто таймер стартует из другого калбэка. Т.е. при незавершенной обработке одного прерывания стартует другое, в этом вся и проблема. Плохая идея в обработчике делать что-то большее, чем тупо выставлять какие-то флаги....
  2. DimaK

    STM32 для чайника

    Коллеги-знатоки, подскажите пожалуйста такой момент с прерываниями. Натолкнулся на то, что если запускать таймер с прерываниями вне файла main.c, то программа не переходит в обработчик прерываний. Т.е. если стартануть таймер их мэйна со всеми теми же настройками, то как положено, при каждом переполнении улетает в соответствующий колбэк. Но стоит перенести запуск в функцию, находящуюся в другом файле проекта - наступает карачун. Причём, флаг по переполнению в "1", таймер вертится и перезапускается, все как положено, только не прыгает в обработчик. Что-то не инициализировал в другом файле, что в мэйне делается автоматически?...Буду весьма благодарен за все советы!
  3. Да это я понял, уже убрал. И вроде даже заработало, но все еще как-то странно.
  4. DimaK

    STM32 для чайника

    Да нет, там не вопрос чтобы обеспечить временную параллельность процесса прошивки. Пусть заливается хоть пять минут. Задача именно в том, чтобы обойтись одним каналом УАРТов на всех. Но теперь чую, придется все кроме программируемого держать в ресете и так по очереди.
  5. DimaK

    STM32 для чайника

    Еще вопрос такой к знатокам: как можно поместить переменную в определенный адрес в STM32CubeIDE ? Вариант типа: __attribute__((at(0x30000000))) uint32_t DCMI_Data [BUFF_Size]; я пробовал, не получилось, судя по дебагеру.
  6. Приветствую, коллеги! Вот уже несколько дней веду неравный бой с модулем DCMI контролера STM32H743. Фишка в том, что я хочу через этот интерфейс затащить данные с параллельной АЦП. Т.е. использовать совсем не по прямому назначению. Вроде все настроил - и модуль и ДМА. Написал тестовую прошивку, запихивающую содержимое шины в буфер (для начала просто притянул несколько пинов шины данных к питанию, чтобы получить значение 0х0403). Импульсы синхронизации H_Sync и V_Sync подаю с соседних же пинов. Частота пиксельного клока - 50 МГц. Проблема вот в чем: прием останавливается после приема примерно 30-40 значений. При этом срабатывает интеррапт по переполнению ФИФО (overrun). Т.е. судя по всему, ДМА тупо не успевает разгребать значения. Вероятно это как-то связано с кешем - начало хоть как-то работать только после того, как закоментил инициализацию кеша данных (т.е. строку SCB_EnableDCache() ). Буду благодарен за любую идею! Картинки прилагаются. Вот код: /* USER CODE BEGIN 2 */ uint16_t BUFF_Size = 2000; // Размер буфера uint32_t DCMI_Data [BUFF_Size]; // Буфер приема данных от DCMI #if defined ( __ICCARM__ ) #pragma location = 0x24004000 uint32_t DCMI_Data [BUFF_Size]; #elif defined ( __CC_ARM ) ALIGN_32BYTES(__attribute__((section (".RAM_D2"))) uint32_t DCMI_Data [BUFF_Size]); #endif uint16_t i; uint16_t Count_AUX; for (i=0; i<BUFF_Size; i++) // Обнуляем буфер { DCMI_Data = 0; } /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { HAL_GPIO_WritePin (DCMI_V_Sync_GPIO_Port, DCMI_V_Sync_Pin,1); HAL_GPIO_WritePin(DCMI_H_Sync_GPIO_Port, DCMI_H_Sync_Pin, 1); HAL_DCMI_Start_DMA (&hdcmi, DCMI_MODE_SNAPSHOT, (uint32_t)DCMI_Data, BUFF_Size); HAL_GPIO_WritePin(DCMI_V_Sync_GPIO_Port, DCMI_V_Sync_Pin, 0); for (Count_AUX=0; Count_AUX<500; Count_AUX++) // { // Delay } HAL_GPIO_WritePin(DCMI_V_Sync_GPIO_Port, DCMI_V_Sync_Pin, 1); for (Count_AUX=0; Count_AUX<500; Count_AUX++) // { // Delay } HAL_GPIO_WritePin(DCMI_H_Sync_GPIO_Port, DCMI_H_Sync_Pin, 0); // Начало приема данных for (Count_AUX=0; Count_AUX<3000; Count_AUX++) // { // Delay } HAL_GPIO_WritePin(DCMI_H_Sync_GPIO_Port, DCMI_H_Sync_Pin, 1); for (Count_AUX=0; Count_AUX<500; Count_AUX++) // { // Delay } HAL_GPIO_WritePin(DCMI_V_Sync_GPIO_Port, DCMI_V_Sync_Pin, 0); for (Count_AUX=0; Count_AUX<500; Count_AUX++) // { // Delay } HAL_GPIO_WritePin(DCMI_V_Sync_GPIO_Port, DCMI_V_Sync_Pin, 1); // Окончание приема HAL_Delay (3); } /* USER CODE END 3 */
  7. Ну вся линейка PIC32 вообще-то....
  8. А как это проще всего сделать? Для ПИКа это можно было сделать при объявлении, прямо всего массива. А для STM32? Я чё-то ищу и внятного решения найти не могу...
  9. DimaK

    STM32 для чайника

    Ок, благодарю. Тогда придётся шить их всетаки по очередти
  10. DimaK

    STM32 для чайника

    Да, согласен, аргументы железные...Но вопрос тот же: где этот протокол? Я в референсе ничего такого не нашел. Там как-то простенько так все написано...
  11. DimaK

    STM32 для чайника

    Ну вот я тоже так думал...Хотя с другой стороны, вся логика (как я ее понимаю) применения системного бутлоадера основана на том, что можно прошить с любого устройства, которое как бы не знает, что становится программатором. Ну т.е. даже через "гипер терминал" можно запрограммировать. А если нужно организовывать какой-то там обмен, то все становится гораздо сложнее. Кроме того, я с ходу не сог найти протокол этого обмена...
  12. DimaK

    STM32 для чайника

    Колееги подскажите пожалуйста такой момент: тут встала задача залить идентичную прошивку в 4 идентичных контроллера с помощью системного бутлоадера. Так вот собственно вопрос: можно ли это сделать параллельно? Т.е. подтянуть у всех четырех разом выводы BOOT как положено и через один и тот же UART1 закинуть прошивку? Или контроллер в процессе прошивки что-то отвечает (тогда начнется каша на Rx UARTa)? Заранее спасибо!
  13. DimaK

    STM32 для чайника

    Балин, ну это вообще шик!
  14. DimaK

    STM32 для чайника

    У меня будут:) Там рядом генератор, который шарашит короткие импульсы амплитудой до 1кВ
  15. DimaK

    STM32 для чайника

    О! А вот такая идея мне вообще нравится! Вот я также тогда и сделаю. А про длину - я в плане помех, про практический опыт. Понятно, что отрезать можно всегда:)
  16. DimaK

    STM32 для чайника

    Ну да, так и придется. А с какой длиной шлейфа реально работает? Там родной шлейф - сантиметров 20. Многовато, ИМХО...
  17. DimaK

    STM32 для чайника

    Прошу прощения покорнейши, осознал всю полноту своей ошибки! Да, я и правда не имел ввиду "как программировать", естественно я и хочу через SWD. У меня чисто практический вопрос: как по-умному совместить гигантский разъем на программаторе с миниатюрным 4-х пиновым разъемчиком на плате. Думал, может есть стандартные переходники. Но как я понял, каждый решает проблему по своему. У меня просто для ПИКа несколько решений есть, но там и выходило из ICD3 6 контактов через маленький RJ12. А на STMe все несколько гипертрофировано, придется что-то сооружать из шлейфов...
  18. DimaK

    STM32 для чайника

    Да, я уже подзабыл особенности общения на русскоязычных форумах: прежде чем перейти к обсуждению по существу, какой-нибудь старожил должен пометить территорию... Уважаемый, вы дали мне два абсолютно "уместных" совета (если я правильно понял вашу коряво сформулированную сентенцию). Про "пить пиво" я, убежденный трезвенник, оставлю без внимания. А вот про мануал замечу, что я его конечно же читал и именно этим и было вызвано моё недоумение по поводу гипертрофированности разъемов. Вот и хотелось услышать совет от практиков. Я что-то просмотрел в документации? Не сочтите за труд, подскажите где именно. Буду очень признателен! И еще: по "Фене" не балакают, а "ботают", если на то уж пошло.
  19. DimaK

    STM32 для чайника

    Подскажите пожалуйста, через какой разъем козырнее всего программировать STM32 через ST-Link? Там просто на программаторе здоровенный разъем с широченным шлейфом. Как-то не представляю такую махину на плате...Какой-то переходник лепить? Или есть все-таки поэлегантней решения?
  20. Приветствую коллеги, есть необходимость оцифровывать относительно короткие временные интервалы (порядка 100к сэмплов) с часотой дискретизации порядка 25 МС/с. Эту задачу я весьма успешно решил на PIC32MZ: на внешнем 12-ти битном АЦП с параллельным интерфейсом удалось поднять аж 50 МС/с! Смысл простой: контроллер выдаёт наружу поделенный на 4 системный клок (200 МГц), которым и тактируется АЦП. А ДМА, стартуемая софтом, переносит регистр порта (к которому подключена шина данных АЦП) в массив нужное число раз. Т.к. ДМА работает синхронно с клоком АЦП (в режиме блок-трансфер это те же 50 МГц), то как раз и получается вожделенная скорость в 50 МС/с. А теперь вот решил переделать все это на STM32H743 (в силу целого ряда причин). Но все оказалось не так просто: клок на такой частоте наружу выдается уже ну совсем корявый, к тому же MDMA работает ну совсем уж медленно - 1/12 от системного клока, против 1/4 на ПИКе (померял "обратным" способом - т.е. гонял по MDMA из массива 0х0000 и 0x0001 в порт и наблюдал пин 0 осциллографом). Т.е. получается, что даже при 400 МГц системного клока больше чем 33.3 МС/с частоты дискретизации не поднять? Или я делаю что-то не так? Подскажите концептуально, пожалуйста. З.Ы. варианты использования DCMI я пока не рассматриваю, но возможность такую держу на самый крайняк....
  21. Приветствую, коллеги! Возникла такая задача: выпрыгнуть по интеррапту от таймера из цикла. Но вот беда: из-за временных требований стандартное решение (т.е. опрос флага прерывания от таймера) применить нельзя. Т.е. цикл является по сути бесконечным. План у меня такой: при возникновении прерывания, программа обработки перепишет в стэке адрес возврата. И счетчик прыгнет на следующую после цыкла строку. Понимаю, что это будет просто клондайк потенциальных косяков, но других вариантов выйти из цыкла, не содержащего условий для выхода я не вижу. Так вот, собственно, и вопрос: это вообще возможно? Кто-нибудь так делал? Из документации я так и не понял, как достучатся до стэка. А запросы в поисковике как один отсылают к TCP/IP.... Вообщен,буду благодарен за любую помощь (кроме советов, типа "перейди на AVR, STP32 etc." )!
×
×
  • Создать...