Stm32.

STM32 с нуля. Введение

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

Итак, для начала разберемся, что же нужно знать и уметь, чтобы начать изучать ARM’ы. А, в принципе, ничего супер сложного и фееричного

Источник: https://microtechnics.ru/stm32-uchebnyj-kurs-vvedenie/

Stm32 550

1 день 1 650 руб. ×от 2 шт. — 1 470 руб.от 20 шт. — 1 411 руб.
Со склада 1 950 руб. ×от 2 шт. — 1 710 руб.от 20 шт. — 1 632 руб.
3 дня 8 610 руб. ×от 2 шт. — 7 710 руб.от 20 шт. — 7 480 руб.
1 день 2 440 руб. ×от 2 шт. — 2 220 руб.от 20 шт. — 2 155 руб.
Со склада 2 340 руб. ×от 2 шт. — 2 220 руб.от 20 шт. — 2 155 руб.
Со склада 3 000 руб. ×от 3 шт. — 2 800 руб.от 30 шт. — 2 750 руб.
Со склада 2 300 руб. ×от 3 шт. — 2 100 руб.от 30 шт. — 2 050 руб.
Со склада 7 750 руб. ×от 3 шт. — 7 700 руб.от 30 шт. — 7 650 руб.
Со склада 620 руб. ×от 5 шт. — 570 руб.от 50 шт. — 548 руб.
1 день 5 420 руб. ×от 2 шт. — 4 930 руб.от 20 шт. — 4 785 руб.
3-4 недели 2 050 руб. ×
3-4 недели 2 990 руб. ×
1 день 2 100 руб. ×от 2 шт. — 2 000 руб.от 20 шт. — 1 935 руб.
3-4 недели 2 920 руб. ×
STM3210B-MCKIT5 днейПр-во: ST Microelectronics 5 дней 55 950 руб. ×
1 день 1 950 руб. ×от 2 шт. — 1 780 руб.от 20 шт. — 1 725 руб.
Со склада 1 690 руб. ×от 3 шт. — 1 610 руб.от 30 шт. — 1 570 руб.
Со склада 1 290 руб. ×от 3 шт. — 1 240 руб.от 30 шт. — 1 209 руб.
Со склада 15 500 руб. ×от 2 шт. — 14 800 руб.от 8 шт. — 14 600 руб.

Страницы Ctrl ← предыдущая Ctrl → следующая

Источник: https://www.chipdip.ru/catalog/popular/stm32

STM32 » Хабстаб

Протокол I2S, не путать с I2C, предназначен для передачи аудио потока. В моем устройстве этот протокол используется для передачи аудио потока между кодеком и МК. Сразу хотелось бы отметить, что как такового отдельного модуля I2S у STM32 нет, а тот что есть реализуется на основе модуля SPI и тот же регистр DR[0:15] у них общий….

В последнее время все чаще натыкаюсь на негативные отзывы о шине I2C у STM32, мол работа с ней это танцы с бубном и тд. За последний месяц мне удалось запустить две микросхемы, работающие по I2C и ни каких танцев, только вдумчивое чтение даташита….

Думаю постоянные посетители сайта заметили, что предпочитаю все делать на регистрах, но иногда все таки использую SPL. Например, в статье про самописный бутлоадер, использовались библиотечные функции для работы с флэш памятью. В очередной раз, подключая эту библиотеку, решил, что она занимает много места и решил самостоятельно реализовать необходимые функции. Для работы с флэш памятью…

Начнем с того, что RTC — это аббревиатура которая расшифровывается следующим образом Real-time clock или по-русски, часы реального времени. В былые времена, при использовании МК AVR в качестве RTC, использовал отдельную микросхему, общение с которой происходило по определенному протоколу. У STM32 RTC же представляет собой модуль, реализованный внутри МК. У STM32 RTC обладает следующими…

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

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

Конечно же следующим желанием было запустить, что-то побольше и подключить это самостоятельно, чтобы в голове сложилась полная картина. С Китая был заказан 7-дюймовый дисплей…

LTDC STM32F429 STM32 RGB interface TFT

При переносе одного из проектов с сотой серии на трехсотую столкнулся с проблемой, посылки SPI всегда были длиной 16 бит, а мне нужно было 8.

Что интересно у сотой серии для настройки длины пакета SPI выделен один бит DFF(Data frame format)  , когда он сброшен длина посылки 8 бит, когда установлен 16.

В трехсотой серии под это дело выделили битовое поле длиной 4 бита и длину посылки можно…

Около полугода назад один из постоянных посетителей сайта отправил мне отладочную плату STM32F429I DISCO. На мои рассказы, что она мне не нужна, он ответил, что это подарок и его следует принять.

А ещё он где-то вычитал, что оперативка на плате нужна для работы дисплея и интересовался у меня для чего именно, но ответа на этот вопрос у меня не было. Понятно было, что оперативка выступает в…

В одной из прошлых статей уже описывал, что такое DMA и приводил пример его работы в связке с АЦП. В том примере, результаты преобразования АЦП записывались в буфер без участия ядра. В этот раз мне надо было перенести буфер из одного участка памяти в другой и я точно знал, что это можно сделать с помощью DMA используя режим MEM2MEM….

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

Но таким способом не получится ТОЧНО измерить период высокочастотного сигнала.

(дальше станет понятно какой сигнал считать высокочастотным) Предположим, что частота исследуемого сигнала 1MНz, а наш таймер отсчитывает 72млн в секунду. Переведем значения частоты в период….

Когда дописывал прошлую статью, на радиокоте наткнулся на тему где обсуждали в каком формате передавать прошивку бутлоадеру.

