DimaK
Members-
Постов
54 -
Зарегистрирован
-
Посещение
Тип контента
Профили
Форумы
Блоги
Весь контент DimaK
-
Кажется разобрался! У меня просто таймер стартует из другого калбэка. Т.е. при незавершенной обработке одного прерывания стартует другое, в этом вся и проблема. Плохая идея в обработчике делать что-то большее, чем тупо выставлять какие-то флаги....
-
Коллеги-знатоки, подскажите пожалуйста такой момент с прерываниями. Натолкнулся на то, что если запускать таймер с прерываниями вне файла main.c, то программа не переходит в обработчик прерываний. Т.е. если стартануть таймер их мэйна со всеми теми же настройками, то как положено, при каждом переполнении улетает в соответствующий колбэк. Но стоит перенести запуск в функцию, находящуюся в другом файле проекта - наступает карачун. Причём, флаг по переполнению в "1", таймер вертится и перезапускается, все как положено, только не прыгает в обработчик. Что-то не инициализировал в другом файле, что в мэйне делается автоматически?...Буду весьма благодарен за все советы!
-
Да нет, там не вопрос чтобы обеспечить временную параллельность процесса прошивки. Пусть заливается хоть пять минут. Задача именно в том, чтобы обойтись одним каналом УАРТов на всех. Но теперь чую, придется все кроме программируемого держать в ресете и так по очереди.
-
Еще вопрос такой к знатокам: как можно поместить переменную в определенный адрес в STM32CubeIDE ? Вариант типа: __attribute__((at(0x30000000))) uint32_t DCMI_Data [BUFF_Size]; я пробовал, не получилось, судя по дебагеру.
-
Приветствую, коллеги! Вот уже несколько дней веду неравный бой с модулем 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 */
-
Ок, благодарю. Тогда придётся шить их всетаки по очередти
-
Да, согласен, аргументы железные...Но вопрос тот же: где этот протокол? Я в референсе ничего такого не нашел. Там как-то простенько так все написано...
-
Ну вот я тоже так думал...Хотя с другой стороны, вся логика (как я ее понимаю) применения системного бутлоадера основана на том, что можно прошить с любого устройства, которое как бы не знает, что становится программатором. Ну т.е. даже через "гипер терминал" можно запрограммировать. А если нужно организовывать какой-то там обмен, то все становится гораздо сложнее. Кроме того, я с ходу не сог найти протокол этого обмена...
-
Колееги подскажите пожалуйста такой момент: тут встала задача залить идентичную прошивку в 4 идентичных контроллера с помощью системного бутлоадера. Так вот собственно вопрос: можно ли это сделать параллельно? Т.е. подтянуть у всех четырех разом выводы BOOT как положено и через один и тот же UART1 закинуть прошивку? Или контроллер в процессе прошивки что-то отвечает (тогда начнется каша на Rx UARTa)? Заранее спасибо!
-
У меня будут:) Там рядом генератор, который шарашит короткие импульсы амплитудой до 1кВ
-
О! А вот такая идея мне вообще нравится! Вот я также тогда и сделаю. А про длину - я в плане помех, про практический опыт. Понятно, что отрезать можно всегда:)
-
Ну да, так и придется. А с какой длиной шлейфа реально работает? Там родной шлейф - сантиметров 20. Многовато, ИМХО...
-
Прошу прощения покорнейши, осознал всю полноту своей ошибки! Да, я и правда не имел ввиду "как программировать", естественно я и хочу через SWD. У меня чисто практический вопрос: как по-умному совместить гигантский разъем на программаторе с миниатюрным 4-х пиновым разъемчиком на плате. Думал, может есть стандартные переходники. Но как я понял, каждый решает проблему по своему. У меня просто для ПИКа несколько решений есть, но там и выходило из ICD3 6 контактов через маленький RJ12. А на STMe все несколько гипертрофировано, придется что-то сооружать из шлейфов...
-
Да, я уже подзабыл особенности общения на русскоязычных форумах: прежде чем перейти к обсуждению по существу, какой-нибудь старожил должен пометить территорию... Уважаемый, вы дали мне два абсолютно "уместных" совета (если я правильно понял вашу коряво сформулированную сентенцию). Про "пить пиво" я, убежденный трезвенник, оставлю без внимания. А вот про мануал замечу, что я его конечно же читал и именно этим и было вызвано моё недоумение по поводу гипертрофированности разъемов. Вот и хотелось услышать совет от практиков. Я что-то просмотрел в документации? Не сочтите за труд, подскажите где именно. Буду очень признателен! И еще: по "Фене" не балакают, а "ботают", если на то уж пошло.
-
Подскажите пожалуйста, через какой разъем козырнее всего программировать STM32 через ST-Link? Там просто на программаторе здоровенный разъем с широченным шлейфом. Как-то не представляю такую махину на плате...Какой-то переходник лепить? Или есть все-таки поэлегантней решения?
-
Приветствую коллеги, есть необходимость оцифровывать относительно короткие временные интервалы (порядка 100к сэмплов) с часотой дискретизации порядка 25 МС/с. Эту задачу я весьма успешно решил на PIC32MZ: на внешнем 12-ти битном АЦП с параллельным интерфейсом удалось поднять аж 50 МС/с! Смысл простой: контроллер выдаёт наружу поделенный на 4 системный клок (200 МГц), которым и тактируется АЦП. А ДМА, стартуемая софтом, переносит регистр порта (к которому подключена шина данных АЦП) в массив нужное число раз. Т.к. ДМА работает синхронно с клоком АЦП (в режиме блок-трансфер это те же 50 МГц), то как раз и получается вожделенная скорость в 50 МС/с. А теперь вот решил переделать все это на STM32H743 (в силу целого ряда причин). Но все оказалось не так просто: клок на такой частоте наружу выдается уже ну совсем корявый, к тому же MDMA работает ну совсем уж медленно - 1/12 от системного клока, против 1/4 на ПИКе (померял "обратным" способом - т.е. гонял по MDMA из массива 0х0000 и 0x0001 в порт и наблюдал пин 0 осциллографом). Т.е. получается, что даже при 400 МГц системного клока больше чем 33.3 МС/с частоты дискретизации не поднять? Или я делаю что-то не так? Подскажите концептуально, пожалуйста. З.Ы. варианты использования DCMI я пока не рассматриваю, но возможность такую держу на самый крайняк....
-
Приветствую, коллеги! Возникла такая задача: выпрыгнуть по интеррапту от таймера из цикла. Но вот беда: из-за временных требований стандартное решение (т.е. опрос флага прерывания от таймера) применить нельзя. Т.е. цикл является по сути бесконечным. План у меня такой: при возникновении прерывания, программа обработки перепишет в стэке адрес возврата. И счетчик прыгнет на следующую после цыкла строку. Понимаю, что это будет просто клондайк потенциальных косяков, но других вариантов выйти из цыкла, не содержащего условий для выхода я не вижу. Так вот, собственно, и вопрос: это вообще возможно? Кто-нибудь так делал? Из документации я так и не понял, как достучатся до стэка. А запросы в поисковике как один отсылают к TCP/IP.... Вообщен,буду благодарен за любую помощь (кроме советов, типа "перейди на AVR, STP32 etc." )!