Запускаем .NET MicroFramework на STM32F4Discovery (перевод)

image
Несколько месяцев назад STMicroelectronics бесплатно раздавали отладочную плату STM32F4 Discovery. Я стал одним из тех, кому повезло получить ее бесплатно. Последний семестр я использовал плату для моего проекта (realtime и embedded OS) с применением Keil. У меня так-же есть отладочная плата Netduino, которая является моим фаворитом среди моих отладочных плат потому что я могу использовать Visual Studio и C#. Я знаю об ограничениях управляемого кода, связанных с расходами ресурсов на CLR, но моя программа не является программой реального времени. В последнюю неделю я случайно наткнулся на сайт netmf4stm32.codeplex.com и был приятно удивлен тем, что .NET MicroFramework был портирован на отладочные платы STM32F4. Так почему-бы не попробовать? Одновременно я описывал весь процесс, разбавляя текст скриншотами. Источником этой работы стал пост netmf4stm32.codeplex.com/discussions/400293. Благодарю LouisCPro и членов netmf4stm32.codeplex.com/team/view. Все это отняло у меня не более 2 часов (включая установку Visual C# Express 2010). Начнем…

Нам понадобится следующее

После того, как Вы все установили (пожалуйста, установите все), подсоедините кабель MiniUSB.

Подключение кабеля MiniUSB к STM32F4
(У меня была установлена другая прошивка, поэтому все легко запустилось)
Как только вы подключите карту, начнется поиск драйверов. Если вы уже установили утилиту STLink, драйвера будут установлены автоматически. Если-же вы пропустили это, пожалуйста установите ее. Запустите STLink (по умолчанию STM32 ST-LINK Utility.exe расположена в папке C:\Program Files (x86)\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility\)
image
STLink подключена к плате
После подключения к утилите очистите STM32F4 (не пугайтесь, вы не получите кирпич) следуя скриншотам ниже (по очереди запустите Erase Chip и Erase Sectors...)
image
Меню очистки
image
Очищение секторов
Сейчас чип очищен. Помните пункт 4 вначале, где указаны ссылки на два архива zip? Распакуйте их в удобное место (мы будем использовать их). В stm32f4discovery.zip вы увидите 3 файла: Tinybooter.hex, ER_Flash.hex and ER_Config.hex. Используя утилиту ST Link загрузите Tinybooter.hex в чип (следуйте указаниям на скриншоте ниже)
image
Раздел Program
image
Tinibooter.hex
Затем нажмите кнопку Reset на плате (или вытащите и вставьте кабель usb). После того, как вы загрузили Tinibooter.hex, кабель MiniUSB будет действовать только в качестве источника питания для нашего проекта. После перезагрузки вашей платы подключите кабель Micro USB (другой кабель). Я использовал кабель для зарядки своего смартфона.
image
Micro и Mini USB кабели подключены
Как только вы подключите кабель Micro USB, система запустит поиск драйверов и не найдет их. Установите драйвер, который находится в другом файле с именем «STM32_WinUSB_drivers_(for evaluation purposes only).zip». Руководствуйтесь скриншотами ниже, если вы не знаете как это сделать.
Перейдите в Devices and Printers (Устройства и принтеры) из меню Пуск, а затем
image
Нажмите правой кнопкой мыши на ярлык STM32.Net Test
image
Свойства -> Изменить настройки
image
Поиск нового драйвера
image
Игнорируйте предупреждение (как обычно )))
image
Сейчас ошибок нет!
Теперь MFDeploy должна быть в состоянии обнаружить плату. MFDeploy это MicroFramework Deployer. С помощью этой программы мы установим CLR, на котором будет работать наш .net код. Отлично, запустите MFDeploy.exe (вы найдете его в папке C:\Program Files (x86)\Microsoft .NET Micro Framework\v4.2\Tools\), который у вас должен появится после установки SDK. Что-бы убедиться, что MFDeploy видит плату, сделайте как показано ниже.
image
MFDeploy ping
Если вы видите ответ, значит все сделано правильно. Загрузите 2 других .hex файла (ER_Config.hex and ER_Flash.hex), распакованных из stm32f4discovery.zip в плату иcпользуя MFDeploy как показано далее
image
Нажмите Browse для загрузки hex файлов
image
Установите их в любой последовательности
Перезагрузите плату.
Поздравляю! У вас теперь есть плата с .NET Microframework!
Сейчас необходимо протестировать нашу плату. Откройте Visual C# Express/Visual Studio. Я уверен, что вы уже установили Microframework SDK. Выберите тип проекта
image
Проект MicroFramework
Теперь нам нужно изменить свойства так, что-бы Visual Express/Studio загружал проект в нашу плату. Настройте так, как показано ниже
image
Настройки
image
С помощью USB
Теперь нам нужно добавить класс что-бы мы смогли поморгать светодиодами.
image
Добавляем класс
image
Microsoft.SPOT.Hardware
Мой тестовый код

using System;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;

