Iar и stm32 cortex m0. часть 0x03, программируем без программатора

IAR и STM32 CORTEX M0. Часть 0x03, Программируем без программатора

В предыдущих сериях…
Итак, мы условились, что работать будем с микроконтроллером STM32F030F4P6, настроили под него IAR и даже спаяли полигоны для испытаний (попутно курнув мануалы).

Предположу также, что у вас уже есть UART-шнурочек для компьютера.

Если нет, то советую спаять, потому что без него ничего не получится — тут вам помогут статьи на нашем сайте, а также max232 [1] (для com-порта), FT232RL [2] (для usb) или CP2102 [3] (тоже usb, но гораздо дешевле). Готово? Идем дальше!

1. Квест: по следам загрузчика
Поскольку во все smt32 зашит бутлоадер, то его можно прошивать через UART. Что для этого нужно? Идем в даташит, в разделе 3.3 Boot modes (стр. 12) нам честно говорят:

Ну, то есть, программировать можно, заюзав порты PA14/PA15, либо PA9/PA10. Мы выбираем второй вариант. Почему? Думаю, что отсутствие порта PA15 — достаточно веская причина 🙂

Открываем теперь RM. Там так же ищем раздел, связанный с загрузчиком (Boot). Ага, вот он: раздел 2.5 Boot configuration (стр. 52). Пролистываем чуть ниже и находим заветный «Embedded boot loader».

Там пишут, что можно прошивать через UART (это мы уже знаем) и… посылают нас к следующему мануалу: AN2606. Ну, раз посылают, придется идти.

Этот аппнот можно скачать в конце статьи, а впрочем, вы уже знаете, где его брать [4].

Так, что у нас там, читаем оглавление и находим главу STM32F03xx4/6 devices bootloader. Не успеваем открыть страницу 29, как нам предлагают вернуться в начало:

Ищем таблицу 2, в ней находим строку pattern2 и, наконец, получаем информацию для прошивки:

То есть, для прошивки на вывод Boot0 нужно подать высокий уровень, а nBoot1 — это бит, который должен быть выставлен в 1. Как выставить nBoot1 в единицу? Для начала неплохо бы проверить, а какое у него значение по умолчанию. Открываем снова RM, после недолгих поисков находим таблицу 12 (стр. 77):

Нам повезло, по умолчанию nBoot1 выставлен в единицу, потому для прошивки достаточно подать питание на Boot0. Начинаем прошивку!

2. Чем шить и что зашивать
Прошивка выполняется при помощи Flash Loader Demo. Раньше эта прога очень глючно работала с Cortex M0, так что советую скачать последнюю версию (в конце статьи или на официальном сайте st,com [5]).

Софт бесплатный, установка стандартная. Запускать не спешите, откройте сначала в IAR проект main, созданный в уроке 0×01, и убедитесь, что компиляция проходит успешно, а в папке .DebugExe (в корне проекта) появляется после этого файл main.

bin. Получилось?

Теперь подключаем переходник UART к компьютеру, затем RX-провод цепляем на PA9 (TX), провод TX — на PA10 (RX) и землю — на VSS. Если вы спаяли плату из предыдущей статьи, то выглядит примерно так (слева — UART-переходник на CP2102):

Нажимаем на переключатели BOOT0 и ON/OFF. Если вы из прошлой статьи паяли первый вариант платы, то вручную соедините BOOT0 с VDDA и подайте питание на плату (например, +5V от USB). Теперь все готово к прошивке, запускаем Flash Loader Demo:

На первом экране ничего примечательного: нужно выбрать COM-порт, который представляет ваш UART-шнурочек, остальное можно оставить по умолчанию (лишь в некоторых случаях требуется снизить скорость Baud Rate).

Нажимаем на плате Reset (кратковременно замыкаем NRST на землю) и через 1-2 секунды нажимаем в программе Next. Не взлетело? Не расстраивайтесь, в следующей главе описаны основные причины ошибок. Если же все сделано правильно, то вам зеленый свет:

Жмем еще раз Next, тип микроконтроллера определится автоматически:

Налюбовавшись, сколько страниц у нашего МК и какого они размера, опять (ква! снова!) нажимаем Next. Мы почти у финиша — перед нами окно загрузки прошивки:

