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

AlanDrakes

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

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

  • Посещение

Репутация

1 Обычный

Информация о AlanDrakes

  • Звание
    Местный
    Местный
  • День рождения 31.01.1988

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array

Посетители профиля

Блок последних пользователей отключён и не показывается другим пользователям.

  1. Наталкивался на похожее поведение, когда память не успевала считывать данные из себя при слишком быстром тактировании ядра. Проверьте, что латентность Flash'а соответствует скорости ядра.
  2. Push-Pull. На ведомых устройствах это всегда вход, так что можно не бояться выставлять на нём любой логический уровень. Если вниз (5 -> 3.3) - резисторный делитель 1к/2к Если вверх (3.3 -> 5) - Mosfet (тот же N7002) и пара резисторов. Эпизодически, когда лень заморачиваться с количеством резисторов, ставлю с инверсией: В особо замороченых случаях, когда требуется сделать более "силовой" плюс - ставлю пару N + P. N-канальный тянет затвор P-канального к нулю, P-канальный подключает сток к питанию. Из минусов - требуется резистор подтяжка уже для P-канального.
  3. На F103 успешно работает вот такая конструкция ожидания завершения передачи последнего* байта: *(volatile uint8_t *)&(SPI2->DR) = Data; // Складываем байт while (!(SPI2->SR & SPI_SR_TXE)); // Ждём, пока не станет "Свободно" в буфере передатчика (иначе можно проскочить) while (SPI2->SR & SPI_SR_BSY); // Только после этого дожидаемся снятия флага "ЗАНЯТО, Л-Л-ЛЯ!" После этого данные гарантированно переданы и можно поднимать ножку. С DMA - можно использовать те же проверки, предварительно отключив сам DMA канал.
  4. Из простейшего (так как отображает, что чип видит): 1. Попробуйте снизить частоту тактирования до 1МГц (возможно слишком длинные провода, или что-то ещё в схеме) и слишком высокая скорость обмена его в итоге и ломает. 2. Попробуйте поменять опции подключения к чипу: Connect -> Under reset / With Pre-reset (должен быть подключен пин сброса). Reset -> Hardware reset. В некоторых случаях желательно подтягивать пин сброса чипа к напряжению питания (3.3В) дополнительным резистором на 1-4кОм. Пин VTarget желательно подключать. От него питаются выходные шинные буферы (в варианте STLink'а на Discovery - нет, но там напряжение должно быть близким, иначе тоже возникают разные интересные сбои).
  5. А ещё можно вызывать __INLINE__ функции. И даже функции описывать так же. Да в конце концов! static inline __attribute__((always_inline)) void stop(void) { PORTD &=~(1<<PIND7); PORTB &= ~(1<<PINB0); } И вызывать в коде "stop();". В результате на место вызова функици будет вставлено её развёрнутое тело - обе операции с портами.
  6. Макрос пытается выполнить два действия с портами? Может в этом случае изменить его на однострочный? #define stop PORTD &=~(1<<PIND7); PORTB &= ~(1<<PINB0) В таком случае будет производиться подстановка, условно, двух команд. А та конструкция должна вызывать у компилятора вопрос "Тут же всегда будет TRUE. Оптимизировать, что ли?"
  7. Кнопка "Изменить" внизу сообщения. А с ассемблером внутри ОС - довольно сложно. Если мне не изменяет память, то можно выделить переменные статически (внутри программы) через db - посмотрите хотя бы здесь. Либо же использовать вызовы ОС, в частности malloc / free для работы с виртуальной памятью. Либо же собирать bare-metal приложение, без всех возможностей ОС. Я так пытаюсь лениво подступиться к одному китайскому SoC кристаллу.
  8. Работать с локальными переменными на ассемблере - та ещё морока. А в среде операционной системы - так вообще. Самое простое объяснение - память, которую видит программа (адресное пространство) никак не связана с реальным адресным пространством, потому что MMU в уже запущеной ОС работает с таблицами адресов (в простейшем случае) и при обращении к памяти по адресу 0xDEADBEEF (допустим), в начале идёт поиск по таблицам адресов, затем выбирается блок памяти, на который диапазон ссылается, после чего идёт попытка обращения к этой памяти (например получилась страница в 4к по адресам 0xFOODC000 ~ 0xFOODCFFF). Вам... действительно нужен ассемблер? Проще же написать программу на Си под малинку. Компилятор сделает большую часть работы за вас. Лично я ассемблером наигрался на AVR'ках. Больше не хочется писать ВЕСЬ код на нём.
  9. У меня имеется подозрение, что писать в адрес 0x100 не удаётся и именно это вызывает исключение.
  10. В базе знаний описан процесс запуска контроллера и подготовки его к шифрованию. https://docs.espressif.com/projects/esp-idf/en/latest/esp32/security/flash-encryption.html В общем случае контроллер может работать в трёх режимах - обычный (flash не зашифрован), комплект разработчика (во flash записывается расшифрованная прошивка, которую после шифрует загрузчик) и release - готовое устройство. Прошивка на внешней флешке должна быть зашифрована (либо в устройстве). Зашить во FUSE блок ключ можно с помщью команды: espefuse.py --port port burn_key flash_encryption abc/key.bin Проверить состояние: espefuse.py --port port summary Если ключ в области FUSE забит вопросами: значит ключ есть и после перезагрузки содержимое внешней флешки будет зашифровано. Ну и процесс обновления по воздуху описан там же
  11. c99 - это стандарт. Компилятор, как правило, gcc В зависимости от архитектуры может быть с преффиксами, а может быть дефолтным. В моём случае, c99 находится в /usr/bin/c99, является алиасом на /etc/alternatives/c99, который является bash-скриптом, запускающим gcc с ключом -std=c99 Сделайте sudo apt-get install gcc
  12. ChaN пишет, что в самой FAT прописывается размер сектора и Windows* системы его поддерживают, но некоторые драйверы используют зашитое значение в 512. http://elm-chan.org/docs/fat_e.html А тут пробуют отформатировать обычную карту памяти под сектор с размером 4к. Вроди бы даже успешно. Но имеются ограничения - минимальное количество кластеров для файловой системы. https://askubuntu.com/questions/983546/trying-to-format-a-64gb-microsdxc-card-with-4096-bytes-per-sector Плюс, дескрипторы USB - нужно сообщать, что размер сектора не 512 байт, а 4к. Но вам это виднее - я только пару раз прикрутил пример от ST к проекту и оно даже заработало... как-то. Ужасно медленно и в режиме только чтения. И естественно, на 512-байтных секторах.
  13. Для одного проекта наваял простенький самописный загрузчик, прикрутил к нему UART и x-modem, чтобы каждый раз не разбирать устройство и не обновлять прошивку программатором. В какой-то момент, обновляя прошивку, случайно указал .elf файл вместо .bin и заметил это только когда залилось уже 190кБ из 96 😕 В общем, счётчик страниц на STM32F103C8T6 успешно крутанулся и записал в загрузчик мусор. Хотя вроди бы всё проверял перед записью. Оказалось, что нет. Так что от ошибок программиста никто не застрахован. И самое печальное, когда от своих ошибок не застрахован.
  14. Упс. А слово-то я перепутал, да 😞 На тех кристаллах, с которыми я имел дело, обычно интерфейс выведен плотненько в 4 пина. Так почему бы не вести их рядом? А потом на месте перекинуть как требуется для другого чипа. =]
  15. На однослойке проблемно. На двух слоях ещё можно. Просто все 4 дорожки вести группой, и уже по месту как-то менять их положение (перекидывать через резисторы-перемычки, например).
×
×
  • Создать...