У меня тоже возникал такой вопрос и в конце прошлой статьи описал почему передавать прошивку удобнее hex файлом, чем бинарником, кому интересно могут почитать тут.

Значит так, нам надо рассмотреть какие бывают типы записей в hex файле и дополнить код из прошлой статьи. Все…

В одной из прошлых статей описывал как прошить STM32 с помощью бутлоадера и объяснял принцип его работы.

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

Думаю у кого-то мог возникнуть вопрос, зачем писать бутлоадер самому, если можно пользоваться встроенным? Ответ на этот вопрос очень прост,…

Как-то раз один знакомый ругался на меня за то, что вместо проекта скинул ему hex и у него так и не получилось залить его в микроконтроллер.

Я, честно говоря так и не понял чего он ругался на меня, ведь не получилось у него)))Эта ситуация подтолкнула меня к написанию статьи. Итак у нас есть прошивка, которую мы хотим залить в МК.

Первым делом, надо создать пустой проект, выбрав при этом МК,…

В интернете достаточно информации про стек поэтому вряд ли смогу рассказать что-то новое.

Если кто-то всё-таки не в курсе, то стек — это область в оперативной памяти, которая работает по принципу стопки тарелок.

Что это за принцип такой? Принцип заключается в том, что если перед нами стоит стопка одинаковых тарелок и нам надо взять одну, то мы возьмём верхнюю, её взять проще всего. Этот же…

В конце прошлой статьи обещал рассказать чем отличается выход push-pull(PP) от open-drain(OD).  Для того чтобы разобраться, предлагаю рассмотреть устройство выхода push-pull. По сути, он состоит из двух ключей, один подтягивает вывод к питанию, другой к земле. А теперь open-drain….

Ранее на сайте уже была опубликована статья о том как конфигурировать выводы STM32, она посвящалась микроконтроллерам 100 серии, хотя явно об этом в статье не говорилось.

В этой статье речь пойдёт о микроконтроллерах 300 и 400 серии.

Перед настройкой любого вывода МК обязательно надо включить тактирование соответствующего порта!!! Каждый вывод МК может быть сконфигурирован в одно из состояний. На…

Давно хотелось прикрутить к осциллографу, который описывал тут, преобразование Фурье, но почему-то руки не доходили.

Совсем недавно, месяц назад решил увеличить частоту сэмплирования ослика, заменив stm32F103VE с частотой сэмплирования 1М на stm32F303VC c частотой сэмплирования 5М.

После замены чипа и изменения программы решил всё-таки разобраться с быстрым преобразованием Фурье(БФП или FFT). …

Те кто читает эту статью, думаю знают, что записать единицу в нулевой бит порта А можно двумя способами GPIOA->ODR |= GPIO_ODR_ODR0; или GPIOA->BSRR = GPIO_BSRR_BS0; И везде пишут, что второй способ правильнее так, как установка бита в таком случае выполянется атомарно. Тут не поспоришь. А теперь давайте представим ситуацию, у нас есть восьмибитная шина, по которой передаются данные,…

В последнее время появилась необходимость в печке для пайки оплавлением. Для тех кто не знает, что это такое, в двух словах опишу, как она работает и для чего она нужна.

Есть у меня десяток плат, которые надо собрать, элементы на плате в основном smd.

Сейчас платы собираются по следующему алгоритму: сначала с помощью шприца наношу на контактные площадки паяльную пасту, затем раскладываю элементы….

Первое время для того, чтобы упростить написание программ для STM32 не вдавался в тонкости настройки системы тактирования, а выбирал частоту системной шины в файле system_stm32f10x.

c, просто расскоментировав нужную строку. Но если уж доходило дело до настройки частоты тактирования отдельных блоков(например АЦП), то использовал CUBE.

Перед глазами вся система тактирования, что очень удобно и…

11-08-2016, 13:07

Статей про резистивные сенсорные панели на сайте уже несколько, тут можно почитать как они работают, а тут как подключить её к AVR и произвести калибровку.

Поэтому далее рассказ пойдёт лишь о тонкостях работы с такой панелью. Как известно, обмен данными c XPT2046 происходит по SPI, поэтому надо просто найти свободный и подключится к нему.

Обычно чтобы посмотреть под какой SPI какие выводы…

Источник: https://hubstub.ru/stm32/

STM32. Первый проект

В этой статье мы решим самую первую классическую задачу — мигание светодиодом. Это позволит нам пройти все процедуру от задумки до конечного результата.
Напомним, что для программирования мы будем использовать CubeMX и Keil uVision, а также плату Nucleo-64 STM32F030. ПО должно быть установлено, как описано в предыдущей статье, а плата подключена к компьютеру.

Nucleo-64 STM32F030

Подготовка проекта в CubeMX

Начнем с запуска генератора инициализационного кода CubeMX. При ее запуске выбор небольшой. Нам нужен пункт меню New Project.
Обычно разработка электронных устройств предполагает то, что вы сами подбираете контроллер, готовите плату для устройства и т.д.

На вкладке MCU Selector есть возможность найти выбранный ранее контроллер, либо при помощи параметрического поиска подобрать именно тот, который оптимально подойдет под ваши задачи, но у нас готовая отладочная плата от производителя, поэтому надо перейти на вкладку Board Selector.

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

После этого вам откроется окно на вкладке Pinout, в котором очень удобно при помощи графического интерфейса настраивается периферия контроллера. На основном экране показан условно сам контроллер. При нажатии мышкой на каждый из выводов контроллера выпадает меню, в котором перечислены все функции, которые он может выполнять (вход, выход, прерывания, АЦП и и.д.

) В левой части список основных настроек периферийных модулей контроллера. Например, если вы в этом списке раскроете пункт меню USART2 и поставите в нем галочку, то увидите сразу как на контроллере соответствующие выводы изменят свое состояние. Но нам пока ничего здесь не надо менять. То есть мы работаем с заготовкой, которая уже настроена на нашу плату.

