Jump to content

    

Сергей Борщ

Модераторы
  • Content Count

    9044
  • Joined

  • Last visited

Everything posted by Сергей Борщ


  1. Вы слишком хорошо думаете о своей способности телепатически передавать мысли. Вы в следущий раз как-то явно отмечайте где мы читаем, где не читаем, а где рыбу заворачивали. Заметьте - запрос, выданый вами.
  2. Создание проекта на assembler в STM32F4

    Ладно, хватит глумиться. Ivanyshka, как вы уже поняли, здесь не любят ленивых студентов. Попробуйте разместить свое задание в разделе "предлагаю работу", но шансов мало. еще формулу запихнуть в макрос и расчет этого значения возложить на компилятор - будет шедевр и по форме и по содержанию.
  3. Какая-то чертовщина с FT2232D

    Проверьте подключение ноги TEST. Снимите ЭСППЗУ, оставив резистор на MISO, MOSI и резистор подтяжки там же - микросхема должна запуститься на данных из встроенной ПЗУ. Если и это е поможет - проблема в монтаже. Чудес не бывает, да.
  4. Загрузчик Chip45 для AVR ATmega 328P

    Так делается в большинстве других контролеров. В AVR под загрузчик выделяется область в конце памяти и при запрограммированном бите BOOTRST выполнение программы начинается с этой области. Размер области определяется битами BOOTSZ и выбирается таким, чтобы в нее уместился загрузчик. "более-менее" пишется через дефис. На вашей картинке красным по белому написано: без инверсии, т.е галочка соответствует единице. Ориентироваться проще всего по биту RSTDSBL - пока он в единице, вы можете достучаться до контроллера программатором. А программа на компьютере знает, что ей надо подергать этот сигнал? Значит нет такой команды, программа дергать RST никак не умеет и вам тоже придется сбрасывать вручную - либо какой-то кнопкой на RST, либо передергивая питание. Или, если имеются исходники программы, добавить в нее дерганье DTR. "Вручную" пишется слитно. Да, именно так - если бит RSTDSBL не прописан в ноль, нужен низкий уровень на ноге RST. Я использую загрузчик из примера применения AVR231, но он настолько сильно доработан напильником, что от него почти ничего оригинального не осталось. И после этих доработок мои программы обновляются по команде через УАПП (UART) в любой момент времени, дергать RST не требуется. Естественно, основная программа (приложение) умеет принимать эту команду и при получении этой команды выполняет некоторые действия для запуска загрузчика. Загрузчик, если запущен не из приложения (если контрольная сумма приложения не совпала) тоже умеет принимать эту команду и само обновение начинается только после получения такой команды. Загрузчик при включении питания проверяет контрольную сумму приложения и отдает управление приложению только в том случае, когда контрольная сумма приложения совпала. Если не совпала - мигает всеми светодиодами и ждет команду обновления. Да, можно. Организуете прием команд, по определенной команде запускаете WDT на минимальное время и зацикливаететесь. Конкретно в этом МК - только от состояния RSTDSBL.
  5. ttyACM на Линуксе

    Насколько я помню, putty пишет в лог не все байты. Байты с кодом 0x00 она у меня точно отбрасывала. Выставленная в настройках терминальной программы скорость влияет только на число, передаваемое в команде SET_LINE_CODING и на скорость обмена по USB никак не влияет.
  6. Проблема с I2C в STM32F4

    Общение с I2C через куб? Достался мне от коллеги проект (правда, на L072) с общением с датчиками по I2C через кубовые функции. Все вроде бы работает нормально, но очень редко и непредсказуемо вдруг оба датчика одновременно как-будто сходят с ума и начинают гнать чушь до снятия питания. Совершенно случайно такой отказ произошел у меня на столе под отладчиком. Что выяснилось: куб по какой-то причине вышел из функции чтения не считав принятый байт (возможно, по таймауту). При следующем чтении он сначала вычитывал оставшийся байт, потом пять байтов из новой транзакции и шестой снова оставлял в регистре приема. Таким образом, все принятые данные сдвигались на один байт. Никакого сброса периферии I2C в случае ошибки там не предусмотрено. Не стал пытаться это исправлять, просто перевел все на свои самописные функции.
  7. Загрузчик Chip45 для AVR ATmega 328P

    Понятия не имею про этот загрузчик, но общие соображения: 1) Состояние BOOTSZ должно соответствовать начальному адресу вашего загрузчика. На всякий случай проверьте. И учтите, что в документации на контроллер, в описании этих битов, начальный адрес области загрузчика указан в словах, а в hex-файле он в байтах, т.е. в два раза больше. 2) Состояние CKSEL указывает на внешний кварц. Он запаян? Его частота соответствует той, на которую расчитан собранный образ вашего загрузчика? Конденсаторы на нем стоят правильного номинала? Есть ли вообще генерация на кварце? 3) CKDIV у вас запрограммирован, т.е. часота кварца делится на 8. Сильно сомневаюсь, что загрузчик задуман работать на такой низкой частоте или что в его коде предусмотрена настройка предделителя (регистра CLKPR). Полагаю, что этот бит должен быть запрограммирован в 1, т.е должна стоять галочка. правильно писать "нибудь" Заведен ли какой-нибудь сигнал с вашего интерфейса на ногу RST? Если нет - то в описании этого загрузчика должна быть описана какая-то команда, при посылке которой ваше приложение должно делать программный сброс (единственный способ сделать это в AVR - запустить собаку (watchdog) и дать ей сработать). Если ничего этого нет - то значит такой команды не предусмотрено.
  8. Это же надо переключить язык, набрать три буквы вместо двух "шт", переключить язык взад. И все ради чего? Какое-то желание выделиться?
  9. LWIP Socket API SOCK_RAW Не создаётся сокет.

    А не включен ли у вас аппаратный подсчет контрольных сумм? Возможно, он при отправке учитывает и рассчитанное вами значение и получает в итоге ноль. Там в lwIP была куча #define включения программного подсчета CRC для разных типов пакетов (CHECKSUM_GEN_XXX и CHECKSUM_CHECK_XXX), при использоавании аппаратного подсчета они все должны быть равны нулю.
  10. ADC/AREF/ISP неиспользуемые пины

    А вот аналоговое питание надо подавать всегда. От него, кроме очевидных АЦП, компараторов и опоры еще питаетсчя порт C и схема BOR.
  11. Весь низкоуровневый вывод дисплея реализован в одной функции. При смене разводки переписать ее - плевое дело и совсем не напрягает. А вот плодить под каждый проц, порт, бит портянки шаблонов, в которых черт ногу сломит, я как-то пока не созрел. А кроме как в дисплеях мне параллельная шина и не требовалась никогда, все сигналы для ногодрыга однобитовые. Вот такое у меня пока что мнение.
  12. STM32F091VCT6 снять защиту

    Купите новый чистый 32f103 (цена ему - копейки), впаяйте, делайте с ним все, что захочется. Когда надоест - впаяете на место родной.
  13. Не компилируется &&= в C++

    Не возбуждайтесь. Я прочитал ваше сообщение на предыдущей странице и, не заметив, что есть еще вторая страница, ответил на него. После публикации увидел предыдущие сообщения и в первом же после вашего, на которое я отвечал, было написано то же самое, что написал я. Именно поэтому я свое сообщение удалил. Удаление сообщений у меня никакими особыми флажками не помечено, я понятия не имею, что оно для своих сообщений доступно только модераторам. Так что на его отсутствие у себя жалуйтесь в лигу сексуальных реформ администраторам в соотвествующем разделе.
  14. Ладно, уговорили. Открывайте отдельную тему с подробным описанием: схема, какие конденсаторы, какой тиристор, особенности конструкции.
  15. Резонатор для STM32F030F4

    Еще одна рекомендация: забыть про рекомендацию ST настраивать неиспользуемые ноги в аналоговый режим и настроить их на вывод. Даже те ноги, которые физически не выведены на корпус - на кристалле эти порты есть.
  16. 8051 ошибка линковки

    тогда смотреть листинги других сишных функций и по ним угадывать параметры директивы $DEFFN.
  17. Где-то в тытрубе хвалили вот такой клей: https://www.aliexpress.com/item/Hot-sell-Fuji-red-glue-adhensive-40g-for-SMT-repair-bga-Consumables/32748750004.html Именно для приклеивания вырваных с дорожками USB-разъемов. Пока руки не дошли заказать и удостовериться.
  18. На тытрубе куча роликов, как народ делает контактную сварку из трансформатора от старой микроволновки. Вполне себе бюджетно.
  19. Не компилируется &&= в C++

    Это был утрированный пример элементарного выражения, приоритет операций в котором известен каждому школьнику старше второго класса. Даже после просмотра кода не понял, что означает "rb" в названии функции. Так что стараюсь давать полные, но не сильно длинные названия функциям. Максимум из двух слов. Остальное вкладываю в имя объекта.
  20. Не компилируется &&= в C++

    Вот именно поэтому, наверное, и не существует короткой записи "&&=". И более правильно говорить не "один из", а "второй", потому что порядок вычисления операндов для этого оператора строго определен.
  21. Не компилируется &&= в C++

    К чему споры? Неспособный запомнить элементарное может писать со скобками y = ax+b. И никто ему это запретить не сможет.
  22. Алгоритм примерно следующий: 5 секунд находимся в Stop, просыпаемся по будильнику RTC разгоняем тактовую до максимально возможных 32 МГц через PLL от HCI Заряжаем I2C на опрос датчика. I2C работает с ПДП (DMA) по прерываниям, после отработки транзакции выставляется флаг. В основном цикле в цикле ожидаем выставления флага. Цикл состоит из проверки флага, WFI, проверки таймера таймаута. делаем немного вычислений повторяем п.3-5 для второго датчика переходим к п.1 код цикла ожидания: while(!Non_empty) { ON(TEST2); __WFI(); OFF(TEST2); if(TIM6->SR & TIM_SR_UIF) // no need to stop timer because of one-pulse mode return false; } TIM6->CR1 = 0; return true; диаграмма работы п.3-6: Каналы 0,1 - работа по I2C, канал 2 в высоком уровне во время отработки обработчика прерывания I2C, канал 3 в высоком уровне во время выполнения WFI (выход TEST2). Как видно, вся работа занимает 1.22 мс каждые 5 секунд, причем примерно 1.07 мс из этого времени ядро спит (Sleep mode). Усредненное потребление платы 28 мкА (плата питается через микроамперметр, на входе платы стоит большой конденсатор, стрелка колеблется 27-28 мкА). Чудо происходит, если закомментировать __WFI - усредненное потребление падает до 11 мкА. Ядро при этом молотит - сигнал на выходе TEST2 исправно скачет 0-1-0-1. Errat-у перечитал, там ничего подобного не описано. Отладчик отключен. Что я мог еще не учесть? Пункты 1-2 выполняются средствами куба (тяжелое наследство), но вроде бы влиять не должны. Увеличивал паузу в п.1 до 10 сек - без WFI среднее потребление падает до 7 мкА, с WFI - до 22 мкА. P.S. вообще-то сначала п.3-6 тоже выполнялись кубовым кодом, без ПДП, прерываний и WFI, но после того, как куб забыл в какой-то момент вычитать регистр приема, выдал ошибку превышения timeout и все данные пошли сдвинутые на один байт, было решено заменить весь кубовый I2C на свой. Заодно ожидалось уменьшение потребления за счет использования WFI, но потребление неожиданно возросло. День поиска вывел на инструкцию WFI. Еще один потраченный день не принес решения. Прошу помощи коллективного разума.
  23. STM32L082 в спячке ест больше, чем на всем скаку

    Ясно. В програмах под управлением ОС у меня так и сделано. Как это реализовать без ОС я слабо представляю. "Отучаемся говорить за других". Это раз. Второе - как добавление WFI в цикл ожидания завершения прерывания может повлиять на потребеление чего-то за пределеами МК?