Понравилась мне платформа Nucleo и приобрел я плату Nucleo-F401RE.Желания углубляться во внутреннее устройство микроконтроллера не было и мое внимание привлекла библиотека mbed. В этой библиотеке заявлена поддержка данной платы.
На Хабре уже есть публикации по быстрому старту Nucleo + mbed («Быстрый старт ST Nucleo-F401 + краткое руководство», «STM32 Nucleo. Подключаем TFT LCD на базе чипа ILI9341»). Но все примеры даются для online IDE. Но такой вариант мне не очень понравился и я стал искать настольную IDE.
Попробовал Eclipse по статье с сайта mbed.org. Но так как пример написан для другого контроллера, а адаптировать инструкцию для STM у меня не получилось, то этот вариант отпал.
Тогда стал смотреть в сторону CooCox CoIDE. К сожалению, CoIDE официально не поддерживает конроллер STM32F401RE. Но пробовать, так пробовать.
Итак, скачиваем CoIDE. Внизу страницы есть две ссылки: по первой загружается CoCenter. Это такой лаунчер, который позволяет управлять установкой и обновлением всех предлагаемых сайтом CooCox программ. Мне нужна была только CoIDE, поэтому я воспользовался второй ссылкой. Данная программа работает только в среде Windows, но меня это устроило.
В CoIDE интегрирован CoBuilder и CoDebugger. А вот компилятор отсутствует и его необходимо установить отдельно.
На этой же странице есть ссылка на инструкцию по настройке внешнего компилятора, где рекомендуется установка GCC ARM Embedded. Отсюда загружаем установочный пакет для Windows.
Далее переходим к установке. Устанавливаем CoIDE. Я выбрал путь для установки «c:\CooCox\CoIDE\» дабы избежать проблем с кириллицей в путях. Затем устанавливаем компилятор. Я не планирую использовать этот компилятор для других целей, поэтому путь установки выбрал «c:\CooCox\GNU Tools ARM Embedded\4.8 2014q3\».
Запускаем CoIDE, выбираем пункт меню «Project – Select Toolchain Path»:

и указываем путь к компилятору «C:\CooCox\GNU Tools ARM Embedded\4.8 2014q3\bin».

Все, можно писать программы.
Но мне хотелось использовать библиотеку mbed. Вот здесь нам и пригодятся предыдущие статьи по быстрому старту. Заходим на сайт и выбираем любой из имеющихся у вас проектов. Я буду работать с самым любимым проектом «Nucleo_blink_led».

Выбираем данный проект в дереве и, нажав правую кнопку мыши, в открывшемся меню выбираем пункт «Export Program…». Далее указываем целевую платформу («ST Nucleo F401RE») и нашу IDE («CooCox CoIDE»).

Нажимаем кнопку «Export» и получаем архив «Nucleo_blink_led_coide_nucleo_f401re.zip». В архиве будет папка с названием нашего проекта «Nucleo_blink_led», которую необходимо распаковать в папку с проектами CoIDE. В моем случае это «c:\CooCox\CoIDE\workspace\».
В запущенном нами CoIDE, выбираем пункт меню «File – Open File…» и в папке «C:\CooCox\CoIDE\workspace\Nucleo_blink_led» выбираем файл «Nucleo_blink_led.coproj».

Наш проект открылся и готов к компиляции.

Выбираем пункт меню «Project – Build» (кнопку Build на панели инструментов или клавишу F7). В появившейся консоли мы должны получить сообщение «BUILD SUCCESSFUL».

Далее есть несколько путей – мы можем, как и в случае с online IDE, скопировать получившийся файл «Nucleo_blink_led.bin» из папки «c:\CooCox\CoIDE\workspace\Nucleo_blink_led\Nucleo_blink_led\Debug\bin\» на нашу плату, либо можем запустить режим отладки, выбрав пункт меню «Debug — Debug» (кнопку «Start Debug» на панели инструментов или Ctrl+F5), либо просто прошить контроллер готовой программой, выбрав пункт меню «Flash – Program Download» (кнопку «Download Code to Flash» на панели инструментов).

