- •Оглавление
- •Предисловие
- •Почему я написал книгу?
- •Для кого эта книга?
- •Как использовать эту книгу?
- •Как организована книга?
- •Об авторе
- •Ошибки и предложения
- •Поддержка книги
- •Как помочь автору
- •Отказ от авторского права
- •Благодарность за участие
- •Перевод
- •Благодарности
- •I Введение
- •1. Введение в ассортимент микроконтроллеров STM32
- •1.1. Введение в процессоры на базе ARM
- •1.1.1. Cortex и процессоры на базе Cortex-M
- •1.1.1.10. Внедренные функции Cortex-M в ассортименте STM32
- •1.2. Введение в микроконтроллеры STM32
- •1.2.1. Преимущества ассортимента STM32….
- •1.2.2. ….И его недостатки
- •1.3. Краткий обзор подсемейств STM32
- •1.3.1. Серия F0
- •1.3.2. Серия F1
- •1.3.3. Серия F2
- •1.3.4. Серия F3
- •1.3.5. Серия F4
- •1.3.6. Серия F7
- •1.3.7. Серия H7
- •1.3.8. Серия L0
- •1.3.9. Серия L1
- •1.3.10. Серия L4
- •1.3.11. Серия L4+
- •1.3.12. Серия STM32WB
- •1.3.13. Как правильно выбрать для себя микроконтроллер?
- •1.4. Отладочная плата Nucleo
- •2. Установка инструментария
- •2.1. Почему выбирают Eclipse/GCC в качестве инструментария для STM32
- •2.1.1. Два слова о Eclipse…
- •2.2. Windows – Установка инструментария
- •2.2.1. Windows – Установка Eclipse
- •2.2.2. Windows – Установка плагинов Eclipse
- •2.2.3. Windows – Установка GCC ARM Embedded
- •2.2.4. Windows – Установка инструментов сборки
- •2.2.5. Windows – Установка OpenOCD
- •2.2.6. Windows – Установка инструментов ST и драйверов
- •2.3. Linux – Установка инструментария
- •2.3.2. Linux – Установка Java
- •2.3.3. Linux – Установка Eclipse
- •2.3.4. Linux – Установка плагинов Eclipse
- •2.3.5. Linux – Установка GCC ARM Embedded
- •2.3.6. Linux – Установка драйверов Nucleo
- •2.3.7. Linux – Установка OpenOCD
- •2.3.8. Linux – Установка инструментов ST
- •2.4. Mac – Установка инструментария
- •2.4.1. Mac – Установка Eclipse
- •2.4.2. Mac – Установка плагинов Eclipse
- •2.4.3. Mac – Установка GCC ARM Embedded
- •2.4.4. Mac – Установка драйверов Nucleo
- •2.4.5. Mac – Установка OpenOCD
- •2.4.6. Mac – Установка инструментов ST
- •3. Hello, Nucleo!
- •3.1. Прикоснитесь к Eclipse IDE
- •3.2. Создание проекта
- •3.3. Подключение Nucleo к ПК
- •3.5. Изучение сгенерированного кода
- •4. Инструмент STM32CubeMX
- •4.1. Введение в инструмент CubeMX
- •4.1.1. Представление Pinout
- •4.1.2. Представление Clock Configuration
- •4.1.3. Представление Configuration
- •4.1.4. Представление Power Consumption Calculator
- •4.2. Генерация проекта
- •4.2.1. Генерация проекта Си при помощи CubeMX
- •4.2.2. Создание проекта Eclipse
- •4.2.3. Ручное импортирование сгенерированных файлов в проект Eclipse
- •4.3. Изучение сгенерированного кода приложения
- •4.3.1. Добавим что-нибудь полезное в микропрограмму
- •4.4. Загрузка исходного кода примеров книги
- •5. Введение в отладку
- •5.1. Начало работы с OpenOCD
- •5.1.1. Запуск OpenOCD
- •5.1.2. Подключение к OpenOCD Telnet Console
- •5.1.3. Настройка Eclipse
- •5.1.4. Отладка в Eclipse
- •5.2. Полухостинг ARM
- •5.2.1. Включение полухостинга в новом проекте
- •5.2.2. Включение полуохостинга в существующем проекте
- •5.2.3. Недостатки полухостинга
- •5.2.4. Как работает полухостинг
- •II Погружение в HAL
- •6. Управление GPIO
- •6.2. Конфигурация GPIO
- •6.2.1. Режимы работы GPIO
- •6.2.2. Режим альтернативной функции GPIO
- •6.2.3. Понятие скорости GPIO
- •6.3. Управление GPIO
- •6.4. Деинициализация GPIO
- •7. Обработка прерываний
- •7.1. Контроллер NVIC
- •7.1.1. Таблица векторов в STM32
- •7.2. Разрешение прерываний
- •7.2.1. Линии запроса внешних прерываний и контроллер NVIC
- •7.2.2. Разрешение прерываний в CubeMX
- •7.3. Жизненный цикл прерываний
- •7.4. Уровни приоритета прерываний
- •7.4.1. Cortex-M0/0+
- •7.4.2. Cortex-M3/4/7
- •7.4.3. Установка уровня прерываний в CubeMX
- •7.5. Реентерабельность прерываний
- •8. Универсальные асинхронные последовательные средства связи
- •8.1. Введение в UART и USART
- •8.2. Инициализация UART
- •8.3. UART-связь в режиме опроса
- •8.3.1. Установка консоли последовательного порта в Windows
- •8.3.2. Установка консоли последовательного порта в Linux и MacOS X
- •8.4. UART-связь в режиме прерываний
- •8.5. Обработка ошибок
- •8.6. Перенаправление ввода-вывода
- •9. Управление DMA
- •9.1. Введение в DMA
- •9.1.1. Необходимость DMA и роль внутренних шин
- •9.1.2. Контроллер DMA
- •9.2. Модуль HAL_DMA
- •9.2.1. DMA_HandleTypeDef в HAL для F0/F1/F3/L0/L1/L4
- •9.2.2. DMA_HandleTypeDef в HAL для F2/F4/F7
- •9.2.3. DMA_HandleTypeDef в HAL для L0/L4
- •9.2.4. Как выполнять передачи в режиме опроса
- •9.2.5. Как выполнять передачи в режиме прерываний
- •9.2.8. Разнообразные функции модулей HAL_DMA и HAL_DMA_Ex
- •9.3. Использование CubeMX для конфигурации запросов к DMA
- •10. Схема тактирования
- •10.1. Распределение тактового сигнала
- •10.1.1. Обзор схемы тактирования STM32
- •10.1.1.1. Многочастотный внутренний RC-генератор в семействах STM32L
- •10.1.3.1. Подача тактового сигнала от высокочастотного генератора
- •10.1.3.2. Подача тактового сигнала от 32кГц генератора
- •10.2. Обзор модуля HAL_RCC
- •10.2.1. Вычисление тактовой частоты во время выполнения
- •10.2.2. Разрешение Выхода синхронизации
- •10.2.3. Разрешение Системы защиты тактирования
- •10.3. Калибровка HSI-генератора
- •11. Таймеры
- •11.1. Введение в таймеры
- •11.1.1. Категории таймеров в микроконтроллере STM32
- •11.1.2. Доступность таймеров в ассортименте STM32
- •11.2. Базовые таймеры
- •11.2.1. Использование таймеров в режиме прерываний
- •11.2.2. Использование таймеров в режиме опроса
- •11.2.3. Использование таймеров в режиме DMA
- •11.2.4. Остановка таймера
- •11.3. Таймеры общего назначения
- •11.3.1.1. Режим внешнего тактирования 2
- •11.3.1.2. Режим внешнего тактирования 1
- •11.3.2. Режимы синхронизации ведущего/ведомого таймеров
- •11.3.2.1. Разрешение прерываний, относящихся к триггерной цепи
- •11.3.2.2. Использование CubeMX для конфигурации синхронизации ведущего/ведомого устройств
- •11.3.3. Программная генерация связанных с таймером событий
- •11.3.4. Режимы отсчета
- •11.3.5. Режим захвата входного сигнала
- •11.3.5.1. Использование CubeMX для конфигурации режима захвата входного сигнала
- •11.3.6. Режим сравнения выходного сигнала
- •11.3.6.1. Использование CubeMX для конфигурации режима сравнения выходного сигнала
- •11.3.7. Генерация широтно-импульсного сигнала
- •11.3.7.1. Генерация синусоидального сигнала при помощи ШИМ
- •11.3.7.2. Использование CubeMX для конфигурации режима ШИМ
- •11.3.8. Одноимпульсный режим
- •11.3.8.1. Использование CubeMX для конфигурации одноимпульсного режима
- •11.3.9. Режим энкодера
- •11.3.9.1. Использование CubeMX для конфигурации режима энкодера
- •11.3.10.1. Режим датчика Холла
- •11.3.10.2. Комбинированный режим трехфазной ШИМ и другие функции управления двигателем
- •11.3.10.3. Вход сброса таймера и блокировка регистров таймера
- •11.3.10.4. Предварительная загрузка регистра автоперезагрузки
- •11.3.11. Отладка и таймеры
- •11.4. Системный таймер SysTick
- •12. Аналого-цифровое преобразование
- •12.1. Введение в АЦП последовательного приближения
- •12.2. Модуль HAL_ADC
- •12.2.1. Режимы преобразования
- •12.2.1.1. Режим однократного преобразования одного канала
- •12.2.1.2. Режим сканирования с однократным преобразованием
- •12.2.1.3. Режим непрерывного преобразования одного канала
- •12.2.1.4. Режим сканирования с непрерывным преобразованием
- •12.2.1.5. Режим преобразования инжектированных каналов
- •12.2.1.6. Парный режим
- •12.2.2. Выбор канала
- •12.2.3. Разрядность АЦП и скорость преобразования
- •12.2.4. Аналого-цифровые преобразования в режиме опроса
- •12.2.6. Аналого-цифровые преобразования в режиме DMA
- •12.2.6.1. Многократное преобразование одного канала в режиме DMA
- •12.2.6.3. Непрерывные преобразования в режиме DMA
- •12.2.7. Обработка ошибок
- •12.2.8. Преобразования, управляемые таймером
- •12.2.9. Преобразования, управляемые внешними событиями
- •12.2.10. Калибровка АЦП
- •12.3. Использование CubeMX для конфигурации АЦП
- •13.1. Введение в периферийное устройство ЦАП
- •13.2. Модуль HAL_DAC
- •13.2.1. Управление ЦАП вручную
- •13.2.2. Управление ЦАП в режиме DMA с использованием таймера
- •13.2.3. Генерация треугольного сигнала
- •13.2.4. Генерация шумового сигнала
- •14.1. Введение в спецификацию I²C
- •14.1.1. Протокол I²C
- •14.1.1.1. START- и STOP-условия
- •14.1.1.2. Формат байта
- •14.1.1.3. Кадр адреса
- •14.1.1.4. Биты «Подтверждено» (ACK) и «Не подтверждено» (NACK)
- •14.1.1.5. Кадры данных
- •14.1.1.6. Комбинированные транзакции
- •14.1.1.7. Удержание синхросигнала
- •14.1.2. Наличие периферийных устройств I²C в микроконтроллерах STM32
- •14.2. Модуль HAL_I2C
- •14.2.1.1. Операции I/O MEM
- •14.2.1.2. Комбинированные транзакции
- •14.3. Использование CubeMX для конфигурации периферийного устройства I²C
- •15.1. Введение в спецификацию SPI
- •15.1.1. Полярность и фаза тактового сигнала
- •15.1.2. Управление сигналом Slave Select
- •15.1.3. Режим TI периферийного устройства SPI
- •15.1.4. Наличие периферийных устройств SPI в микроконтроллерах STM32
- •15.2. Модуль HAL_SPI
- •15.2.1. Обмен сообщениями с использованием периферийного устройства SPI
- •15.2.2. Максимальная частота передачи, достижимая при использовании CubeHAL
- •15.3. Использование CubeMX для конфигурации периферийного устройства SPI
- •16. Циклический контроль избыточности
- •16.1. Введение в расчет CRC
- •16.1.1. Расчет CRC в микроконтроллерах STM32F1/F2/F4/L1
- •16.2. Модуль HAL_CRC
- •17. Независимый и оконный сторожевые таймеры
- •17.1. Независимый сторожевой таймер
- •17.1.1. Использование CubeHAL для программирования таймера IWDG
- •17.2. Системный оконный сторожевой таймер
- •17.2.1. Использование CubeHAL для программирования таймера WWDG
- •17.3. Отслеживание системного сброса, вызванного сторожевым таймером
- •17.4. Заморозка сторожевых таймеров во время сеанса отладки
- •17.5. Выбор сторожевого таймера, подходящего для вашего приложения
- •18. Часы реального времени
- •18.1. Введение в периферийное устройство RTC
- •18.2. Модуль HAL_RTC
- •18.2.1. Установка и получение текущей даты/времени
- •18.2.1.1. Правильный способ чтения значений даты/времени
- •18.2.2. Конфигурирование будильников
- •18.2.3. Блок периодического пробуждения
- •18.2.5. Калибровка RTC
- •18.2.5.1. Грубая калибровка RTC
- •18.2.5.2. Тонкая калибровка RTC
- •18.2.5.3. Обнаружение опорного тактового сигнала
- •18.3. Использование резервной SRAM
- •III Дополнительные темы
- •19. Управление питанием
- •19.1. Управление питанием в микроконтроллерах на базе Cortex-M
- •19.2. Как микроконтроллеры Cortex-M управляют рабочим и спящим режимами
- •19.2.1. Переход в/выход из спящих режимов
- •19.2.1.1. «Спящий режим по выходу»
- •19.3. Управление питанием в микроконтроллерах STM32F
- •19.3.1. Источники питания
- •19.3.2. Режимы питания
- •19.3.2.1. Рабочий режим
- •19.3.2.2. Спящий режим
- •19.3.2.3. Режим останова
- •19.3.2.4. Режим ожидания
- •19.3.2.5. Пример работы в режимах пониженного энергопотребления
- •19.4. Управление питанием в микроконтроллерах STM32L
- •19.4.1. Источники питания
- •19.4.2. Режимы питания
- •19.4.2.1. Рабочие режимы
- •19.4.2.2. Спящие режимы
- •19.4.2.2.1. Режим пакетного сбора данных
- •19.4.2.3. Режимы останова
- •19.4.2.4. Режимы ожидания
- •19.4.2.5. Режим выключенного состояния
- •19.4.3. Переходы между режимами питания
- •19.4.4. Периферийные устройства с пониженным энергопотреблением
- •19.4.4.1. LPUART
- •19.4.4.2. LPTIM
- •19.5. Инспекторы источников питания
- •19.6. Отладка в режимах пониженного энергопотребления
- •19.7. Использование калькулятора энергопотребления CubeMX
- •20. Организация памяти
- •20.1. Модель организации памяти в STM32
- •20.1.1. Основы процессов компиляции и компоновки
- •20.2.1. Исследование бинарного ELF-файла
- •20.2.2. Инициализация секций .data и .bss
- •20.2.2.1. Пара слов о секции COMMON
- •20.2.3. Секция .rodata
- •20.2.4. Области Стека и Кучи
- •20.2.5. Проверка размера Кучи и Стека на этапе компиляции
- •20.2.6. Различия с файлами скриптов инструментария
- •20.3. Как использовать CCM-память
- •20.3.1. Перемещение таблицы векторов в CCM-память
- •20.4.1. Программирование MPU с использованием CubeHAL
- •21. Управление Flash-памятью
- •21.1. Введение во Flash-память STM32
- •21.2. Модуль HAL_FLASH
- •21.2.1. Разблокировка Flash-памяти
- •21.2.2. Стирание Flash-памяти
- •21.2.3. Программирование Flash-памяти
- •21.3. Байты конфигурации
- •21.3.1. Защита от чтения Flash-памяти
- •21.4. Дополнительные памяти OTP и EEPROM
- •21.5. Задержка чтения Flash-памяти и ускоритель ART™ Accelerator
- •21.5.1. Роль TCM-памятей в микроконтроллерах STM32F7
- •22. Процесс начальной загрузки
- •22.1.1. Программное физическое перераспределение памяти
- •22.1.2. Перемещение таблицы векторов
- •22.1.3. Запуск микропрограммы из SRAM с помощью инструментария GNU MCU Eclipse
- •22.2. Встроенный загрузчик
- •22.2.1. Запуск загрузчика из встроенного программного обеспечения
- •22.2.2. Последовательность начальной загрузки в инструментарии GNU MCU Eclipse
- •22.3. Разработка пользовательского загрузчика
- •22.3.2. Как использовать инструмент flasher.py
- •23. Запуск FreeRTOS
- •23.1. Введение в концепции, лежащие в основе ОСРВ
- •23.2.1. Структура файлов с исходным кодом FreeRTOS
- •23.2.1.2. Как импортировать FreeRTOS с использованием CubeMX и CubeMXImporter
- •23.3. Управление потоками
- •23.3.1. Состояния потоков
- •23.3.2. Приоритеты потоков и алгоритмы планирования
- •23.3.3. Добровольное освобождение от управления
- •23.3.4. Холостой поток idle
- •23.4. Выделение памяти и управление ею
- •23.4.1. Модель динамического выделения памяти
- •23.4.1.1. heap_1.c
- •23.4.1.2. heap_2.c
- •23.4.1.3. heap_3.c
- •23.4.1.4. heap_4.c
- •23.4.1.5. heap_5.c
- •23.4.2. Модель статического выделения памяти
- •23.4.3. Пулы памяти
- •23.4.4. Обнаружение переполнения стека
- •23.5. Примитивы синхронизации
- •23.5.1. Очереди сообщений
- •23.5.2. Cемафоры
- •23.5.3. Сигналы потоков
- •23.6. Управление ресурсами и взаимное исключение
- •23.6.1. Мьютексы
- •23.6.2. Критические секции
- •23.6.3. Обработка прерываний совместно с ОСРВ
- •23.7. Программные таймеры
- •23.7.1. Как FreeRTOS управляет таймерами
- •23.8. Пример из практики: Управление энергосбережением с ОСРВ
- •23.8.1. Перехват холостого потока idle
- •23.8.2. Бестиковый режим во FreeRTOS
- •23.9. Возможности отладки
- •23.9.1. Макрос configASSERT()
- •23.9.2. Статистика среды выполнения и информация о состоянии потоков
- •23.10. Альтернативы FreeRTOS
- •23.10.1. ChibiOS
- •23.10.2. ОС Contiki
- •23.10.3. OpenRTOS
- •24. Продвинутые методы отладки
- •24.1. Введение в исключения отказов Cortex-M
- •24.1.1.1. Как инструментарий GNU MCU Eclipse обрабатывает исключения отказов
- •24.1.1.2. Как интерпретировать содержимое регистра LR при переходе в исключение
- •24.1.2. Исключения отказов и их анализ
- •24.2.1. Представление Expressions
- •24.2.1.1. Мониторы памяти
- •24.2.2. Точки наблюдения
- •24.2.3. Режим Instruction Stepping Mode
- •24.2.4. Keil Packs и представление Peripheral Registers
- •24.2.5. Представление Core Registers
- •24.3. Средства отладки от CubeHAL
- •24.4. Внешние отладчики
- •24.4.1. Использование SEGGER J-Link для отладчика ST-LINK
- •24.4.2. Использование интерфейса ITM и трассировка SWV
- •24.5. STM Studio
- •24.6. Одновременная отладка двух плат Nucleo
- •25. Файловая система FAT
- •25.1. Введение в библиотеку FatFs
- •25.1.1. Использование CubeMX для включения в ваши проекты библиотеки FatFs
- •25.1.2. Наиболее важные структуры и функции FatFs
- •25.1.2.1. Монтирование файловой системы
- •25.1.2.2. Открытие файлов
- •25.1.2.3. Чтение и запись файла
- •25.1.2.4. Создание и открытие каталога
- •25.1.3. Как сконфигурировать библиотеку FatFs
- •26. Разработка IoT-приложений
- •26.2. Ethernet контроллер W5500
- •26.2.1. Как использовать шилд W5500 и модуль ioLibrary_Driver
- •26.2.1.1. Конфигурирование интерфейса SPI
- •26.2.1.2. Настройка буферов сокетов и сетевого интерфейса
- •26.2.2. API-интерфейсы сокетов
- •26.2.2.1. Управление сокетами в режиме TCP
- •26.2.2.2. Управление сокетами в режиме UDP
- •26.2.3. Перенаправление ввода-вывода на сокет TCP/IP
- •26.2.4. Настройка HTTP-сервера
- •26.2.4.1. Веб-осциллограф
- •27. Начало работы над новым проектом
- •27.1. Проектирование оборудования
- •27.1.1. Послойная разводка печатной платы
- •27.1.2. Корпус микроконтроллера
- •27.1.3. Развязка выводов питания
- •27.1.4. Тактирование
- •27.1.5. Фильтрация вывода сброса RESET
- •27.1.6. Отладочный порт
- •27.1.7. Режим начальной загрузки
- •27.1.8. Обратите внимание на совместимость с выводами…
- •27.1.9. …и на выбор подходящей периферии
- •27.1.10. Роль CubeMX на этапе проектирования платы
- •27.1.11. Стратегии разводки платы
- •27.2. Разработка программного обеспечения
- •27.2.1. Генерация бинарного образа для производства
- •Приложение
- •Принудительный сброс микроконтроллера из микропрограммы
- •B. Руководство по поиску и устранению неисправностей
- •Проблемы с установкой GNU MCU Eclipse
- •Проблемы, связанные с Eclipse
- •Eclipse не может найти компилятор
- •Eclipse постоянно прерывается при выполнении каждой инструкции во время сеанса отладки
- •Пошаговая отладка очень медленная
- •Микропрограмма работает только в режиме отладки
- •Проблемы, связанные с STM32
- •Микроконтроллер не загружается корректно
- •Невозможно загрузить микропрограмму или отладить микроконтроллер
- •C. Схема выводов Nucleo
- •Nucleo-F446RE
- •Разъемы, совместимые с Arduino
- •Morpho-разъемы
- •Nucleo-F411RE
- •Разъемы, совместимые с Arduino
- •Morpho-разъемы
- •Nucleo-F410RB
- •Разъемы, совместимые с Arduino
- •Morpho-разъемы
- •Nucleo-F401RE
- •Разъемы, совместимые с Arduino
- •Morpho-разъемы
- •Nucleo-F334R8
- •Разъемы, совместимые с Arduino
- •Morpho-разъемы
- •Nucleo-F303RE
- •Разъемы, совместимые с Arduino
- •Morpho-разъемы
- •Nucleo-F302R8
- •Разъемы, совместимые с Arduino
- •Morpho-разъемы
- •Nucleo-F103RB
- •Разъемы, совместимые с Arduino
- •Morpho-разъемы
- •Nucleo-F091RC
- •Разъемы, совместимые с Arduino
- •Morpho-разъемы
- •Nucleo-F072RB
- •Разъемы, совместимые с Arduino
- •Morpho-разъемы
- •Nucleo-F070RB
- •Разъемы, совместимые с Arduino
- •Morpho-разъемы
- •Nucleo-F030R8
- •Разъемы, совместимые с Arduino
- •Morpho-разъемы
- •Nucleo-L476RG
- •Разъемы, совместимые с Arduino
- •Morpho-разъемы
- •Nucleo-L152RE
- •Разъемы, совместимые с Arduino
- •Morpho-разъемы
- •Nucleo-L073R8
- •Разъемы, совместимые с Arduino
- •Morpho-разъемы
- •Nucleo-L053R8
- •Разъемы, совместимые с Arduino
- •Morpho-разъемы
- •D. Корпусы STM32
- •LFBGA
- •LQFP
- •TFBGA
- •TSSOP
- •UFQFPN
- •UFBGA
- •VFQFP
- •WLCSP
- •E. Изменения книги
- •Выпуск 0.1 – Октябрь 2015
- •Выпуск 0.2 – 28 октября 2015
- •Выпуск 0.2.1 – 31 октября 2015
- •Выпуск 0.2.2 – 1 ноября 2015
- •Выпуск 0.3 – 12 ноября 2015
- •Выпуск 0.4 – 4 декабря 2015
- •Выпуск 0.5 – 19 декабря 2015
- •Выпуск 0.6 – 18 января 2016
- •Выпуск 0.6.1 – 20 января 2016
- •Выпуск 0.6.2 – 30 января 2016
- •Выпуск 0.7 – 8 февраля 2016
- •Выпуск 0.8 – 18 февраля 2016
- •Выпуск 0.8.1 – 23 февраля 2016
- •Выпуск 0.9 – 27 марта 2016
- •Выпуск 0.9.1 – 28 марта 2016
- •Выпуск 0.10 – 26 апреля 2016
- •Выпуск 0.11 – 27 мая 2016
- •Выпуск 0.11.1 – 3 июня 2016
- •Выпуск 0.11.2 – 24 июня 2016
- •Выпуск 0.12 – 4 июля 2016
- •Выпуск 0.13 – 18 июля 2016
- •Выпуск 0.14 – 12 августа 2016
- •Выпуск 0.15 – 13 сентября 2016
- •Выпуск 0.16 – 3 октября 2016
- •Выпуск 0.17 – 24 октября 2016
- •Выпуск 0.18 – 15 ноября 2016
- •Выпуск 0.19 – 29 ноября 2016
- •Выпуск 0.20 – 28 декабря 2016
- •Выпуск 0.21 – 29 января 2017
- •Выпуск 0.22 – 2 мая 2017
- •Выпуск 0.23 – 20 июля 2017
- •Выпуск 0.24 – 11 декабря 2017
- •Выпуск 0.25 – 3 января 2018
- •Выпуск 0.26 – 7 мая 2018
Схема тактирования |
273 |
Рисунок 2: Как частота источника тактового сигнала увеличивается/уменьшается за счет использования блоков PLL и предделителей
10.1.1. Обзор схемы тактирования STM32
Схема тактирования микроконтроллера STM32 может иметь достаточно сложную структуру. Даже в «простейших» микроконтроллерах STM32F0 внутренняя сеть тактирования может иметь до четырех каскадов PLL/предделителей, а мультиплексор системного так-
тового сигнала, англ. System Clock Multiplexer (также известный как переключатель си-
стемного тактового сигнала (System Clock Switch, SW)) может питаться несколькими замещающимися источниками.
Более того, подробное объяснение схемы тактирования каждого семейства STM32 является сложной задачей, которая также требует, чтобы мы сосредоточили наше внимание на конкретном номере устройства по каталогу (P/N). На самом деле на структуру схемы тактирования влияют главным образом следующие ключевые аспекты:
•Основное семейство микроконтроллеров STM32. Например, все микроконтроллеры STM32F0 предоставляют только одну периферийную шину (APB1), которая может тактироваться на той же максимальной частоте ядра Cortex-M. Другие микроконтроллеры STM32 обычно предоставляют две периферийные шины, и только одна из них (APB2) может достигать максимальной тактовой частоты ЦПУ. И напротив, ни одна из периферийных шин, доступных в микроконтроллере STM32F7, не может достичь максимальной частоты ядра8. В таблице 1 приведена максимальная тактовая частота для шин AHB, APB1 и APB2 (с соответствующими тактовыми частотами таймеров) микроконтроллеров, оснащающих все платы Nucleo: вы можете отметить, что для некоторых микроконтроллеров STM32 можно достичь максимальной тактовой частоты только используя внешний HSE-генератор.
•Тип и количество периферийных устройств, предоставляемых микроконтроллером. Сложность схемы тактирования увеличивается с увеличением количества доступных периферийных устройств. Кроме того, некоторые периферийные устройства требуют специальных источников тактового сигнала и частот, влияющих на число каскадов PLL.
•Вид поставки и корпус микроконтроллера, определяющие действующий тип и количество предоставляемых периферийных устройств.
8 За исключением таймеров на шине APB2 (по крайней мере, на момент написания данной главы – февраль 2016 года).
Схема тактирования |
274 |
Таблица 1: Максимальные тактовые частоты шин AHB, APB1 и APB2 микроконтроллеров, оснащающих все платы Nucleo
Даже если ограничиться рассмотрением только шестнадцати микроконтроллеров, оснащающих платы Nucleo, это потребует долгой и утомительной работы, подразумевающей глубокое знание всех периферийных устройств, реализованных интересующим микроконтроллером. По этим причинам мы дадим краткий обзор схемы тактирования STM32, оставляя читателю ответственность за детальное изучение интересующего его микроконтроллера. Более того, как мы увидим через некоторое время, благодаря CubeMX можно абстрагироваться от конкретной реализации схемы тактирования, кроме случаев, когда нам необходимо иметь дело с особыми конфигурациями PLL, оптимальными по производительности и энергопотреблению.
На рисунке 3 показана схема тактирования одного из самых простых микроконтроллеров STM32: STM32F030R8. Она взята из соответствующего справочного руководства9, предоставляемого ST. Для многих новичков в платформе STM32 этот рисунок совершенно не понятен и довольно сложен для понимания, в особенности, если они также плохо знакомы с другими микроконтроллерами встраиваемых систем. Красным цветом обозначен наиболее значимый путь: путь от HSI-генератора к ядру Cortex-M0, шине AHB и DMA. Это тот путь, который мы молча «использовали» до сих пор, не слишком разбираясь с его возможными конфигурациями. Позвольте представить вам наиболее важные элементы данного пути.
9 http://www.st.com/web/en/resource/technical/document/reference_manual/DM00091010.pdf
Схема тактирования |
275 |
Рисунок 3: Схема тактирования микроконтроллера STM32F030R8
Путь начинается от внутреннего генератора на 8 МГц. Как уже было сказано, это RC-генератор, откалиброванный на заводе ST с точностью до 1% при температуре окружающей среды в 25°C. Затем тактовый сигнал HSI-генератора может быть направлен к
переключателю системного тактового сигнала (SW) в том виде, в каком он на выходе ге-
нератора (путь выделен синим цветом на рисунке 3), или его можно направить к блоку умножителя PLL после его деления на 2 промежуточным предделителем10. Блок основного PLL может умножать тактовый сигнал в 4 МГц на значение вплоть до 12 для полу-
чения максимальной системной тактовой частоты (System Clock Frequency, SYSCLK),
равной 48 МГц. Источник тактового сигнала SYSCLK может использоваться для питания периферийного устройства I2C1 (в качестве альтернативы HSI-генератору) и другого промежуточного предделителя – предделителя шины AHB, который может использо-
ваться для понижения высокочастотного тактового сигнала (High (speed) Clock, HCLK), в
свою очередь, подводимого к шине AHB, ядру и системному таймеру.
10 Предделитель (prescaler) – это «электронный счетчик», используемый для понижения высоких частот. В данном случае предделитель «/2» уменьшает основную частоту в 8 МГц до значения 4 МГц.
Схема тактирования |
276 |
Почему так много промежуточных каскадов PLL/предделителей?
Как было сказано выше, тактовая частота определяет общие характеристики, при этом она также влияет на общее энергопотребление микроконтроллера. Возможность выборочно разрешать/запрещать тактирование или уменьшать тактовую частоту некоторых частей микроконтроллера дает возможность снизить энергопотребление в соответствии с необходимой эффективной вычислительной мощностью. Как мы увидим в Главе 19, микроконтроллеры L0/1/4 вводят еще больше каскадов PLL/предделителей, чтобы предоставить разработчикам больший контроль над общим потреблением микроконтроллеров. Вместе с надлежащим проектированием устройства это позволяет создавать устройства с батарейным питанием, которые могут работать на протяжении многих лет, используя одну и ту же батарейку.
Конфигурация схемы тактирования выполняется специальным периферийным устрой-
ством11, называемым Системой сброса и тактирования (Reset and Clock Control, RCC), и
этот процесс в основном состоит из трех этапов:
1.Выбирается источник высокочастотного генератора (HSI или HSE) и конфигурируется должным образом, если используется HSE12.
2.Если мы хотим подать сигнал SYSCLK с частотой, превышающей частоту, обеспечиваемую высокочастотным генератором, нам необходимо сконфигурировать блок основного PLL (который обеспечивает сигнал PLLCLK). В противном случае мы можем пропустить этот шаг.
3.Конфигурируется переключатель системного тактового сигнала (SW) выбором правильного источника тактового сигнала (HSI, HSE или PLLCLK). Затем выбираются правильные настройки предделителей шин AHB, APB1 и APB2 (если доступна) для достижения требуемой частоты высокочастотного сигнала (HCLK – сигнал, который подается на ядро, DMA и шину AHB) и частот продвинутых пе-
риферийных шин APB1 и APB2 (если есть).
Знание допустимых значений для PLL и предделителей может быть кошмаром, особенно для более сложных микроконтроллеров STM32. Только некоторые комбинации действительны для используемого микроконтроллера STM32, и их неправильная конфигурация может потенциально повредить микроконтроллер или, по крайней мере, привести к отказам (неправильная конфигурация тактирования может привести к ненормальному поведению, странным и непредсказуемым сбросам и т. п.). К счастью для нас, инженеры STM32 предоставили отличный инструмент для упрощения конфигурации тактирования: CubeMX.
10.1.1.1. Многочастотный внутренний RC-генератор в семействах STM32L
Источник тактового сигнала и его сеть распределения оказывают значительное влияние на общее энергопотребление микроконтроллера. Если нам нужна частота SYSCLK выше
11Иногда ST определяет в своих документах RCC как «периферийное устройство». Иногда нет. Я не уверен, что ее уместно называть периферийным устройством, однако буду давать такое же определение, как это делает ST. Иногда.
12В микроконтроллерах STM32L0/1/4 сигнал SYSCLK может также питаться от другого отделенного источника тактового сигнала с пониженным энергопотреблением, называемого MSI. Мы поговорим об этом источнике тактового сигнала дальше.
Схема тактирования |
277 |
или ниже внутреннего источника тактового сигнала HSI (который составляет 8 МГц для большинства микроконтроллеров STM32 и 16 МГц для некоторых других), мы должны увеличить/уменьшить ее, используя мультиплексор источников для блока PLL (PLL Source Mux) и промежуточные предделители. К сожалению, эти компоненты потребляют энергию, и это может оказать существенное влияние на устройства с батарейным питанием.
Таблица 2: Сравнение источников тактового сигнала в микроконтроллере STM32L476
Микроконтроллеры STM32L0/1/4 специально спроектированы для приложений с пониженным энергопотреблением, и они решают именно эту проблему, предоставляя специальный внутренний источник тактового сигнала, называемый внутренний многочастотный (MultiSpeed Internal, MSI) RC-генератор. MSI-генератор представляет собой RCгенератор с пониженным энергопотреблением, с предварительно откалиброванной на заводе точностью в ±1% при 25°C, которая может возрасти до ±3% в диапазоне температур 0-85°C. Основной характеристикой MSI-генератора является то, что он обеспечивает до 12 различных частот без добавления каких-либо внешних компонентов. Например, MSI-генератор в STM32F476 обеспечивает внутренний источник тактового сигнала в диапазоне от 100 кГц до 48 МГц. Тактовый сигнал MSI-генератора используется в качестве SYSCLK после перезагрузки от сброса, пробуждения из режимов пониженного энергопотребления Ожидания (Standby) и Выключенного состояния (Shutdown). После перезагрузки от сброса частота MSI-генератора устанавливается на значение по умолчанию (например, частота MSI-генератора по умолчанию в STM32F476 составляет 4 МГц). В таблице 2 приведены наиболее важные характеристики всех возможных источников тактового сигнала в микроконтроллере STM32L476. Как видите, наилучшее энергопотребление достигается при тактировании микроконтроллера MSI-генератором (без использования мультиплексора источников для блока PLL). Кроме того, данный источник тактового сигнала гарантирует самое короткое время запуска по сравнению с HSIгенератором. Интересно проследить, что для стабилизации тактовой частоты LSEгенератора требуется до двух секунд: если скорость запуска действительно важна для вашего приложения, то стоит рассмотреть вариант использования отдельного потока для запуска LSE-генератора.
В дополнение к преимуществам, связанным с пониженным энергопотреблением, при использовании MSI-генератора в качестве источника для мультиплексора источников для блока PLL вместе с LSE-генератором, он обеспечивает очень точный источник тактового сигнала, который может использоваться устройством USB OTG FS без
Схема тактирования |
278 |
использования внешнего выделенного кварцевого генератора, в то же время питая блок основного PLL для работы системы на максимальной частоте в 80 МГц.
10.1.2.Конфигурирование схемы тактирования с помощью
CubeMX
В Главе 4 мы уже встречались с представлением CubeMX Clock Configuration. Теперь самое время посмотреть, как оно работает. На рисунке 4 показана схема тактирования того же микроконтроллера F0, который мы рассматривали до сих пор. Как видите, благодаря большему количеству места на экране, сеть распределения выглядит менее громоздкой.
Рисунок 4: Как схема тактирования микроконтроллера STM32F030R8 представлена в CubeMX
Даже в этом случае наиболее важные пути схемы тактирования выделены красным и синим цветом. Это должно упростить сравнение с рисунком 3. При создании нового проекта CubeMX по умолчанию выбирает HSI-генератор в качестве источника тактового сигнала по умолчанию. HSI-генератор также выбран в качестве источника тактового сиг-
нала по умолчанию для переключателя системного тактового сигнала System Clock Mux
(путь показан синим цветом), как показано на рисунке 4. Это означает, что для рассматриваемого здесь микроконтроллера частота ядра Cortex-M будет равна 8 МГц.
CubeMX также сообщает нам о двух вещах: максимальные частоты для высокочастотного тактового сигнала (HCLK) и шины APB1 в этом микроконтроллере равны 48 МГц (метки синего цвета). Чтобы увеличить частоту ядра ЦПУ, сначала нужно выбрать PLLCLK в качестве источника тактового сигнала для переключателя системного тактового сигнала, а затем выбрать правильный коэффициент умножения PLL. Однако CubeMX предлагает быстрый способ сделать это: вы можете просто написать «48»
Схема тактирования |
279 |
внутри поля HCLK и нажать клавишу Enter. CubeMX автоматически упорядочит настройки, выбрав правильный путь схемы тактирования (красный на рисунке 4).
Если ваша плата использует внешний кварцевый HSE/LSE-генератор, вы должны разрешить его в периферийном устройстве RCC, прежде чем использовать его в качестве основного источника тактового сигнала для соответствующего генератора (мы пошагово рассмотрим, как сделать это). После разрешения внешнего генератора можно указать его частоту (внутри синего поля задания входной частоты с меткой «Input frequency») и сконфигурировать блок основного PLL для достижения желаемого тактового сигнала SYSCLK (см. рисунок 5). С другой стороны, входная частота внешнего генератора может использоваться непосредственно в качестве источника тактового сигнала для переключа-
теля системного тактового сигнала System Clock Mux.
Рисунок 5: CubeMX позволяет выбрать HSE-генератор после его разрешения, воспользовавшись периферийным устройством RCC
Нам необходимо соответствующим образом сконфигурировать периферийное устройство RCC, чтобы разрешить внешний источник тактового сигнала. Это можно сделать в представлении Pinout в CubeMX, как показано на рисунке 6.
Рисунок 6: Варианты конфигурации, предоставляемые периферийным устройством RCC
И для HSE-генераторов, и для LSE-генераторов, CubeMX предлагает три варианта конфигурации:
•Запрещен (Disable): внешний генератор недоступен/не используется, и используется соответствующий внутренний генератор.
•Кварцевый/керамический резонатор (Crystal/Ceramic Resonator): использу-
ется внешний кварцевый/керамический резонатор, от которого выводится соответствующая основная частота. Подразумевается, что выводы RCC_OSC_IN и RCC_OSC_OUT используются для подключения HSE-генератора, и соответствующие сигнальные I/O недоступны для других применений (если мы используем внешний низкочастотный кварцевый генератор, то соответствующие I/O RCC_OSC32_IN и RCC_OSC32_OUT также не могут использоваться для других целей).