Что такое cmsis stm32

Программирование STM32. Часть 2: IAR + CMSIS

Это вторая часть цикла статей про микроконтроллеры STM32F1xxx, начало тут. Здесь мы поговорим о библиотеке CMSIS, зачем она нужна, где взять и как ее подключить к своему проекту. Все стати цикла будут находиться здесь: http://dimoon.ru/category/obuchalka/stm32f1

Введение

Cortex Microcontroller Software Interface Standard (CMSIS) содержит описание всех регистров микроконтроллера, таблицу векторов прерываний и некоторый стартовый код, который выполняется перед передачей управления функции main(). Вообще говоря, СMSIS является необязательным компонентом проекта, однако, в этом случае придется самому заботиться об огромном количестве вещей. Кроме того, эта библиотека позволяет писать в некоторой степени переносимый код с одного микроконтроллера, на другой.

Качаем CMSIS

В данный момент CMSIS поставляется совместно с STM32Cube MCU Package. Скачать его можно на странице выбранного микроконтроллера (там, где качали даташит, Reference manual и так далее), называется STM32CubeF1:

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Для скачивания нужно зарегистрироваться у них на сайте. Феее, ну и нафига они это сделали?:\ Оставлю ка я ссылку на архив в конце статьи, чтоб не возится во всеми этими регистрациями. Но все же лучше скачать актуальную версию библиотеки на официальном сайте. Весит архив к стати довольно много, 97 метров.

Создаем проект в IAR ARM

Теперь проводим небольшую подготовительную работу по созданию проекта в IAR ARM. Запускаем среду IAR Embedded Workbench:

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

В IAR-e все проекты (Projects) находятся внутри Workspace-а, причем количество проектов в одном воркспейсе может быть несколько.

Выбираем Project->Create New Project…

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

В открывшемся окне выбираем тип проекта: C->main:

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Нажимаем ОК, набираем какое-нибудь имя (в моем случае test_proj) и сохраняем в какой-нибудь папке:

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32Проект создан. После этого выбираем File->Save All и в открывшемся окне набираем имя нашего Workspace-а, его можно назвать так же, как и проект.

Теперь нам надо настроить проект под конкретный микроконтроллер, а именно STM32F103C8. Нажимаем правой кнопкой мыши на названии нашего проекта и выбираем пункт Options…

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

В разделе General Options на вкладке Target выбираем наш микроконтроллер:

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Далее настаиваем уровень оптимизации компиляции. При отладке иногда натыкался на некоторые проблемы при высоком уровне оптимизации, поэтому советую в C/C++ Compiler на вкладке Optimizations ставить None или на крайняк Low:

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Первая строчка указывает на корень проекта, где лежит main.c, это вроде как не обязательно, но пусть будет, вторая на будущую папку с CMSIS. Обращаем внимание на стрелки прокрутки вкладок, выделил синим:

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Теперь отладчик. В разделе Debugger на вкладке Setup выбираем ST-LINK, который идет в комплекте с отладочными платами Discovery:

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

и на вкладке Download ставим галочку Use flash loader(s):

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

После этого в разделе ST-LINK выбираем тип интерфейса подключения, у нас по SWD:

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Фух, проект настроили. Нажимаем OK для сохранения изменений.

После этого идем в каталог с проектом и создаем там папку CMSIS, в нее мы будем складывать файлы библиотеки CMSIS:

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Библиотека CMSIS

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Обращаем внимание на строчку:

Ага, STM32F103C8 тут есть. Значит для нашего микроконтроллера подойдут исходники, от B версии: STM32F103xB. Запомним это. Из этой папки копируем в CMSIS проекта следующие файлы:

Далее переходим в .\CMSIS\Device\ST\STM32F1xx\Source\Templates и отсюда забираем файл system_stm32f1xx.c

После нам нужен стартап-файл. Заходим в .\CMSIS\Device\ST\STM32F1xx\Source\Templates\iar. Там нас так же ждет большое количество файлов и мы так же ищем тот, который оканчивается на xB: startup_stm32f103xb.s. Копируем его в $PROJ_DIR$\CMSIS\.

Затем переходим в .\CMSIS\Include и забираем вот эти 3 файла:

Так как в STM32F103C8 микропроцессорное ядро Cortex M3, то и берем соответствующие исходники.

