"Hello, World" с ARM и Windows CE 6.0 на C#

ARM
Итак, попробуем написать тестовую программу для mini2440 и Windows CE 6.0. Для этого нам понадобится следующее:
— Visual Studio 2008 (можно с SP1)
— .NET Compact Framework 3.5 SDK (мои примеры будут сделаны с ним, ставится вместе с VS2008)
— библиотеки с драйвером GPIO вот отсюда www.domodom.fr/documentsJointsSpip/Driver%20GPIO%20v1.0.zip

Небольшое отступление «Почему именно студия и C#?»
Вообще под WinCE можно кодить много на чем. Изначально была такая штука, как Embedded Visual Studio, которая позволяла писать программы для портативных windows систем используя С++, специфические API и т.д. Однако с появлением .NET Compact Framework и C# Microsoft начала пересаживать на них всех разработчиков, причем не только ембеддеров, ибо просто, быстро и удобно. Плюсы студии и фрейворка в том, что можно достаточно быстро получить красивое приложение с окошками, кнопочками и прочими свистелками и перделками, при этом не вникая в код для описания этих самых окошек и кнопочек, студия все сделает сама, а разработчику можно углубиться в написание рабочего кода. Еще есть альтернатива в виде Qt Embedded, но я ее не пробовал. Еще плюс студии в том, что приложения можно отлаживать прямо на устройстве, достаточно подключить его к ПК, в студии выбрать в качестве Debug-target Windows CE Device и при нажатии кнопки дебага студия сама зальет программу на устройство и запустит отладку(на системах до XP включительно необходимо наличие ActiveSync, на Vista и Seven – Windows Mobile Device Center).

Ну, понеслась вода по трубам!
Создаем новый проект. File-New-Project-Visual C#-Smart Device-Smart Device Project, версию фреймворка выбрать 3.5, вводим имя проект (у меня Start_2440),

в следующем окне выбираем целевую платформу – Windows CE и шаблон – Device Application. Создастся новый проект и откроется дизайнер с пустой формой. Определимся, что будет делать наше первое приложение:
— нажатием кнопки можно включить или выключить светики на плате;
— отправить произвольный текст через СОМ-порт на другое устройство;
— подрыгать ножкой в разъеме GPIO
— отработать нажатие аппаратной кнопки на плате
Думаю для первого раза будет достаточно. Для начала выставим размер формы в 240 пикселей по ширине и 320 пикселей по высоте в свойствах формы. Добавим элементы интерфейса. Нам нужны четыре кнопки(Button), один TextBox, один ComboBox и один Label. Элемент mainMenu1 можно удалить, он нам не понадобится.



Зададим названия кнопкам и прочим элементам. Также добавим на форму элемент serialPort. Должно получиться следующее.



Откроем код, нажав кнопку “F7”. Там где задаются используемые namespace добавим namespace для работы с портами
using System.IO.Ports;

Из скачанного архива с драйвером GPIO для работы с портами ввода-вывода необходимо в Solution Explorer добавить в проект файлы из папки GPIO (ее надо положить в папку с проектом)Pin.cs, PinConfiguration.cs, PinValue.cs и Port.cs



и в исходник добавить строку
using Mini2440.GPIO;

Теперь сделаем так, чтобы можно было нажатием кнопок включать и выключать светики на плате. Они подключены к порту B к пинам 5, 6, 7 и 8. Для работы с пинами необходимо определить переменные типа Pin:
public Pin led1, led2, led3, led4; //объявляем переменные типа Pin для четырех ног МК к которым подключены диоды

Связываем наши переменные с портами и пинами. У меня это сделано с собитии загрузки формы Form1_Load.
led1 = new Pin(Port.PORT_B, 5, PinConfiguration.OUTPUT, PinValue.HIGH);
led2 = new Pin(Port.PORT_B, 6, PinConfiguration.OUTPUT, PinValue.HIGH);
led3 = new Pin(Port.PORT_B, 7, PinConfiguration.OUTPUT, PinValue.HIGH);
led4 = new Pin(Port.PORT_B, 8, PinConfiguration.OUTPUT, PinValue.HIGH); 