В ней уже настроен UART, светодиод, кнопка и некоторые дополнительные функции, которые уже есть на плате.Далее переходим на вкладку Clock Configuration.

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

На вкладке Configuration вам предоставляется дополнительные возможности по настройке подключенной к проекту периферии, которая для нашего случая уже заранее настроена.Нажмите на кнопку GPIO (General Purpose Input/Output, порты ввода/вывода общего назначения). У нас выбрано два вывода. К выводу PA5 мы еще на первой вкладке подключили светодиод, а к выводу PC13 кнопку.

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

Во вкладке Project выбираем пункт Generate Project. На этом шаге среда уже не знает что мы собираемся делать далее и тут уже придется что-то делать. Задайте проекту имя и укажите директорию для его хранения (желательно без кириллических символов).

Toolchain/IDE (инструментарий, Integrated Development Environment – интегрированная среда разработки) – в этом пункте необходимо выбрать MDK-ARM V5.После нажатия кнопки Ok утилита начнет скачивание необходимых файлов и подготовит структуру проекты. По окончании ее работы вы сможете найти файл проекта для Keil uVision.
CubeMX сразу предложит вам открыть сгенерированный проект. Сделайте это и Keil uVision откроется автоматически. В проводнике слева найдите файл main.c и откройте его.

Работа с проектом в Keil uVision

Интерфейс среды относительно прост. Сверху панель инструментов, слева дерево файлов проекта, справа текстовый редактор, снизу выходная информация о сборке проекта. Обратите внимание на то, сколько всего для нас сделал CubeMX. Это он собрал воедино все файлы драйверов и библиотек, которые вы видите слева. И именно он написал весь текст файла main.c.

Давайте немного подробнее поговорим о структуре этого автоматически сгенерированного кода. В нем много комментариев с подсказками и разъяснениями. Нас интересуют именно те в комментарии в которых есть слова USER CODE BEGIN и USER CODE END. Между этими комментариями можно писать свой код.

Дело в том, что после того как проект сгенерирован в CubeMX и вы начали уже изменять его, у вас может возникнуть желание подключить что-то дополнительно или изменить настройки. Если вы будете писать свою программу только в этих выделенных частях, то при изменении проекта в CubeMX в ваш код будет не тронут. int main(void) – точка входа в программу.

Затем по тексту происходит инициализация HAL-драйвера (Hardware Abstraction Layer). Это важный аспект нашего курса. Мы будем использовать именно этот драйвер и мы уже подбираемся к непосредственному написанию кода. В файлах этого драйвера содержится исчерпывающие описание всех функций работы с аппаратным обеспечением нашего контроллера.

Мы планируем включить светодиод, подключенный к выводу PA5. Соответственно нас интересует файл stm32f0xx_hal_gpio.c. Найдите его в списке файлов и откройте.

Желательно (а рано или поздно это произойдет), изучить все что там написано, но сейчас нам важен результат. Поэтому жмем Ctrl+F и ищем в документе слова HAL_GPIO_WriteНаходим строку 425 и копируем в буфер обмена описание функции, которая будет изменять состояние вывода.Затем мы возвращаемся к файлу main.

c и в нем находим место где начинается бесконечный цикл while(1). В теле этого цикла у нас и будет происходить включение/выключение светодиода. Скопированный текст необходимо вставить дополнительной 101ой строкой. Обратите внимание, что слева появится крестик, который обозначает что этот код неправильный.

В этой строке необходимо удалить типы переменных, указать конкретный порт и пин, и указать его состояние (ноль или единица). Для установки низкого напряжения на выводе необходимо написать GPIO_PIN_RESET.

То есть в итоге у вас должно выглядеть все как на картинке:Далее, в соответствии с задачей, нам необходимо ввести задержку, переключить вывод в высокое логическое состояние и снова сделать задержку. Функция задержки описана в HAL-драйвере как HAL_Dealy();. Время задержки в ней указывается в миллисекундах.

GPIO_PIN_SET – выставить вывод в единичное состояние. Допишите остальные функции так как показано на рисунке:Далее выполните команду Project -> Build, или нажмите F7. Если все сделано верно, то в нижнем окне после компиляции вы увидите сообщение о том, что axf-файл создан без ошибок и предупреждений.

Прошивка контроллера

Ранее мы уже подключили плату и проверили, что STLink работает. Можно прошить плату через STLink Utility, но лучше сразу настроить Keil на работу с ним. Откройте пункт меню Debug -> Options. На вкладке Debug у вас должен быть выбран Use ST-Link Debugger.

Нажмите на кнопку Settings и перед вами откроется новое окно.Перейдите на вкладку Flash Download и установите галочку Reset and Run. Эта галочка нужна чтобы программа запускалась на выполнение сразу после перезагрузки.

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

Сам светодиод на плате подписан как LD2.

Если он не замигал, то, возможно, плата просто не начала исполнять программу после обновления прошивки. Попробуйте перезагрузить ее при помощи черное кнопки.

Пользовательский светодиод на плате

Итоги

Hello world на светодиоде это огромный шаг. Если вы проделали его и до этого хорошо знали язык (применяя его на другой платформе), то вы можете уверенно говорить, что STM32 вы освоили. То есть у вас есть полный инструментарий для работы с этими контроллерами.

Кому-то все эти действия могут показаться сложными, но надо помнить, что мы настроили очень мощный инструмент, дающий огромные возможности разработчику. Если посмотреть на сам код который мы написали, то он вполне будет понятен даже тем, кто только поверхностно знаком с Arduino.

Все остальное связано только с настройкой среды.

