
- •Оглавление
- •Предисловие
- •Почему я написал книгу?
- •Для кого эта книга?
- •Как использовать эту книгу?
- •Как организована книга?
- •Об авторе
- •Ошибки и предложения
- •Поддержка книги
- •Как помочь автору
- •Отказ от авторского права
- •Благодарность за участие
- •Перевод
- •Благодарности
- •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

Инструмент STM32CubeMX |
113 |
4.2.2. Создание проекта Eclipse
А сейчас мы создадим проект Eclipse, в котором будут размещаться файлы, сгенериро-
ванные CubeMX.
Перейдите в меню File → New → C Project. Введите название проекта, которое вам нравится, и выберите Hello World ARM Cortex-M C/C++ Project в качестве типа проекта.
Рисунок 15: Второй шаг мастера генерации проекта
На втором шаге заполните поля Processor core, Clock, Flash size и RAM size в соответствии с типом вашей Nucleo (см. таблицу 2, если вы их не знаете), а все остальные поля оставьте в соответствии с рисунком 15.
Таблица 2: Настройки проекта для выбора в соответствии с имеющейся Nucleo

Инструмент STM32CubeMX |
114 |
На третьем шаге оставьте все поля по умолчанию, кроме последнего: Vendor CMSIS name. Это поле должно иметь следующий шаблон: stm32<семейство>xx. Например, для Nucleo-F1 впишите stm32f1xx или для Nucleo-L4 впишите stm32l4xx, как показано на рисунке 16. Продолжайте работу с мастером проекта, пока он не будет завершен.
Рисунок 16: Третий шаг мастера генерации проекта
Еще раз, мы использовали плагин Eclipse GNU MCU для генерации проекта, но на этот раз есть некоторые файлы, которые нам не нужны, поскольку мы будем использовать файлы, сгенерированные инструментом CubeMX. На рисунке 17 показан проект Eclipse и пять выделенных файлов в представлении Project Explorer. Вы можете безопасно удалить их, нажав кнопку Delete на клавиатуре.
Рисунок 17: Проект Eclipse с выделенными файлами для удаления

Инструмент STM32CubeMX |
115 |
Нам нужно изменить еще кое-что в файлах, сгенерированных плагином GNU MCU. Открыв файл ldscripts/mem.ld, мы увидим, что начальный адрес (origin) Flash-памяти неправильный, потому что, как мы видели в Главе 1, Flash-память отображается с адреса 0x0800 0000 для всех устройств STM32. Итак, убедитесь, что определения начального адреса памяти11 вашего файла .ld равны следующим:
...
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 96K
...
4.2.3.Ручное импортирование сгенерированных файлов в проект Eclipse
После того, как мы создали проект Eclipse, нам нужно импортировать в него проект CubeMX. Существует два способа сделать это: вручную или с помощью удобного инструмента, созданного автором данной книги. Настоятельно рекомендуется выполнить представленные операции вручную хотя бы один раз, чтобы точно понять, какие программные компоненты участвуют в каждой операции.
Начиная с этого момента все представленные пути указаны относительно папки
/STM32Toolchain/cubemx-out/<название-проекта>.
Перейдите в папку Inc в файловой системе и перетащите все ее содержимое в папку include в Eclipse. Eclipse спросит вас, каким образом импортировать файлы. Выберите параметр Copy files и нажмите кнопку ОК. Таким же образом перейдите в папку Src в файловой системе и перетащите все ее содержимое в папку src в Eclipse. С помощью двух данных операций мы импортировали код приложения в проект Eclipse.
Начиная с этого момента, вы найдете несколько путей и имен файлов, относящихся к микроконтроллерам F4. Например, путь с такой структурой
‘Drivers/STM32F4xx_HAL_Driver/Inc’ или имя файла, подобное этому
‘system_stm32f4xx.c’. Прошу отметить, что вы должны заменить F4 семейством STM32 вашего микроконтроллера (F0, F1, F2, F3, F7, L0, L1, L4). Обра-
тите внимание на заглавную букву (F4) или строчную (f4) в пути или имени файла.
Примите также к сведению, что начиная с этого параграфа мы будем использовать шрифт Courier для указания путей файловой системы (например,
Drivers/STM32F4xx_HAL_Driver/Inc); а папки Eclipse мы будем указывать жирным
шрифтом (например, system/include/stm32f4xx). Это соглашение действует во всей книге.
11 Очевидно, что объем памяти зависит от конкретного микроконтроллера. Всегда дважды проверяйте, соответствует ли он аппаратным спецификациям вашего микроконтроллера. Если он не совпадает, при запуске могут возникать странные ошибки (мы узнаем, как бороться с аппаратными ошибками в следующей главе). CubeMX предоставляет нам еще одно быстрое решение. Открыв папку
/STM32Toolchain/cubemx-out/<название-проекта>/SW4STM32/<название-проекта> Configuration, вы найдете файл,
заканчивающийся на .ld. Это скрипт компоновщика, содержащий правильные определения начального адреса памяти для вашего микроконтроллера. Вы можете просто скопировать секцию MEMORY, содержащуюся в данном файле, и вставить ее в файл ldscripts/mem.ld.