Распишу по порядку, что есть что:
Port.PORT_B — выбор порта
5 — прописываем номер пина (смотрим по схеме платы)
PinConfiguration.OUTPUT — режим работы пина, помимо OUTPUT можно выставить режим входа с подтяжкой(INPUT_WITH_PULLUP) и без подтяжки (INPUT_WITHOUT_PULLUP)
PinValue.HIGH — задаем лог. «1» на выходе или PinValue.LOW – лог. «0»
Теперь пины 5, 6, 7 и 8 порта В соединены со светодиодами, подавая на них «1» мы выключаем светики, подавая «0» — включаем. Напишем обработчики нажатия кнопок “LED on” и “LED off”:
Включаем
private void btLEDon_Click(object sender, EventArgs e)
        {
            //нажатием кнопки включаем все диоды
            led1.Value = PinValue.LOW;
            led2.Value = PinValue.LOW;
            led3.Value = PinValue.LOW;
            led4.Value = PinValue.LOW;
	   }

И выключаем
private void btLEDoff_Click(object sender, EventArgs e)
        {
            //и выключаем диоды нажатием другой кнопки
            led1.Value = PinValue.HIGH;
            led2.Value = PinValue.HIGH;
            led3.Value = PinValue.HIGH;
            led4.Value = PinValue.HIGH;
        }

Для работы с СОМ-портом необходимо добавить в событие Form1_Load следующую конструкцию
foreach (string str in SerialPort.GetPortNames()) //считываем имена всех COM-портов, имеющихся в системе
            {
                this.comboBoxPortName.Items.Add(str); //добавляем их имена в комбобокс, чтобы можно было выбрать нужный из списка. Можно эту конструкцию убрать и прописать имя СОМ-порта прямо в программе, но тогда для смены порта будет нужна перекомпиляция
            }

Теперь при запуске приложения в комбобоксе будет список всех имеющихся СОМ-портов в системе и можно выбирать нужный нам. Теперь напишем обработчик нажатия кнопки “Open”, которой мы будем открывать СОМ-порт, предварительно выбранный в комбобоксе.
private void btOpen_Click(object sender, EventArgs e)
        {
            //нажатием кнопки "Open" открываем СОМ-порт
            //в мини2440 при подключении к ПК выбираем СОМ1 поскольку именно он распаян через преобразователь уровней на разъем DB9M
            serialPort1.PortName = comboBoxPortName.SelectedItem.ToString();//берем имя порта, выбранное в комбобоксе
            serialPort1.BaudRate = 115200; //задаем скорость
            serialPort1.Open();//открываем порт
        }

Чтобы отправить что-то через СОМ-порт напишем обработчик нажатия кнопки “Send”, чтобы по ее нажатию отправлялся текст из текстбокса.
private void btSend_Click(object sender, EventArgs e)
        {
            serialPort1.WriteLine(textBox1.Text);
        }

Фиксировать нажатие кнопки будем по таймеру. Для этого добавим на форму компонент Timer и выставим время между тиками в 1 мс. В ту часть кода, где мы объявляем переменные типа Pin необходимо добавить переменную для нашей кнопки (я взял кнопку №1, которая подключена к пину 0 порта G.
public Pin led1, led2, led3, led4, btn1;

и
btn1 = new Pin(Port.PORT_G, 0, PinConfiguration.INPUT_WITH_PULLUP); 

В обработчик события timer1_Tick добавим следующее действие:
private void timer1_Tick(object sender, EventArgs e)
        {
            if (btn1.Value == PinValue.HIGH)//если кнопка нажата, т.е. на пине появилась лог. 1,
            {
                label1.Text = "Button 1 is pressed!";//то меняем текст label1
            }
            else
            {
                label1.Text = "None";//кнопку отпустили, появилась надпись "None"
            }
        }

Теперь при нажатии кнопки 1 у нас текст label1 будет изменяться на текст Button 1 is pressed!
И последнее, пускай по срабатыванию таймера у нас меняется 1 и 0 на каком-нибудь пине, который расположен на разъеме GPIO (CON5 на схеме и на плате). Я выбрал EINT17, который соответствует пину 9 порта G.



В код обработки события таймера, перед кодом определения нажатия кнопки вставляем такую конструкцию
if (gpg9.Value == PinValue.LOW)
            {
                gpg9.Value = PinValue.HIGH;
            }
            else
            {
                gpg9.Value = PinValue.LOW;
            }

Не забудьте добавить переменную gpg9 типа Pin по аналогии с диодами и кнопкой.
Вживую все это выглядит так:

Включаем плату, с карты памяти запускаем нашу программу, жмем кнопочки — мигаем светодиодами, смотрим присутствующие СОМ-порты, смотрим реакцию на нажатие кнопки 1, смотрим на осциллографе дерганье 9-й ноги порта G. Заранее извиняюсь за качество видео, снимал старим фотиком с рук. Как появится какой-нибудь штатив — пересниму.

Полезные ссылки:
Мой образ с интегрированным драйвером GPIO и .NET Compact Framework 3.5
rghost.ru/18110811

Совсем забыл прикрепить готовый проект с исходниками, качаем тут:
rghost.ru/18129191

За схемами и прочим барахлом идем на friendlyarm.net/

Комментарии (40)

RSS свернуть / развернуть
Классно! Плюсану. Кстати, смотрите, ща набежит vga.
0
А первая фотка вообще интересная :)
0
А чего там заинтересовало?
0
Да просо непривычно видеть родной масдай, запущеный на отладочной платке, в окружении железа и осцилла :)
0
Гм, почему?)
0
Очень радует, что стали появляться статьи об этом модуле.Продолжения жду с нетерпением)
+1
  • avatar
  • lejay
  • 16 августа 2011, 05:17
