- •Оглавление
- •Предисловие
- •Почему я написал книгу?
- •Для кого эта книга?
- •Как использовать эту книгу?
- •Как организована книга?
- •Об авторе
- •Ошибки и предложения
- •Поддержка книги
- •Как помочь автору
- •Отказ от авторского права
- •Благодарность за участие
- •Перевод
- •Благодарности
- •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
Схема тактирования |
282 |
Требуется следующая конфигурация:
−Паяемые мосты SB48 и SB49 ВКЛ
−Резисторы R34 и R36 удалены
•LSE-генератор не используется: PC14 и PC15 используются в качестве GPIO вместо источника низкочастотного тактового сигнала.
Требуется следующая конфигурация:
−Паяемые мосты SB48 и SB49 ВКЛ
−Резисторы R34 и R36 удалены
Взависимости от версии аппаратного обеспечения платы NUCLEO возможны две конфигурации по умолчанию для выводов LSE-генератора. Версия платы MB1136 C-01/02/03 указана на наклейке, размещенной на нижней стороне печатной платы.
•Маркировка платы MB1136 C-01 соответствует плате, сконфигурированной так, что LSE-генератор не используется.
•Плата с маркировкой MB1136 C-02 (или выше) соответствует плате, оснащенной встроенным 32 кГц генератором.
•Плата с маркировкой MB1136 C-03 (или выше) соответствует плате с новым кварцевым LSE-генератором (ABS25) и обновленными значениями C26, C31 и C32.
Прочитайте внимательно
Все платы Nucleo с версией выпуска MB1136 C-02, имеют серьезную проблему со значениями демпфирующих резисторов R34, R36 и с конденсаторами C26, C31 и C32. Эта проблема не позволяет LSE-генератору запускаться правильно.
10.2. Обзор модуля HAL_RCC
До сих пор мы видели, что периферийное устройство Система сброса и тактирования (Reset and Clock Control, RCC) отвечает за конфигурацию всей схемы тактирования микроконтроллера STM32. Модуль HAL_RCC содержит соответствующие дескрипторы и процедуры CubeHAL для абстрагирования от конкретной реализации RCC. Однако фактическая реализация данного модуля неизбежно отражает особенности схемы тактирования в используемой серии STM32 и номере по каталогу. Погружение в этот модуль, как мы это делали для других модулей HAL, выходит за рамки данной книги. Оно потребовало бы, чтобы мы прослеживали слишком много различий между несколькими микроконтроллерами STM32. Итак, сейчас мы сделаем краткий обзор основных функций RCC и шагов, которые необходимо выполнить при конфигурации схемы тактирования.
Наиболее подходящими структурами Си для конфигурации схемы тактирования являются RCC_OscInitTypeDef и RCC_ClkInitTypeDef. Первая используется для конфигурации источников RCC для внутреннего/внешнего генератора (HSE, HSI, LSE, LSI), а также некоторых дополнительных источников тактового сигнала, если они предоставляются микроконтроллером. Например, некоторые микроконтроллеры STM32 серии F0 (STM32F07x, STM32F0x2 и STM32F09x) обеспечивают поддержку USB 2.0 в дополнение к внутреннему отдельному и откалиброванному на заводе высокочастотному генератору, работающему на частоте 48 МГц, для питания периферийного устройства USB. В таком случае, структура RCC_OscInitTypeDef также используется для конфигурации этих дополнительных источников тактового сигнала. Структура также имеет
Схема тактирования |
283 |
поле, которое является экземпляром структуры RCC_PLLInitTypeDef, конфигурирующей блок основного PLL, используемого для увеличения частоты тактовых импульсов источника. Она отражает суть аппаратной структуры блока основного PLL и может состоять из нескольких полей в зависимости от серии STM32 (в микроконтроллерах STM32F2/4/7 она может иметь довольно сложную структуру).
Напротив, структура RCC_ClkInitTypeDef используется для конфигурации источника тактового сигнала переключателя системного тактового сигнала (System Clock Switch, SWCLK), шины AHB и шин APB1/2.
CubeMX разработан для генерации правильного кода инициализации схемы тактирования нашего микроконтроллера. Весь необходимый код упакован внутри процедуры SystemClock_Config(), с которой мы сталкивались в сгенерированных до сих пор проектах. Например, следующая реализация SystemClock_Config() отражает суть конфигурации схемы тактирования для микроконтроллера STM32F030R8, работающего на частоте
48 МГц:
1void SystemClock_Config(void) {
2RCC_OscInitTypeDef RCC_OscInitStruct;
3RCC_ClkInitTypeDef RCC_ClkInitStruct;
5RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
6RCC_OscInitStruct.HSIState = RCC_HSI_ON;
7RCC_OscInitStruct.HSICalibrationValue = 16;
8RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
9RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
10RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12;
11RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;
12HAL_RCC_OscConfig(&RCC_OscInitStruct);
13
14RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;
15RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
16RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
17RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
18HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);
20 |
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); |
21 |
|
22 |
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); |
23 |
|
24/* Конфигурация IRQn прерываний таймера SysTick */
25HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
26}
Строки [5:12] выбирают HSI-генератор в качестве источника тактового сигнала и активируют блок основного PLL, устанавливая HSI-генератор в качестве источника тактового сигнала через мультиплексор PLL. Затем тактовая частота увеличивается в двенадцать раз (параметр поля PLLMUL). Строки [14:18] устанавливают частоту SYSCLK. В качестве источника тактового сигнала выбирается PLLCLK (строка 15). Таким же образом частота SYSCLK выбирается в качестве источника для шины AHB, и та же частота HCLK (RCC_HCLK_DIV1) в качестве источника для шины APB1. Другие строки кода устанавливают
Схема тактирования |
284 |
таймер SysTick – специальный таймер, доступный в ядре Cortex-M, который используется для синхронизации некоторых внутренних операций HAL (или для управления планировщиком ОСРВ, как мы увидим в Главе 23). HAL основан на соглашении о том, что таймер SysTick генерирует прерывание каждые 1 мс. Поскольку мы конфигурируем тактовую частоту SysTick таким образом, чтобы она работала на максимальной частоте ядра 48 МГц (что означает, что SYSCLK выполняет 48000000 тактовых циклов каждую секунду), мы можем установить таймер SysTick так, чтобы он генерировал прерывание каждые 48000000 циклов/1000 мс = 48000 тактовых циклов13.
10.2.1. Вычисление тактовой частоты во время выполнения
Иногда важно знать, насколько быстро работает ядро ЦПУ. Если наша микропрограмма спроектирована так, чтобы она всегда работала с установленной частотой, мы можем запросто жестко закодировать это значение в микропрограмме, используя именованную константу. Однако это всегда плохой стиль программирования, и он совершенно неприменим в случае, когда мы динамически управляем частотой ЦПУ. CubeHAL предоставляет функцию, которую можно использовать для вычисления частоты SYSCLK: HAL_RCC_GetSysClockFreq()14. Однако с этой функцией следует обращаться с особой осторожностью. Давайте посмотрим почему.
HAL_RCC_GetSysClockFreq() не возвращает реальную частоту SYSCLK (он никогда не сможет сделать это надежным способом без известной и точной внешней опорной частоты), но основывает результат на следующем алгоритме:
•если источником SYSCLK является HSI-генератор, то возвращается значение на основе макроса HSI_VALUE;
•если источником SYSCLK является HSE-генератор, то возвращается значение на основе макроса HSE_VALUE;
•если источником SYSCLK является PLLCLK, то возвращается значение, основанное на HSI_VALUE/HSE_VALUE, умноженное на коэффициент PLL, в соответствии с конкретной реализацией микроконтроллера STM32.
Макросы HSI_VALUE и HSE_VALUE определены в файле stm32xxx_hal_conf.h и являются жестко закодированными значениями. HSI_VALUE определяется ST во время проектирования микросхемы, и мы можем доверять значению соответствующего макроса (за исключением 1% точности). Напротив, если мы используем внешний генератор в качестве источника HSE-генератора, мы должны предоставить фактическое значение для макроса HSE_VALUE, в противном случае значение, возвращаемое функцией HAL_RCC_GetSysClockFreq(), является неправильным15. Это также влияет на частоту тиков (то есть времени, требуемого для генерации прерывания таймера) таймера SysTick.
13Как мы увидим в следующей главе, таймер является модулем автономного отсчета, то есть устройством, которое считает от заданного значения до 0 каждый тактовый цикл. Ради полноты, обратите внимание, что таймер SysTick представляет собой 24-разрядный таймер нисходящего отсчета, то есть он отсчитывает от сконфигурированного максимального значения (в нашем случае 48000) до нуля, а затем автоматически перезапускается. Источник тактового сигнала таймера устанавливает то, как быстро считает этот таймер. Поскольку здесь мы указываем, что источником тактового сигнала для таймера SysTick является HCLK (строка 22), то счетчик будет достигать нуля каждые 1 мс.
14Обратите внимание, что ядро Cortex-M тактируется не частотой SYSCLK, а частотой HCLK, которая может быть снижена предделителем шины AHB. Таким образом, подводя итог, частота ядра равна
HAL_RCC_GetSysClockFreq()/предделитель шины AHB.
15HAL_RCC_GetSysClockFreq() определена так, чтобы возвращать значение типа uint32_t. Это означает, что
она может возвращать неверные результаты с дробными значениями для HSE-генератора.
Схема тактирования |
285 |
Мы также можем получить частоту ядра с помощью глобальной переменной CMSIS
SystemCoreClock.
Прочитайте внимательно
Если мы решим вручную управлять конфигурацией схемы тактирования без использования процедур CubeHAL, мы должны помнить, что каждый раз, когда мы меняем частоту SYSCLK, нам нужно вызывать функцию CMSIS SystemCoreClockUpdate(), в противном случае некоторые процедуры CMSIS могут давать неправильные результаты. Эта функция автоматически вызывается
для нас процедурой HAL_RCC_ClockConfig().
10.2.2. Разрешение Выхода синхронизации
Как было сказано ранее, в зависимости от используемого корпуса ИС микроконтроллеры STM32 позволяют направлять тактовый сигнал на один или два выходных I/O, называемых выходами синхронизации (Master Clock Output, MCO). Это выполняется с помощью функции:
void HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_MCODiv);
Например, чтобы направить PLLCLK к выводу MCO1 в микроконтроллере STM32F401RE (который соответствует выводу PA8), мы должны вызвать вышеупомянутую функцию следующим образом:
HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_PLLCLK, RCC_MCODIV_1);
Прочитайте внимательно
Обратите внимание, что при конфигурации вывода MCO в качестве выходного GPIO его скорость (то есть скорость нарастания) влияет на качество выходного тактового сигнала. Кроме того, для более высоких тактовых частот следующим образом должна быть включена компенсационная ячейка (compensation cell):
HAL_EnableCompensationCell();
Обратитесь к техническому описанию вашего микроконтроллера для получения дополнительной информации о ней.
10.2.3. Разрешение Системы защиты тактирования
Система защиты тактирования (Clock Security System, CSS) – это функция периферий-
ного устройства RCC, которая используется для обнаружения неисправностей внешнего HSE-генератора. CSS является важной функцией в некоторых критически важных приложениях, где неправильная работа HSE-генератора может нанести вред пользователю. Ее важность подтверждается тем фактом, что обнаружение сбоя замечается исключением NMI – исключением ядра Cortex-M, которое нельзя запретить.
При обнаружении сбоя HSE-генератора микроконтроллер автоматически переключается на тактовый сигнал HSI-генератора, который выбирается в качестве источника тактового