Инструмент STM32CubeMX |
116 |
Теперь перейдите в папку файловой системы Drivers/STM32F4xx_HAL_Driver/Inc и импортируйте все ее содержимое в папку Eclipse system/include/stm32f4xx. Таким же образом перейдите в папку файловой системы Drivers/STM32F4xx_HAL_Driver/Src и импортируйте все ее содержимое в папку Eclipse system/src/stm32f4xx. Мы успешно импортировали HAL от ST в наш проект. Теперь очередь за пакетом CMSIS-CORE.
Сначала мы начнем импортировать официальный пакет CMSIS-CORE. Перейдите в папку файловой системы Drivers/CMSIS/Include и перетащите все ее содержимое в папку Eclipse system/include/cmsis. Когда Eclipse спросит вас, ответьте Yes, чтобы заменить существующие файлы.
Теперь нам нужно импортировать файлы конкретного устройства для CMSIS-CORE.
Обратите внимание, что плагин GNU MCU уже встраивает CMSIS-CORE в сгенерированный проект, но он старой версии (3.20). Мы заменяем его последней официальной версией, поставляемой ST (4.30 на момент написания данной главы).
Перейдите в папку файловой системы Drivers/CMSIS/Device/ST/STM32F4xx/Include и
перетащите все ее содержимое в папку Eclipse system/include/cmsis. Eclipse попросит вас перезаписать существующие файлы: ответьте Yes. Теперь перейдите в папку startup и перетащите файл startup_stm32f4xxxx.s в папку Eclipse system/src/cmsis.
Прочитайте внимательно
Файлы .s – это ассемблерные файлы, которые должны обрабатываться непосредственно ассемблером GNU Assembler (AS). Однако Eclipse CDT запрограммирован так, чтобы ожидать, что ассемблерный файл заканчивается на .S (заглавная S). Поэтому переименуйте файл startup_stm32f4xxxx.s в startup_stm32f4xxxx.S. Для этого щелкните правой кнопкой мыши по файлу в Eclipse и выберите пункт Rename.
Итак, давайте вспомним, что мы сделали до сих пор.
1.Сначала мы создали пустой проект ARM C/C++, используя технические характеристики нашего микроконтроллера.
2.Затем мы удалили некоторые файлы, сгенерированные плагином GNU MCU, и импортировали файлы, сгенерированные CubeMX; мы также обновили начальный адрес FLASH в файле mem.ld.
3.Затем мы скопировали основные файлы приложения из папок Inc и Src.
4.Мы импортировали HAL от ST для нашего микроконтроллера и новейший пакет
CMSIS-CORE.
5.Наконец, мы добавили правильный ассемблерный startup-файл startup_stm32f4xxxx.s для нашего микроконтроллера и переименовали его в startup_stm32f4xxxx.S (заканчивающийся на заглавную .S).
Втаблице 3 приведены файлы и папки, которые необходимо импортировать в проект Eclipse. Пути слева являются путями файловой системы (относительно каталога сгенерированного проекта CubeMX); пути справа – это соответствующая папка Eclipse.

Инструмент STM32CubeMX |
117 |
Таблица 3: Файлы и папки, которые необходимо импортировать в соответствующие папки Eclipse
Пути и файлы файловой системы |
Папки Eclipse |
Inc |
include |
Src |
src |
Drivers/STM32F4xx_HAL_Driver/Inc |
system/include/stm32f4xx |
Drivers/STM32F4xx_HAL_Driver/Src |
system/src/stm32f4xx |
Drivers/CMSIS/Include |
system/include/cmsis |
Drivers/CMSIS/Device/ST/STM32F4xx/Include |
system/include/cmsis |
startup/startup_stm32f4xxxx.S |
system/src/cmsis |
Я понимаю, что данные процедуры кажутся громоздкими, но, поверьте мне: как только вы ознакомитесь с этими процедурами, вы сможете создать проект для каждого микроконтроллера STM32, включая новейшие микроконтроллеры STM32F7 и будущие STM32. Однако в следующем параграфе мы рассмотрим способ автоматизации данной задачи.
Если вы попытаетесь скомпилировать проект, вы увидите много ошибок и предупреждений. Чтобы завершить его настройку, нам нужно еще два шага.
HAL от ST предназначен для работы со всеми микроконтроллерами имеющихся серий (F0, F1 и т. д.). Внутри HAL используются несколько условных макросов для распознавания типа микроконтроллера. Таким образом, мы должны указать микроконтроллер, оснащающий нашу Nucleo.
Перейдите в меню Project → Properties, а затем в раздел C/C++ Build → Settings. Выберите раздел Cross ARM C Compiler → Preprocessor, а затем щелкните значок Add… (значок, обведенный красным на рисунке 18). Введите имя макроса, соответствующее вашей Nucleo (см. таблицу 2, столбец HAL Macro). Например, для Nucleo-F401RE используйте макрос STM32F401xE.
Рисунок 18: Настройки проекта Eclipse и определение макроса микроконтроллера

