STM8S103F3P6 и ST-Link2
Если в прошлый раз я писал о работе с STM8 из под Linux, то сейчас мне бы хотелось раскрыть этот вопрос с позиций Windows.
В качестве ОС я выбрал «старушку» Windows XP SP3, а в качестве «подопытного» чипа, так же как и в прошлый раз, у меня STM8S103F3P6 распаяный на плате как на картинке слева. Используемый мною программатор, это китайский клон ST-Link2.
Этот пост можно назвать «быстрым стартом» STM8в Windows.
Первым делом нужно будет поставить драйвера для программатора ST-Link2. Для этого заходим на домашний адрес компании ST в раздел данного программатора:
http://www.st.com/web/catalog/tools/FM146/CL1984/SC724/SS1677/PF251168
Проматываем страницу книзу, в раздел ПО:
после чего следует щелкнуть по STSW-LINK009. В результате попадем на страницу драйвера:
Как видно, драйвер предлагается для OC: Windows XP, Windows7, Windows8. Десятка похоже, что в пролете 😉
Кликнув по кнопке Download, получаем zip архив. Но т.к. как я уже говорил, что фирма ST сурова, то и никаких инсталятов со слайд-щоу и словами благодарности «за то что выбрали наше предложение», в архиве вы не найдете. Поэтому ставятся они по-другому.
Нужно вставить ST-Link2 в USB порт и дождаться когда запуститься мастер установки драйверов. В появившемся диалоговом меню следует отказаться от соединения с Window Update и в качестве источника драйверов указать распакованную папку скачанного архива.
После чего система сама найдет подходящие для себя драйвера и установит их:
Т.о. программатор начнет отображаться в диспетчере устройств:На данный момент для разработки и отладки программного обеспечения для STM8 существует четыре среды: ST Toolset от STMicroelectronics, Ride7 от Raisonance (www.raisonance.com), CXSTM8 от Cosmic software, IAR Embedded Workbench от IAR Systems. Сравнительный анализ средств разработки программного обеспечения представлен в таблице1 Таблица 1.Сравнительный анализ бесплатных средств разработки программного обеспечения
Инструментарий Среда разработки Си-инструментарий Си-инструментарий других производителей Ограничение Си-иструментария, Кбайт Программатор-отладчик STMicroelectronics ST Visual Develop Нет Cosmic software, Raisonance Нет ST-Link R-Link STICE Raisonance Ride 7 Есть Нет 16 R-Link Cosmic software CXSTM8 Есть Нет 32 Нет IAR Systems IAR Workbench Есть Нет 8 или полная версия на 30 дней ST-Link STICE
Пакет ST Toolset включает в себя среду разработки ST Visual Develop и отдельную программу для более функционального внутрисхемного программирования flash-памяти микроконтроллеров ST Visual Programmer. Среда разработки ST Visual Develop имеет встроенный инструментарий для разработки программного обеспечения на языке assembler, но у нее также имеется возможность подключения и использования Си-инструментария от Raisonance и Cosmic software. Стоит заметить, что все четыре среды с Си-инструментарием предоставляют возможность использования с некоторыми ограничениями, а именно– по загружаемому коду во flash-память. УRaisonance оно составляет 16Кбайт, у Cosmic software– 32Кбайт, а у IAR– 8Кбайт или полную версию с 30-дневным ограничением.
Сейчас нужно будет скачать ST Toolset в состав которого входит флешер ST Visual Programmer. Его домашняястраница:www.st.com/web/en/catalog/tools/PF210568
Выбрав тип микроконтроллера и программатор, попадаете в главное окно программы.
Важный момент: микроконтроллеры STM8 имеют единую шину памяти(адресная шина). Т.е. нет разделения на flash память и оперативную. Т.е. разделение есть на внутреннем уровне т.к. архитектура микроконтроллера все-таки гарвардская, но внешне, архитектура выглядит как фон Неймовская. Чтобы вспомнить, чем отличается одно от другого, приведу цитату из википедии:
В чистой архитектуре фон Неймана процессор в каждый момент времени может либо читать инструкцию, либо читать/записывать единицу данных из/в памяти. Оба действия одновременно происходить не могут, поскольку инструкции и данные используют один и тот же поток ( шину). В компьютере с использованием гарвардской архитектуры процессор может читать инструкции и выполнять доступ к памяти данных одновременно, без использования кэш-памяти. Таким образом, компьютер с гарвардской архитектурой при определенной сложности схемы быстрее, чем компьютер с архитектурой фон Неймана, поскольку шины инструкций и данных расположены на разных, не связанных между собой физически, каналах. Исходя из физического разделения шин команд и данных, разрядности этих шин (следовательно, и адресные пространства) могут иметь различные значения и физически не могут пересекаться друг с другом.
Т.е. благодаря гарвардской архитектуре в AVR одна команда выполнялась за один такт.
Скриншот ST Visual Programmer:
Оперативка нас пока не интересует, на скриншоте красными стрелками помечены кнопки чтения и заливки прошивки.
Попытка прочитать что-то без программатора приведет к ошибке:
С программатором, но без микроконтроллера, тоже приведет к ошибке:
Пример успешного чтения прошивки:
Полученную прошивку можно тут же обратно записать в микроконтроллер или сохранить в файл. Можно открыть любую другую прошивку в формате ihex и из программы прошить микроконтроллер.
Запись:
После того, как с прошивками разобрались, осталось узнать в чем эти STM8 программировать. Своего инструментария для разработки на Си у ST нет, а имеющиеся компиляторы или платны или доступны с ограничениями. Часто как наиболее оптимальное решение предлагается COSMIC, но без лицензионного ключа вы ничего в нем не сделаете, а он выдается спустя несколько дней с момента запроса (я ждал три дня). IAR имеет ограничение 8Кбайт, но лицензионный ключ выдается сразу. Причем ключ может выдаться на полностью функциональную версию, с ограничением в 30дней использования. Т.к. STM8S103F3P6 имеет как раз всего 8Кбайт, то большего как бы и не надо. В любом случае пока идет ключ для COSMIC, можно воспользоваться IAR. Скачать его можно с сайта IAR: https://www.iar.com/iar-embedded-workbench/#!?architecture=STM8
После установки, вам предложат заполнить анкету и выбрать тип лицензии. После чего на email придет ссылка с лицензионным ключом. Введя этот ключ при первом запуске IAR вы попадаете в главное окно программы.
По второй ссылке, хоть речь идет и о IAR для ARM, большая часть посвящена самой среде разработке IAR. Я не буду повторять описанного там материала, а буду на него опираться.
Сейчас наша задача составить простой Blink, скомпилировать его и загрузить в микроконтроллер. Для этого сначала нужно создать новый проект:
затем, задать параметры проекта:
имя проекта:
после чего откроется рабочее окно, где слева будет браузер проекта, в центре текстовый редактор, в снизу окно для логов. На панели инструментов не трудно будет найти кнопки компиляции и загрузки проекта в микроконтроллер:
Но прежде, чем что-то компилировать, следует сначала настроить проект. Поэтому в браузере проекта следует щелкнуть правой кнопкой по названию проекта, и открыть Options
где первым делом, во вкладке target следует выбрать целевой микроконтроллер:
а в качестве отладчика ST-LINK
Так же полезно будет зайти в опции IAR в настроить окно вывода сообшений:
После чего можно уже будет нажать на кнопку компиляции:
В нижнем окне логов появится отладочная информация.
Плата STM8S103S103F3P имеет два светодиода Один выполняет роль индикатора питания, другой подтянут к пину PB5(да, как в Arduino pin13).
Попробуем написать программу для мигания этим светодиодом:
Закомментируем сначала функцию delay, скомпилируем проект, подключим ST-Link с микроконтроллером и нажмем зеленый треугольник «Debug and Download» …
и попадем в окно отладчика. Справа будет ассемблерный листинг программы загруженной в микроконтроллер, слева на панели инструментов появятся кнопки для управления пошаговой отладкой. Нажимая «Step over» раз за разом, светодиод будет на плате будет то загораться то, гаснуть.
Раскомментиров delay, скомпилировав и загрузив прошивку еще раз в микроконтроллер, на панели отладки можно будет нажать на красный крестик. Тогда программа запустится на выполнение и светодиод начнет периодически мигать с интервалом примерно 1/5 сек.
Резюмируя можно сказать, за небольшую сумму (170 руб за ST-Link2 + 68 руб за плату STM8S103F3P6) получили в свои руки достаточно профессиональную связку железа и софта, с которыми можно сделать многое.
www.count-zero.ru
Портфель микроконтроллеров компании STMicroelectronics в его нынешнем виде сформировался несколько лет назад (рисунок 1). Исключая различные узкоспециализированные устройства, в нем выделяются 2 семейства контроллеров — 8-битное STM8 и 32-битное STM32. В то время, как последнее основано на ядрах Cortex-Mx производства компании ARM, STM8 — это архитектура собственной разработки. Несмотря на то, что в нашей стране словосочетание «контроллер от SТ» твердо ассоциируется с приборами семейства на ядре Cortex, 8-битные контроллеры удерживают устойчивое лидерство по количеству проданных микросхем, которое составляет около 240 миллионов шт. (по информации за 2011 год).
Рис. 1. Портфель контроллеров STMicroelectronics
Микроконтроллеры STM8 изначально были ориентированы на автомобильный рынок, однако успешность архитектуры позволила вывести данное семейство на широкий рынок. Но лучшие черты, свойственные Контроллерам, ориентированным на автомобильную промышленность, семейство сохранило. Это, в первую очередь, то, что вся память, как Flash, так и Eeprom, построена по технологии Еeprom, благодаря этому энергопотребление слабо зависит от температуры кристалла. Технологический процесс 130 нм гарантирует низкое потребление. Кстати, можно упомянуть, что STMicroelectronics занимает 40% рынка Eeprom-памяти и является неоспоримым лидером в этой нише, происходит это благодаря самым передовым технологиям. А то, что память занимает до 95% кристалла контроллера, гарантирует, что изделия будут отвечать наивысшим требованиям качества.
В данной статье мы рассмотрим более подробно архитектуру контроллера, научимся создавать проект в среде IAR, конфигурировать его под выбранную платформу.
За несколько лет существования микроконтроллеры на ядре STM8 стали де-факто лидером на рынке 8-битных устройств. Ежегодное производство составляет несколько сотен миллионов штук. Микроконтроллеры этого семейства можно найти повсеместно: в бытовой и промышленной электронике, компьютерах, медицинском оборудовании.
Архитектура STM8 настолько проста для программиста, что не требует глубоких знаний для того, чтобы начать работать с контроллером. Очень многое было взято от контроллеров STM32 (читай ARM). В то же время набор команд CISC гарантирует высокую плотность кода, а то, что команды в большинстве 1-тактовые и 16-битные — высокую производительность. Среди разработчиков зачастую бытует мнение, что STM8 — это инкарнация 51 архитектуры, однако это совершенно не верно. Наличие команд относительной косвенной адресации явно говорит о том, что система инструкций оптимизирована под язык «Си» для быстрой обработки условий case. Следует так же отметить, что знаний ассемблера для решения подавляющего числа задач промышленного управления не требуется.
С практической точки зрения, в первую очередь следует обратить внимание на единое 24-битное адресное пространство, в котором замечательно разместилась Flash-память, ОЗУ, Eeprom, а также регистры периферии. Это существенно упрощает написание кода, например, функции для работы с массивами из ОЗУ и Flash-памяти не требуется писать в нескольких экземплярах. Коды различных стеков и библиотек легко портируются, так как в основном рассчитаны на архитектуру фон Неймана (в смысле адресного пространства). При этом шины для доступа к разным типам памятей разделены, что говорит нам о наличии Гарвардской архитектуры.
Для того, чтобы многобайтные команды и данные поступали в ядро без задержек, реализован 3-ступенчатый конвейер. Команды вычитываются из памяти по 32-битной шине, соответственно, за 1 обращение — 2 команды. Код можно выполнять так же из памяти данных, но, так как шина к памяти данных 8-битная, то конвейер будет заполняться гораздо медленнее и производительность будет ниже, однако о такой возможности нужно знать.
Система прерываний реализована в ядре. Прерывания вызываются через вектора, которые расположены в начальной части кода. При этом контекст сохраняется автоматически. Однако для выхода из прерывания требуется инструкция, отличная от инструкции выхода из обычной подпрограммы, потому пользователь должен в том или ином виде сообщать компилятору о том, что функция является обработчиком прерываний. Количество прерываний — до 32, из которых 29 пользовательские, с задаваемым приоритетом, остальные — системные, включая RESET.
Наиболее популярные средства программирования STM8 это среды ST Visual Develop с компилятором производства компании Raisonance и IAR Embedded Workbench. В таблице 1 приведено их краткое сравнение.
Таблица 1. Краткое сравнение сред разработки IAR EW и ST VD
Параметр | ST VD | IAR EW |
---|---|---|
Поддержка ST7 | да | нет |
Ограничение по коду на бесплатную лицензию, Кбайт | 32 | 8 |
Многоплатформенность компилятора | нет | да |
Встроенный дебаггер-отладчик | да | да (ST-LINK) |
Уровень оптимизации кода | высокий | высокий |
В нашем случае мы выберем среду производителя IAR, так как контроллер, который мы будем программировать содержит всего 8 Кбайт памяти программ и по остальным параметрам он не проигрывает ST VD, зато более известен российскому разработчику, так как многие пользовались им для программирования контроллеров других архитектур.
Как уже было упомянуто выше, мы рассмотрим контроллер с 8 Кбайт Flash-памяти, это контроллер линейки Value Line. Почему? В первую очередь потому, что данное семейство позиционируется как самое эффективное в плане цены и не имеет конкурентов со стороны STM32. Данные микроконтроллеры предназначены для создания на их основе различных датчиков, контроллеров управления для бытовой и промышленной аппаратуры. То есть там, где мощность 32 бит не востребована, а стоимость и энергопотребление играют наиважнейшую роль.
Итак, остановим выбор на контроллере STM8S003K3T6. Компания STMicroelectronics для данной линейки выпустила средство для быстрого старта под названием STM8SVLDISCOVERY. Рассмотрим вкратце, что предлагает данная отладочная плата (рис. 2).
Рис. 2. Отладочная плата STM32VLDiscovery
Данная отладочная плата уже содержит встроенный отладчик ST-Link, который впоследствии можно использовать для программирования пользовательских систем.
Периферия микроконтроллеров STM8 очень гибкая и для того, чтобы настроить тот или иной блок в требуемый режим, понадобится настроить до нескольких конфигурационных регистров. Для того, чтобы защититься от мелких ошибок, на исправление которых, как правило, теряется большая часть времени, STMicroelectronics предлагает стандартную периферийную библиотеку. С ее помощью инициализация превращается в запуск функции с несколькими понятными параметрами.
Структура библиотеки приведена на рисунке 3.
Рис. 3. Структура стандартной периферийной библиотеки
Из этой структуры видно, что все обработчики прерываний собраны в одном файле. За каждый периферийный блок отвечает отдельный файл и существует конфигурационный файл, в котором пользователь должен выбрать, какие модули периферии будут включены, а какие не будут. К файлу приложения пользователя подключается единственный файл stm8s.h, а все остальное делается автоматически.
Наличие библиотек не исключает возможность работы напрямую с регистрами. Более того, оба подхода можно комбинировать для достижения наилучших показателей кода.
Данная библиотека свободно скачивается с сайта www.st.com.
Во первых, с сайта http://www.iar.com/ следует скачать и установить среду разработки IAR Embedded Workbench для STM8 в редакции Kickstart (рисунок 4).
Рис. 4. Вид проекта в среде IAR EW
Наипростейший путь создания нового проекта — это воспользоваться шаблоном-примером. В каждом архиве периферийной библиотеки имеется такой пример, который после разархивирования находится в папке ProjectSTM8S_StdPeriph_TemplateEWSTM8.
Мы же, для того, чтобы упростить себе задачу, возьмем периферийную библиотеку с шаблоном проекта именно для этой платы [1] и в этом архиве найдем файл STM8SVLDISCOVERY_DiscoverProjectsProject_templateEWSTM8Project.eww. Разархивируйте проект и запустите этот файл. Откроется среда IAR. В данном проекте-шаблоне уже настроено все необходимое для того, чтобы работать с контроллером как через библиотеки, так и через регистры (напрямую).
Как нетрудно заметить, пользовательские файлы выведены в отдельные папки и их можно быстро найти, чтобы открыть и что-либо изменить. Библиотека периферии выделена в отдельную папку и в нее можно смотреть только для ознакомления, так как все включенные в нее файлы имеют статус «только для чтения». Итак, перед нами классический вид проекта в среде IAR, где главным является файл main.c, в котором содержится функция входа в пользовательское приложение void main(void). Второй пользовательский файл — это stm8s_it.c, в котором содержатся пустые обработчики всех возможных прерываний. Эти обработчики, в случае их использования, останется заполнить собственным кодом.
Рассмотрим подробно настройки проекта. Для этого следует зайти в меню, и выбрать ProjectOptions. Пожалуй, основные опции мы рассматривать подробно не будем, так как они понятны и одинаковы для всех версий IAR. А вот опции, которые разрешают работать с библиотекой мы обсудим подробнее (рисунок 5).
Рис. 5. Свойства компилятора
Для этого найдем закладку Preprocessor в опциях С/С++-компилятора. В первую очередь обратите внимание, что подключена папка с файлами описаний (*.h) стандартной периферийной библиотеки. Далее требуется обратить внимание на наличие глобального макроса-определения STM8S003. Библиотека работает с разными линейками сери STM8S, потому этот макрос помогает ей понять, с чем ей конкретно придется работать.
В опциях дебаггера по умолчанию уже выбран ST-Link и для того, чтобы загружать проект в плату, достаточно подключить ее по USB и нажать кнопку «Download and Debug» на панели инструментов (рисунок 6).
Рис. 6. Часть панели инструментов с кнопкой запуска
Итак, мы вплотную приблизились к написанию собственного кода. Мы напишем программу, которая будет конфигурировать вывод порта, к которому подключен светодиод, и поуправляем им Перед тем, как приступить к программированию, необходимо скачать принципиальную схему, ее, а также другую полезную информацию по данное плате, можно найти здесь: [2].
Светодиод катодом подключен к PD0, анод подключен через токозадающий резистор к питанию. Таким образом, чтобы включить светодиод, необходимо подать на вывод порта логический 0.
В первую очередь изучите файл-шаблон main.c. Вы найдете в нем, кроме самого основного приложения, интересную функцию void assert_failed(u8* file, u32 line). По умолчанию она отключена макросом USE_FULL_ASSERT. Данная функция позволяет отследить некорректное использование библиотеки в том случае, если вы задали какой-то параметр неверно или перепутали порядок следования параметров. Эту опцию рекомендуется активировать для режима отладки, включив в список преопределенных символов компилятора.
Начинаем модификацию void main(void).
Для того, чтобы понять, какую функцию нужно взять для инициализации из библиотеки, нужно открыть список функций файла stm8s_gpio.c, и станет очевидно, что нужна функция GPIO_Init (рисунок 7).
Рис. 7. Функции драйвера периферийного модуля GPIO
Тут же можно посмотреть, какие аргументы принимает эта функция. Для этого не нужно открыть толстые справочники, а достаточно просто посмотреть описание функции, расположенное над ней самой в виде комментария (рисунок 8).
Рис. 8. Функция инициализации GPIO
Соответственно, первый аргумент станет очевидно понятными, это GPIOD. А вот для понимания того, что должны из себя представлять остальные, требуется отправиться к определениям GPIO_Pin_TypeDef и GPIO_Mode_TypeDef. И сразу станет ясно, что это GPIO_PIN_0 и GPIO_MODE_OUT_PP_HIGH_FAST соответственно.
Итак, мы получили функцию
GPIO_Init(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_PP_HIGH_FAST)
Включим ее в основной код. Вот и вся инициализация. После этого остается только воздействовать на состояние вывода. Для этого также обратимся в файл библиотеки и найдем наиболее подходящую функцию void GPIO_Write(GPIO_TypeDef* GPIOx, uint8_t PortVal). Аналогичным образом найдем, какие должны быть у данной функции аргументы для того, чтобы включить или выключить светодиод.
Итак, в итоге мы получим следующий вид функции void main(void) (рисунок 9):
Рис. 9. Функция void main(void)
После этого загрузим код в контроллер и по шагам (клавиша F10) пройдем все команды для того, чтобы убедиться, что код работает.
Микроконтроллеры семейства STM8 — это мощные и, в то же время, недорогие устройства, на которых можно строить различную домашнюю и промышленную автоматику. Крайне невысокая цена контроллеров линейки Value Line делает их весьма конкурентоспособными на рынке средств для построения различных датчиков (дыма, газа) там, где массовость, компактный размер и цена важны в равной степени. А то, что контроллер очень удобен в использовании как в электрическом, так и в программном смысле, делает возможным окончить разработку в кратчайшие строки.
1. http://www.st.com/web/en/catalog/tools/PF257969
2. http://www.st.com/web/en/catalog/tools/PF252276#.
Получение технической информации, заказ образцов, поставка — e-mail: [email protected]
Рубрика: статья
Компания STMicroelectronics является №1 производителем электроники в Европе. Компоненты ST широко представлены в окружающих нас потребительских товарах – от iPhone до автомобилей разных марок. Лидеры индустриального рынка выбирают компоненты ST за их надежность и выдающиеся технические параметры. В компании ST работает 48 000 сотрудников в 35 странах. Производственные мощности расположены в 12 странах мира. Более 11 тысяч сотрудников заняты исследованиями и разработками – инновационное лидерство …читать далее
www.compel.ru
Создание первого проекта в IAR.
Запустим среду IAR Embedded Workbench for STMicroelectronics STM8. Текущая версия -1.20. После загрузки мы видим следующее окно:
Не стоит пренебрегать размещенными в основном окне программы на желтом фоне. Особенно важными являются разделы Getting Started и User Guides. В них содержатся масса полезной информации по самой среде разработки, а также гайды по Си, С++ и ассемблеру. В разделе Example Projects Капитан Очевидность разместил примеры проектов.
Создадим новый проект: идем в меню «Project», где выбираем пункт меню «Create new project…».
В появившемся окошке выбираем шаблон для языка Си, после чего нам предлагают сохранить нашу рабочую область – Workspace, с расширением *.eww. Сохраняем, выскакивает окошко с запросом сохранения проекта, сохраняем и его. Проекты IAR имеют расширение *.ewp.
Перед нами появилось такое окошко:
Это шаблон пустого Си-файла. Сами шаблоны находятся в папке %Путь к IAR% IAR Systems\Embedded Workbench 6.0 Kickstart\stm8\config\template\project. Если у вас от проекта к проекту повторяются какие-то заготовки – можете создать свои шаблоны, и выбирать их при создании нового проекта.
Наберем следующий код, после чего сохраним проект:
#include "iostm8.h" // подключение заголовочного файла с объявлениями регистров, масок и битов
int main( void ) // Основная программа
{
PD_DDR_bit.DDR0 = 1; // Ножка PD0 конфигурируется на вывод
while(1) // Бесконечный цикл
{
PD_ODR ^= MASK_PD_ODR_ODR0; // Переключение уровня напряжения на ножке на противоположное
// при помощи операции Исключающее ИЛИ (XOR)
}
}
Нажимаем Оk. Теперь самое время запустить нашу программу.
На основной панели инструментов нажимаем кнопку «Download and Debug» в виде зеленого треугольника, и если никаких проблем не возникло, о чем IAR не преминет нам сообщить, то наша программа будет записана в микроконтроллер и мы увидим следующее окошко:
Справа мы видим окошко дизассемблера, по центру – окно основной программы. Строка, подсвеченная зеленым, выполнится на следующем шаге. Пошагаем по программе при помощи кнопки «Step Over» (F10), и увидим, что светодиод на плате мигает.
Соответственно, программа работает правильно. Выйти из режима отладки можно нажав кнопку «Stop Debugging» в виде красного крестика.
На сегодня все, а в следующей статье мы подробнее рассмотрим порты ввода-вывода, а также Firmware Library для STM8.
Ссылки:
Раздел сайта STM, посвященный STM8S-DISCOVERY
we.easyelectronics.ru
Если вы обладаете железной силой воли и горите желанием стать программистом, то можете добиться своей цели с помощью самообразования. Это не самый простой и короткий путь: вам придётся самому разбираться в информационном хаосе и бороться с прокрастинацией. Зато вы можете учиться в удобное время за относительно небольшие деньги или же совсем бесплатно.
Начинать проще всего с интерактивных онлайн-курсов. В Сети есть множество площадок, материалы которых доступно объясняют основы программирования и задают направление для дальнейшего развития. Особое внимание уделяйте тем курсам, которые обучают на примерах реальных проектов, то есть поэтапно рассказывают, как создавать конкретную программу или сайт.
Платформа с бесплатными курсами по веб-разработке freeCodeCampЗапомните, что у вас ничего не получится без практики. Учитесь по проектно-ориентированным курсам и пытайтесь сами писать разобранные в них программы и сайты. Ищите лекции на YouTube с разбором проектов, которые вы бы хотели разрабатывать. Сначала копируйте работу других людей и анализируйте её. Затем пробуйте отходить от оригинала, экспериментируйте, изменяйте отдельные элементы, пока не сможете создавать что-то уникальное.
Помимо курсов и видеолекций, к вашим услугам официальная документация, доступная на сайтах языков, и книги. Когда разберётесь в основах, поищите свежие издания с подзаголовком Best Practices по выбранному языку программирования. Такие книги содержат лучшие приёмы разработки.
Обязательно поставьте перед собой цель создать свой проект и постоянно работайте над ним.
Это поможет закрепить полученные знания и понять, какой информации вам ещё не хватает. Ваши навыки будут развиваться вместе с проектом. Когда закончите его, работайте над новым — более сложным.
Если у вас возникнут трудности в процессе обучения или разработки, вы всегда сможете обратиться по любому вопросу к сообществам программистов вроде «Тостер» и Stack Overflow. Вам, например, помогут решить какую-нибудь задачу, выбрать хороший курс или укажут на ошибки в коде.
Сервис вопросов и ответов на технологические темы «Тостер»Оттачивать навыки удобно на специальных площадках, где можно посоревноваться с другими программистами, решая с помощью кода различные практические задачи. В числе таких сервисов — Codewars, TopCoder и HackerRank.
Если почувствуете, что ваше развитие зашло в тупик, или захотите ускорить обучение, попробуйте следующие варианты.
13 советов тем, кто изучает программирование самостоятельно →
Ментор — персональный наставник, который указывает на ошибки, предупреждает о подводных камнях, помогает прокладывать курс обучения. Полезная рекомендация, полученная в нужный момент, может избавить вас от многих проблем и сэкономить массу времени. Поэтому ментор никому не помешает.
Узнайте, есть ли среди ваших знакомых разработчики. Возможно, кто-нибудь из них захочет вам помогать. Если таких людей вы не знаете, можете поискать их в сообществах программистов. К примеру, на том же «Тостере». Только услуги менторства стоят недёшево, а за просто так тратить много времени на незнакомых людей никто не желает.
Дистанционные и очные курсы с преподавателями, которые обучают программистов с нуля, стали невероятно популярными за последние годы. В рамках этого формата вам также предстоит очень много работать самостоятельно. Зато вы будете заниматься по профессионально подготовленной программе, а решения задач будет проверять живой человек. К недостаткам курсов можно отнести высокую стоимость обучения.
Популярные русскоязычные онлайн-площадки, которые занимаются системной подготовкой программистов: «Нетология», GeekBrains и Loftschool.
Если предпочитаете заниматься очно, можете поискать образовательные центры, которые обучают программированию в вашем населённом пункте. К сожалению, такие заведения чаще всего присутствуют только в больших городах. В качестве примера можно привести компьютерную академию «ШАГ», у которой есть филиалы в нескольких странах.
Если у вас много времени в запасе и вы уверены, что хотите связать жизнь с программированием, можете изучать компьютерные науки в университете. Но имейте в виду, что традиционные учебные заведения отстают от прогресса, так что современные языки программирования и прочие технологии вам придётся осваивать самостоятельно.
С другой стороны, университет даст фундаментальные знания математики, алгоритмов и других областей, которые помогут вам стать высококлассным программистом. За годы усердной учёбы вы сформируете правильный тип мышления, благодаря которому будете схватывать всё на лету в профессиональной сфере.
В ИТ-индустрии можно выделить несколько направлений, в каждом из которых используют свой набор языков. Перечислим основные направления в порядке возрастания сложности:
Чтобы сделать правильный выбор направления и, в частности, языка, учитывайте следующие факторы: сложность освоения и количество обучающих материалов в Сети, ваши личные предпочтения (что именно хотите разрабатывать) и востребованность языка на рынке труда.
График востребованности языков на международном рынке труда / research.hackerrank.comВостребованность языка в вашем регионе легко проверить на сайтах для поиска работы. Просто откройте раздел для разработчиков ПО и посмотрите количество доступных вакансий.
ИНФОГРАФИКА: Какой язык программирования учить первым →
Если вы в замешательстве, присмотритесь к JavaScript — языку, на котором написан почти весь веб. Многие организации и программисты советуют новичкам выбирать именно этот язык в качестве первого.
Например, основатель образовательного ресурса freeCodeCamp Квинси Ларсон рекомендует JavaScript всем начинающим. Ларсон приводит очень простые аргументы:
Кроме того, вокруг этого языка сформировалось крупное сообщество разработчиков. Высокий интерес к JavaScript обеспечивает огромное количество курсов, книг и другого образовательного контента.
Любому программисту не помешает глубокое понимание математики. Для таких направлений, как разработка игровой графики или большие данные, математический ум — это необходимость. Но что касается веб-разработки и создания несложных программ, то в большинстве случаев без математики можно обойтись. Хотя среди профессионалов на этот счёт нет единого мнения.
А вот понимание английского, хотя бы на уровне беглого чтения документации, обязательно для всех программистов. Официальные документы и большая часть образовательных материалов появляются в первую очередь на английском языке. Книги часто устаревают ещё до того, как выходит перевод. Кроме того, знание английского открывает перспективы для работы со всем миром.
Как выучить английский язык: всё самое интересное и полезное →
Чтобы найти первую работу в качестве программиста, вы должны иметь портфолио. Это созданный вами проект, а лучше несколько, которые демонстрируют все ваши умения разработчика. В программу большинства курсов входит разработка проектов, которые могут войти в ваше портфолио.
Очень ценным пунктом в резюме будет наличие опыта работы, особенно командной разработки. Но где его взять, если вы ищете первую работу?
Перед собеседованием не забудьте поискать в Сети списки задач и вопросов, которые часто задают соискателям.
lifehacker.ru
Для тех, кому лень читать целиком: В STM8S-DISCOVERY отлично заливается прошивка от ST-LINK/V2 и все работает.
Тех, кто хочет узнать, что довело меня до жизни такой, приглашаю под кат.
Несмотря на то, что я порядочный ретроград, прогресс таки докатился и до меня — в текущей разработке у меня будет стоять новый модный STM8S103F3P6 по причине выдающейся цены оного. А, кстати, о ретроградах…
Так вот, у меня возникла необходимость программировать STM8. Посему я достал с полки упомянутую в заголовке плату, сдул с нее пыль и попытался запрограммировать контроллер. Не вышло. Надо сказать, что у меня и до этого были проблемы с ST-LINK (V1), и тогда я даже нашел решение; тем не менее, сейчас не прокатило и это. Не знаю в чем дело, но факт — ST-LINK окончательно отказался работать на моей системе.
В общем, я задумался о том, как бы материализовать себе ST-LINK/V2. В принципе, такие программаторы у меня были на платах STM32-Discovery — но на отладках, как известно, стоит урезанная версия, которая может программировать только то семейство, для которого эта отладка предназначена. Купить — вариант понятный, но это надо еще из дома выходить, да и программатор мне был нужен вотпрямщас. Грустно блуждая по интернету, я в очередной раз наткнулся на человека, который сделал ST-LINK/V2 сам. Посмотрел я на это, посмотрел, и вдруг понял, что схема, приведенная в статье, совершенно не противоречит схеме программатора STM8S-DISCOVERY (стр. 16)! Собственно, в программаторе и там, и там канонично используется STM32F103C8T6, включение значимых ножек по схеме совпадает…
В общем, я запаял хедеры разъема JTAG’а программатора на STM8S-DISCOVERY и подключил к нему сигналы SWD (они находятся на тех же пинах, что и JTAG) от программатора с платы STM32-VLDISCOVERY, после чего с помощью STM32 ST-LINK Utility снял защиту, стер кристалл и залил бинарник прошивки, который взял из архива, скачанного по ссылке из той статьи, где человек самостоятельно собирал программатор. После подключения к компьютеру подопытный девайс определился как ST-LINK/V2. Далее я штатно обновил прошивку с помощью ST-LINK Upgrade Tool и в качестве теста попробовал подключиться к STM8S103F3P6 из STVP. Бинго! Все заработало!
Программировать STM32 через мой новый ST-LINK/V2 и использовать JTAG на нем я пока не пробовал, но, судя по схеме, это возможно через тот же самый выведенный порт JTAG’а.
Так что, если у кого-то есть STM8S-DISCOVERY с ST-LINK V1 и какая-нибудь из плат STM32-DISCOVERY, с помощью последней можно легко залить прошивку ST-LINK/V2 в первую и получить полноценный ST-LINK/V2.
embedderslife.wordpress.com
Начнём с того, что вообще такое порт ввода-вывода. Для настройки режима работы или изменения состояния линии ввода-вывода обычно достаточно одного-двух битов, а регистры в контроллерах, как правило, восьми, шестнадцати или даже 32-х битные (как в stm32). Выделять для каждой линии ввода-вывода свой отдельный регистр — довольно расточительно, вот и придумали группировать в одном регистре биты управления сразу несколькими линиями, а группы линий, имеющие общие регистры управления, называть портами.
В контроллерах stm32 в порт может быть сгруппировано до 16-ти линий. Именуются порты обычно буквами латинского алфавита: PORTA, PORTB, PORTC …
Теперь про сами линии ввода-вывода. Линии ввода-вывода могут быть общего назначения (GPIO — general purpose input output) или иметь какое-то специальное назначение (например, специальные линии модулей встроенной периферии: MOSI/MISO для модуля SPI, D+/D- для модуля USB …). Как правило, линии делают конфигурируемыми, то есть такими, которые, в зависимости от настроек, могут использоваться или как GPIO, или как специальные. Типовую внутреннюю структуру канала ввода-вывода контроллера stm32 можно видеть на рисунке ниже.
Всего возможно 8 конфигураций линий ввода-вывода:
Конфигурация определяется регистрами GPIOx_CRL (первые 8 линий порта x) и GPIOx_CRH (вторые 8 линий порта x). В этих регистрах на каждую линию порта выделено по 4 бита, из которых 2 называются MODEy[1:0], а другие 2 — CONFy[1:0], где y — номер линии порта.
Кроме самих режимов, при конфигурировании линии в качестве выхода, сочетанием битов MODE[1:0] задаётся максимальная скорость переключения.
При конфигурировании линии в качестве входа с подтяжкой, в настройке принимает участие также выходной регистр порта (GPIOx_ODR). Соответствующий конфигурируемой линии бит регистра GPIOx_ODR в этом случае определяет «направление» подтяжки (к питанию или к «земле»).
По умолчанию (то есть после ресета) все линии настроены как «floating input».
Наглядно, всё то о чём мы сейчас говорили, показано в табличке ниже:
Режим | CNF1 | CNF0 | MODE1 | MODE0 | GPIOx_ODR | |
General purpose output | push-pull | 0 | 0 | 01 — max speed 10 MHz 10 — max speed 2 MHz 11 — max speed 50 MHz | 0 или 1 | |
open-drain | 1 | 0 или 1 | ||||
Alternate function output | push-pull | 1 | 0 | не важно | ||
open-drain | 1 | не важно | ||||
Input | analog | 0 | 0 | 00 | не важно | |
floating | 1 | не важно | ||||
pull-down | 1 | 0 | 0 | |||
pull-up | 1 |
Итак, порт мы настроили, что дальше? Дальше надо как-то линиями этого порта рулить.
Когда порт настроен для работы со встроенной периферией, эта периферия либо сама рулит нужными линиями, либо мы ими рулим, но через регистры этой самой периферии. Про это я писать пока не буду (про периферийные модули разговор особый). А пока рассмотрим как можно работать с линиями порта напрямую.
Считать состояние линий портов можно через Port Input Data Registers, которые коротко именуются GPIOx_IDR (x — буква порта, A, B, C и так далее). В младшие 16 бит каждого из этих регистров читаются состояния линий соответствующего порта, а старшие 16 бит — не используются.
Когда линии порта настроены как выходы GPIO, то управлять состоянием этих выходов можно через Port Output Data Registers, которые кратко именуются GPIOx_ODR (x — буква порта, A, B, C и так далее). То есть, те значения, которые записываются в эти регистры, появляются и на соответствующих выходных линиях. В этих регистрах также используются только младшие 16 бит.
Кроме того, как я выше уже писал, регистры GPIOx_ODR используются при конфигурировании входов с подтяжкой к питанию или «земле».
Помимо описанных выше регистров, для каждого порта выделены ещё два регистра, которые позволяют обойтись одной операцией для установки или сброса битов в выходных регистрах порта. Эти регистры называются GPIOx_BSRR (Port Bit Set/Reset Register) и GPIOx_BRR (Port Bit Reset Register), где x — буква порта.
Суть тут в следующем. Все регистры управления портами доступны только в виде слова целиком (то есть тут нет доступа к отдельным битам). Поэтому для изменения каких-либо отдельных битов, нужно сначала прочитать регистр, потом его модифицировать, а потом записать обратно. При этом между чтением и записью может произойти прерывание, в результате обработки которого, какие-то значения в регистрах могут поменяться. Мы эти изменения при перезаписи регистра потеряем. Чтобы этого избежать — можно каждый раз выключать прерывания на время модификации
выходных регистров порта, но это путь долгий и неэффективный.
Вместо этого как раз и придумали регистры GPIOx_BSRR и GPIOx_BRR. Эти регистры позволяют без всякого выключения прерываний осуществлять «атомарные» (то есть происходящие в одно действие) операции с отдельными битами регистров GPIOx_ODR.
Запись единицы в какой-либо из младших 16-ти бит регистра GPIOx_BSRR приводит к «атомарной» установке соответствующего бита регистра GPIOx_ODR в единицу, а запись единицы в какой-либо из старших 16-ти битов регистра GPIOx_BSRR приводит к «атомарному» сбросу соотвветствующего бита регистра GPIOx_ODR в ноль. Установка бита имеет приоритет над сбросом, то есть если установить в единицу одновременно два бита регистра GPIOx_BSRR, отвечающие за сброс и установку одного и того же бита регистра GPIOx_ODR, то в результате выполнения операции произойдёт установка этого бита в единицу.
Регистр GPIOx_BRR работает аналогично, за исключением того, что через этот регистр возможен только сброс битов регистра GPIOx_ODR и невозможна их установка.
Наверняка у некоторых читателей возникнет вопрос: «А в чём разница между использованием регистров GPIOx_BSRR + GPIOx_BRR и методом bit-banding?» Разница тут в том, что с помощью метода bit-banding за одну операцию можно изменить только один бит регистра GPIOx_ODR, а с помощью регистров GPIOx_BSRR, GPIOx_BRR можно изменить сразу несколько битов. В регистры GPIOx_BSRR, GPIOx_BRR мы записываем сразу целое слово и соответствующая реакция на эту запись появится сразу у всех битов регистра GPIOx_ODR для которых в этом слове установлены единицы.
Надеюсь с этим всё понятно (если нет, то спрашивайте на форуме), поэтому пойдём дальше.
Ещё одной интересной особенностью при работе с портами контроллеров STM32 является наличие механизма защиты отконфигурации порта от изменения. Для этого тоже существуют специальные регистры — GPIOx_LCKR (Port Configuration Lock Registers), где x — буква порта. Работает этот механизм следующим образом. Младшие 16 бит регистра GPIOx_LCKR используются для выбора линий порта, конфигурацию которых необходимо залочить (выбор осуществляется установкой соответствующего бита в единицу), а потом специальной последовательностью действий над 17-м битом осуществляется залочка этих выбранных конфигураций. Последовательность такая: записать 1, записать 0, записать 1, считать 0, считать 1. Правильный результат двух последних операций (чтение) говорит о том, что защита успешно включена. После включения защиты отменить её уже нельзя и выбранные конфигурации останутся залоченными до перезагрузки контроллера.
Главный документ, который стоит почитать чтобы узнать подробности (например, где какие биты расположены в описанных регистрах, адреса регистров и тому подобное) — это как обычно Reference Manual RM0008 (CD00171190.pdf). В данном случае копаем раздел 9 этого мануала (General-purpose and alternate function).
В качестве примера приведу программку, которая будет контролировать уровень сигнала на входе PA9 (скажем, на него у нас прицеплена кнопка) и изменять, в зависимости от этого уровня, уровень сигнала на выходе PA8 (сюда можно через резистор подключить светодиод). То есть при подаче единицы на вход PA9 — на выходе PA8 тоже будет устанавливаться единица, а при подаче нуля на вход PA9 — на выходе PA8 будет устанавливаться ноль.
Программа под катом
;--------------------------------------------------------- ; blocks addresses SAR EQU 0x42000000 ; Start Alias Region FLASH EQU 0x40022000 RCC EQU 0x40021000 PORTA EQU 0x40010800 ; registers addresses FLASH_ACR EQU FLASH+0x0 RCC_CR EQU RCC+0x0 RCC_CFGR EQU RCC+0x4 RCC_APB2ENR EQU RCC+0x18 GPIOA_CRH EQU PORTA+0x4 ; регистр конфигурации старшей половины PortA (8-15) GPIOA_IDR EQU PORTA+0x8 ; входной регистр PORTA GPIOA_ODR EQU PORTA+0xC ; выходной регистр PORTA GPIOA_BSRR EQU PORTA+0x10 ; регистр установки/сброса отдельных бит PORTA ; bits numbers LAT1 EQU 1 HSEON EQU 16 HSERDY EQU 17 PLLSRC EQU 16 PLLMUL EQU 18 PPRE2 EQU 11 PLLON EQU 24 PLLRDY EQU 25 SW1 EQU 1 AFIOEN EQU 0 IOPAEN EQU 2 MCO EQU 24 MODE8 EQU 0 ; биты MODE для PA8 - это 0-й и 1-й CNF8 EQU 2 ; биты CNF для PA8 - это 2-й и 3-й MODE9 EQU 4 ; биты MODE для PA9 - это 4-й и 5-й CNF9 EQU 6 ; биты CNF для PA9 - это 6-й и 7-й AREA STACK, NOINIT, READWRITE SPACE 0x400 Stack_top AREA RESET, DATA, READONLY dcd Stack_top dcd Program_start AREA PROGRAM, CODE, READONLY ENTRY Program_start InitClock mov r9, #1 ; устанавливаем Latency = 2 ldr r0, =SAR+(FLASH_ACR&0x00FFFFFF)*0x20+LAT1*4 str r9,[r0] ; включаем HSE ldr r0, =SAR+(RCC_CR&0x00FFFFFF)*0x20+HSEON*4 str r9,[r0] ; ждём появления флага HSERDY ldr r0, =RCC_CR ; загружаем в r0 адрес регистра RCC_CR wait_hserdy ldr r10,[r0] ; читаем регистр RCC_CR ; проверяем, равен ли бит HSERDY единице (&0x20000) tst r10,#(1<<HSERDY) beq wait_hserdy ; выбираем HSE источником для PLL, устанавливаем множитель = 9, ; предделитель для APB2 (/2), MCO - no clock (оно так и по умолчанию, это просто чтоб внимание обратить) ldr r0,=RCC_CFGR ; загружаем в r0 адрес регистра RCC_CFGR ldr r10,=(1<<PLLSRC)+(7<<PLLMUL)+(4<<PPRE2)+(0<<MCO) str r10,[r0] ; включаем PLL ldr r0,=SAR+(RCC_CR&0x00FFFFFF)*0x20+PLLON*4 str r9,[r0] ; ждём появления флага PLLRDY ldr r0, =RCC_CR ; загружаем адрес регистра RCC_CR wait_pllrdy ldr r10,[r0] ; читаем RCC_CR ; проверяем, равен ли бит PLLRDY единице (&0x2000000) tst r10, #(1<<PLLRDY) beq wait_pllrdy ; выбираем PLL в качестве SYSCLK ldr r0,=SAR+(RCC_CFGR&0x00FFFFFF)*0x20+SW1*4 str r9,[r0] ; включаем тактирование PORTA ldr r0,=SAR+(RCC_APB2ENR&0x00FFFFFF)*0x20+IOPAEN*4 str r9,[r0] ; конфигурируем PORTA (PA8 - выход, PA9 - вход) ldr r0,=GPIOA_CRH ; загружаем в r0 адрес регистра GPIOA_CRH ldr r10,[r0] ; читаем регистр GPIOA_CRH в r10 ; устанавливаем PA8 MODE=11 (output max speed = 50MHz), PA8 CNF=00 (output push-pull) ; PA9 MODE=00 (input), PA9 CNF=01 (input floating, т.е Hi-Z) ; ногу PA9 можно было и не настраивать, поскольку все ного после ресета по умолчанию настроены ; на вход Hi-Z, так что это просто чтобы внимание обратить ldr r11,=(3<<MODE8)+(0<<CNF8)+(0<<MODE9)+(1<<CNF9) bfi r10, r11, #0, #8 ; копируем 8 младших бит регистра r11 в r10 str r10,[r0] ; пишем регистр r10 в регистр GPIOA_CRH ;------------------ ; делаем что-то полезное Work nop ; это чтобы не получить warning: A1581W: Added 2 bytes of padding... ldr r0, =GPIOA_IDR ; в r0 - адрес регистра входов ldr r10,[r0] ; читаем входы (регистр IDR) tst r10,#(1<<9) ; test 9 bit (проверяем уровень на 9-й ноге) beq Null ; если ноль - прыгаем One ldr r0,=GPIOA_BSRR ; загружаем в r0 адрес регистра GPIOA_BSRR ldr r10,=(1<<8) ; загружаем в r10 0x100 (установленный 8-й бит, set 8-th bit in GPIOA_ODR) str r10,[r0] ; пишем регистр r10 в GPIOA_BSRR b Work Null ldr r0,=GPIOA_BSRR ; загружаем в r0 адрес регистра GPIOA_BSRR ldr r10,=(1<<24) ; загружаем в r10 0x1000000 (установленный 24-й бит, reset 8-th bit in GPIOA_ODR) str r10,[r0] ; пишем регистр r10 в GPIOA_BSRR b Work END ;--------------------------------------------------------- |
;——————————————————— ; blocks addresses SAR EQU 0x42000000 ; Start Alias Region FLASH EQU 0x40022000 RCC EQU 0x40021000 PORTA EQU 0x40010800 ; registers addresses FLASH_ACR EQU FLASH+0x0 RCC_CR EQU RCC+0x0 RCC_CFGR EQU RCC+0x4 RCC_APB2ENR EQU RCC+0x18 GPIOA_CRH EQU PORTA+0x4 ; регистр конфигурации старшей половины PortA (8-15) GPIOA_IDR EQU PORTA+0x8 ; входной регистр PORTA GPIOA_ODR EQU PORTA+0xC ; выходной регистр PORTA GPIOA_BSRR EQU PORTA+0x10 ; регистр установки/сброса отдельных бит PORTA ; bits numbers LAT1 EQU 1 HSEON EQU 16 HSERDY EQU 17 PLLSRC EQU 16 PLLMUL EQU 18 PPRE2 EQU 11 PLLON EQU 24 PLLRDY EQU 25 SW1 EQU 1 AFIOEN EQU 0 IOPAEN EQU 2 MCO EQU 24 MODE8 EQU 0 ; биты MODE для PA8 — это 0-й и 1-й CNF8 EQU 2 ; биты CNF для PA8 — это 2-й и 3-й MODE9 EQU 4 ; биты MODE для PA9 — это 4-й и 5-й CNF9 EQU 6 ; биты CNF для PA9 — это 6-й и 7-й AREA STACK, NOINIT, READWRITE SPACE 0x400 Stack_top AREA RESET, DATA, READONLY dcd Stack_top dcd Program_start AREA PROGRAM, CODE, READONLY ENTRY Program_start InitClock mov r9, #1 ; устанавливаем Latency = 2 ldr r0, =SAR+(FLASH_ACR&0x00FFFFFF)*0x20+LAT1*4 str r9,[r0] ; включаем HSE ldr r0, =SAR+(RCC_CR&0x00FFFFFF)*0x20+HSEON*4 str r9,[r0] ; ждём появления флага HSERDY ldr r0, =RCC_CR ; загружаем в r0 адрес регистра RCC_CR wait_hserdy ldr r10,[r0] ; читаем регистр RCC_CR ; проверяем, равен ли бит HSERDY единице (&0x20000) tst r10,#(1<<HSERDY) beq wait_hserdy ; выбираем HSE источником для PLL, устанавливаем множитель = 9, ; предделитель для APB2 (/2), MCO — no clock (оно так и по умолчанию, это просто чтоб внимание обратить) ldr r0,=RCC_CFGR ; загружаем в r0 адрес регистра RCC_CFGR ldr r10,=(1<<PLLSRC)+(7<<PLLMUL)+(4<<PPRE2)+(0<<MCO) str r10,[r0] ; включаем PLL ldr r0,=SAR+(RCC_CR&0x00FFFFFF)*0x20+PLLON*4 str r9,[r0] ; ждём появления флага PLLRDY ldr r0, =RCC_CR ; загружаем адрес регистра RCC_CR wait_pllrdy ldr r10,[r0] ; читаем RCC_CR ; проверяем, равен ли бит PLLRDY единице (&0x2000000) tst r10, #(1<<PLLRDY) beq wait_pllrdy ; выбираем PLL в качестве SYSCLK ldr r0,=SAR+(RCC_CFGR&0x00FFFFFF)*0x20+SW1*4 str r9,[r0] ; включаем тактирование PORTA ldr r0,=SAR+(RCC_APB2ENR&0x00FFFFFF)*0x20+IOPAEN*4 str r9,[r0] ; конфигурируем PORTA (PA8 — выход, PA9 — вход) ldr r0,=GPIOA_CRH ; загружаем в r0 адрес регистра GPIOA_CRH ldr r10,[r0] ; читаем регистр GPIOA_CRH в r10 ; устанавливаем PA8 MODE=11 (output max speed = 50MHz), PA8 CNF=00 (output push-pull) ; PA9 MODE=00 (input), PA9 CNF=01 (input floating, т.е Hi-Z) ; ногу PA9 можно было и не настраивать, поскольку все ного после ресета по умолчанию настроены ; на вход Hi-Z, так что это просто чтобы внимание обратить ldr r11,=(3<<MODE8)+(0<<CNF8)+(0<<MODE9)+(1<<CNF9) bfi r10, r11, #0, #8 ; копируем 8 младших бит регистра r11 в r10 str r10,[r0] ; пишем регистр r10 в регистр GPIOA_CRH ;—————— ; делаем что-то полезное Work nop ; это чтобы не получить warning: A1581W: Added 2 bytes of padding… ldr r0, =GPIOA_IDR ; в r0 — адрес регистра входов ldr r10,[r0] ; читаем входы (регистр IDR) tst r10,#(1<<9) ; test 9 bit (проверяем уровень на 9-й ноге) beq Null ; если ноль — прыгаем One ldr r0,=GPIOA_BSRR ; загружаем в r0 адрес регистра GPIOA_BSRR ldr r10,=(1<<8) ; загружаем в r10 0x100 (установленный 8-й бит, set 8-th bit in GPIOA_ODR) str r10,[r0] ; пишем регистр r10 в GPIOA_BSRR b Work Null ldr r0,=GPIOA_BSRR ; загружаем в r0 адрес регистра GPIOA_BSRR ldr r10,=(1<<24) ; загружаем в r10 0x1000000 (установленный 24-й бит, reset 8-th bit in GPIOA_ODR) str r10,[r0] ; пишем регистр r10 в GPIOA_BSRR b Work END ;———————————————————
[свернуть]
Код конечно не оптимальный, но, надеюсь, максимально понятный. Если вопросы всё же остались — задавайте на форуме.
radiohlam.ru