В результате любого из указанных действий на нашей плате должен весело замигать зеленый светодиод LD2.
На этом можно было бы и остановиться, но мигать одним светодиодом скучно.
Поэтому соберем не сложную схему с семисегментным индикатором CA56-12SRWA. Ноги индикатора с номерами 12, 9, 8, 6 управляют включением разрядов индикатора 1, 2, 3, 4 при подаче на них высокого напряжения. Остальные ноги отвечают за отдельные сегменты каждого знакоместа и точки и должны подключаться через токоограничивающий резистор к выходам с низким уровнем напряжения. Сегменты управляются одновременно во всех разрядах, поэтому будем делать динамическую индикацию.
Код main.c для динамической индикации.
#include "mbed.h" #define pause 0.005 void disp(char n); DigitalOut seg1(D8); DigitalOut seg2(D3); DigitalOut seg3(D5); DigitalOut seg4(D7); DigitalOut seg5(D9); DigitalOut seg6(D2); DigitalOut seg7(D4); DigitalOut seg8(D6); //dp DigitalOut dig1(D10); DigitalOut dig2(D11); DigitalOut dig3(D12); DigitalOut dig4(D13); int main() { dig1=0; // Выключаем разряд 1 индикатора dig2=0; // Выключаем ��азряд 2 индикатора dig3=0; // Выключаем разряд 3 индикатора dig4=0; // Выключаем разряд 4 индикатора seg8=1; // Выключаем точку во всех разрядах // Основной цикл while(1) { disp('0'); // Формируем цифру '0' dig1=1; // Подаем высокий уровень на первый разряд wait(pause); // ждем dig1=0; // выключаем первый разряд disp('1'); // Формируем цифру '1' dig2=1; // Подаем высокий уровень на второй разряд wait(pause); // ждем dig2=0; // выключаем второй разряд disp('2'); // Формируем цифру '2' dig3=1; // Подаем высокий уровень на третий разряд wait(pause); // ждем dig3=0; // выключаем третий разряд disp('3'); // Формируем цифру '3' dig4=1; // Подаем высокий уровень на четвертый разряд wait(pause); // ждем dig4=0; // выключаем четвертый разряд } } // Подпрограмма формирования цифр на разрядаз индикатора void disp(char n) { switch (n) { case '0': // Для отображения цифры '0' seg1=0; // Сегмент a подтягиваем к низкому уровню (будет светиться) seg2=0; // Сегмент b подтягиваем к низкому уровню (будет светиться) seg3=0; // Сегмент c подтягиваем к низкому уровню (будет светиться) seg4=0; // Сегмент d подтягиваем к низкому уровню (будет светиться) seg5=0; // Сегмент e подтягиваем к низкому уровню (будет светиться) seg6=0; // Сегмент f подтягиваем к низкому уровню (будет светиться) seg7=1; // Сегмент g подтягиваем к высокому уровню (будет потушен) break; case '1': seg1=1; seg2=0; seg3=0; seg4=1; seg5=1; seg6=1; seg7=1; break; case '2': seg1=0; seg2=0; seg3=1; seg4=0; seg5=0; seg6=1; seg7=0; break; case '3': seg1=0; seg2=0; seg3=0; seg4=0; seg5=1; seg6=1; seg7=0; break; default: seg1=1; seg2=1; seg3=1; seg4=1; seg5=1; seg6=1; seg7=1; break; } }
Все комментарии есть в тексте программы.
Прошиваем контроллер и наш индикатор отображает текст «0123».
Программа не претендует на совершенство и, при необходимости, на сайте mbed.org можно найти готовые библиотеки для управления такими индикаторами.
В результате я получил IDE для работы с Nucleo и библиотекой mbed без использования сети интернет.
В моем проекте использовалась библиотека mbed ревизии 91. При обновлении библиотеки, мы можем обновить наш проект «Nucleo_blink_led» на сайте developer.mbed.org/compiler и повторно экспортировать его к себе на компьютер. Затем нам нужно просто обновить папку «mbed» в нашем проекте на новую и перекомпилировать проект.