Другими словами, если надо только мигать светодиодом, то возможно, проще будет это сделать и на Arduino, но если в перспективе вы хотите использовать USB, работать с файловой системой, RTOS и т.д., то на STM32 это будет не намного сложнее чем мигать светодиодом, тогда как для Arduino это почти недоступно.

Ссылки на остальные статьи цикла можно найти здесь.
Мы будем очень рады, если вы поддержите наш ресурс и посетите магазин наших товаров shop.customelectronics.ru.

Источник: http://www.customelectronics.ru/stm32-pervyiy-proekt/

STM32 / Сообщество EasyElectronics.ru

Рейтинг

28.46

голосов: 30

Для тех, кому лень изучать С++ и С#…
Многие начинающие или даже имеющие за плечами большой опыт программирования программисты микроконтроллеров сталкиваются с проблемой написания более менее рабочего оконного приложения для управления микроконтроллером с ПК и отображения телеметрии. В большинстве случаев для этого нужно изучать языки программирования высокого уровня, такие как С++ и C#. Процесс изучения этих языков может привести программиста, который всю жизнь программировал только на С в ступор, потому что они очень сильно отличаются от обычного С, а изучение этих языков займет у него очень много времени. Именно для таких людей компания NationalInstruments выпустила программу LabWindowsCVI, в которой весь код пишется на простом С и человек, который программировал только на С очень легко в ней разберется…

В этом топике хочу представить вам цикл уроков по программированию LabWindowsCVI с использованием отладочной платы STM32F4Discovery…

В процессе работы мы напишем простое приложение :
С помощью этого приложения мы сможем:

    -Управлять состоянием светодиодов; -Управлять яркостью синего светодиода; -Получать значения угловых ускорений со встроенного акселерометра; -Изменять значения на выходе ЦАП и изменять его с помощью АЦП.

Видео, демонстрирующее работу приложения представлено ниже:

Спасибо за внимание!

Вы когда-нибудь участвовали в форумных склоках на тему «Что лучше — написать свое или взять готовое?». Лично я обожаю подобные вещи, причем я больше предпочитаю наблюдать, нежели участвовать.

Ведь это так весело, сначала обсуждаются технические детали, потом постепенно переходят на личности, потом кого-то банят… Вы скажете, что я второсортное быдло, которому нравятся такие же второсортные развлечения? Знаете, а зачем это отрицать, зачем заниматься самообманом? Лучше принять себя таким, какой я есть, и гордо нести это как знамя: «Да, я — быдло!». Поэтому вместо самоотрицания я попытаюсь «набросить», и если мне повезет, то там, в комментариях разгорится такой спор переходящий от технический деталей к личным оскорблениям. Так что может послужить предпосылкой такого спора? Ну вот, например, такая тема. Есть у вас в микроконтроллере замечательная штука — интерфейс CAN, помощью которого можно сделать массу замечательных вещей: шину для связи между модулями в умном доме, между узлами в собственном роботе, между модулями в ПЛК, между электроникой в автомобиле и т.д. и т.п. Но что пустить «поверх» CAN: свой самодельный протокол или взять готовый. А если готовой протокол, то что лучше свой самописный стек или готовый? Займу пожалуй одну из крайних позиций — все готовое, и протокол и стек к нему, а именно CANOpen и CANFestival.

Читать дальше

Обещанный пример порта Yaffs под STM32F429, память NAND128-A, интерфейс FMC, доступ к регистрам через библиотеку SPL. Надеюсь никто не будет против, если я не стану прикреплять архив с исходниками, просто дам ссылку на публичный репозитарий. Схему подключения не стану приводить — не вижу никакого смысла, в документации все есть.

Читать дальше

https://www.youtube.com/watch?v=HwomcPSQsRE

Как часто приходится жалеть о принятых решениях. Безрассудно прожитые школьные годы, неверно выбранный ВУЗ, разгульная студенческая жизнь, переезд не в тот город, выбор параллельной NAND Flash в качестве вместилища архивных данных.

Вот казалось бы, интерфейс EMC есть, команды у флешки для записи/чтения простые, как угол дома и самое главное — дешево! Кто-то может возразить, сказав, что обычные SD-карты сегодня тоже дешевые и разъемы к ним недорогие, плюс по софту тоже все готово — тут тебе и файловая система FATFs, и примеры.

Но иногда в такой разговор может вмешаться слишком «умный» программист, который скажет: — Нет! Мы делаем промышленный прибор, который будет подвержен тряскам во время транспортировки, кривым рукам наладчиков на объекте, вибрациям в процессе работы. Никаких разъемов для критически важных узлов.

На что вы возможно ответите: — Тогда может быть использовать память с интерфейсом SPI, там вроде как тоже давно все изведанно. — Нет, нет! Дорого, да и чем плоха NAND'а? — очень самоуверенно возражает оппонент. — Ну я не уверен насчет… — Бла, бла, бла! Поверьте я знаю что предлагаю, нам нужна параллельная NAND flash.

— Ну Вы не сомневаетесь, что по софту не будет проблем? — Кто сомневается?! Я сомневаюсь?!!! — Ладно, ладно, дерзайте, — махнете Вы рукой. Микросхема будет заложена в решение, и пути назад уже не будет…

Читать дальше

Попросил меня как-то один уважаемый заказчик организовать ему передачу данных с контроллера (stm32f407) в компьютер. Всё бы ничего, но скорость ему требовалась аж 40 мегабит в секунду.

Надо сказать, что железка была уже готова, основной код написан, в качестве интерфейса передачи выбран USB High Speed с внешним PHY (USB3300). У программиста заказчика с USB что-то не заладилось, посему решили произвести усиление коллектива вашим покорным слугой.