Вот так это должно выглядеть в папке $PROJ_DIR$\CMSIS:

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Теперь эти файлы надо добавить в обозреватель проекта в IAR-е. Для удобства создадим группу с одноименным названием CMSIS. Нажимаем правой кнопкой мыши на названии проекта и выбираем Add->Add Group…

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Вводим название группы и нажимаем OK:

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

После этого в группу CMSIS добавляем файлы из папки CMSIS:

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

В открывшемся диалоге выбираем все файлы и нажимаем Открыть:

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

В результате получаем вот это:

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

После этого открываем файл stm32f1xx.h и раскомментируем стоку с #define STM32F103xB:

Далее пишем следующий main:

Выбираем Project->Make. Если все сделали правильно, то получаем сообщение об успешной компиляции проекта:

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Вот мы и научились подключать CMSIS к нашему проекту. В следующей статье мы продолжим изучение микроконтроллеров STM32 😉 Продолжение тут.

Источник

STM32 старт с CMSIS

Вот как быстро набирают обороты микроконтроллеры ARM! Уже сложно игнорировать их неоспоримые преимущества. Вот и я ковыряя AVR косо посматривал на STM32, к слову конкретно микроконтроллеры STMicroelectronics далеко не единственные Cortex-M тем более ARM. ARM это огромное семейство различных ядер, и вообще правильно говорить ядро ARM Cortex-M, само по себе ядро это еще не микроконтроллер и микропроцессор. Но это те еще дебри которые вылезают в огромную статью, так что не будем об этом. В этой же статье я хотел немного пролить свет на Cortex-M от компании STMicroelectronics, а если еще точнее то конкретно на пожалуй самый дешевый: STM32F030F4P6. Когда я его покупал (конец 2017г) то цена за 1шт из комплекта 10шт была порядка 35р. 35 КАРЛ! Что вы порекомендуете за 350р/10шт? Ну давайте начнем по порядку.

Я бы начал писать с начала а именно с системы тактирования. Но здесь как то сложно наблюдать что изменилось не так ли? Начать с портов ввода вывода и стандартного Hello World!? Вроде бы тоже как то вырвано из контекста. Попробуем со средств разработки.

Средств разработки существует много, серьезно, прямо целый зоопарк. Среди них существуют три гиганта, IAR Embedded Workbench, Keil uVision, а вот с третьим гигантом немного сложнее, сюда я запишу Eclipse‘о подобные среды а именно среды программирования построенные на базе Eclipse. Выбор пожалуй вопрос индивидуальный, я совсем не хочу разводить холиваров на эту тему, но для читателей скажу что IAR и Keil неплохи своим компилятором(спорный вопрос и если дело дойдет до реальной прошивки я попробую более объективно это показать) но просто отвратны редакторами. Библиотеки. Вот тут я буду нещадно уничтожать как HAL так и SPL, будем писать так как пишут под тот же AVR, будем дергать регистры, будем писать свои функции. Хватить плодить ардуинщиков, она хороша ТОЛЬКО для старта! Хватит CTRL-C, CTRL-V! Будем думать своей головой. Будет не просто, придется стереть колесико мыши крутя на мониторе Datasheet и Reference Manual. Их наличие перед глазами обязательно! Никаких analogRead и грешных analogWrite. Только регистры только хардкор, ниже только ASM!

Итак с чего начнем? С покупок! Идем в магазин, интернетмагазин, или куда вы там ходите? И покупаем/заказываем наш микроконтроллер, лучше без отладочной платы.

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Далее нам необходим загрузчик, рекомендую приобрести STLink v2, но за неименеем подойдет и прошивка через UART.

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

А так же необходима плата/переходник TSSOP20-DIP20. Даже без кварца обойдемся! Если есть желание поковырять USB то советую обратить внимание на F042 в том же корпусе. Итак что имеем? 16кб флэш неплохо! 4кб оперативной памяти отлично! Куча периферии мне даже лень перечислять, как вам ПЯТЬ шестнадцати битных таймера + один системный двадцати четырех битный, и это в таком малыше, дайте два!

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Ну и поговорим об окружении/ide. Лично я программирую в Linux, не нужно пугаться, все что там создано универсально. Я попытаюсь описать именно универсальный способ сборки прошивок. Что понадобится? GCC! Это главный козырь *nix систем. О нем можно писать невообразимо много. Конкретно нам понадобится arm-none-eabi-* утилиты, туда же входит отладчик который умеет всё! Утилита OpenOCD версии от 0.9.0, и какой нибудь редактор с подсветкой си, любой который вам удобен. Для тех кто через UART вам же придется довольствоваться stm32 flash loader demonstrator. Для пользователей linux понадобится разрешить юзеру доступ к stlink. Но так как они продвинутые, описывать не стану, гугл все решит.