Нажмите Download to device и загрузите файл main.bin. Также в этом окне можно слить прошивку (если она не защищена). Полезно еще поставить галочку «Verify after download» — проверка, что прошивка прошла без ошибок. Имеются и другие опции, будем их рассматривать по мере надобности. А пока жмем все тот же Next и наслаждаемся прошивкой:

3. Troubleshooting
Что делать, если программа в упор не видит вашу плату? Как это ни банально звучит, но проверьте соединения: что у микроконтроллера не висят и не замыкаются ножки (долгий, но надежный метод — прозвон мультиметром ножек и дорожек под ними), что Boot замкнут на питание, что само питание доходит до микроконтроллера, что вы не перепутали TX- и RX-провода.

Если все это в порядке, то вот вам еще список типичных ошибок:

  • Общая земля. Моя любимая ошибка. Например, вы спаяли UART-шнурочек, от него идет два провода: TX и RX. Вы их подсоединяете к своей схеме, которая питается от батарейки, и… ничего не работает. Почему? Да потому что вы поленились вывести с UART-шнурка провод GND. Решение: соединить GND шнурка с GND вашей платы.
  • Еще одна причина ошибок — нестабильное питание микросхемы. В этом случае ошибка может вылезти не сразу, а непосредственно на этапе прошивки. Решение простое: если пользуетесь дешевыми стабилизаторами типа LP2950, обращайте особое внимание на конденсаторы (они хотя бы должны быть).
  • Ошибка «…….. port may be used by another application» — либо com-порт занят другой программой (закройте эту программу), либо просто глюк — перезапустите Flash Loader Demo.
  • Слишком быстро нажимаете Next после резета. Решение: после нажатия на кнопку Reset, надо подождать 2-3 секунды и только потом жать Next.
  • Слишком высокая скорость Baud Rate. Решение: снизить ее.
  • Глючный UART-шнурочек. Этим грешит, например, USB-переходник на CP2102. Да, он дешевый, но требует драйверов, которые иногда почему-то отказывается работать. Решение: замкнуть RX/TX на переходнике и проверить любой терминальной программой [6]. Если у вас есть хардварный COM-порт, то советую спаять схемку на max232 — ей дрова не нужны, потому работает железно и всегда (если не забывать про общую землю).
  • Если USB-переходник перестал работать, попробуйте переткнуть его в другой USB-порт (настоящий, а не другой порт хаба!). Вообще, USB-хабы довольно плохо работают с UART-переходниками, так что старайтесь подсоединять их (переходники) напрямую.
  • Не хватает питания — если плата работает от батарейки. Решение (вы не поверите!): заменить батарейку.
  • Выбран не тот com-порт — такое тоже бывает 🙂

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

4. Елочка, гори Диодик, мигай!
Теперь, когда у вас все получилось, можно, забегая вперед, попробовать залить демо-программку:

