Уже в течение продолжительного времени, периодически достаю из ящика свою Raspberry PI, сдуваю пыль и ложу обратно 🙂 Наконец решился взяться всерьез за это дело.

Немного о текущем состоянии дел. Довольно давно не было обновлений на сайте, полгода прошло. Как раз в то время, мне довелось переносить относительно большой проект с STM32L1 написанный с использованием SPL, под новый камень STM32L4, под который не существует SPL, а так как времени не было совсем, то решил юзать HAL.

Как по мне, HAL перекрывает большинство запросов обычного человека, по инициализации периферии. Да были и баги, лично столкнулся с несколькими, но писать об этом нет смысла, ибо это могут пофиксить в свежей версии либы. Несмотря на большой размер, документация вполне себе понятная. Если уж говорить про уровень регистров, то в L1 и L4 довольно много различий, опять же писать о них бессмысленно, так как все слишком быстро устаревает и меняется, а тому кому это интересно и так откроет референс и все увидит.

В общем, писать статьи об настройке периферии STM32 потеряло всякий смысл. Была и другая информация, но так как она довольно специфичная, то я пришел к выводу, что это не будет никому интересно. Тем не менее есть и интересности, вроде датчиков и интерфейсов, думаю постепенно все таки буду выкладывать статьи.

Текущий курс статей будет направлен на другой более широкий круг проблем, так как четких целей пока нет. Есть Raspberry Pi, есть желание, остальное по ходу будет понятно. Для тех кто не знает, что это такое: это одноплатный компьютер, втыкаем в него мышку, клавиатуру, монитор и получаем обычный компьютер, на котором можно делать большинство тех же задач, что вы делаете ежедневно. Наиболее часто встречаемый пример использования это мобильные телефоны и планшеты на базе Android.

Чем хороши одноплатники, у них много интерфейсов, те же GPIO, UART, I2C, SPI и т.п., но есть и ништяки покруче вроде hdmi, wifi, bluetooth, usb, камеры и т.п. Больше производительность, больше оперативной памяти в сравнении с микроконтроллерами, возможность установки операционной системы, аппаратная обработка видео и звука.

Но скажу честно, что отношусь к миру одноплатников довольно скептически, ибо все проекты, которые воистину для меня интересны, можно на пальцах рук пересчитать и либо очень сложные, либо очень специфичные. Все остальное либо шлак, либо решаемо микроконтроллером, но надеюсь боевого запала хватит для того момента, когда доберусь до реально интересного.

По поводу выбора платформы, только по причинам — доставаемости, сообщество и она у меня есть. Но если в процессе появится более достойный кандидат, то перейду без сомнений.

Окей, все же хоть и четких целей нет, но некие рамки есть. Интересна работа с видео, камерой, дисплеями, возможно OpenCV. Интересен GUI, вроде опроса кучи датчиков и отрисовки всяких графиков, интересна работа с всякой периферией. Возможно драйвера. Может обработка звука. Если придумаю еще что то или есть интересные идеи пишите, добавлю.

Надо сказать, что много о чем не буду писать, например нет смысла описывать что такое printf или как работать с консолью, ибо это легко гуглится и осваивается. Предполагаю, что базовые вещи о периферии вы знаете из статей про микроконтроллеры. Юзать будем Raspbian, накатить его никакой проблемы не составляет. Целью кого то учить не ставлю, но буду рад если это кому то поможет.

Так как из всех тем периферия мне ближе всего с нее и начну. Работаем в консоли (terminal). Кое что на всякий случай из полезных команд:

sudo ... ///открыть с правами суперпользователя
ls -a    ///посмотреть содержимое каталога
cd /usr  ///перейти в другой каталог
nano hello.c  ///открыть в текстовом редакторе файл

Писать будем на Си, ибо я его люблю и пока есть возможность использовать его, будем юзать его. По идее GCC предустановлен в Raspbian, проверьте в консоле gcc -v, если установлен то выдаст версию. Если это не так, то установите.

Перейдите в удобный каталог и создайте исходник.

sudo nano hello.c

Пишем исходник

#include <stdio.h>
 
void main(int argc, char *argv[])
{
  printf("hello!!!\n");
  return;
}

Компилируем

sudo gcc hello.c -o hello

Запускаем программу

./hello

Как итог, в консоль должно выдаться сообщение
hello_pi

Считаем Hello world освоенным, поэтому сразу двигаемся дальше.

Теперь попробуем зажечь светодиод

#include <stdio.h>
#include <stdlib.h>
 
