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

esaulenka

Свой
  • Постов

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

  • Посещение

  • Победитель дней

    2

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


  1. Вопрос крайне интересен :-) Мне всегда был нужен двунаправленный SPI, в этом случае отлично работает метод "положили в DR, подождали RXNE, считали DR".
  2. Какой-то странный флаг у ST-шников получился, да. Они это и сами признают:
  3. Компилятор-то какой? Для gcc можно использовать __attrubute__((used)) const char name_fw[] PROGMEM = "xxxx"; Подробности: https://gcc.gnu.org/onlinedocs/gcc-5.2.0/gc...able-Attributes
  4. STM32F103CBT и I2C2

    Почему-то на осциллографе отчётливо видны 25 МГц, а ноги второго I2C перекрываются с эзернетом. Этот чудо-HAL случайно тактирование на модуль MAC не включил? :-) UPD. Глупость говорю, попутал со 105-м.
  5. Практика показывает, что безответственными девайсы получаются сами собой. Например, если недостаточно хорошо продумать условия сброса ватчдога, половина freertos'а виснет, в живых остаётся только "малозначимые" задачи, одна из которых продолжает дёргать ватчдог. Спасибо за ценные сведения. Но на практике проще сбрасывать единократно запущенный ватчдог постоянно, чем его включать-выключать. Это если выключение ватчдога вообще предусмотрено.
  6. Для автообновления (и прочих спецрежимов) я делал специальные костыли - отдельно дёргал ватчдог. И freertos обычно стартует несколько :-) быстрее. Ватчдог, правда, был бесплатный - внутренний. Это я к тому, что условие задачи выглядит слегка надуманным.
  7. Добро пожаловать в реальный мир. Суть его такова, что отладчик корректно показывает буковки-цифирки только при низких уровнях оптимизации. Правильно написанный код при этом работает с любой оптимизацией. Понимать, как именно он работает, приходится по асм-листингу.
  8. И почему бы это сразу не описать, в первом же сообщении?.. Таймером, на мой взгляд - единственное нормальное решение. Без всяких прерываний, раз уж эту миллисекунду не жалко :-) Если в контроллере не используется встроенный ЦАП, можно задействовать самые простые таймеры - TIM6/TIM7. Считать nop'ы можно, но, во-первых, лениво (это после каждой правки расчётной части проверять, подбирать заново...), а во-вторых, частота опроса будет плавать, если алгоритм обработки нелинейный (например, входные значения меньше 100 обсчитаются по одной ветке, больше 100 - по другой).
  9. Я правильно понял, что эта "библиотека" будет содержать вечный цикл с ожиданием флажка таймера (с последующей обработкой данных) ? Это принципиально плохое решение. Хотя бы потому, что остальной, неизвестной части программы тоже нужно процессорное время.
  10. Тем не менее, там есть готовый кусок кода. Работающий. А написать своё, тесты продумать-сделать-прогнать... У меня часа два займёт. Можно только восхищаться человеком, производительность которого на порядок выше. Я сам не большой любитель супербиблиотек со встроенной кофеваркой. Но тут задача - стандартнее придумать сложно, надо брать готовое.
  11. Это называется "велосипедостроение". Бессмысленное и беспощадное.
  12. У кейла можно сделать это галками, в свойствах файла. Естественное ограничение - в эту область памяти переедет всё содержимое файла.
  13. А дальше вдумчиво читать описания slave mode и TIMx_SMCR. Конкретикой не поделюсь - сам я этим режимом не пользовался.
  14. Ну уж раз галка есть, то, конечно же, так тому и быть. Неважно, что в user manual NXP-шники пишут: Не, ну как тут с галкой-то поспорить?! Документация заведомо в проигрыше... Reference manual от STM32F030
  15. Вот тут написано чуть подробнее: википедия. С одним, правда, исключением - ядро ARM в теории поддерживает оба порядка байт, но на практике (в кремнии) реализуют только little endian. А вот это, в общем случае, плохо. Не каждый процессор умеет читать переменные длиной 2 байта с нечётного адреса. ARM7, например, от такого кода сломается.
  16. К слову, есть вот такая замечательная штука: http://caxapa.ru/codebook/?search=m6 Иногда угадывает :-)
  17. STM32F373 GPIO

    Банальный ответ - отладчиком прочитать регистры тактирования (RCC_*), выписать на бумажку, и по reference manual'у разобрать их на битики. Вместе с тщательным курением этого мануала занимает полчаса.
  18. Пробовал этот чудо-код, не понравилось. Во-первых, без поллитры не разберёшься (я так и не смог - слишком много уровней накручено), а во-вторых, оно как-то очень неоптимально спроектировано. Во всяком случае, HID на STM32F105 с библиотекой куба генерировал в 2-3 раза больше прерываний, чем с библиотекой libopencm3. В libopencm3, правда, есть косяк с передачей данных по control endpoint, но если не делать HID (или делать HID с передачей по interrupt ep, как сделал я), то всё хорошо. Ошибка явно железячная, т.к. при добавлении задержек, приводящих скорость libopencm3 к виду ST'шной библиотеки, ошибка пропадает.
  19. Режим one pulse mode просто сбрасывает битик TIM_CR1_CEN в момент, TIM_CNT станет равным TIM_ARR. Чтобы снова запустить таймер, надо установить этот бит обратно. Однако в момент прерывания он явно ещё тикает, и эта идея не работает, нужна какая-то другая :-)
  20. Например, когда версий у программы больше одной, а настройки при апгрейде хочется сохранять. Поддерживать, скажем, три разных структуры настроек - геморрой с неожиданными багами. PS делали подобный велосипед (структура - прям по букварю); но там была флеш. При изменении настроек всё вычитывалось, перестраивалось и записывалось обратно; с фрагментацией бороться было не надо.
  21. Ещё раз предлагаю ознакомиться с reference manual. И сравнить раздел "Channel configuration procedure" и код DMA_Cmd().
  22. ЭТО надо забыть и внимательно изучить reference manual. Там английским языком сказано, что после того, как DMA передаст запрограммированное количество байт, оно останавливается. Потом снова надо записать требуемое количество в регистры и снова запустить передачу. Термин "выгрузить в DMA" некорректный.
  23. Что странно, описание гуглится плохо. Зато есть локальная копия:
  24. Для кейла надо: 1) найти меню Install Pack, Select Pack (зелёные кнопки с квадратами). Установить этот самый pack под используемый процессор. 2а) при создании нового проекта нужный стартап подключится автоматически 2б) для готового проекта скопировать стартап отсюда: C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\1.1.0\Device\Source\ARM\startup_stm32f10x_ld.s (путь поправить в соответствии с используемым контроллером). Там же рядом лежат полезные файлы - описание регистров, пример инициализации clock'ов. А __main() - штука нужная. Эта библиотечная функция инициализирует глобальные переменные, которые используются в Си-шном коде. Потом оттуда вызывается пользовательский main()
×
×
  • Создать...