Всмысле, буду очень рад, если оно будет)
0
Ну я думаю что-то еще будет, поскольку есть желание разобраться с работой АЦП, поскольку текущий драйвер GPIO позволяет работать только с цифровыми ногами.
0
+1
Вот бы кто для этой платы кухню Андройда сделал, цены не было бы этому человеку)) Да и платы раскупили бы наверно.
0
Андроид… под него довольно геморройно что-либо писать(по крайней мере на первый взгляд), по крайней мере посмотрев талмуд по кодингу для оного сразу отпало все желание
0
Андроид имеет тяжелый старт в плане кодинга. Знакомый говорит все становится гораздо проще когда «втянешься». В свете последних событий думаю андроид именно та система под которую стоит учится.
+1
Android… No way.
0
Кстати, во сколько девайс обошелся?
+1
Брал давно, вроде было 135 баксов включая доставку.
0
Респект
наконецто нашелся человек который осветит все тонкости и на русском
шедевральный цикл статей
цены тебе нет pilamaster
респектую
п.с.
ща говорят уже 6440 можно за 100 баксов взять

вот бы еще знать как виндовс СЕ вылечить
а то вроди как образ будет работать несколько месяцев и потом гг))))
+1
либо качать с торрентов, либо для школьников, студентов и аспирантов можно получить для некоммерческого использования бесплатно и легально от Microsoft на сайте dreamspark.com (нужно зарегиться и отправить им скан ученического, студенческого или аспирантского билета). Тогда можно будет получить Platform Builder с помощью которого собирается образ системы (нужен еще BSP, который свободно скачивается с friendlyarm.net). Visual Studio 2008 Prof. тоже можно получить на дримспарке легально и бесплатно. Мой образ работает без ограничений по времени.
0
не погоди
я это все уже скачал и установил и собирал
ну у меня нет френдли но я на эмуляторе игрался

и на томже торенте я и прочитал в коментах что без лицензии
винда ЦЕ работает только пол года

меня это и убило

а вообще и лицензия так то не дорого стоит
вопрос в том что они оптом продаютса)))))

значит говориш про пол года это бред?
хм
это радует
0
нет, это не бред, сам видел образы, которые работают 180 дней, просто выложенный образ не имеет ограничений по времени работы.
Для ковыряния дома можно и без лицензии, раз в полгода образ перезаливать и все ну или на dreamspark брать, а для коммерческого использования конечно нужна лицензия, иначе банально могут взять за жопу и тогда денег угробится в разы больше, чем затраты на лицензию.
0
Всё решил))))
беру такой комплект

сама плата с дисплеем
www.wayengineer.com/index.php?main_page=product_info&cPath=50_68&products_id=210&zenid=dd52s1an1q95brfijhe4naj7h3

GPS модуль для нее
www.wayengineer.com/index.php?main_page=product_info&cPath=50_68&products_id=211&zenid=dd52s1an1q95brfijhe4naj7h3

И тройник RS232
www.wayengineer.com/index.php?main_page=product_info&cPath=50_68&products_id=494&zenid=dd52s1an1q95brfijhe4naj7h3

кто со мной)))) а то одному впцхать не охото))))
0
на него вроде как ведроид установлен ;)
0
Спасибо, что таки добрался до статьи! :)

Пара быстрых вопросов:

1. Сколько могут отдать ноги GPIO? Светодиоды обязательно через транзисторы?

2. В VS2008 со всеми этими доп. пакетами есть только один тип приложения на .NET CF — на WinForms, консольного приложения или сервиса нет?