Для полноты картины следует добавить, что весь код контроллера был написан при помощи CubeMX, а программа на ПК — на Delfi.

Читать дальше

При программировании STM32 производитель контроллеров предлагает использовать библиотеку Standart Peripherial Libray, но мне не нравится то количество кода, которое приходится писать, чтобы инициализировать вывод для выполнения каких-либо функций. Так же код, на мой взгляд, получается не особо читаемым. При поиске способа исправить эти недочёты вспомнились «макросы Аскольда Волкова», названные так по имени автора.

Читать дальше

Хочу поделиться небольшой программой для работы с проектами IAR EWARM для микроконтроллеров STM32F с ядрами M0, M3, M4, M7 (и другими со схожей организацией структуры папок ST CMSIS). Нескромное название программы — IAR project manager, предназначена для ускорения типовых рутинных процессов при работе с IAR EWARM. Её основные возможности: — создание нового проекта со всеми необходимыми файлами CMSIS; — добавление новой директории в проект; — переименование «воркспейса» и проекта; — очистка проекта; Программа написана на Python 3.6.0 и имеет зависимость от LXML. На данный момент “exe” версии программы нет, поэтому для её запуска необходим интерпретатор Python. Распространяется под лицензией MIT, соответственно: “…THE SOFTWARE IS PROVIDED «AS IS», WITHOUT WARRANTY OF ANY KIND …”

Ссылка на проект: GitHub

Далее о работе с программой.

Читать дальше

Источник: http://we.easyelectronics.ru/blog/STM32/

STM32 для начинающих. Урок 2. Тактирование STM32

Система тактирования STM32.

Сегодня речь пойдет о системе тактирования микроконтроллеров STM32. Если вы ещё не знаете что такое такт, частота и вообще не затрагивали до этого системы тактирования, перейдите на наш урок. Хоть по данной ссылке и рассматривается система тактирования микроконтроллера AVR, понятия определенные в уроке по ссылке, применимы и к системе тактирования микроконтроллеров STM32.

Итак, приступим!

Рассматривать систему тактирования будем на примере микроконтроллера STM32F303VCT6, который установлен в отладочной плате STM32 F3 DISCOVERY.

Взглянем на общую структуру системы тактирования:

Как мы видим, система тактирования STM32, на порядок сложнее системы тактирования микроконтроллеров AVR, не смотря на то, что на рисунке отражена лишь основная её часть.

Давайте разбираться!

Рассматривать схему следует слева направо. Во-первых, мы должны выбрать основной источник тактирования контроллера. Выбирать будем между HSI и HSE.

HSE —Внешний высокочастотный генератор. Источником тактирования для него служит внешний тактовый сигнал (Input frequency), который как мы видим по схеме, может быть от 4 до 32 МГц. Это может быть кварцевый резонатор, тактовый генератор и так далее.

HSI Внутренний высокочастотный генератор. В микроконтроллерах STM32 F3 является RC цепочкой с частотой 8МГц. Точность значительно ниже внешнего генератора HSE.

Каждый из данных источников тактирования может быть соединен с PLL. Однако перед подачей на PLL сигнал с HSI будет уменьшен в 2 раза. Сигнал HSE в свою очередь, может подаваться на PLL без изменений, либо быть уменьшен в определенное количество раз, по желанию пользователя.

PLLClock Система Фазовой Автоподстройки Частоты (ФАПЧ). Позволяет умножить входной сигнал HSI или HSE в необходимое количество раз.

https://www.youtube.com/watch?v=-swzPsSIkEw

С PLL сигнал может быть подан на системную шину, максимальная частота которой 72МГц. Либо, на системную шину может быть подан сигнал HSE или HSI напрямую, то есть без преобразования PLL.

Системная тактовая частота SYSCLK, тактирует все основные шины микроконтроллера, через соответствующие делители, как мы видим на схеме выше. Следует учитывать, что максимальная тактовая частота некоторых шин ниже SYSCLK. Поэтому, перед подачей тактового сигнала SYSCLK на шину, следует поделить его соответствующим делителем. Если этого не сделать, микроконтроллер зависнет.

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

Настроим нашу отладочную плату STM32 F3 DISCOVERY на работу с тактовой частотой 72 МГц.

Создадим и настроим проект в Keil uVision. Подробнее об этом в нашем видео уроке.

Добавим следующий код:

#include “stm32f30x_gpio.h”#include “stm32f30x_rcc.h”RCC_HSEConfig(RCC_HSE_ON); //Enable HSEwhile(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET) ; //Waiting for HSEFLASH->ACR |= FLASH_ACR_PRFTBE;FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);FLASH->ACR |= (uint32_t)((uint8_t)0x02);RCC_PREDIV1Config(RCC_PREDIV1_Div1);//PREDIV 1 Divider = 1RCC_PLLConfig(RCC_PLLSource_PREDIV1,RCC_PLLMul_9);//Set PREDIV1 as source for PLL,And set PLLMUL=9RCC_PLLCmd(ENABLE);//Enable PLLwhile(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) ;//Waiting for PLLRCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//Set PLL as SYSCLK SoucreRCC_HSICmd(DISABLE);//Disable HSIRCC_ClocksTypeDef RCC_Clocks;RCC_GetClocksFreq (&RCC_Clocks);

Читайте также  STM32. Обзор платы STM32 F3 Discovery.

В основной функции main, объявлена структура RCC_ClocksTypeDef. Данная структура содержит в себе поля, отражающие текущую тактовую частоту определенных частей контроллера.

Затем в основной функции вызывается функция InitRCC,которая настраивает тактирование контроллера. Рассмотрим её подробнее.

Командой RCC_HSEConfig(RCC_HSE_ON), мы включаем HSE.