namespace STM32F_Test
{
    public class Program
    {
        public static void Main()
        {
            OutputPort led = new OutputPort(Cpu.Pin.GPIO_Pin1, false); //PA1 on discovery board

            while (true)
            {
                led.Write(true);
                Thread.Sleep(500);
                led.Write(false);
                Thread.Sleep(500);
            }
        }
    }
}

Узнать карту пинов платы можно в этом файле “C:\MicroFrameworkPK_v4_2\DeviceCode\Targets\Native\STM32\ManagedCode\Hardware\CPU.cs” который вы найдете, если установили комплект портирования (не включены в список свыше).
Оригинал статьи: singularengineer.wordpress.com/category/electronics

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 14

    +1
    отличная интересная статья, спасибо!
      +1
      Насколько глубоко реализована поддержка периферии? Таймеры, интерфейсы, USB — можно задействовать?

      Кстати, mini-USB для питания использовать необязательно. Если соединить PA9 с 5V плата будет питаться от micro-USB.
        +1
        В избранное!

        Вопрос про переферию меня тоже интересует, что то нигде не нашёл информацию как у них дела с переферией в порте обстоят…
          0
          тоже имею такую плату, но пока дальше побаловаться встроенной прошивкой (эмуляция мыши управляемая через акселерометр) не зашло.
            +2
            Проделал все указанное в статье, в целом всё работает. Несколько замечаний:
            1. Делать Erase Chip и Erase Sectors имхо излишне — во-первых эти два пункта делают одно и тоже, во-вторых при прошивке все равно выполняется очистка. Но это мелочь.
            2. После прошивки Tinibooter.hex система отказывалась видеть плату, резет или переподключение mini-USB ничего не дало. Помогла кнопочка Disconnect в ST-Link Utility.
            3. В студии при нажатии Deploy Project система ушла в BSOD. Deploy Solution выполняется вроде бы успешно. Отладка работает!
            4. С целью оценить оверхед, добавляемый фреймворком, заменил тело цикла на много повторяющихся строчек:
            led.Write(true); led.Write(false);
            Итог довольно печальный: частота полученного сигнала ~47кГц. Для сравнения на чистом С будет 84МГц. Таким образом, разница в 3 порядка.

            На «побаловаться» — сойдет. Но для чего-то более-менее серьезного пока сыровато. ПиСишный .NET хорош тем, что при запуске приложения IL компилируется в нативный код, поэтому особой разницы в производительности нет. Здесь же этого, видимо, не происходит (хотя я ожидал, что это произойдет при заливке кода на плату), поэтому имеем тормоза.
              0
              Для высокоуровневой логики и GUI — самое оно, чтоб не на С его клепать.
              А там где скорость нужна, понятное дело, не стоит дотнет юзать.
                0
                Я заранее прошу прощения. Далёк от схемотехники и embedded.
                Вы говорите что на процессоре с частотой около 80Mhz (http://www.ti.com/ww/ru/mcu/cortex_m4f/) у вас тело цикла состоящее из 2х инструкций выполнялось с частотой 84Mhz?

                Наверное я чего-то не понимаю. Объясните пожалуйста.
                  0
                  Не 80, а 168. По одному такту на инструкцию.
                  STM32F4
                    0
                    Забавно. А управление циклом ничего не кушает?
                    А вы замеряли или просто высказали догадку?
                      0
                      Я же писал
                      заменил тело цикла на много повторяющихся строчек:
                      led.Write(true); led.Write(false);

                      Аналогично для нативного кода будет примерно так:
                      GPIOA->BSRRL = 1;//set pin
                      GPIOA->BSRRH = 1;//rst pin
                      Чем больше таких повторяющихся пар в теле цикла, тем меньше влияние лишней инструкции перехода.
                      И да, естественно замерял.
                0
                Похоже судьба проекта .NET MicroFramework такая же как и у squawk(jvm) на этой платформе. Молодцы что разработчики портировали проект, народ почитает новость, попробует. А реально массово использовать в проектах никто не будет. java.net/projects/squawk/pages/BuildingSquawkForOtherMCUs

                IMHO ардуиновский wiring более прост в изучении и эффективен для быстрого старта. Народ его использует. Реализация libmaple для stm32 вполне стабильна
                  0
                  Интересно, а взлетит на STM32F103RBT6?
                    0
                    Только в параллельной вселенной, в которой бегемоты умеют летать. А в нашей это, может, и взлетит, но тормоза будут настолько чудовищны, что ничего серьёзнее «Hello, world» делать не будет смысла. Ещё нужно иметь ввиду, что периферия у STM32F4xx и STM32F10x разная, в том числе GPIO — значит, в .NET MicroFramework должны быть библиотеки для последних, а также способ выбора конкретной серии МК.
                      –1
                      Не кипешуйте, все нормально будет. Сейчас даже суровые native C — кодеры такты процессора не считают. Эволюция давно уже идет от нативного программирования к архитектурному, коллективному, и управлению процессом кодинга уделяется больше внимания чем самому коду.
                      Микрофреймворк кстати не так уж плох, если не пугаться и познакомиться с ним поближе. Практически няшечка, если не идти на принцип сурового олдскула.

                  Only users with full accounts can post comments. Log in, please.