Далее возьмем CMSIS библиотеку, это своего рода сборник дэфайнов, который делает работу с регистрами подобной AVR, и даже лучше! Ну например в AVR есть регистр PORTB он определяет что у нас на ножке земля или питание. А в CMSIS это выглядет так: GPIOB->ODR немного сложнее? Но тут сыграло роль бОльшее количество переферии, и даже у портов намного больше регистров. Ну например у того же GPIO аж 11 регистров для настройки порта. Конкретно настройка уровней на выводе занимаются 4 регистра, зачем так много позже разберемся. Начнем! Для начала немного о процессе сборки. GCC компилирует объектные файлы, потом LD занимается распихиванием данных из этих файлов по адресам для конкретного МК. Ну это если коротко. Принимая во внимание огромное разнообразие ARM ядер и еще большей разновидностью переферии используемой с ними логично предположить что LD не в состоянии знать о том как устроена память в каждом из них, а значит ему нужно это указать и занимается этим специальный скрипт. Привожу скрипт для данного МК выдернутый из SW4STM32.

Далее файл startup_stm32.s, стоит понимать что это исходник ASM, то есть это рабочий код, можно прямо на ассемблере прямо в этом файле писать программу. Тут нас интересует .cpu cortex-m0 и .thumb это определения для ASM которые говорят что будут использоваться соответствующие наборы команд. Далее Reset_Handler это то куда МК попадает после Reset. Еще точнее от сюда начинается выполняться программа, заметьте не с main и не system init а именно с Reset_Handler он же указан в скрипте линкера. Тут происходит вся стартовая инициализация которая тоже для нашего курса не особо интересна, и в конце этого безобразия происходит прыжок в main, в тот самый который нам нужен. Далее идет перечисление аппаратных прерываний, там где стоят нули можно вписывать названия реальных функций на определенные места в соответствии с Reference Manual. Ну например у меня написана функция RCC_IRQHandler заходим в RM на страницу 170 и находим там RCC оно на позиции 4 если считать от SysTick начиная с нуля то это как раз то самое прерывание. Так прописываются все прерывания. RCC_IRQHandler это имя функции! Оно должно быть определено в коде, то есть такая функция должна существовать, если это не нат то мы попадем в .weak RCC_IRQHandler которая при отсутствии одноименной функции отправит программу в Default_Handler а от туда в бесконечный цикл, но программа скомпилируется! По стартовому коду вроде все. Переходим к могучему make.

Перейдем к структуре проэкта, в корневом каталоге распологается makefile startup.s и linkerscript.ld папка inc и src, все по классике, в inc обязательны файлы CMSIS: cmsis_armcc.h, cmsis_armclang.h, cmsis_compiler.h, cmsis_gcc.h, cmsis_iccarm.h, cmsis_version.h, core_cm0.h, stm32f0xx.h, tz_context.h. Для других семейств МК требуются немного другие файлы. В src нужен main.c. Это и есть минимум который получился у меня, вроде не сложно.

Попробуем уже что нибудь? Моргнем?