На его включение необходимо время, поэтому необходимо подождать пока не будет установлен флаг RCC_FLAG_HSERDY.

Делаем мы это в цикле while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET) .

Затем мы производим настройку задержки флеш памяти. Это необходимо делать при работе системной шины на частотах свыше 36 МГц!

После настройки задержки выбираем предделитель PLL. Командой RCC_PREDIV1Config(RCC_PREDIV1_Div1) мы устанавливаем предделитель на 1.

Командой RCC_PLLConfig(RCC_PLLSource_PREDIV1,RCC_PLLMul_9) выбирам HSE как источник частоты для PLL и выбираем умножение в 9 раз.

Остается только влючить PLL командой RCC_PLLCmd(ENABLE),и ожидать установки флага RCC_FLAG_PLLRDY,в цикле while. Тем самым мы обеспечиваем необходимую временную задержку для включения PLL.

После этого выбираем PLL как источник системной частоты SYSCLK командой RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK). Предделители шин трогать не будем, поэтому шины AHB,APB1,APB2 будут работать на частотах 72,36 и 72 МГц соответственно.

Остается лишь выключить внутреннюю RC цепочку командой RCC_HSICmd(DISABLE).

После выполнения функции InitRCC, в основном цикле прошивки заполним структуру RCC_ClocksTypeDef, что позволит нам узнать, правильно ли мы настроили систему тактирования. Делаем мы это командой RCC_GetClocksFreq (&RCC_Clocks).

Посмотреть значения тактовых частот контроллера можно в режиме отладки, установив точку останова на команде __NOP() что означает, пустую команду. Данную команду часто добавляют для удобства отладки.

Подключаем отладочную плату STM32 F3 DISCOVERY, собираем прошивку, прошиваем плату и наконец, заходим в режим отладки, нажав кнопку Start/Stop debug session (Ctrl+F5). Установив точку останова на функции __NOP,и добавив структуру RCC_Clocks в Watch,запускаем исполнение прошивки, нажав F5. В результате видим:

Читайте также  GPS маячок. STM32

Частоты настроены правильно, и микроконтроллер теперь работает на частоте 72 Мгц.

Итак, как Вы поняли из сегодняшнего урока, система тактирования STM32 достаточно мощна и гибка для удовлетворения потребностей Ваших проектов. Потратив время на её настройку — Вы достигнете прекрасных результатов!

Спасибо за внимание! Ваши вопросы как обычно в комментариях!

Другие уроки цикла.

Любое копирование, воспроизведение, цитирование материала, или его частей разрешено только с письменного согласия администрации MKPROG.RU. Незаконное копирование, цитирование, воспроизведение преследуется по закону!

Источник: http://mkprog.ru/mikrokontrollery-stm32/stm32-dlya-nachinayushhih-urok-2-taktirovanie-stm32.html

Программирование STM32

Курс поможет овладеть навыками программирования микроконтроллеров с нуля. В качестве примера для работы взята отладочная плата STM32F3Discovery с установленным микроконтроллером STM32F303VCT6.

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

  На текущий момент записано 20 видеоуроков по данному курсу.  

Для ознакомления с курсом открыты первые 4 урока.

Урок 1: Введение

Введение в программирование микроконтроллеров. Выбор аппаратных средств. Первое знакомство с отладочной платой.

Урок 2: Установка IAR

Знакомство с фирмой-производителем ST Microelectronics. Установка программной среды разработки IAR.

Урок 3: Дополнительные инструменты

Установка программы-конфигуратора STM32Cube. Установка программы работы с памятью ST Visual Programmer.

Урок 4: Создание проекта

Создание конфигурации проекта в STM32Cube и генерация проекта для IAR Embedded Workbench.

Урок 5. FLASH-память

Считывание и загрузка кода программы во FLASH-память микроконтроллера с помощью ST Visual Programmer. Первое знакомство с отладочной платой.

Урок 6. Порты ввода-вывода

Понятие портов и линий ввода-вывода. Загрузка программы в отладочную плату средствами среды разработки IAR. Включение светодиодов на плате.

Урок 7. Светодиоды и кнопка

Реализация «бегущего огня», а также переключения светодиодов по кнопке.

Урок 8. Сохранение данных

Сохранение энергонезависимых данных во FLASH-память микроконтроллера на примере запоминания светодиода, на котором закончилось переключение бегущего огня перед отключением питания

Урок 9. Таймеры-счетчики

Использование периферийного модуля таймера-счетчика для формирования задержки.

Урок 10. Прерывания

Использование прерывания по переполнению таймера-счетчика TIM6 для реализации задержки.

Урок 11. Внешние прерывания

Использование различных прерываний и их приоритетов.

Урок 12. Тактирование

Задание тактовой частоты ядра и периферийных модулей.

Урок 13. Широтно-импульсная модуляция

Конфигурация и использование широтно-импульсной модуляции на каналах таймера TIM1 с различной частотой.

Урок 14. Сторожевой таймер

Использование независимого и системного сторожевого таймера. Использование регистра окна.

Урок 15. Аналого-цифровой преобразователь

Использование аналого-цифрового преобразователя и внутреннего датчика температуры.

Урок 16. Основные и дополнительные каналы АЦП

Использование нескольких каналов единого модуля АЦП.

Урок 17. Прямой доступ к памяти

Использование прямого доступа к памяти для получения результатов аналого-цифрового преобразования.

Урок 18. Дискретизация

Использование таймера для синхронизации запусков АЦП с сохранением результатов через прямой доступ к памяти.

Урок 19. Цифро-аналоговый преобразователь

Использование цифро-аналогового преобразователя для генерации треугольного сигнала, сигнала шума или постоянного аналогового значения.