Инструмент STM32CubeMX |
118 |
Если вы используете пользовательскую плату с микроконтроллером, которого нет в таблице 2, вы можете найти макрос для вашего микроконтроллера в файле system/include/cmsis/stm32XXxx.h.
Последний шаг – удалить следующие файлы из проекта Eclipse12:
•system/src/stm32XXxx/stm32XXx_hal_msp_template.c
•system/src/stm32XXxx/stm32XXxx_hal_timebase_tim_template.c
•system/src/stm32XXxx/stm32XXxx_hal_timebase_rtc_alarm_template.c:
Эти файлы являются шаблонами, сгенерированными CubeMX в папке system/stm32XXxx (я считаю, что CubeMX не должен помещать данные файлы в сгенерированный проект). Мы проанализируем их позже в книге.
Поздравляю: теперь вы готовы к компиляции проекта. Если все прошло успешно, проект должен скомпилировать генерируемый бинарный файл без ошибок (некоторые предупреждения все еще есть, но не беспокойтесь о них).
12 Некоторые из этих файлов все еще отсутствуют в нескольких CubeHAL – если вы не можете найти их, не беспокойтесь об этом. Если вы найдете другие файлы, заканчивающиеся на template.c, удалите их.

Инструмент STM32CubeMX |
119 |
Интермеццо Eclipse
Вы могли заметить, что каждый раз, когда вы меняете что-то в настройках проекта, требуется много времени для компиляции всего дерева файлов с исходным кодом. Это происходит потому, что Eclipse перекомпилирует все файлы с исходным кодом HAL, содержащиеся в system/src/stm32XXxx/. Это действительно раздражает, и вы можете ускорить время компиляции, отключив все те файлы, которые не нужны вашему приложению. Например, если вашей плате не нужно использовать устройства I²C, вы можете безопасно отключить компиляцию файлов stm32XXxx_hal_i2c_ex.c и stm32XXxx_hal_i2c.c, щелкнув по ним правой кнопкой мыши, а затем выбрав
Resource configuration → Exclude from build и выбрав все определенные конфи-
гурации проектаa.
Другое решение этой же проблемы – настроить CubeMX так, чтобы он добавлял в проект только необходимые библиотечные файлы. Для этого в настройках проекта
CubeMX выберите Copy only the necessary library files, как показано нижеb.
aОднако имейте в виду, что исключение неиспользуемых файлов HAL из компиляции не повлияет на размер бинарного файла: любой современный компоновщик может автоматически исключить из генерации абсолютного файла (бинарный файл, который мы загрузим на нашу плату) все эти перемещаемые файлы, содержащие неиспользуемый код и данные (подробнее о процессе компоновки бинарного файла STM32 в Главе 20).
bЭто приведет к тому, что если позже вам потребуется использовать дополнительное периферийное устройство, вам придется импортировать соответствующие файлы HAL вручную.

Инструмент STM32CubeMX |
120 |
4.2.4.Автоматический импорт файлов, созданных с помощью
CubeMX, в проект Eclipse
Предыдущие шаги могут быть выполнены автоматически с использованием простого Python-скрипта. Его название – CubeMXImporter, и его можно скачать с авторского аккаунта на github13.
Прочитайте внимательно
Инструмент автоматически удаляет все ненужные существующие файлы проекта. Среди них также файл main.c и все другие файлы, содержащиеся в папках Eclipse src и include. По этой причине не выполняйте CubeMXImporter в существующем проекте. Всегда выполняйте его в новом проекте Eclipse, сгенерированном с помощью плагина Eclipse GNU MCU.
Данный скрипт работает хорошо, только если вы сгенерировали проект CubeMX для инструментария SW4STM32 (он же AC6).
CubeMXImporter использует Python 2.7.x и библиотеку lxml. Здесь вы можете найти инструкции по установке для Windows, Linux и Mac OSX.
Windows
В Windows мы должны сначала установить последнюю версию Python 2.7. Мы можем скачать ее прямо по этой ссылке14. После загрузки запустите установщик и убедитесь, что все параметры установки включены, как показано на рисунке 19. После завершения установки вы можете установить предварительно скомпилированный пакет lxml, загрузив его отсюда15.
Linux и MacOS X
В этих двух операционных системах Python 2.7 установлен по умолчанию. Итак, нам нужно только установить библиотеку lxml (если она еще не установлена). Мы можем просто установить ее с помощью команды pip:
$ sudo pip install lxml
13https://github.com/cnoviello/CubeMXImporter
14https://www.python.org/ftp/python/2.7.10/python-2.7.10.msi
15https://pypi.python.org/packages/2.7/l/lxml/lxml-3.5.0.win32- py2.7.exe#md5=3fb7a9fb71b7d0f53881291614bd323c