-
Постов
10 921 -
Зарегистрирован
-
Посещение
-
Победитель дней
31
Сообщения, опубликованные Сергей Борщ
-
-
5 часов назад, dimir сказал:
void DMA1_Channel1_IRQHandler (void) { if(DMA1->ISR & DMA_ISR_TCIF1) { DMA1->IFCR|= DMA_IFCR_CTCIF1; } if(DMA1->ISR& DMA_ISR_TEIF1) { DMA1->IFCR|= DMA_IFCR_CTEIF1; } }
Вот сразу тут:
1) Зачем дважды читать ISR? достаточно прочитать его один раз во временную переменную и потом проверять биты флагов в этой переменной.
2) делать "или" с содержимым IFCR не имеет смысла - оттуда всегда читаются нули. Поэтому нужно в него только писать (DMA1->IFCR = DMA_IFCR_CTCIF1;) На логику работы не повлияет, но какие-то такты сэкономите.
Настройки ПДП в коде не нашел - может вы там разрешили еще какое-то прерывание, флаг которого не обрабатываете и поэтому программа после выхода из обработчика попадает в него снова.
11 часов назад, dimir сказал:.У меня другой вопрос как это половина массива отправить а вторую потом?
У ПДП есть два флага - HTIF выставляется, когда передана половина от запрошенного количества данных и TCIF - когда переданы все данные. Когда передана половина данных - на их место можно писать новые для следующего цикла. Когда переданы все - можно писать на место второй половины, пока ПДП передает первую (если его запустить в циклическом режиме - он после передачи второй половины автоматически снова начнет передавать первую).
Утром попробую найти код, которым студенту объяснял прямой цифровой синтез для запуска трехфазного синхронного двигателя.
Добавлено: нашел переписку со студентом, кода там нет. Будет время - накидаю заново, но не обещаю, что прямо завтра.
-
14 минут назад, dimir сказал:
Метод DDS ?И в прерывании по DMA.
Да, прямой цифровой синтез в прерывании ПДП.
15 минут назад, dimir сказал:Некоторая периферия перестаёт просто работать.
Какая именно периферия? Показывайте код, разберемся вместе. У меня все работает, так что дело тут явно не в периферии.
-
Только что, dimir сказал:
Мне кажется что DMA в этом плане не очень подходит
В каком плане?
2 минуты назад, dimir сказал:Каким образом это произвести?
12 часов назад, Сергей Борщ сказал:Можно быстро-быстро методом DDS набить половину массива, натравить на массив ПДП в циклическом режиме и пока ПДП скармливает эту половину таймеру - быстро-быстро набить вторую половину массива. Потом повторять набивание первой/второй половин в прерываниях HTIF/TCIF.
-
9 часов назад, AVI-crak сказал:
Зачем страдать и мучаться, если можно в прерывании выполнить четыре целочисленных умножения не напрягаясь.
Чтобы не вызывать прерывание таймера на каждый отсчет, а готовить сразу кучу отсчетов в прерывании ПДП.
9 часов назад, AVI-crak сказал:К тому-же стыковать массивы с разным окончанием фазы - та ещё задачка
При использовании прямого цифрового синтеза (DDS) этого не требуется.
10 часов назад, x893 сказал:Можно быстро-быстро посмотреть пример
Можно, но лучше сначала думать своей головой.
-
34 минуты назад, dimir сказал:
А если не использовать DMA
Можно быстро-быстро методом DDS набить половину массива, натравить на массив ПДП в циклическом режиме и пока ПДП скармливает эту половину таймеру - быстро-быстро набить вторую половину массива. Потом повторять набивание первой/второй половин в прерываниях HTIF/TCIF. Я так FFSK/GMSK передавал в эфир на очень неспешном F100 и оставалась куча времени на другие задачи.
-
2 часа назад, tonyk_av сказал:
Во-первых, осознай _зачем_ так делается.
Поделитесь тайной: _зачем_ в случайные моменты времени при выполнении очередного шага в отладке сворачивать все открытые в этом окне структуры? Зачем их сворачивать при перезапуске отладки? Кто-то лучше меня знает, куда мне смотреть, а куда не стОит?
-
1
-
-
Тогда что-то в программе. Протеус позволяет выполнять программу по ассемблерным командам? Скорее всего - да, вот и пройдите начиная от вектора сброса.
-
11 минут назад, astral_ сказал:
Я замкнул контакты кварца и при попытке прошить была ошибка.
Воооот. Значит таки ваш контроллер работает от кварца, но пока непонятно, чем занимается. Тогда читайте, что я написал про WDTON.
-
1 час назад, astral_ сказал:
программатор ISP
А программа какая им управляет?
1 час назад, astral_ сказал:если выставить фьюзы для внешнего кварца, а кварц не подключить к МК, то при попытке его прошить будет ошибка, у меня же программа нормально записывается
Я все-таки недопонял - вы прошили CKSEL для кварца и после этого, с физически отключенным кварцем он у вас все равно прошивается? Значит CRSEL не прошились или прошились неправильно - у вас идет тактирование от внутреннего RC. Или вы не пробовали с отключенным кварцем? Так попробуйте - отпаяйте его или просто замкните его ноги пинцетом. Чудес же не бывает. Прочитайте CKSEL - в них действительно то, что вы хотели записать?
1 час назад, astral_ сказал:МК ничего не выдает
Значит программа где-то зацикливается. Может не успевает что-то сделать и его сбрасывает сторожевая собака (watchdog timer). Может вы вместе с CKSEL прописали WDTON и не сбрасываете собаку - тогда через 16 мс она сработает и все начнется с начала. Телепатировать можно до бесконечности.
1 час назад, astral_ сказал:также не работает и в протеусе
С протеусом не работал, но этого не понимаю - как программа может не работать? Контроллер не работает только в трех случаях - когда нет питания, когда снаружи прижата нога сброса и когда на него не подается тактирование. В симуляторе ни одно из этих условий не выполняется, он в любом случае должен исполнять какие-то ассемблерные команды.
-
23 минуты назад, NefoRalt сказал:
И я не понимаю, то ли таймер косо запускается, то ли запуск АЦП криво закодил
Махайте ногами через модули сравнения (compare) обоих таймеров и смотрите осциллографом/лог. анализатором.
-
10 часов назад, astral_ сказал:
программатор прошивает, но схема также не работает, в чем может быть причина?
Например, вы забыли повесить на кварц конденсаторы. Или ваш программатор воспринимает галочку как ноль, а ее отсутствие - как 1 (PonyProg этим страдал, чуть ли каждую неделю лет пятнадцать назад тут кто-нибудь плакался) и вы вместо 1110 записали 0001, что соответствует внутреннему RC-генератору на 1 МГц. К тому же CKSEL=0 рекомендован для керамического резонатора, для кварца производитель рекомендует CKSEL = 1. А вообще "схема не работает" слишком неконкретно. Рассказывайте подробнее - что вы хотите получить, что наблюдаете, что за программу вы заливаете, какой программатор используете и т.п.
Программатор прошивает только один раз? Если бы вы правильно запрограммировали CKSEL на кварц и кварц не работал бы - после сброса последовательный программатор больше не смог бы подключиться к процессору. Или вы используете высоковольтный параллельный программатор? Пока будем по-умолчанию предполагать последовательный программатор, значит либо вы неправильно прошиваете CKSEL и контроллер у вас продолжает работать от внутреннего RC, либо кварц работает и дело в вашей программе.
-
Использовал GD32F100, защиту выставляю своим загрузчиком по команде в зашифрованном образе прошивки (программа одна и та же, что для STM, что для GD32, единственное - пришлось вставить __DSB() между записью ключей в OPTKEYR и проверкой OPTWRE). После выставления защиты у меня отправка подтверждения и бесконечный цикл со сбросом по сторожевой собаке. Наблюдал проблему, что при подключенном отладчике (SWD, ST-link + OpenOCD) после выставления защиты и сброса по собаке программа не выполняется, куда его уносит непонятно (защита-то включена). И вывести его из этого состояния можно было только передергиванием питания - после передергивания питания программа работала штатно, отладчиком можно подключиться и снять защиту. Если отладчик не подключать - тоже все работает штатно (устанавливается защита, собака сбрасывает, программа начинает работать с начала). Потратил часа два, пока догадался отключить отладчик, глубже копать не стал - изделие старое, доработок не планируется.
-
В 13.08.2022 в 00:00, jcxz сказал:
Зачем? Есть разъём SWD. Какой смысл в заведении отдельного разъёма для одной единственной операции? Неужто так важно сэкономить на покупке единственного дешёвого эмулятора для производства???
Да чтобы весь цикл программирования/тестирования на производстве проходил через один разъем и один преобразователь USB-UART путем запуска одного-единственного скрипта/командного файла.
-
22 часа назад, TOG сказал:
и я отключаю прием на время пока идет передача.
Отключаю глобальное прерывание USART1
Хм. А почему бы для отключения приема не сбрасывать бит RE включения приема в самом УСАПП (USART)? Или "это - для слабых!"?
22 часа назад, TOG сказал:Пытаюсь сбросить бит Pending (HAL_NVIC_ClearPending(USART1_IRQn). Не выходит. Бит не сбрасывается.
Потому что вы не сбросили бит RXNE или как он там называется в вашем УСАПП.
-
5 часов назад, SII сказал:
может оказаться как минимум небезынтересным посмотреть, за какой прирост сколько приходится платить.
Максимальный уровень оптимизации как бы предполагает, что клиент готов отдать все за любой прирост
-
34 минуты назад, Turgenev сказал:
и этот стык можно будет использовать для прошивки
Тогда на тот же разъем должны быть выведены BOOT0 и RST, а это потенциальная ловля помех и непреднамеренные уходы в загрузчик. Лучше все-таки все 6 сигналов для программирования (GND, питание, Rx, Tx, RST, BOOT0) вывести на отдельный разъем на плате недалеко от контроллера - он, фактически, нужен только на производстве и только один раз - для заливки собственного загрузчика, через который в дальнейшем через любой выведеннный наружу интерфейс заливаются шифрованные обновления.
34 минуты назад, Turgenev сказал:Стало интересно, а если бы первый ЮАРТ был занят SN65C3232PW или наподобие микросхемой преобразователем, можно было бы вывести ЮАРТ параллельно для прошивки? Не помешала ли бы микросхема, висящая на том же ЮАРТе процессу прошивки? Естественно, при условии что микросхема ничего не принимает.
Если выход этой микросхемы подсоединять не напрямую, а через резистор 1...10 кОм - ваш программатор ее однозначно пересилит и будет совершенно неважно - принимает она что-либо или нет.
-
2 часа назад, repstosw сказал:
Из плюсов IAR(по сравнению с GCC):
Даёт более компактный код - меньше в 1,5-2 раза. Причём при оптимизации по скорости.
А вы не проверяли, может этот более компактный код стал медленнее? Чем-то напоминает анекдот:
Цитата- Мы починили, теперь ваш принтер работает как часы!
- Это хорошо, но мне нужно было, чтобы он работал как принтер...
-
Если вы в Европе - переводите сразу в тепло трением!
-
Алгоритм "приведения в чувство" описан в конце документации (USING SET AND RESET TO REMOVE BRIDGE OFFSET и EXAMPLE OF SELFTEST).
По исходникам вижу, что после включения делаю self-test как описано в документации, потом вычисляю смещение (Offset), опять же по документации и в процессе измерений вычитаю рассчитанное смещение из считанного результата. Для моей задачи (оценка положения кольцевого магнита в водяном счетчике) этого оказалось достаточно, более глубоко не копал.
Плавающую точку в расчетах не использовал - там и 32-битных целых вполне хватает.
-
На первый взгляд мне больше нравится вторая схема - в ней емкость трансилов отвязана диодами. Но у нее есть существенный недостаток - при наступлении аварийной ситуации трансил уходит в КЗ (гарантированно, даже при перегрузке до трещин в корпусе), а диод выгорает в обрыв, оставляя схему без защиты. Есть слабая надежда, что первым выгорит резистор - но тут никаких гарантий и скорее нет. Так что - да, третья схема наиболее надежна.
48 минут назад, Loriot сказал:поставил бы его, если существовал бы его отечественный аналог
А если набрать его из дискретных элементов? Там и емкость при последовательном соединении трансилов уменьшится.
-
4 часа назад, koluna сказал:
но внутренний генератор запускается с внешним кварцем 8 МГц. Вижу синусоиду...
А с завода не должен - с завода они все настроены на работу от внутреннего RC-генератора и никаких синусоид снаружи не видно. Значит кто-то ему fuses перешил и, вполне вероятно, мог по ошибке отключить последовательное программирование. Может потому вся партия и была выпаяна. А барыги в этом не разбираются, для них это "микросхема без пробега по российским дорогам, вчера новая была".
-
9 часов назад, Alexey_N сказал:
.Видимо не получается найти правильный пункт меню. Я нажимаю Файл - Импорт - Схема из другой САПР. Вот скриншоты.
Что я делаю не так?полагаю, схему надо предварительно в PCAD сохранить в формате pcad-ascii.
9 часов назад, Alexey_N сказал:Можно ли в этой версии сделать выделение/подсвечивание цепей?
Если не изменяет память - в плате надо выделит сегмент дорожки и несколько раз нажать U.
В схеме у меня в 6.99 вторая сверху иконка справа.
-
9 часов назад, Obam сказал:
пример STM32L451
У F107 все не так гибко. Там, чтобы получить тактовую 72 МГц, 48 МГц для USB и 50 МГц для PHY требуется кварц, частота которого кратна 5 МГц.
-
1 час назад, Reystlin сказал:
При каждом включении необходимо будет вставить этот кусок кода
Занесите это значение в константу, потом присваивайте ее значение.
stm32 Cинусоида.
в STM
Опубликовано · Пожаловаться
Для начала прочитать их описание в документации на контроллер.
Перечитал несколько раз. Так ничего и не понял.
Как же у студента из одного массива ШИМом формировались три синусоиды и от них трехфазный синхронный двигатель крутился и скорость регулировалась? Как у меня ATмега88 (без ПДП - его там нет) с кварцем 16 МГц формирует 31 кГц ШИМом 6 синусоид 400 Гц из одного массива с огибающей синуса для управления 3 двухфазными двигателями ДиД, оцифровывает 2 сельсина, считает ПИДы следящих систем и успевает еще общаться с управляющим компьютером? Как такая же ATmega88 формирует тем же ШИМом из того же массива огибающей два трехфазных напряжения частотой 400 Гц с плавным нарастанием частоты и амплитуды от 0 до заданных значений и потом с плавным снижением частоты и амплитуды до нуля?
Нет. Но приходится обучать принятых на работу студентов.