Просто? Максимально! Ну и где теперь HAL и SPL? Нука нука расскажите мне о прелести абстракций. Да есть трудности с файлами линкера сборщика и стартовым файлом. Но это мелочи. Что тут в коде происходит? Подключение заголовков,я уж извините, разжевывать не буду. В функции main в которую нас перекидывает как вы помните из Reset_Handler первой строкой включается порт A следующей строкой настраивается на выход пин ноль порта А, Внимание! Тут не уместно использовать присвоение так как на этом же порту находятся пины SWD, поставите равно и придется поднимать камень с помощью connect under reset в программе STLink, как это работает в OpenOCD я так и не понял. Ну а в цикле все по накатанной сброс пина в данном случае происходит через регистр BSRR, это атомарный регистр. Атомарный означает что присвоением мы затронем только необходимые пины, остальные останутся без изменений, это очень удобно и к тому же сокращает количество команд ассемблера так как мы только пишем в регистр, а при использовании битовых масок мы сначала читаем потом применяем маску и затем пишем обратно. Задержка выполнена простым циклом так как CMSIS не имеет реализацию функции delay, тут уж кто как может, кто то циклы использует, лично я для этого настраивал SysTick (это такой системный таймер который может только считать, и он общий для ВСЕХ Cortex-M так как это часть ядра). Компиляция происходит командой make all очистка make clean загрузка make debug. Теперь немного о размере программа size говорит что размер 1104байт а вот бинарник занимает 592 байта, секция BSS которая равна 512 байтам это стек, он не занимает флеш, он занимает оперативную память стеком. Попробуем оптимизацию? В файле makefile меняем параметр OPT с O0 на Os. Чуть уменьшился, получаем 524 байта, много? НЕТ! В архиве мой рабочий минимальный проэкт, предположу что для Windows пользователей нужно только прописать пути до arm-none-eabi-*. Вот пожалуй и все что я хотел рассказать, если будет интересно то я продолжу.

Источник

STM Урок 165. Библиотека CMSIS. STM32F1. Бегущие огни

Изучая возможности библиотеки LL и её умение работать на уровне регистров контроллера, мы начали больше понимать в аппаратной организации микроконтроллеров STM.

Теперь нам предстоит ещё более углубленное изучение данных контроллеров. В этом нам поможет другая библиотека — CMSIS.

CMSIS (Cortex Microcontroller Software Interface Standard) — библиотека стандарта программного обеспечения микроконтроллеров Cortex, являющаяся независимым от производителя уровнем аппаратной абстракции для серии процессоров Cortex®-M и определяет общие интерфейсы инструментов.

К сожалению, пользуясь данной библиотекой, мы не сможем генерировать проекты с помощью проектогенератора Cube MX, и инициализация всякого рода периферии ляжет уже на наши плечи, но, с другой стороны, это даёт больше свободы мыслям программиста.

Что же подтолкнуло меня на такой, так сказать, подвиг — на использование библиотеки CMSIS. Подтолкнуло многое. Особенно то, что я хотел создать урок по RCC на LL и причём всё у меня получилось, но только автоинициализация, которая генерируется Cube MX, сбрасывает BACKUP регистры причём даже до инициализации самой RTC, что делает не совсем удобным их использование, а именно для использования автономного литиевого источника питания. Можно, конечно, посредством оператора goto исходя из ряда условий обойти автоинициализацию, но, думаю, не только я не люблю костыли.
Вторая мотивация — это то, что очень уж хочется подобраться поближе к регистрам, к из настройкам, а затем уж к самому ядру ARM. Вообще-то, я уже давно к нему подобрался, разработан ряд проектов на ассемблере, думаю, и до него дойдём.

Сегодня мы напишем простой проект, с помощью которого мы «заставим» контроллер помигать 10-ю светодиодами, подключенными к его портам (конечно же с токоограничивающими резисторами).

Контроллер будем по-прежнему использовать самый простой и дешёвый — STM32F103, расположенный на недорогой отладочной плате. Мало того, схему мы тоже не трогаем. Оставим ту же светодиодную планку, подключенную к тем же ножкам, как и при использовании в уроке 144, в котором мы начали знакомство с режимами пониженного энергопотребления. Правда, никакой милиамперметр мы в разрыв подключать не будем и стандартно подключим наш дешёвый программатор к четырём ножкам платы

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Прежде чем приступить к написанию проекта, нам нужно будет познакомиться с некоторой аппаратной организацией. Хотя мы это и так делаем постоянно, но ещё много того, что мы не знаем.

Как известно, чтобы любая периферия заработала, нужно первым делом включить ей тактирование. Данная задача решается путём включения определённых битов регистра, отвечающего за ту шину, к которой подключена та или иная периферия. Вообще тактированием занимается модуль RCC (Reset & clock control). У данного модуля существует много регистров, но нам нужны именно те, биты которых будут включать тактирование нужных нам видов периферии.

