Поэтому я переключаюсь с PIC на ARM и купил плату обнаружения STM32F4. Пока я понимаю, что для его программирования вы можете получить доступ ко всем регистрам непосредственно в памяти (очевидным образом), а также есть 3 основные библиотеки, которые вы можете использовать для облегчения своей жизни. Теперь мой вопрос: какой из этих 3 (CMSIS, HAL, Std Peripherals Lib) самый НИЗКИЙ уровень? то есть. тот с меньшими накладными расходами. Моя цель состоит в том, чтобы изучить внутреннюю работу контроллера и не сделать мою жизнь проще (немного), поэтому я хотел бы знать, какой из них ближе к ядру, не прибегая к использованию сборки.
29
Libraries/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h
илиDrivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h
соответственно.Ответы:
Определенно CMSIS. Это не совсем библиотека, она в основном содержит определения для различных регистров.
Это именно то, что нужно для легкого доступа к регистрам микроконтроллера, чтобы реализовать свой собственный HAL. Это не требует дополнительных затрат, поскольку вы просто получаете доступ к регистрам.
Имейте в виду, что CMSIS, в отличие от двух других, определяется ARM, а не ST. Это означает, что различные библиотеки CMSIS для различных микроконтроллеров очень похожи, что значительно облегчает переносимость.
Кроме того, CMSIS является более простым, поэтому он (IMO) является наиболее универсальным и наиболее надежным, возможно, с меньшим количеством (или отсутствием) ошибок. Некоторые библиотеки hal для различных mcu, которые я использовал, довольно печально известны своими ошибками.
С другой стороны, CMSIS требует от вас гораздо больше работы. Однако это мой личный выбор, так как я предпочитаю тратить свое время на создание качественных библиотек, которые соответствуют моим потребностям, и на понимание того, как работает чип, а просто на изучение новой библиотеки.
источник
Чтобы узнать, как это работает, вы хотите использовать ничего из вышеперечисленного. Получите ручной кросс-компилятор и документацию от st, done. Начните кодировать. эти чипы вообще очень легко программировать. документация говорит вам, какие биты в каких регистрах делают что.
Любая / все эти библиотеки предназначены для того, чтобы снять с вас это понимание / нагрузку / работу и создать ощущение, будто вы просто вызываете API, как опыт разработки приложений. Это то, что хотят многие люди. Вы можете использовать весь исходный код для этих библиотек, чтобы помочь понять, но когда вы станете лучше, вы обнаружите дыры и проблемы в библиотеках, иногда очень страшный код. код, собранный вместе, написанный в общих чертах и грубо перенесенный с одного чипа на другой, возможно, поддерживающий функции, которых нет у вашего чипа, и т. д. И все они имеют чрезмерную нагрузку. В 10-100 раз больше кода для этой задачи, конечно, многие из них могут быть оптимизированы, но зачем это нужно?
Независимо от того, пользуетесь ли вы своей собственной или используете одну из этих библиотек, вам все равно следует поискать исходные библиотеки, которые вы используете, чтобы убедиться, довольны ли вы тем, что они делают, если это имеет смысл, соответствует документации по чипу и т. Д. идет не так, вам, вероятно, придется копаться в их вещах столько же, сколько в вашей, чтобы выяснить, почему.
Обратите внимание, что документы по чипам тоже не идеальны, это часть веселья.
Я не понимаю, почему сборка возникает в дискуссии о программировании голого металла. Вы можете обойтись с очень небольшой сборкой. Для этих чипов cortex-m вам технически нужно только столько ассемблера для загрузки:
Вы не можете полагаться ни на данные, ни на bss, и вы не можете вернуться с основного с этим минимумом asm. Но это все, что вам нужно для самого чистого металла. Теперь, если вы хотите делать прерывания, вам нужно больше записей в векторной таблице. больше .word строк. Я рекомендую больше asm, но возможно на 10 или 20 строк больше.
обычно это все, что я использую.
Да, это говорит Cortex-M0, но это фактический загрузчик для моего кода M4. Я предпочитаю, чтобы это был thumb, а не thumb2. И я просто повторно использую этот код из одного cortex-m в другой, меняя адрес указателя стека по мере необходимости, чтобы он работал для m0, m3 и m4. У меня еще нет m7, и я не слишком много его исследовал.
Включение fpu может потребовать еще несколько строк asm, поскольку необходимы конкретные инструкции. Но дело не в том, чтобы смешивать низкоуровневое программирование и асм. C тем, что нужно для настройки чипа, а также для написания приложения. Библиотеки, о которых вы говорите, написаны на C, а не на asm, поэтому, очевидно, им также не нужно использовать asm.
Если вы хотите изучить внутреннюю работу, напишите свой собственный код. Не используйте эти библиотеки, кроме как для справки. Иногда проще просто взломать его, чем пытаться прочитать их код. (не только ST, но и все поставщики. У одного из поставщиков была строка кода, настолько тревожная, что я использую ее как вопрос для собеседования, нет, не собираюсь публиковать ее здесь).
Безусловно, ST, но и другие производители, для экономии энергии, имеют тактовые импульсы для участков чипа, поэтому, прежде чем вы попытаетесь мигнуть светодиодом, вам нужно найти бит включения для этого блока gpio и посмотреть, выйдет ли он. сброса включен, если нет, то включите его, разговаривая с этой логикой gpio без включенных часов, он просто вешает процессор, ожидая ответа от логики, которая никогда не ответит. Они не всегда говорят вам об этих способностях. После включения они иногда проводят вас через init для некоторого определенного периферийного устройства. Документы ST довольно хороши. Исходя из микрочипа, который получает довольно плохую оценку за документацию, у вас не должно быть проблем.
источник
Я использовал и то, и другое, просто доступ к регистру и периферийную библиотеку STD. Мне легче просто иметь дело с регистрами. Также, если вы используете отладчик, вы можете просмотреть регистры и подтвердить, что они содержат то, что вы запрограммировали для них. Я думаю, что вы узнаете больше о работе чипа таким же образом.
источник
Исходя из 8-битного мира, я всегда привык программировать периферийные устройства через регистры. В паспортах микроконтроллеров (т. Е. Справочных руководствах по STM32) описывается периферийное оборудование исключительно в регистрационной записи. Поскольку программист должен прочитать эту самую документацию, чтобы узнать о периферийных функциях и возможностях, прежде чем предпринимать какие-либо попытки его использования, для меня естественно начать программирование регистров. С капризным расположением кода и комментариями я считаю, что код можно приятно читать и изменять даже после того, как он вернулся к нему через несколько месяцев.
источник
До сих пор я использовал определения CMSIS и получал удовольствие от непосредственного использования регистров. Между тем, я использовал библиотеки HAL в нескольких проектах. Это оказало значительное влияние на время выполнения кода, поэтому я вышел из него. Хотя CMSIS отвечает моим интересам, в эти дни я собираюсь быть поклонником libopencm3 . Это как
LL
библиотеки, предоставляемые ST. Тем не менее, он охватывает больше микроконтроллеров даже в семействах ST:пожалуйста, обратите внимание, что:
Вы можете найти список поддерживаемых микроконтроллеров здесь .
источник
adc_get_result()
которая заключает в себе полный драйвер периферийного устройства АЦП, включая аспекты в реальном времени, прерывания и т. Д. Похоже, что STwrite_to_scary_register
- это просто раздутая оболочка для доступа к регистру. Справедливости ради, ST не единственный поставщик, который обеспечивает такое избыточное вздутие, Atmel ASF и другие одинаково плохи.