3. Совсем обнаглею, если попрошу видео процесса компиляция/деплой/дебаг до первого брейкпоинта? Интересно, насколько это всё быстро и хорошо работает.
0
1) Не в курсе, надо искать инфу. На плате светодиоды подключены к МК катодом, а анодом через резюки к 3.3В, поэтому сказать сложно можно ли их наоборот подключить.
2) Есть Device Application (стандартное оконное приложение), Class Library, Console Application, Control Library 9для создания своих элементов интерфейса) и Empty Project(можно сделать все что угодно)
3) Попозже запишу, когда буду делать статью про отладку. Сейчас могу сказать, что компиляцию проходит достаточно быстро, а в целом быстродействие зависит от основного компа, одно дело компилять и деплоить на нетбуке(приходилось и такое делать) или на двухядерном стационаре с 4-мя гигами памяти.
0
3) Попозже запишу, когда буду делать статью про отладку. Сейчас могу сказать, что компиляцию проходит достаточно быстро, а в целом быстродействие зависит от основного компа, одно дело компилять и деплоить на нетбуке(приходилось и такое делать) или на двухядерном стационаре с 4-мя гигами памяти.
Ну как работает студия я уже привык :), интересует именно шустрость деплоя и запуска дебага. Жду продолжения… :)

Спасибо за ответы!
0
Отлично! Однозначно плюс! Может, даже сам на такую платку раскошелюсь…
0
  • avatar
  • _YS_
  • 16 августа 2011, 20:35
ХР-шные кнопочки и иконки не тормозят интерфейс?
0
нет, не тормозят, оно там по умолчанию такое, В MS любят красивости:)
0
… вопрос от балды — а компилятор какой нибудь на эту ось установить можно?
0
GCC вроде под нее собрать можно. По крайней мере под винмобайл 2003 точно был.
0
Было вроде что-то, но я не интересовался, т.к. кодить прямо на ней как-то не комильфо.
0
расскажите что за мобилка-оссцилограф. симпотичная
0
  • avatar
  • Sgm
  • 17 августа 2011, 06:23
0
DSO Nano(DSO201)
www.seeedstudio.com/depot/micro-digital-storage-oscilloscopedso-nano-p-512.html
И тут вроде про него тоже писали.
Брал на ебее за 70 баксов, сигналы частотой больше 200 КГц показывает уже не очень, а так вот по быстрому посмотреть сигнал самое то.
0
Я писал.
Но сейячас уже лучше смотреть в сторону DSO Quad от них же (seeedstudio, не dx).
0
Вроде как Влад себе заказал, интересно его мнение.
Я тоже хочу взять себе.
0
Судя по имеющейся у меня информации, если нано нравится всем кроме частотного диапазона и одноканальности — квад взять стоит. Из общих минусов у них неудобное управление, это вам не ригол с тучей кнопочек и шестью энкодерами, и ебанутый редкий разъем щупа (MCX). Заявленные характеристики уже уверенно большинство любительских нужд покрывают.
0
Да уж, цена не радует правда 199 баксов
DSO Quad
0
Когда я брал свой, квад еще только был в стадии тестирования, да и дороговато получается, я года полтора назад взял за 9000 (с копейками) руб. USB-осцилл masterkit.ru/main/set.php?code_id=442768 у него минус в том, что нужен комп, а так вполне адекватное устройство, ну а DSO — так чисто потыкать по быстрому. А если есть iPad, то можно за 300 баксов превратить его в осциллограф и логический анализатор:) www.wired.com/gadgetlab/2011/04/iscilloscope-300-kit-turns-ipad-iphone-into-multitouch-oscilloscope/
0
Основная фишка нано и квада — это их карманность, поэтому они незаменимы когда с осциллографом надо мотаться по клиентам/подвалам/чисту полю. Ну и они весьма быстро подготавливаются к работе, именно поэтому хороши для «по быстрому посмотреть». В этом плане конкурентов у них негусто, только фирменные мультиметры-осциллографы, но те как правило заметно больших габаритов.
Ну и еще если что — сгорит только дешевый осциллограф, причем (особенно нано) вполне ремонтопригодный.
0
private void button1_Click(object sender, EventArgs e)
        { 
            for (w = 0; w < 500000; w++)
            {
                led1.Value = PinValue.LOW;
                led1.Value = PinValue.HIGH;
            }   
        }

1.Получилась частота 50 кГц. Что больше никак не можно получить?
2.Кто юзал АЦП, за сколько времени идет одно преобразование?
0
  • avatar
  • VIC
  • 26 января 2012, 13:14
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.