Для начала посмотрим краткую схему архитектуры контроллера, на которой очень хорошо видно, какие виды периферии к какой шине подключены

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Первым делом в нашем проекте мы будем настраивать работу с интерфейсом SWD, посредством которого мы программируем и отлаживаем наш контроллер. Управление SWD происходит в регистре AFIO_MAPR, до которого мы доберёмся чуть позже, следовательно, нам надо включить тактирование AFIO (alternate-function I/O). Так как он подключен к шине APB2, то включением его тактирования занимается вот этот регистр

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Название каждого бита в таких регистрах говорящее. Каждый из них включает, ту периферию, сокращённое название (аббревиатура) которой присутствует в его названии. Поэтому AFIO включит соответствующий бит данного регистра — AFIOEN

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Аналогично в проекте данного урока мы задействуем тактирование портов GPIOA и GPIOB установкой соответствующих битов в данном регистре

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Теперь посмотрим, собственно, регистр, с помощью определённых битов которого мы задействуем SWD — AFIO_MAPR

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Этот регистр занимается переназначением ножек портов, задействованных для тех или иных видов периферии, а также конфигурирует отладочный последовательный порт. Нам нужно будет его второе назначение. За это отвечает данное битовое поле

SWJ_CFG[2:0] (Serial wire JTAG configuration): битовое поле настройки отладочного последовательного порта. Биты данного поля работают только на запись, считывать мы их не можем. Они используются для настройки SWJ и отслеживания альтернативных функций ввода / вывода. SWJ (Serial Wire JTAG) поддерживает доступ JTAG или SWD к порту отладки Cortex®. Состояние по умолчанию после сброса — SWJ ON без трассировки.

Имеют место вот такие комбинации данных настроек

000: Полный SWJ (JTAG-DP + SW-DP) с ножкой RESET

001: Полный SWJ (JTAG-DP + SW-DP), но без NJTRST

010: JTAG-DP отключен, SW-DP включен.

100: JTAG-DP отключен и SW-DP отключен.

Нас с нашим программатором будет интересовать 3 вариант с отключенным JTAG.

Так как мы будем работать сегодня с ножками портов ввода вывода, то нам интересно также будет изучить регистры контроллера, которые отвечают за настройку и управление текущим состоянием данной периферии. Хоть мы уже не раз использовали биты настройки портов, но мы никогда полностью данные регистры не изучали. Поэтому давайте восполним данный пробел.

Для каждого порта ввода-вывода, имеющегося в контроллере, существует по 7 регистров.

Первые два регистра являются частями регистровой пары настройки ножек портов. Так как ножек у портов всего 16 и для каждой ножки отведено по 4 бита для настройки, то получается, что нам требуется всего 64 бита, вот и получилось 2 регистра — младший и старший.

Первый регистр — младший, который отвечает за настройку ножек портов от 0 до 7

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Второй регистр — старший, который отвечает за настройку ножек портов от 8 до 15

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Теперь рассмотрим назначение битов битовых полей данных регистров для отдельно взятой ножки

CNFy[1:0] (Port x configuration bits): битовое поле настройки ножки y порта x.

В случае использования ножки на вход:

00: Аналоговый режим

01: Плавающий вход (состояние после сброса) без подтяжки

10: Вход с подтягиванием резистора или к плюсу или к общей шине (завит от состояния бита в регистре ODR)

11: не используется

В случае использования ножки на выход:

00: Обычный двухтактный выход

01: Выход с открытым коллектором

10: Альтернативная функция, двухтактный выход

11: Альтернативная функция, выход с открытым коллектором.

MODEy[1:0] (Port x mode bits): битовое поле настройки режима работы ножки y порта x.

00: Режим входа (состояние после сброса)

01: Режим выхода, максимальная скорость 10 MHz.

10: Режим выхода, максимальная скорость 2 MHz.

11: Режим выхода, максимальная скорость 50 MHz.

Следующий регистр — регистр входных данных

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Каждый бит данного регистра содержит состояние соответствующей ножки порта. Доступен только для чтения.

Следующий регистр — регистр выходных данных

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

В режиме выхода ножки порта с помощью сброса или установки бита, соответствующего данной ножке, мы меняем её состояние. Биты доступны как на чтение так и на запись. Поэтому мы также можем узнать текущее состояние ножки, настроенной на выход.

В режиме входа ножки мы устанавливаем направление подтяжки резистора

0 — резистор подтянут к общему проводу,

1 — резистор подтянут к шине питания.

