Курс "Программирование микроконтроллеров Stm32. Базовый курс"
5790
151
0
151

Курс "Программирование микроконтроллеров Stm32. Базовый курс"

  • Цена:
    5790

    ПОДРОБНОЕ ОПИСАНИЕ

    Автор: Максим Селиванов

    Курс посвящен изучению основ программирования микроконтроллеров stm32 от компании ST Microelectronics, а так же основам программирования ядра Cortex от компании ARM.

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

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

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

    • Урок №1. Введение в курс

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

    • Урок №2. Микроконтроллеры STM32 от ST

    История компании ST Microelectronics. Место компании в современном мире. Достижения компании в сфере электронных компонентов и технологий. Обзор продукции от компании. История появления микроконтроллеров stm32. Развитие семейств stm32. Отладочные платы для микроконтроллеров. 

    • Урок №3. Преимущества микроконтроллеров STM32

    Наглядный пример преимущества производительности 32-разрядного ядра по сравнению с ядрами с меньшей разрядностью. Набор специальных команд ядра Cortex. Преимущества в объемах Flash- и RAM-памяти. Высокая тактовая частота работы и возможность запуска RTOS. Наличие большого количество разнообразной периферии. Преимущества и недостатки, а так же области применения 8 и 32 разрядных микроконтроллеров. 

    • Урок №4. История компании ARM

    История создания компании. Разработка собственного процессора и компьютера. Процессоры CISC и RISK, преимущества и недостатки. Развитие архитектуры ARM. Причины низкой популярности персональных компьютеров на базе ARM. Области применения процессоров ARM. Бизнес модель по продаже интеллектуальной собственности в виде микропроцессорных ядер. Разработки компании ARM. 

    • Урок №5. Обзор семейства ядер Cortex

    Разделение ядер на 3 подсемейства Cortex-A, Cortex-R, Cortex-M. Основные сферы применения ядер. Хронология разработки ядер. Причины популярности использования Cortex-M в микроконтроллерах. Развитие семейства ядер Cortex-M. Линейка ядер М0, М0+, М3, М4, М7.

    • Урок №6. Преимущество ядер от ARM

    Причины, по которым компании предпочитают использовать в микроконтроллерах технологию ядер от ARM. Демонстрация сложности ядер микроконтроллеров. Схема 4-битного АЛУ. Внутренняя структура процессора. Понятие ядра и внутренней периферии микроконтроллера. Требования к ядру микроконтроллера. Причины, по которым в микроконтроллерах используются ядра Cortex-M.

    • Урок №7. Обзор микроконтроллеров STM32

    Семейства и линейки микроконтроллеров stm32. Причины разделения на семейства ядер. Семейства с низким потреблением, базовыми характеристиками и высокой производительностью. Обзор программы MCU Finder. Параметры поиска микроконтроллеров. Хронология появления семейств микроконтроллеров stm32. Карта поддерживаемых команд ядер Cortex-M. Основные характеристики микроконтроллеров из базовых семейств (STM32F0, STM32F1, STM32F3), мало потребляющих семейств (STM32L0, STM32L1, STM32L4) , высокопроизводительных семейств (STM32F2, STM32F4, STM32F7, STM32H7). Преимущества и недостатки STM32F103C8T6. Отладочная плата под микроконтроллер. 

    • Урок №8. Обзор отладочной платы

    Отладочная плата на базе stm32f103c8t6. Принципиальная схема и распиновка платы. Компоненты отладочной платы. Система питания, тактирования и программирования платы. Тип линейного стабилизатора платы с низким падением напряжения RT9193, XC6204, XC6205. Максимальные нагрузочные токи платы. Подача и снятие питания с платы. Интерфейс SWD. Режимы загрузки. Линии для управления загрузки. Выводы,  допускающие подачу 5В. Нагрузочные способности выводов. 

    • Урок №9. Клоны и подделки STM32

    Микроконтроллеры с обозначениями CH32, CS32, CKS32, GD32. Примеры где продаются аналоги микроконтроллеров. Методы позволяющие определить поддельные МК. Маркировки клонов. Проблемы с программированием не оригинальных микроконтроллеров. Обзор поставщиков микроконтроллеров. Внешние признаки поддельных микроконтроллеров. 

    • Урок №10. Обзор других отладочных плат

    Обзор разных отладочных плат на stm32. Отличия в распиновке и схемотехнике плат. Преимущества и недостатки отладочных плат.

    • Урок №11. Обзор программаторов STM32

    Виды программаторов. Программаторы на  отладочных платы. Разные версии st-link. Форм факторы программатора st-link v.2 Фирменные программаторы от ST. Распиновка разъемов программаторов. Интерфейс JTAG и SWD. Отличия интерфейсов, основные преимущества и недостатки. Отличия в программаторах разной ценовой категории. Подключение программатора к микроконтроллеру. Важное правило при использовании питания от программатора. Версия программатора st-link v.2.1. Виртуальный СОМ-порт и виртуальный диск. Переделка программатора v2 в версию v2.1. Расширенные функции версии программатора v.3. Обзор программаторов на aliexpress. Рекомендации перед покупкой. Программатор J-Link от Segger. 

    • Урок №12. Прошивка STM32 через UART

    Таблица загрузки STM32. Расположение и назначение выводов BOOT0 и BOOT1. Понятие встроенного загрузчика. Адресное пространство микроконтроллера. Расположение flash памяти и системной памяти. Механизм переключения на загрузку из разных областей памяти. Преобразователи USB-UART для перепрошивки. Подключение преобразователя к микроконтроллеру. Выбор скорости обмена данными. Программа Flash Loader Demonstrator. Установка и снятие защиты памяти программ.  

    • Урок №13. Прошивка через ST-Link

    Подключение программатора и установка драйверов. Программа st-link utility. Обновление прошивки программатора при помощи встроенной программы обновления. Работа с программаторами с устаревшей прошивкой. Пример обновления прошивки. Разбор частых ошибок при программировании через программатор. Основные параметры программируемого микроконтроллера. Пример программирования тестовых прошивок. 

    • Урок №14. Программирование с отключенным SWD

    Причины, по которым может быть отключен интерфейс программирования SWD. Управление интерфейсом SWD через конфигуратор. Настройка соединения через st-link utility. Тестовые прошивки с активным и неактивным интерфейсом SWD. Использование программаторов с выводом сброса для прошивки.

    • Урок №15. Прошивка и отладка аналогов STM32

    Обзор подделок и аналогов stm32 на aliexpress. Влияние частоты и кабеля на связь программатора с микроконтроллером. Ошибка неверного идентификатора микроконтроллера. Редактирование файла конфигурации для устранения ошибки неверного идентификатора. Причины и возможные решения ситуации когда микроконтроллер не переходит в режим загрузки из системной памяти.

    • Урок №16. Обзор сред программирования

    Популярные средв программирования и отладки STM32. Среды программирования Keil и IAR, преимущества и недостатки. Понятие компилятора и интегрированной среды разработки. Компилятор GCC, Keil и IAR. Среда разработки CooCox. Понятие платформы Eclipse. Среды разработки System WorkBench, Atolic True Studio. Среда разработки CubeIDE. Преимущества и недостатки CubeIDE. Другие среды разработки STM32. 

    • Урок №17. Установка и настройка CubeIDE

    Требования к компьютеру для среды CubeIDE. Основные  ошибки при установке среды. Путь установки workspace. Краткий обзор среды. Первый запуск среды. Основные настройки, которые нужно сделать сразу после установки. 

    • Урок №18. Изменение темы оформления CubeIDE

    Настройка внешнего вида среды. Установка и настройка новой темы. Настройка текстового редактора.

    • Урок №19. Кодировка символов в CubeIDE

    Причины нечитаемного текста на русском языке. Принцип кодирования символов в таблице UTF-8. Пример кодировки текста в кодировочной таблице UTF-8. Кодировочная таблица Windows-1251. Пример некорректного вывода надписей при проблемах с кодировкой текста. Исправление кодировки программы, если не настроена кодировка проекта. 

    • Урок №20. Обзор документации (Часть №1)

    Основные документы для микроконтроллера. Расположение папки репозитория. Коды документации. Особенности документации на stm32. Обзор Datasheet. Краткие характеристики микроконтроллеров. Некоторые особенности в маркировке микроконтроллеров. Информация по внутреннему строению, распиновке выводов. Типы выводов, основные и альтернативные функции выводов, ремап выводов. Предельные параметры микроконтроллера. Токи потребления при разных режимах работы. Характеристики портов ввода-вывода. Логические уровни напряжения для разных выводов. Внутренние подтягивающие резисторы. Вывод RESET.

    • Урок №21. Обзор документации (Часть №2)

    Обзор Reference Manual. Особенности описания периферии. Обзор разделов документации. Память и архитектура шины, питание микроконтроллера, выводы для питания, монитор питания, бэкап регистры. Регистр в котором хранится указание на размер flash-памяти. Отладочные интерфейсы. Обзор документов из раздела Programming Manual. Обзор Errata Sheet.  Ошибки ядра и периферии. Аппаратные и программные ошибки. Раздел Application Mode. Подключение линий питания микроконтроллера. Разбор типовой схемы подключения микроконтроллеров stm32. Обзор варинатов загрузки микроконтроллера. 

    • Урок №22. Категории density линеек stm32

    Разделение stm32 на low-, medium-, high-, XL- density devices. Разделение документации в зависимости от категорий. 

    • Урок №23. Обзор документа HAL UM1850

    Ревизии документа. Причины появления разных ревизий. Отличия между ревизиями документов. Описание библиотек HAL и LL. Функции из библиотеки HAL. Разбор функции задержки и функции управление выводами порта. Разбор описания функций.

    • Урок №24. Создание первого проекта (Часть №1)

    Этапы создания проекта. Разбор базовых возможностей среды CubeIDE. Вкладка выбора микроконтроллера. Вкладка выбора отладочной платы. Пример работы с функцией замены микроконтроллера. Функции выбора микроконтроллера по ядру, серии, линейки, корпусу, объемам памяти и набору периферии. Краткие характеристики из таблицы параметров. Выбор имени и папки до проекта и тип проекта.

    • Урок №25. Создание первого проекта (Часть №2)

    Разбор встроенного конфигуратора в среде CubeIDE. Разбор вкладок конфигуратора. Настройка выводов на вход/выход. Горячие клавиши конфигуратора. Поиск выводов. Сброс конфигурации. Категории периферии. Настройка выводов на режимы работы периферии. Перенос функций периферии на другие выводы. Функция закрепления выводов. Ограничения режимов периферии. Система тактирования микроконтроллера. Работа от внутреннего генератора и внешнего кварцевого резонатора. Низкочастотный и высокочастотный кварцевые резонаторы. Включение отладочного интерфейса. Запуск генерации кода. Краткий обзор кода.

    • Урок №26. Создание первого проекта (Часть №3)

    Работа с файлами проекта. Настройка отображения окон с кодом проекта. Управление окнами проекта. Понятие перспективы в среде CubeIDE. Настройка перспективы проекта. Добавление перспективы отладки проекта. Настройка перспективы для написания программы. Обзор файлов входящих в состав проекта. Открытие, закрытие, удаление и импорт проекта. Открытие нескольких проектов. Определение местоположения файлов проекта и переход к файлам. Состав проекта. Файл линкера. Файл сатртапа на ассемблере. Комментарии в файле main и их назначение. Заголовки комментариев. Переход к месту определения функции. Краткий обзор основных функций созданных при генерации проекта. Компиляция проекта. Обзор окна затрачиваемых ресурсов окна Build Analyser. Процесс компиляции и перепрошивки микроконтроллера. Функции управления выводами и функции задержки.

    • Урок №27. Создание первого проекта (Часть №4)

    Основные ошибки, которые могут возникнуть на этапе создания, конфигурирования и компиляции. Предлагаемые варианты исправления ошибок. Автодополнение кода. Функция переключения вывода в противоположение состояние. Настройка вкладки Debugger. Программирование через программатор с устаревшей прошивкой. Обновление прошивки программатора через CubeIDE. Автоматизация функции перепрошивки программы. Обзор горячих клавиш на различные действия в среде CubeIDE. Конфигурация построения проекта. Отличия конфигурации Release от Debug. Уровни оптимизации компилятора и дебаггера. Изучения информации из консоли. Разбор заполнения секции памяти. Включение генерации файлов прошивки в разных форматах. Расположение файлов прошивки в папках проекта.

    • Урок №28. Настройка тактирования. Теория

    Программная задержка через пустой цикл декремента переменной. Встроенные RC генераторы в микроконтроллерах. Линии прохождения сигнала тактирования. Коммутаторы тактовых сигналов. Делители частоты с изменяемым и неизменным коэффициентами. Модуль умножения частоты PLL и принцип его работы. Описание модулей и регистров для настройки системы тактирования. Подключение высокочастотного кварцевого резонатора для тактирования. Подключение низкочастотного резонатора для часов реального времени. Частота SYSCLK и HCLK. Частота такирования ядра, памяти и других элементов. Понятие шин обмена данными. Тактирование шин AHB, APB1, APB2. Предельные частоты тактирования модулей. Разгон микроконтроллера по частоте. Тактирование микроконтроллера от внешнего сигнала тактирования. Кварцевый резонатор и кварцевый генератор. 

    • Урок №29. Настройка тактирования. Практика

    Настройка системы тактирования на практике. Программная задержка в виде пустого цикла. Настройка системы тактирования на увеличение и уменьшение тактовой частоты. Превышение частоты тактирования модулей микроконтроллера. Автоматическая и ручная настройка системной  частоты. Сброс системы тактирования. 

    • Урок №30. Настройка тактирования. CSS модуль

    Модуль защиты от сбоя в работе системы тактирования. Преимущества и недостатки внутреннего RC-генератора. Причины и последствия отказа кварцевого резонатора. Работа модуля PLL при отказе кварцевого резонатора. Пример зависания микроконтроллера при тактировании частотой напрямую от кварцевого резонатора.

    • Урок №31. Настройка тактирования. Вывод частоты MCO

    Вывод тактовой частоты на выход MCO. Настройка на тактирование от внешнего источника тактового сигнала.  

    • Урок №32. Обзор библиотек HAL, LL, SPL, CMSIS

    Обзор библиотек CMSIS, SPL, HAL, LL и LibOpenCm3. Преимущества и недостатки каждой из библиотек. Стандартная и вендор-зависимая часть библиотеки CMSIS. Функции-обертки CMSIS. Стандартная библиотека периферии SPL. Пример фрагмента кода с использованием SPL. Причины отказа от поддержки и развития библиотеки SPL. Преимущества и недостатки библиотеки HAL. Отличия библиотеки HAL от SPL и CMSIS. Причины широкого распространения библиотеки HAL. Низкоуровневая библиотека LL. Причины создания библиотеки LL. Отличия от CMSIS и HAL. Преимущества и недостатки. Фрагмент кода с использованием библиотеки LL. 

    • Урок №33. Порты ввода-вывода. Работа на выход

    Обозначение портов ввода-вывода. Разрядность портов. 8 режимов работы выводов портов. Конфигурация выводов по умолчанию. Понятие альтернативных функций выводов портов. Максимальный втекающий и вытекающий ток вывода порта. Уровни логического нуля и логической единицы. Максимальный ток по линиям питания VСС и GND. Использование режима Open Drain. Формирование на выходе сигнала с напряжением выше, чем напряжение питания. Понятие скорости изменения сигнала на выходе. Влияние скорости изменения сигнала на характеристики устройства на микроконтроллере. Регистры для настройки выводов порта. 

    • Урок №34. Порты ввода-вывода. Работа на вход

    Режимы работы вывода на вход. Плавающий вход, вход с подтягивающим и стягивающим резисторами, аналоговый вход. Особенности работы вывода в режиме плавающего входа. Параметры встроенных подтягивающего и стягивающего резисторов. Токи утечки и емкости выводов. Понятие триггера Шмитта и его применение в составе вывода. Применение режима аналогового входа. Уровни логических сигналов. Ограничения напряжений сигналов для выводов разных типов. Логические уровни сигналов для вывода RESET. Понятие и предназначение встроенных защитных диодов. Инжектированные токи выводов. Использование защитных диодов в схемах согласования сигналов. Причины и последствия протекания токов через внутренние защитные диоды. Характеристики и схемотехника FT-выводов микроконтроллера. Максимальное напряжение, которое допустимо подавать на FT-вывод. Регистры для настройки выводов. Особенности регистра для считывания состояний с выводов.

    • Урок №35. Библиотека HAL (Часть №1)

    Пример использования библиотеки HAL для простого проекта. Создание проекта. Настройка выводов во встроенном конфигураторе. Группировка выводов по периферии. Уровень вывода по умолчанию. Настройки Project Manager. Имя проекта, расположение проекта, настройка размера стека и кучи. Версия прошивки конфигуратора. Настройка выбора библиотеки.  Работа с интерфейсом конфигуратора. Переключение из перспективы конфигуратора в перспективу написания кода. 

    • Урок №36. Библиотека HAL (Часть №2)

    Обзор файлов и папок входящих в состав проекта. Файлы проекта, файлы библиотеки и файлы описаний. Защитные комментарии в проекте. Инициализация библиотеки HAL. Системный таймер для работы функции задержки в библиотеке HAL. Функция для конфигурирования системы тактирования микроконтроллера. Функция для настройки выводов портов. Структура настроек для конфигурации выводов. Константы для заполнения настроек выводов. Настройка выводов в ручном режиме с заполнением структуры. Тактирование модулей портов ввода-вывода. Функция задания уровня на выводе порта. Выбор аргументов функции для настройки вывода. Прошивка проекта в микроконтроллер. 

    • Урок №37. Библиотека HAL (Часть №3)

    Функция переключения вывода. Функция считывания состояния вывода. Возвращаемые значения из функции. Пользовательские метки вывода микроконтроллера. Преимущество использования меток при программировании. Подробный разбор функции инициализации библиотеки HAL. Настройки предвыборки FLASH памяти. Настройка системного таймера на период 1 мс. Функция настройки интерфейса программирования. Конфигурация системы тактирования. Конфигурация выводов портов в ручном режиме. Работа вывода в режиме открытого стока на примере мигания светодиода.

    • Урок №38. Библиотека LL (Часть №1)

    Использование функций библиотеки LL для создания проекта. Отличие функций библиотеки LL от функций библиотеки HAL. Разбор состава проекта использующего библиотеку LL. Разбор функций и структур библиотеки LL. Использование библиотеки HAL и LL в одном проекте. Особенности функций библиотеки LL. Разбор функций сгенерированных в проекте. Разделение кода для управления периферией по отдельным файлам. Размещение пользовательских функций в файлах периферии.

    • Урок №39. Библиотека LL (Часть №2)

    Обзор документации с описанием библиотеки LL. Разбор функций и параметров передаваемых в функции. Функции установки и сброса выводов. Ошибки при программировании через программатор из среды CubeIDE. Назначение меток для выводов портов. Размещение пользовательских функций в файлах для работы с периферией. Создание констант управления через оператор enum. Подключение прототипа функций через заголовочный файл. 

    • Урок №40. Библиотека LL (Часть №3)

    Функция оценки состояния вывода из библиотеки LL. Передаваемые и принимаемые значения. Расположение пользовательских определений меток. Разбор работы функций библиотеки LL. Макросы для работы с регистрами. Развертывание функций из библиотеки LL. Понятие встраиваемой статической функции. Использование спецификатора static. Ошибки на стадии линковки программы. Регистр обеспечивающий атомарную операцию управления выводами. Принцип работы функции задержки из библиотеки LL. Одновременное управление несколькими выводами при помощи функций LL.

    • Урок №41. Сравнение библиотек HAL и LL

    Сравнение затрачиваемых ресурсов при использовании библиотек HAL и LL. Секции .text, .data, .bss. Понятие стека и кучи. Настройка размера стековой памяти и кучи. Динамическое выделение памяти. Информация по распределению памяти между функциями. Распределение памяти по секциям памяти. Объяснение результатов по объемам памяти для проекта с LL и HAL.

    • Урок №42. Библиотека CMSIS (Часть №1)

    Создание проекта без использования встроенного конфигуратора. Обзор кода генерируемого по умолчанию. Очистка проекта от дополнительного кода. Регистры тактирования периферии. Шины AHB, APB1, APB2 в составе микроконтроллера. Распределение периферии по шинам. Разряды из регистра тактирования портов. Доступ к полям структуры через указатель. Использование информации из Reference Manual для обращения к регистрам периферии. Регистры для записи/чтения, только для чтения и только для записи. Регистры для настройки портов ввода-вывода. Значения по-умолчанию в регистрах. Программная задержка в виде пустого цикла. 

    • Урок №43. Библиотека CMSIS (Часть №2)

    Дополнение программы определениями разрядов. Пример поиска подходящего определения в файле описания для разрядов регистра. Корректная настройка разрядов регистров. Функция программной задержки.

    • Урок №44. Библиотека CMSIS (Часть №3)

    Использование регистров для считывания состояния выводов. Настройка выводов в различные режимы работы. Усложнение работы программы. Удаление и восстановление лишних файлов из программы. Подключение файла библиотеки CMSIS. Изменение настроек проекта для подключения библиотечный файлов. Зависимость настроек проекта от выбранной конфигурации. Очистка проекта от предупреждений на несуществующие файлы.

    • Урок №45. Карта памяти (Часть №1)

    Обзор карты памяти микроконтроллера. Адресное пространство ядер Cortex-M. Сегменты адресного пространства. Адреса расположения загрузчика, программной и оперативной памяти, регистров периферии. Расположение байт опций. Расположение в памяти регистров для работы с регистрами ядра микроконтроллера. Отражение адресов памяти в зависимости от режима загрузки микроконтроллера. Механизм перехода к различным областям памяти в зависимости от выбранного режима загрузки.

    • Урок №46. Карта памяти (Часть №2)

    Обзор памяти микроконтроллера через stm32CubeProgrammer. Элементы навигации и отображения памяти в программе программатора. Форматы отображения памяти. Считывание памяти за пределами объема Flash-памяти. Считывание зарезервированной памяти. Изменение программной памяти в ручном режиме. Считывание оперативной памяти. Обзор места расположения глобальных и статических переменных и стековой памяти. Обзор памяти для работы с регистрами периферии. Определение адресов расположения регистров периферии. Базовый адрес периферии и адреса смещения. Считывание адресов расположения регистров ядра Cortex-M. 

    • Урок №47. Карта памяти (Часть №3)

    Обзор сегмента памяти в котором расположены Flash память, системный загрузчик и байты опций. Байты опций. Изменение байт опций в ручном режиме и в автоматическом режиме при помощи специального меню. Байты защиты памяти программ от считывания. Пользовательские байты. Байты защиты отдельных секторов flash-памяти. Регистр показывающий размер flash-паямти. ID-номер микроконтроллера. Код семейства микроконтроллера. Демонстрация на практике механизма выбора источника загрузки. Механизм начала выполнения программы. Инициализация стека, адрес перехода на начало программы. Влияние адреса на режим работы ядра Cortex. Механизм перехода к выполнению программы из оперативной памяти.

    • Урок №48. Программирование с адресами

    Обращение к регистрам через указатели языка Си. Очистка проекта от лишних файлов. Удаление подключений файлов из настроек проекта. Доступ к регистру через базовый адрес и смещение регистра. Адрес смещения для разных регистров периферии. Программа без использования библиотеки CMSIS.

    • Урок №49. Использование среды Proteus

    Подходящая версия Proteus для симуляции работы stm32. Модель платы BluePill для симуляции в протеусе. Отличия между STM32F103C8T6 и STM32F103C6T6. Создание схемы для симуляции. Выбор прошивки для симуляции микроконтроллера. Ошибки отсутствия питания по линиям VDDA и VSSA. Настройка тактирования на внешний кварцевый резонатор. Причины медленной симуляции проекта в протеусе. Добавление модели платы BluePill в протеус. Недостатки среды Proteus для симуляции stm32.

    • Урок №50. Проект кодовый замок

    Реализация матричной клавиатуры. Принцип работы и алгоритм опроса матричной клавиатуры для stm32. Создение  проекта в протеусе. Настройка микроконтроллера в конфигураторе проекта. Подготовка проекта к написанию кода. 

ПОХОЖИЕ ТОВАРЫ

© ИнфоКурс 2012 - 2024