Урок 20. Пользовательский сигнал

Использование цифро-аналогового преобразователя для генерации сигнала произвольной формы.

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

При этом доступ к новым урокам для Вас будет открыт автоматически.

Источник: https://prog-cpp.ru/stm32/

Штурмуем STM32

В данный момент курс не завершён, идёт переработка материала: новая версия платы, новые темы (АЦП, bootloader и т.д.)Завершение работ: ориентировочно начало августа. Сайт переедет на другую площадку.

Данный курс является рефлексией и логическим завершением двухлетнего руководство кружком электроники на ИРИТ-РтФ, УрФУ (HEC – Hardware Engineering Club, позже IMEN – I Am an Engineer).

Курс в текущей форме был прочитан студентам 3-го курса Радиотехнического Факультета УрФУ в весеннем семестре 2016 года (отчёт), а также в осеннем семестре 2016 года школьникам СУНЦ УрФУ (отчёт). Связаться с автором можно по электронной почте.

Набор можно заказать в интернет-магазине MakeItLab.

Цель и задачи курса

Главной целью курса является попытка продемонстрировать весь жизненный цикл цифрового устройства: от первоначальной идеи до реализации и управления продуктом.

Основными задачами являются: научить работать с технической документацией; показать основы программирования микроконтроллерной техники; объяснить, как проектировалось устройство (от идеи и схемотехнической реализации до конечной реализации и эксплуатации устройства).

Требования

Минимальный уровень компетенций, при котором можно начинать прохождение курса, подразумевает умение писать несложные программы на языке Си с использованием арифметических, логических и побитовых операций. Умение пользоваться циклами и условиями. Умение писать функции. Понимание процедурного и модульного программирования. Понимание законов Ома, Кирхгофа. Умение анализировать несложные электрические схемы.

Благодарности

Никитин Дмитрий Алексеевич – помощь в изготовлении первых образцов устройства, тестирование некоторых узлов, администрирование части задач по учебной группе; Хорькова Мария Алексеевна – литературный редактор печатной версии; Прозоров Антон Михайлович – технический редактор, цензор; Гусев Андрей Викторович – технический редактор, цензор; Михайлова Екатерина Владимировна – предоставление части фотоматериалов для иллюстрации книги; Круглова Евгения Константиновна – пайка первого образца устройства; Журбин Вячеслав Алексеевич – тестирование некоторых узлов устройства; Малыгин Иван Владимирович, Иванов Вячеслав Элизбарович, Шабунин Сергей Николаевич – предоставление академической группы для опробации курса; Исаков Дмитрий Николаевич – предоставление оборудования и монтаж видео-составляющей курса.

Сопровождающие материалы:

  • Статьи по занятиям (см. ссылки в плане курса)
  • Книжка в формате PDF
  • Сопроводительные видео-инструкции на youtube
  • Листинги программ в репозитории на github
  • Приложение под Android для управления устройством

Поддержать!

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

Однако, стоит заметить, что подготовка всего вышеперечисленного отняло не мало сил и энергии.

В этой связи автор будет безмерно рад, если вы приобретёте набор в интернет-магазине MakeItLab (возможна доставка).

План курса

  1. Введение
  2. Теория
  3. Инструменты разработки
  4. Программирование
    • Из чего состоит простейшая программа? С чего начать программирование? Рассмотрим простейшую программу.
    • Структура проекта для устройства. У нашего устройства различный функционал и необходимо его как-то структурировать.
    • Разбираемся с тактированием МК. Как запустить МК от внутренней RC-цепочки используя PLL?
    • GPIO: мигаем светодиодом. Как написать простейшую программу, которая сможет мигать светодиодом?
    • Прерывания, события и NVIC. Что такое прерывания и как с ними работать?
    • Системный таймер — SysTick. Как написать «правильную» функцию задержки? Потребуется системный таймер!
    • Работа с SysTick без прерывания. Адаптируем код для использования функции задержки для датчика температуры DS18B20.
    • Датчик температуры DS18B20. Что такое протокол 1-Wire и как с ним работать? Реализуем работу с датчиком температуры.
    • Обработка нажатия кнопки. Как обрабатывать такие события, как нажатие кнопки? Как устроен модуль, который позволит нам работать с кнопками?
    • Машина состояний. Как организовать работу устройства в нескольких режимах? Самый простой — машина состояний.
    • Стандартная библиотека периферии. Кроме CMSIS — библиотеки для всех ARM, вендоры-производители пишут свои библиотеки, которые упрощают работу с микроконтроллером. В случае ST Microelectronics это стандартная библиотека периферии.
    • Что такое таймер? Что делает таймер, какие функции они могут выполнять? Сколько таймеров в микроконтроллере?
    • Таймеры: работа с энкодером. У таймеров имеется несколько режимов работы. Один из них позволяет наиболее простым образом работать с таким устройством как инкрементальный датчик угла поворота.
    • Светодиод, таймер и ШИМ. Есть одна вещь, про которую вам необходимо знать в любом случае — широто-импульсная модуляция. Она может быть использована для работы с двигателем или других не менее важных применениях. Мы рассмотрим как менять яркость светодиода при помощи ШИМ.
    • Музыка с ШИМ. Вы уже познакомились с понятием ШИМ и даже увидели как это работает на практике. Пришло время сделать что-то сложнее тускнеющего светодиода — добиться звучания музыки!
    • Что такое часы реального времени? Микроконтроллер не знает что такое секунда. Как же нам получать время?
    • Интерфейс SPI. Интерфейсов бывает много разных, однако микросхема MAX7219 работает по SPI, а значит нужно разобраться что он из себя представляет.
    • Драйвер семисегментного индикатоа MAX7219. Настало время написать драйвер для работы с семисегментным индикатором.
    • Что такое АЦП? Как отцифровать аналоговый сигнал и где это может пригодиться?
    • Фоторезистор как датчик освещённости. Как менять яркость дисплея в зависимости от освещённости?
    • Wi-Fi модуль ESP8266. Как добавить Wi-Fi на наше устройство? Можно использовать модуль.
    • Интерфейс UART. Как работает интерфейс UART? Перед написанием драйвера, как и в случае с MAX7219 необходимо разобраться с интерфейсом.
    • Драйвер ESP8266. Для того что бы наш Wi-Fi модуль заработал, нужно написать драйвер.
  5. Дополнение
  6. Проектирование
    • Как проектировалось устройство? Пора разобраться в том, как именно проектировалось устройство!
    • Идея. Почему в качестве устройства в курсе были выбраны часы?
    • Проектирование. Настало время разобраться как было спроектировано устройство. Какие критерии были поставлены, как выбирались компоненты и т.д.
    • Разводка печатной платы. Мало того что устройство спроектировано на бумаге, его нужно оформить в виде печатной платы. Делать это нужно с умом, поэтому давайте разберёмся с этим вопросом?
    • Автоматизация проектирования. Раньше печатные платы рисовали руками (печатные дорожки, контактные площадки) в прямом смысле этого слова. К счастью XX век нам подарил компьютер и задача немного упростилась. Какое программное обеспечение можно использовать?
  7. Прочее
    • Ссылки и материалы. Список документов, материалов сайтов, которые были использованы в курсе.
    • Словарь. Знание английского важно для современного инженера. Как правило документация написана на нём. На этой странице вы найдёте все слова, которые нам повстречались в курсе и могут пригодиться вам в дальнейшем.