#include “stm32f0xx.h” void delay (int a); void main(void)
{ /* GPIOC Periph clock enable */
RCC->AHBENR |= RCC_AHBENR_GPIOAEN; GPIOA->MODER |= (GPIO_MODER_MODER3_0 | GPIO_MODER_MODER4_0) ;
/* Configure PC3 and PC4 in output mode */ GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_3 | GPIO_OTYPER_OT_4) ;
// push pull mode while (1) { GPIOA->BSRR |= GPIO_ODR_3; GPIOA->BRR |= GPIO_ODR_4; delay(500000); GPIOA->BRR |= GPIO_ODR_3; GPIOA->BSRR |= GPIO_ODR_4; delay(500000);
} } void delay (int a){ int i,j; for (i=0 ; i

Компилируем, заливаем, после заливки отключаем Boot0. Теперь подключите два светодиода: к PA3 и к PA4. Нажмите Reset. Лампочки должны мигать по очереди. Как-то так:

О том, что за магия тут происходит, читайте в следующей статье… Хотя… Нет, сначала добавим еще автоматизации.

1. http://easyelectronics.ru/svyaz-mikrokontrollera-s-kompyuterom-cherez-rs232.html 2. http://easyelectronics.ru/preobrazovatel-usb-uart-na-ftdi-ft232rl.html 3. http://we.easyelectronics.

ru/electro-and-pc/cp2102-preobrazovatel-usb-uart-za-45-rubley.html 4. http://www.st.com/en/microcontrollers/stm32f030f4.html?s_searchtype=partnumber#tabHeader-2 5. http://www.st.

com/en/development-tools/flasher-stm32.html

6. http://easyelectronics.ru/terminalnye-programmy.html

Источник: http://cxem.gq/mc/mc429.php

Загрузчик STM32

В микроконтроллерах STM32 существуют три интерфейса для заливки прошивки: 

  • JTAG
  • SWD
  • UART (через загрузчик)

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

Вот допустим устройство уже готово и работает у пользователя, и вдруг ВНЕЗАПНО возникает потребность в перепрошивке. Конечно, можно разобрать девайс и подпаяться к отладочному интерфейсу, но это относительно сложно + нужен отладчик.

А что если устройство уже соединено с компом через UART ? В этом случае гораздо проще использовать этот интерфейс для загрузки прошивки. Вот тут-то загрузчик будет очень кстати. Пользователю достаточно нажать одну кнопку и девайс входит в режим прошивки.

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

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

BOOT1 BOOT0 Что запускается
Х Программа прошитая во FLASH
1 Загрузчик
1 1 Программа из SRAM

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

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

Пока не совсем понимаю для чего это нужно, разве что программа выполняется быстрей (если верить интернетам). Вернемся к загрузчику. Чтоб ввести наш контроллер в режим прошивки, удерживаем кнопку BOOT и жмем RESET. После этого кнопку можно отпустить. Для прошивки используется специальный софт который называется Flash Loader Demonstrator.

Вы можете скачать его на сайте ST или у меня. Процедура прошивки проста до безобразия: Достаточно лишь следовать указаниям мастера. На первом шаге нас попросят выбрать номер ком порта к которому подключен контроллер и указать настройки соединения. Что примечательно у загрузчика есть автодетект скорости.

Это значит что можно свободно выбрать любую скорость из списка и оно заработает. Лишь бы ваш адаптер RS232 – UART (или USB-UART) её поддерживал. Мой преобразователь на CP2102 о котором я вкратце уже рассказывал, отлично работает на всех скоростях.

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

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

Если контроллер защищен от считывания прошивки, то вы можете снять защиту, но при этом содержимое флеш памяти будет уничтожено. Это делаеется кнопкой “Remove protection” которая у меня не доступна т.к.

защита памяти не включена. 

Следующий шаг мастера показывает какие страницы flash памяти защищены от записи/чтения. Нужно не забыть выбрать объем памяти которым обладает программируемый контроллер. Кажется там есть автодетект который сам сделает правильный выбор, но я не уверен. У моего контроллера есть 128 кБайт памяти, что я и выбрал:

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

Есть возможность проверить содержимое памяти после прошивки. Или можно сразу начать выполнение прошитой программы. Чтение памяти возможно опять таки если это не запрещено. Снять или установить защиту от записи/чтения можно в этом же окне. Еще можно редактировать “Option bytes”.

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

После нажатия кнопки Next выполняется выбранное действие. Результат выполнения отображается на последнем шаге мастера. Если всё хорошо, то вы увидите сообщение похожее на это:

Когда работа с загрузчиком завершена нужно перезагрузить контроллер нажатием на RESET. Если кто-то хочет подробнее узнать о протоколе который используется загрузчиком, то можно почитать аппноут AN3315. Возможно, окажется полезным и аппноут AN2606. Если остались вопросы касаемо загрузчика – спашивайте, попробую ответить. 

Источник: http://easystm32.ru/useful-things/42-bootloader-

Микроконтроллеры STM32

ПодробностиКатегория: Микроконтроллеры STM32Автор: AdminПросмотров: 8679

Одной из первых компаний выведших группу микроконтроллеров на ядре ARM Cortex-M3 является «STMicroelectronics», которая и сегодня находится в числе лидеров среди производителей подобных микроконтроллеров.

Начиналось всё в 2007 году с двух семейств – «Performance Line» (STM32F103) и «Access Line» (STM32F101). И по сей день компания работает над улучшением характеристик и над расширением семейств. Помимо этого, пополняя программную составляющую продукта, и обеспечивая техническую поддержку.

Сейчас микроконтроллеры STM32 представлены 10-тью основными линейками для достижения различных целей:

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

А так же «pin-to-pin» и программная совместимость по всем линейкам. И это всё – на одном ядре ARM Cortex-M3.
Рассмотрим три основных инструмента, необходимых для того что бы начать работу с микроконтроллером STM32:

Параметры некоторых микроконтроллеров STM32

Распиновка микроконтроллера STM32F407V

Структура одного из микроконтроллеров STM32

1. Программный инструментарий для разработки программ по микроконтроллеры STM32

Программные средства для разработки под ARM-архитектуру представлены в широком ассортименте. Рассмотрим самые популярные из них.Самым качественным, но при этом и самым дорогим является инструментарий представленный компаниями «Keil» и «IAR Systems».

С точки зрения оптимизации и компактности кода, С-инструментарии наиболее продвинуты, этим и обусловлена их высокая цена.

Кроме этого, за дополнительную плату данные компании предоставляют широкий выбор дополнительного ПО: USB-стеки, TCP/IP-стеки, операционные системы реального времени, и многое другое.

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

2. Оценочная плата для разработки

Для микроконтроллеров STM32 существует широкий выбор оценочных плат. При чём не только от «STMicroelectronics», но и от прочих производителей. Например, модули «Махаон» и «Барракуда» от компании «Терраэлектроника».

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

По подробнее остановимся на линейке оценочных плат «Discovery», разработанной компанией «STMicroelectronics» для 8-битных микроконтроллеров – STM8S-Discovery и STM8L-Discovery, и «STM32VLDiscovery» – для 32-битных.

Особенностью данных оценочных плат является то, что они являются завершённым решением, чтобы начать разработку программного обеспечения на микроконтроллерах. Имея необходимую обвязку и внешние компоненты, а также интегрированный программатор-отладчик «ST-Link», сам микроконтроллер является полноценным решением, не требующим дополнительных затрат.

3. Программатор-отладчик для разработки микроконтроллеры STM32

Не смотря на поддержку устройств других производителей, изготовитель каждой среды разработки в качестве программатора – отладчика, как правило, предоставляет своё собственное решение. Сегодня «ST-Link» – самый экономичный вариант. И его поддерживает основная масса сред разработки.

«Родные» программаторы отладчика конечно, предоставляют максимальные возможности по отладке ПО. Так же, при выборе программаторов-отладчиков предоставляется несколько вариаций от одного разработчика: как более простые с поддержкой основных отладочных функций, так и профессиональные версии с поддержкой полного спектра функций трассировки и отладки.

К примеру, программаторы-отладчики для «IAR Embedded Workbench» – «J-Link» и «J-Trace», для «Keil uVision» – «ULink» и «ULink-Pro».
В этой статье мы рассмотрели основные инструменты, необходимые для работы с группой микроконтроллеров STM32.

Если Вам необходима дополнительная информация, то обращайтесь на официальный сайт «STMicroelectronics», где представлены разнообразные примеры, описания и много другой информации.

Услуги по разработке интерактивных электронных технических руководств (ИЭТР) представляет компания ITORUM. ИЭТР – это документация выполненная в интерактивной электронной форме.

Источник: http://www.radio-magic.ru/microcontrollers/stm32/150-stm32-timers-2

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

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

Читайте также:  Антенна для диапазона 160м с низкой высотой подвеса

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

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

Программирование ARM-контроллеров STM32 на ядре Cortex-M3. Часть 5. Как залить прошивку в контроллер

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

Вообще-то прошивать контроллеры STM32 можно по-разному, но мы рассмотрим самый простой вариант прошивки — через последовательный интерфейс с помощью фирменной утилиты Flash Loader Demonstrator. Эта утилита совершенно бесплатна и её можно скачать как с официального, так и с нашего сайта.

Как мы ранее уже говорили, — в системной области памяти контроллера зашит bootloader. Именно он и позволяет записать прошивку во flash-память через последовательный интерфейс.

Детально bootloader описан в документе AN2606 (CD00167594.pdf), а используемый им протокол — в документе AN3155 (CD00264342.pdf). Это для тех, кто хочет исчерпывающей информации, а мы рассмотрим процесс прошивки через bootloader вкратце.

Для начала вам нужно скачать и установить себе на компьютер утилиту Flash Loader Demonstrator.

Далее, нужно соединить контроллер с компьютером через UART1. Мой подопытный STM32F103C8T6 имеет 48-выводный корпус, в котором UART1 выведен на ноги 30 (Tx) и 31 (Rx).

Обратите внимание, что в контроллере используется именно UART (причём с уровнями 0/+3,3В), а не RS-232, то есть соединять напрямую выводы контроллера и com-порт компьютера нельзя. Я нашёл выход из этой ситуации в использовании USB-to-COM преобразователя RH-0002 на микросхеме cp2102.

Помимо того, что этот преобразователь может использоваться как USB-to-UART с уровнями 0/+3,3 В (его можно разделить на две отдельных части: USB-to-UART и UART-to-RS232), он также позволяет запитать контроллер напряжением 3,3 Вольта (то есть отпадает необходимость во внешнем источнике питания).

Вот здесь описано, как собрать преобразователь самостоятельно

Итак, ногу Tx контроллера нужно соединить с ногой Rx преобразователя, а ногу Rx контроллера — с ногой Tx преобразователя. Кроме этого, контроллер нужно запитать и обеспечить нужные уровни на ногах BOOT0 (pin 44), BOOT1 (pin 20). Для запуска bootloadera, который расположен в system memory, ногу BOOT1 нужно подтянуть к «земле», а BOOT0 — к «питанию» (табличка справа).

Подтяжку для BOOT0, BOOT1 лучше делать не жёсткую, а джамперами, чтобы можно было легко выбирать режимы загрузки (например, переключившись после заливки проги в режим загрузки из flash, можно будет эту прогу сразу и потестить).

Схема подключения показана ниже.

Дальше всё просто. Запускаем Flash Loader Demonstrator. Откроется страничка, на которой нужно выбрать com-порт и скорость обмена.

Чётность и количество бит данных уже настроены как надо, скорость можно менять — контроллер в процессе инициализации обмена настраивается на выбранную скорость автоматически, com-порт нужно выбрать тот, который создался при подключении USB-to-COM преобразователя к компьютеру (наш преобразователь создаёт при подключении виртуальный com-порт, полностью имитирующий настоящий аппаратный). После того, как всё настроили — жмём «Next».

О том, что всё нормально и соединиться с контроллером удалось, нам сообщит зелёный сигнал светофора на следующей страничке. Если связь не установится — на эту страничку нас вообще не пустят, сообщив, что контроллер не отвечает.

При установлении связи программа автоматически определит сколько у контроллера flash-памяти и защищена ли эта память от чтения. Нажав кнопку «Remove protection» защиту можно снять, но при этом содержимое флеша будет стёрто (предыдущая записанная туда прошивка уничтожится). Жмём «Next».

В следующем окне нам предлагают выбрать тип программируемого камня (хотя непонятно зачем, — он и так автоматически определяется), а также показывают для нашего камня PID, карту flash-памяти, и версию bootloader-а. Просто жмём «Next».

В следующем окне нужно выбрать, что мы собственно хотим с нашим контроллером делать.

Тут возможны следующие варианты: Erase (стереть), Download to device (загрузить в контроллер прошивку), Upload from device (считать прошивку с контроллера), Enable/Disable Flash protection (включить/выключить защиту flash-памяти), Edit option bytes (изменить байты опций).

Соответственно, если мы хотим залить прошивку — выбираем Download to device, потом жмём на квадрат с тремя точками и выбираем в проводнике файл с прошивкой, которую надо залить, после чего опять жмём «Next».

На следующей странице внизу появится прогресс-бар, в котором будет показан ход выполнения процедуры загрузки.

После того, как вся прошивка будет загружена в контроллер, этот прогресс-бар станет зелёным и в нём белыми буквами будет написано: «Download operation finished successfully» (операция загрузки успешно завершена). После этого, можно нажать кнопку «Close» и закрыть Flash Loader Demonstrator

Всё, теперь чтобы залитая программа начала выполняться нам останется только настроить контроллер на загрузку из flash (BOOT0 = 0, BOOT1 — любой уровень) и перезагрузить его.

Источник: http://radiohlam.ru/?p=1348

Ссылка на основную публикацию
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}