ARM. STM32 быстрый старт

Данная статья, которая является ещё одним «быстрым стартом» в освоении ARM-контроллеров, возможно поможет сделать первые шаги в освоении 32-битных контроллеров ARM на базе ядра Cortex-M3 — STM32F1xxx серии. Возможно данная статья (которых на эту тему появляется как грибов после дождя) станет для кого-то полезной.

Введение

Почему ARM?
1. Есть из чего выбрать (разными производителями сегодня выпускается более 240 ARM-контроллеров)
2. Низкая цена (например за 1$ можно получить 37хI / O, 16K Flash, 4K RAM, 2xUART, 10x12bitADC, 6x16bitPWM).

А начнем нашу работу с контроллеров фирмы ST Microelectronics. Контроллеры на основе ядра ARM Cortex-M3 характеризуются широким набором периферии, высоким уровнем рабочих характеристик, низкой цене
P.S. В самом начале создается впечатление, что ARM’ы это какие-то страшные (в пайке, разводке, программировании) существа. Но это лишь на первый взгляд 🙂 и вы в этом сами убедитесь.

Итак, изучать ARMы будем на примере контроллеров STM32F1. Одновременно эта серия имеет несколько линеек:

  • Value line STM32F100 — 24 МГц CPU, motor control, CEC.
  • Access line STM32F101 — 36 МГц CPU, до 1 Mб Flash
  • USB access line STM32F102 — 48 МГц CPU with USB FS
  • Performance line STM32F103 — 72 МГц, до 1 Mб Flash, motor control, USB, CAN
  • Connectivity line STM32F105/107 — 72 МГц CPU, Ethernet MAC, CAN, USB 2.0 OTG

Также существует следующая классификация:

Low-density devices

STM32F101xx, STM32F102xx, STM32F103xx

Medium-density devices

STM32F101xx, STM32F102xx, STM32F103xx

High-density devices

STM32F101xx, STM32F103xx

XL-density devices

STM32F101xx, STM32F103xx

Connectivity line devices

STM32F105xx, STM32F107xx

Придется часто лазить здесь
Ещё скажу несколько слов об этом ресурсе. Ясное дело, выбираем нужный контроллер и попадаем на страницу с кучей файлов в формате. рdf. (вкладка Design support). Можно читать все, но достаточно ознакомиться с такими файлами:
1. REFERENCE MANUAL (содержит полную спецификацию на контроллер).
2. ERRATA SHEET (содержит описание ошибок, которые могут возникать при работе с периферией).
3. Остальные документы содержат примеры работы с периферией, вопросы, связанные с программированием, описание некоторых библиотек, а с самого низа страницы можно найти EVARM-проекты демоплат и подобное ПО.

Архитектура

Итак, наш контроллер STM32 содержит в себе Cortex-M3 процессор (M означает серию для бюджетных устройств). Для того, чтобы начать программировать ARMы и не пользоваться лишь default’ными примерам и настройками нужно иметь представление об их архитектуре. Для начала:
1) 32-битный МК, выполненный по Гарвардской архитектуре (память программ и данных разделены),
2) имеет несколько отдельных шин и 3-ступенчатый конвейер и более 10 регистров общего назначения, что позволяет выполнять операции параллельно и (большинство) — за один такт.
3) набор инструкций — Thumb-2 (смесь 16 — и 32-битных команд, ориентированный на компиляторы C / C + +).

Рассмотрим упрощенную блок-схему шинной архитектуры STM32:

Архитектура на примере линейки Connectivity devices

Итак, давайте коротко пройдемся по основам основ:
Матрица шин (bus matrix) — контроллер высокоскоростных шин, обеспечивающий независимую связь и арбитраж (в случае одновременного доступа к одному ресурсу) между системной шиной и шиной данных ядра, DMA, Ethernet (masters) и периферией — SRAM, FLASH, AHB (slaves) .

Шины ядра:
ICode bus — 32-битная шина инструкций — обеспечивает связь ядра с интерфейсом инструкций Flash.
DCode bus — шина данных — обеспечивает связь ядра с интерфейсом данных во Flash.
System bus — системная шина ядра — обеспечивает связь ядра и периферии
Flash interface (FLITF) интерфейс Flash-памяти — обеспечивает чтение, запись, стирание, чтение с буфером предварительной выборки, защиту памяти (от записи или чтения).
AHB system bus (Advanced High-performance Bus) — шина, которая связывает матрицу шин и периферийные шины APB (Advanced Peripheral Bus (Bridge)). Шина AHB, предназначена для управления, например, регистрами системной периферии (GPIO ЦАП и т.п.). Надо сказать, что шины APB1,2 работают на разных частотах: так APB2 может работать на частоте ядра, а быстродействие APB1 ограничено 36 МГц. Потому, на APB2 и висит скоростная периферия (АЦП, некоторые таймеры порты ввода / вывода и т.д.)
DMA (Direct Memory Access) — обеспечивает прямой доступ к памяти в обход ядра (нужно лишь задать что, откуда и куда передать, а DMA сам все возьмет и передаст кому надо через матрицу шин)
Reset & Clock Control (RCC) — обеспечивает тактирование ядра и периферии (которая по дефолту отключена от тактового сигнала) и сброс контроллера.

Стандартная схема подключения

И здесь для начинающих возникает вопрос в чем и как рисовать и разводить печатные платы для, например, 144-ногого микроконтроллера (48-ноги ещё куда не шло). Но ничего страшного в рисовании схемы, разводке и пайке данных контроллеров нет. Для этого можно пользоваться программой Eagle (она содержит библиотеку компонентов ST или в крайнем случае можно поискать в Интернете или скачать внизу статьи), можно попробовать рисовать платы в старом добром Sprint-е (хотя, первый вариант мне кажется более надежным). Ниже приведены стандартные схемы включения контроллеров семейства Value line STM32F100С4 и Connectivity line STM32F105

Привожу базовую схему подключения контроллеров STM32F1 и некоторые их нюансы:

  • Корпус: контроллеры STM32 помещены в корпусах LQFP с числом лапок от 48 до 144, при этом распиновка ножек контроллеров в одинаковых корпусах — совпадает, что не может не радовать.
  • Питание:
  •  Контроллер питается от источника в 3.3 В (хотя можно подключать 2-3.6 В).
  • Хотя напряжение питания равно 3.3В, много ножек контроллера толерантны к 5В сигналов (см. в спецификации лапки с пометкой FT).
  • Vbat — используется для подключения резервного источника питания. Если в схеме резервный источник не используется, то Vbat надо посадить на общий источник питания.
  • Vdd_1 … 4 подтягиваем к «+», Vss_1 … 4 сажаем на «-» источника питания.
  • Спецификация на контроллер советует поставить параллельно источнику питания 5 конденсаторов в 100нФ (поближе к контроллеру) и один на 4.7мкФ (ближе к Vdd_3). Во многих схемах авторы часто не ставят их, думаю, если контроллер питается от чистого стабилизированного источника их можно не ставить.
  • Питание АЦП (он питается напряжением 2,4-3,6 В) и цифровой части схемы в STM32 разделены (для большей надежности, очевидно) и если мы не используем отдельный источник для АЦП, Vdda / Vssa сажаем на соответствующие выводы общего источника, иначе схема может работать некорректно и непредсказуемо. В 100-пиновых корпусах есть ещё дополнительные лапки опорного источника АЦП Vref + / Vref-. Vref- нужно повесить на Vdda, а на Vref + можно бросить от 2,4 В до Vdda.
  • Резонатор. STM32 может тактироваться от:
  • Внутреннего высокочастотного генератора на 8 МГц (HSI).
  • Внутреннего низкочастотного источника тактовых импульсов 40 кГц (LSI).
  • Внешнего высокочастотного осциллятора (HSE).
  • Внешнего низкочастотного осциллятора на 32,768 кГц (LSE-генератор может работать вместе с HSE или синхросигналом и обеспечивает синхронизацию часов реального времени и работу оконного сторожевого таймера).
  • Внешнего сигнала синхронизации (его частота должна быть целым делителем максимальной рабочей частоты контроллера).
  • Сброс контроллера можно провести:
  • «заземлив» лапку NRST. Стоит сказать, что разработчик постарался и уже включил подтягивающий резистор этой лапки. (external reset)
  • С помощью одного из сторожевых таймеров независимого или оконного (IWDG или WWDG reset).
  • С помощью схемы слежения за низким напряжением (low-power management reset)
  • при входе в режим Standby
  • при входе в режим Stop
  • Программно — установкой определенного бита
  • Для удобства пайки LQFP корпусов, существуют переходники. Продаются на eBay, бывают универсальные и под фиксированное количество ножек. Средняя цена: 1$ за штуку, посмотреть можно здесь.

    Программирование. Отладка

    BOOT1

    BOOT0

    Boot mode

    X

    0

    Flash память

    0

    1

    Системная память (bootloader)

    1

    1

    Память SRAM

    Контроллеры STM32 можно заставить загружаться с 3-х областей памяти (в зависимости от состояния ножек BOOT0 и BOOT1 при старте контроллера или после его сброса). Записать программу в память контроллера можно следующими способами:

    1 способ:
    Используя загрузчик (он уже записан в системную память) и USART1 (USART2 remaped): использует внутренний тактовый сигнал 8 МГц. Чтобы запустить встроенный загрузчик, зашитый в контроллер производителем, достаточно просто бросить на лапки контроллера TX1, RX1 сигнал с преобразователя RS232-3.3В (например на базе FT232RL) и выставить перед этим BOOT0 = 1 и BOOT1 = 0 жмем RESET и можем шить программу в контроллер. А зашивается она в программе Flash Loader Demonstartor от STM (для Windows).

    PS. Если вы сидите под LINUX и не имеете отладочной платы типа дискавери, можно заливать прошивку в контроллер через всеми любимый rs-232 (собственно — через преобразователь rs-232-3,3В). Для этого нужно использовать python-скрипт (Ivan A-R) (для LINUX или MACOSX).
    Для начала у вас должен быть установлен Python 2.6 версии и библиотека для работы с последовательным портом — PySerial library.
    Теперь, чтобы запустить скрипт stmloader.py (из терминала, разумеется) нужно его немного подправить под свой компьютер: откроем его в текстовом редакторе.
    Набираем в командной строке
    ~$ dmesg | grep tty
    чтобы увидеть все последовательные порты ПК.
    и после набора…
     ~$ setserial -g /dev/ttyS[0123]
    мы узнаем путь к нашему 232-му порту. Если система ругается на setserial, установим его
    ~$ sudo apt-get install setserial
    мы узнаем путь к нашему физическому порту (например, у меня — /dev/ttyS0). Теперь нужно записать этот путь в файл скрипта stm32loader.py вместо дефолтного «/dev/tty.usbserial-…». Набираем в терминале
    ~$ python stm32loader.py -h
    …для вызова справки и заливаем прошивку в наш контроллер.

    2 способ:
    Через USB OTG, используя DFU-режим, требует внешнего кварца на 8 МГц, 14.7456 МГц или 25 МГц (этот загрузчик есть не у всех контроллерах с USB OTG надо внимательно смотреть на маркировку вашего контроллера)

    3 способ:
    JTAG/SWD. Ну и для тех, кто имеет демоплату типа Discovery или самопальный JTAG/SWD программатор, можно заливать код и уже отлаживать свой микроконтроллер этим способом. Для JTAG в микроконтроллере отведено 6 лапок (TRST, TDI, TMS, TCK, TDO, RST) + 2 на питание. SWD использует 4 сигнала (SWDIO, SWCLK SWO, RESET) и 2 на питание.

    PS. В среде EAGLE я набросал несколько схем-заготовок для 48-ми, 64-х и 100-ногих контроллеров (папка eagle), а stm32loader содержит скрипт stm32loader.py

    Прикрепленные файлы:

    Добавить комментарий

    Ваш адрес email не будет опубликован.