void main(int argc, char *argv[])
{
  FILE *fp;
 
  printf("hello!!!\n");
 
  fp = fopen ("/sys/class/gpio/export", "w");
  fprintf(fp, "17");
  fclose(fp);
 
  fp = fopen ("/sys/class/gpio/gpio17/direction", "w");
  fprintf(fp, "out");
  fclose(fp);
 
  fp = fopen ("/sys/class/gpio/gpio17/value", "w");
  fprintf(fp, "1");
  fclose(fp);
 
  return;
}

Вот тут остановимся поподробнее. Итак если вы помните, то чтобы зажечь светодиод на микроконтроллере, нужно сделать минимум две вещи: настроить ножку на выход, подать на нее лог 1. Как мы помним любой регистр микроконтроллера это адрес в памяти, т.е. для настройки мы должны открыть даташит, посмотреть адрес порта, настроить его записью нужных значений, потом записать по другому адресу значение, которое надо выдать на порт.

На аппаратном уровне здесь все тоже самое, есть определенных адрес куда вы должны записать что то, но увы в linux нельзя напрямую записать что то в память из пользовательского пространства. Есть несколько методов, но мы рассмотрим универсальный. Заключается он в том, что любая нога представляется как обычный файл. Да да, вы просто пишите в файл 1 и у вас включается ножка, пишите 0 — выключается. Достоинство то, что это работает на любой плате, недостаток — низкая скорость обработки.

Итак в начале мы открываем файл «/sys/class/gpio/export» и пишем туда 17. После этого ядро создаст в каталоге /sys/class/gpio/ папку с файлами, которые позволят нам управлять 17 ногой. Далее в файл direction пишем направление ножки, т.е. выход out. И наконец в файл value запишем 1. После этого нога включится. Если записать 0, то нога выключится. Вы можете для интереса перейти в файловом менеджере в каталог и записать в файл value 1 или и посмотреть как нога включается/выключается.

rpi_40

Выводы: ногой дрыгать через sysfs просто, пишешь в файл получаешь результат, очень просто, очень универсально. На каком то сайте, были сравнения ногодрыга, подобным образом удавалось выжимать килогерцы. Думаю этого вполне достаточно на текущий момент. В следующий раз немного улучшим наш ногодрыг, добавим мигалку.

8 комментариев: Зажигаем светодиод на Raspberry Pi

  • позор мне, Даже не знаю что такое ваш распбери пойду что-ли вики почитаю))

  • Да забавно вышло, как то вылетело из общей массы текста, надо добавить. UPD: добавил чуток

  • Попробуйте библиотеку wiringpi — очень удобная с кучей функций и примеров(UART, LCD, Adafruit I2C LCD и тд). По поводу SPL и HAL, вот недавно начал копать STM32, начитавшись интернета, заодно прислушавшись к гуру DiHalt думаю нужно все-таки делать упор на CMSIS.

  • Пробовал, работает, но либа специфичная для Raspbian, поэтому особой ценности не имеет. Пока что меня интересуют стандартные возможности, то что будет работать на любой сборке, на любом железе. По поводу голого CMSIS, дихольт писал эти статьи уже довольно таки давно и поверьте, не будете вы на регистрах инициализировать карту памяти например или АЦП с ДМА, ну нет в этом никакого смысла, кроме академического. Если же нужно для проекта, то все равно будете придумывать какие то обертки, какие то макросы. Этим заниматься можно только от полного безделия. У меня довольно таки большой проект реализован, вся инициализация полностью с использованием хала, критичные участки и те места, которые в хале сделаны через жопу переписывал на CMSIS, но в остальном все работает без нареканий.

  • А если например использовать библиотек bcm2835-1.17. с хедером #include ?

  • Тут ситуация следующая: если мне нужно будет срочно решить какую то задачу и там без платформозависимой либы будет никак, то естественно я возьму wiringpi или bcm2835. Но это не принесет мне знаний, так как эти штуки заточены конкретно для распбиана и малины, как настраивать GPIO и как работать с ними, я и так знаю суть точно такая же как у микроконтроллеров. Предположим завтра появится новый одноплатник, у которого не будет wiringpi и bcm2835 подобных библиотек, то я могу с легкостью воспользоваться стандартными средствами и подрыгать GPIO не взирая на отсутствие библиотек.

  • Тут еще такой момент, сколько продержится карта с таким режимом записи в файл? Всегда интересовал данный вопрос.

  • вот вопрос интересный, но предполагаю, скорее всего что на карту ничего не пишется. Просто интерфейс универсальный. Ведь никто не говорит, что функция write пишет на карту

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Последние комментарии
  • Загрузка...
Счетчик
Яндекс.Метрика