Следующий регистр — специальный регистр атомарной установки или сброса ножек порта

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Данный регистр интересен тем, что мы можем сразу устанавливать или сбрасывать отдельные ножки порта в одну операцию. С помощью регистра ODR мы сначала его полностью читаем, если нам нужно не тронуть уровень других ножек, затем устанавливаем бит в считанном слове, а затем результат обратно записываем в регистр.

Старшая половина регистра отвечает за сброс ножек, младшая — за установку. Ноль в записываемом значении регистра не имеет эффекта, поэтому уровни ножек, биты которых установлены в ноль не тронутся, а значения ножек, биты которых установлены в 1 либо сбросятся либо установятся в зависимости от того в каком полуслове они будут находиться.

Другими словами, битовое поле BRy, где y — номер ножки порта, работает следующим образом

0 — нет эффекта

1 — сброс ножки порта в низкий уровень.

А битовое поле BSy, где также y — номер ножки порта, работает следующим образом

0 — нет эффекта

1 — установка на ножке порта высокого уровня.

Следующий регистр — регистр сброса ножек порта

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Данный регистр работает аналогично предыдущему, но здесь только биты сброса ножек.

Следующий регистр — регистр защиты конфигурации порта

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Биты данного регистра предназначены для защиты ножек портов от изменения. Если мы хотим защитить какие-то ножки от записи, то мы записываем в соответствующие им биты данного регистра, находящиеся в младшем его полуслове, единицы, остальные биты оставляем в нулях. Затем при помощи специальной комбинации над битом 16 — LCKK мы производим применение блокировки. Данная последовательность следующая: записываем в данный бит 1, затем 0, затем опять 1, затем данный бит считываем дважды, первый раз должен считаться 1, второй — 0. Если всё так, то значит мы защитили нужные ножки.

Также стоит сказать, что у микроконтроллеров высших моделей (F4, F7 и т.д.) регистры для настройки портов другие. Мы помним наши первые уроки по STM32, так как в них мы работали с CMSIS, но использовали мы контроллер STM32F407VG, установленный на плате Discovery 4, там регистры были другие. Об этом надо помнить, то есть переносимость кода на CMSIS на другие контроллеры не всегда имеет место. Также мы перенастраивали порты, когда работали с датчиком DS18B20 уже на контроллере F103.

Пока всё по аппаратной части.

Можно приступить к проекту, который мы, конечно же, не будем преобразовывать из первых уроков, а создадим с нуля.

Cube MX мы никакой не запускаем, запускаем сразу Keil и создаём в нём новый проект. Как это делать, мы знаем, но в видеоверсии я это всё равно покажу.

Проект создадим с именем BLINK01_CMSIS, также назовём и папку, в котором его создадим, выберем соответствующий контроллер

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Затем выберем следующие пункты

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Переименуем группу в дереве проекта. Хотя это и необязательно, но, как по мне, так лучше смотрится

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Создадим в данной группе новый файл main.c, сохранив его в папку с проектом, желательно во вложенной в нём папке с таким же именем, чтоб потом не запутаться

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Прежде чем начнём писать код, давайте немного настроим наш проект.

Зайдём в его настройки и во вкладке Target изменим частоту тактирования

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Установим галку вот здесь в следующей вкладке, может пригодится HEX-файл

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Также можно настроить и формирование чистого бинарника — файла BIN.

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

В следующей вкладке напишем вот это «STM32F103xB,STM32F10X_MD» (без кавычек), убедившись также в том, что уровень оптимизации — 0

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Сохраним настройки, нажав кнопку OK, затем откроем их снова, т.к. дальнейшие настройки зависят от уже проделанных.

Во вкладке Debug выберем программатор

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Нажмём кнопку Setting рядом со строкой выбора отладчика и, попав в его настройки в закладке и в следующем пункте изменим значение, также убедимся, что остальные настройки такие же как в скриншоте

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Перейдём в третью вкладку и настроим программатор на автоперезагрузку контроллера после прошивки

Что такое cmsis stm32. Смотреть фото Что такое cmsis stm32. Смотреть картинку Что такое cmsis stm32. Картинка про Что такое cmsis stm32. Фото Что такое cmsis stm32

Вот сколько настроек, и будут потом ещё. Думаю, теперь не каждому придёт в голову начинать каждый раз проект с нуля.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *