При изучении любого незнакомого дела, особенно когда речь идет о микроконтроллерах, возникает вопрос — «С чего начать». Ведутся поиски статей по ключевым словам «Getting Started», неизбежно появляется дилема выбора среды разработки и программатора-отладчика. Чтобы помочь вам определиться с ответами на возникшие вопросы, я поделюсь своим опытом в освоении 32-битных контроллеров семейства STM32F от ST Microelectronics.
Вариантов по сути дела было два — STM32F или NXP (LPC1xxx). На микроконтроллеры STM32F мой выбор пал по нескольким причинам.
Во-первых, дешёвая отладочная плата STM32VL-Discovery. Некоторые из вас, кто занимается электроникой, наверняка успели урвать халявную Discovery, бесплатно раздаваемую при участии в конкурсе от EBV-Electronik. Тем, кто не успел подать заявку или вообще не знал о такой возможности, расстраиваться не стоит — плата стоит порядка 500 рублей. Цена более чем доступная.
Во-вторых, сами контроллеры довольно дешёвые. Простейший камень STM32F100C4T6 c 16 килобайтами на борту стоит меньше 40 рублей (!), при этом по характеристикам и периферии уделывает любую «Мегу», которая, кстати, всё равно стоит дороже. Цена на камни старшей линейки с аппаратным USB (STM32F103) тоже вполне гуманна, порядка 120 рублей.
В-третьих, контроллеры активно начинают набирать интерес у электронщиков, статьи по освоению STM32 появляются в интернетах одна за другой. Если так пойдет и дальше, популярность вполне может достигнуть уровня контроллеров Atmel.
Единственное по сравнению с тем же Atmel неудобство для радиолюбителя, это мелкий корпус. Про DIP можете забыть. Единственный доступный корпус — это LQFP с шагом ножек 0.5 мм. Тем не менее, плату при определенной сноровке изготовить ЛУТом не составит труда (об этом мы уже читали), так что мелкий корпус минусом я не считаю. На фото слева — моя плата для корпуса LQFP48.
Пара слов об отладочной плате STM32VL-Discovery: на борту у неё программатор-отладчик ST-Link и отлаживаемый (target) контроллер STM32F100RBT6 (128 кб флеша, 8 кб оперативы). Все выводы разведены на штырьки, имеется два светодиода и кнопка. Разъём SWD отладчика выведен наружу, так что плату можно использовать и как обычный ST-Link. Это нам на руку, не понадобится покупать программатор.
Здесь не всё так однозначно, как с атмеловской AVR Studio. Вариантов несколько:
Итак, нам понадобятся:
Здесь есть и библиотека CMSIS для ядра ARM Cortex M3, и STM32 Peripheral Library (библиотека для работы с периферией от ST Microelectronics), а так же собственные разработки CooCox для выбранного микроконтроллера. Нам достаточно лишь отметить галочкой требуемые библиотеки и дело в шляпе. Для простейшей светодиодной моргалки — а именно так выглядит «Hello World» на микроконтроллерах — нам понадобятся CMSIS Core, CMSIS Boot, RCC (управление тактированием периферии) и GPIO (управление портами ввода-вывода общего назначения).
Без лишних пояснений напишу код простейшей программы:
Компилируем (F7), наблюдаем появившиеся в директории Debug исполняемые файлы — bin, hex, elf.
Программу мы подготовили, теперь займёмся её загрузкой в чип. Подключаем плату (об установке драйверов пояснять не стану), запускаем ST-Link Utility. Контроллер в Discovery подключен по SWD, поэтому первое, что надо сделать, это переключить режим работы программатора-отладчика с JTAG на SWD:
Далее всё прозрачно: меню Target -> Program & Verify… выбираем файл hex, жмём Program и прошивка завершена. Остается только нажать на плате Discovery кнопку Reset — ту, что с черным колпачком — и порадоваться моргающему светодиоду.
Поздравляю. Ваша первая программа написана, скомпилирована, прошита в чип и успешно работает. Начало положено, а далее дело за вами: лезем в шаблонный код, как обычно что-то изменяем, дополняем, изучаем новые периферийные устройства, подключаем новые библиотеки. И не забываем читать Reference Manual, в нём масса полезной информации.
Обновление: Начиная с версии 1.3.0 среда разработки CooCox IDE поддерживает ST-Link, поэтому программирование и отладку можно осуществлять прямо из CoIDE, без использования ST-Link Utility. Выбор адаптера через меню Debug -> Debug Configuration (ST-Link, порт SWD). Загрузка программы в контроллер через меню Flash -> Program Download.
На этом всё. Желаю успехов в освоении микроконтроллеров ST Microelectronics.
Выбор контроллера
Вариантов по сути дела было два — STM32F или NXP (LPC1xxx). На микроконтроллеры STM32F мой выбор пал по нескольким причинам.
Во-первых, дешёвая отладочная плата STM32VL-Discovery. Некоторые из вас, кто занимается электроникой, наверняка успели урвать халявную Discovery, бесплатно раздаваемую при участии в конкурсе от EBV-Electronik. Тем, кто не успел подать заявку или вообще не знал о такой возможности, расстраиваться не стоит — плата стоит порядка 500 рублей. Цена более чем доступная.
Во-вторых, сами контроллеры довольно дешёвые. Простейший камень STM32F100C4T6 c 16 килобайтами на борту стоит меньше 40 рублей (!), при этом по характеристикам и периферии уделывает любую «Мегу», которая, кстати, всё равно стоит дороже. Цена на камни старшей линейки с аппаратным USB (STM32F103) тоже вполне гуманна, порядка 120 рублей.
В-третьих, контроллеры активно начинают набирать интерес у электронщиков, статьи по освоению STM32 появляются в интернетах одна за другой. Если так пойдет и дальше, популярность вполне может достигнуть уровня контроллеров Atmel.
Единственное по сравнению с тем же Atmel неудобство для радиолюбителя, это мелкий корпус. Про DIP можете забыть. Единственный доступный корпус — это LQFP с шагом ножек 0.5 мм. Тем не менее, плату при определенной сноровке изготовить ЛУТом не составит труда (об этом мы уже читали), так что мелкий корпус минусом я не считаю. На фото слева — моя плата для корпуса LQFP48.
Пара слов об отладочной плате STM32VL-Discovery: на борту у неё программатор-отладчик ST-Link и отлаживаемый (target) контроллер STM32F100RBT6 (128 кб флеша, 8 кб оперативы). Все выводы разведены на штырьки, имеется два светодиода и кнопка. Разъём SWD отладчика выведен наружу, так что плату можно использовать и как обычный ST-Link. Это нам на руку, не понадобится покупать программатор.
Выбор среды разработки
Здесь не всё так однозначно, как с атмеловской AVR Studio. Вариантов несколько:
- IAR. Коммерческая. Ограничение по объёму исполняемого кода. Нафиг.
- Keil. То же самое. Нафиг.
- Atollic TrueStudio. Основана на Eclipse, но, тем не менее, является коммерческой. В бесплатной Lite-версии ограничения по объёму кода нет, но регулярно выскакивает рекламка «Приобретайте версию PRO». Нафиг.
- Чистый Eclipse с плагином ARM и компилятором ARM-GCC. Вроде вот оно, кроссплатформенное счастье, но откуда ни возьмись появляется еще более подходящая кандидатура:
- CooCox IDE (CoIDE). Тоже основана на Eclipse, но бесплатна. Включает в себя всё для работы с ARM, позволяет не отходя от кассы докачивать необходимые библиотеки. Умеет работать с различнями отладчиками (правда не с ST-Link, но это обходится установкой GNU Debugger'a). Единственный минус — сборка есть только под винду. Линуксятникам придется ставить Eclipse и настраивать его руками. Как обычно. Ну да ничего, нам не привыкать.
Собственно, Getting Started!
Итак, нам понадобятся:
- Плата STM32VL-Discovery
- Утилита STM32 ST-Link Utility
- Среда разработки CoIDE последней версии (на данный момент это 1.3.0).
Здесь есть и библиотека CMSIS для ядра ARM Cortex M3, и STM32 Peripheral Library (библиотека для работы с периферией от ST Microelectronics), а так же собственные разработки CooCox для выбранного микроконтроллера. Нам достаточно лишь отметить галочкой требуемые библиотеки и дело в шляпе. Для простейшей светодиодной моргалки — а именно так выглядит «Hello World» на микроконтроллерах — нам понадобятся CMSIS Core, CMSIS Boot, RCC (управление тактированием периферии) и GPIO (управление портами ввода-вывода общего назначения).
Без лишних пояснений напишу код простейшей программы:
#include <stm32f10x.h>
#include <stm32f10x_conf.h>
#include <stm32f10x_rcc.h>
#include <stm32f10x_gpio.h>
void Delay(volatile uint32_t nCount) {
for (; nCount != 0; nCount--);
}
int main(void) {
/* SystemInit() вызывается из startup_stm32f10x_md_vl.c */
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOC , &GPIO_InitStructure);
while (1) {
GPIOC->ODR |= GPIO_ODR_ODR9;
Delay(0x1FFFF);
GPIOC->ODR &= ~GPIO_ODR_ODR9;
Delay(0x7FFFF);
}
return 0;
}
Компилируем (F7), наблюдаем появившиеся в директории Debug исполняемые файлы — bin, hex, elf.
Прошивка контроллера
Программу мы подготовили, теперь займёмся её загрузкой в чип. Подключаем плату (об установке драйверов пояснять не стану), запускаем ST-Link Utility. Контроллер в Discovery подключен по SWD, поэтому первое, что надо сделать, это переключить режим работы программатора-отладчика с JTAG на SWD:
Далее всё прозрачно: меню Target -> Program & Verify… выбираем файл hex, жмём Program и прошивка завершена. Остается только нажать на плате Discovery кнопку Reset — ту, что с черным колпачком — и порадоваться моргающему светодиоду.
Поздравляю. Ваша первая программа написана, скомпилирована, прошита в чип и успешно работает. Начало положено, а далее дело за вами: лезем в шаблонный код, как обычно что-то изменяем, дополняем, изучаем новые периферийные устройства, подключаем новые библиотеки. И не забываем читать Reference Manual, в нём масса полезной информации.
Обновление: Начиная с версии 1.3.0 среда разработки CooCox IDE поддерживает ST-Link, поэтому программирование и отладку можно осуществлять прямо из CoIDE, без использования ST-Link Utility. Выбор адаптера через меню Debug -> Debug Configuration (ST-Link, порт SWD). Загрузка программы в контроллер через меню Flash -> Program Download.
На этом всё. Желаю успехов в освоении микроконтроллеров ST Microelectronics.
Полезные ресурсы по теме
- Моя статья о периферийных устройствах STM32. Научит вас методике изучения периферии. Рекомендую к прочтению.
- Настройка связки Eclipse + ARM-GCC. Рекомендуется к прочтению для того, чтобы вы узнали, какую работу CoIDE делает за вас.
- Видеообзор документации контроллеров STM32. Поможет вам разобраться, как и где искать документацию на контроллер.
- STM32VL-Discovery на сайте ST Microelectronics. Мануал, схема, драйверы, ST-Link Utility и всё остальное, что относится к плате.