Источник: http://stm32.chrns.com/

Tag: stm32

Итак, со схемами в proteus наигрались, теперь голова полна идеями, хотелками и желалками. Но ни одна идея не реализуется сама собой, поэтому надо выбрать “движок” для нее.

Как выбирают контроллер?

Во-первых, по личным предпочтениям. Кому-то нравится одна архитектура, кому-то другая. У кого-то уже есть опыт с одними микроконтроллерами и ему лень изучать другие … Но я считаю, что раз опыта и предпочтений нет, поэтому – stm32. Вам на данном этапе все равно, а мне потом спасибо скажете.

Во-вторых, по скорости. Если задача сложная, то думаю понятно, что работающий на 72МГц контроллер обгонит работающего на 16МГц (грубо – у кого больше литраж у двигателя, тот быстрее разгонится или больше увезет).

А если устройство работает от батареек, то наоборот, устройство работающее на 16МГц легко даст фору работающему на 72х (опять же, чем больше литров, тем чаще на заправку надо будет ездить).

Но на данном этапе нам совершенно все равно, какая скорость у контроллера – для нас подойдет любая.

И наконец, по числу портов и их возможностями. Все порты делятся на два типа: цифровые и аналоговые. Цифровые оперируют уровнями типа “есть сигнал” и “нету сигнала”, а аналоговые – “какой уровень у сигнала?”.

Говоря другими словами – кнопки, выключатели и прочие переключатели – это цифровые, а всякие регуляторы, измерители и прочее – аналоговые. На каждую кнопку, релюшку или измеритель надо по одному порту (конечно, есть куча возможностей, как от этого уйти, но пока нам этого не надо).

И крайне рекомендую при выборе зарезервировать пару портов под всякие доделки и внезапно всплывшие идеи.

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

Что будем делать-то? В смысле для чего мы все это затеяли? Давайте начнем с простого. Пусть будет система автоматического включения света в машине.

Как пример использования: садимся в машину, включаем зажигание, заводим машину и через некоторое время наш контроллер включает фары. Выключили зажигание – все выключилось.

Сплошные бонусы: стартеру легче крутить двигатель – фары не отбирают лишних ампер и вам не надо будет помнить о включении фар.

Какой будет алгоритм работы?

1. Измеряем напряжение бортовой сети 2. Напряжение меньше 13В? если да, иди на п.1 3. Подождать 5 секунд.

4. Включить фары.

Все, никаких заморочек. Просто и совсем не страшно. Как видно, нам потребуется всего 2 порта: один аналоговый для измерения напряжения в сети и один цифровой, для управления релюшкой фар.

(отступление) Не хотите фары включать? Ну тогда например можно автоматически включать и выключать компрессор в пневмосистеме. Или в зависимости от температуры включать нагреватель или вентилятор. В общем, подойдет любой вариант “измерил что-то и как это что-то достило такого-то уровня – включил или выключил нечто”.

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

Теперь готовимся скачать много из сети. Для начала нам нужна программа STM32CubeMx. (Все поисковики ее легко находят, но вот прямая ссылка http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1533/PF259242?sc=stm32cube там мотайте страницу в самый низ и справа будет маленькая красная кнопочка Download).

Зачем нужна эта программа? Как я писал в первом посте, STM32 имеют один, но очень большой и неприятный минус – очень сложно начать с ними работать. В этих микроконтроллерах очень много возможностей и вариаций, поэтому даже просто запустить его составляет очень большую проблему.

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

В общем, реальный кошмар после атмеловских контроллеров и 99% причин неработащих программ.

Вот и придумали этакий “генератор кода инициализации”, когда можно мышкой не торопясь повыбирать порты и их функции. При этом идет одновременный контроль правильности использования порта и непересечение его с другими функциями. В общем, скачивайте, распаковывайте и запускайте программу (может потребовать java, так что тоже ставьте). Как ставить программы, нажимая next, я рассказывать не буду

Источник: https://blog.kiltum.tech/tag/stm32/

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}