0
Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях сгенерирует одинаковый код. Можете проверить дизассемблером, входящим в тулчейн:
$ arm-none-eabi-objdump -d <бинарник проекта>
Кстати, ваш сниппет можно переписать компактнее, без if:
btn_state = (GPIOA->IDR & 1<<0) != 0;
Что касается курса, спасибо, рад, что он оказался полезен. Жаль, не было возможности его доделать, как планировал (а то и вовсе переделать, на свежую голову). Впрочем, на дворе конец 2018 года, и STM32 уже стали обыденностью, так информации сейчас куча, и вы можете найти что-нибудь посвежее :)
avatar

burjui

  • 23 ноября 2018, 20:07
0
На момент написания статьи таких команд не было. Давно не занимался ардуйнёй, не в курсе, какова ситуация сейчас.
avatar

burjui

  • 17 января 2017, 19:06
+1
Вам нужно добавить библиотеку LineDriver:
https://github.com/RoboCraft/LineDriver/archive/arduino-1.x.zip

С дополнительными библиотеками я малость перемудрил, конечно, сейчас бы сделал проще :)
avatar

burjui

  • 18 февраля 2016, 21:18
0
Быстродействие наверное теоретически ограничено частотой процессора, ведь еще есть минимальная длительность сигналов CLK и сам бит информации, верно?
Верно, но максимальная частота работы использованных в статье регистров — 50 МГц, так что вы ограничены только частотой МК.

необходимо в случае нажатия какой либо из них отправить в СОМ порт номер кнопки и зажечь светодиод в этой кнопке, для надежности наверное лучше еще принимать ответ от компьютера
Ну да, нужен массив. Вы пульт охраны делаете? :) Если да, то проверять ответ обязательно, как и сообщать о его отсутствии.

Нажатия будут не чаще чем раз в секунду.
Тогда вообще можно не париться.
avatar

burjui

  • 13 декабря 2015, 13:18
0
Вы правильно всё поняли. Но у каскадов сдвиговых регистров есть один недостаток: задержка считывания прямо пропорциональна длине каскада. На каждый считываемый бит нужно 1 раз «дёрнуть» CLK, а для 300 входов — 300 раз, соответственно. Частота «дёргания» ограничена быстродействием МК, и при большом количестве входов задержка может оказаться неприемлемой — возможно, придётся отказаться от функций Arduino и работать с периферией МК напрямую, что немного сложнее (но эффективнее).

Впрочем, если вы не планируете как-либо обрабатывать считываемые данные, и просто нужно, скажем, на каждую кнопку зажигать светодиод, то вы можете просто соединить выход последнего входного регистра в цепочке со входом первого выходного, и тогда можно обойтись без массива, а задача МК сведётся к дёрганию ножками:

// запомнили входы
LATCH(IN) -> 0
LATCH(IN) -> 1
// начинаем читать входы в выходы
LATCH(OUT) -> 1
// сдвигаем биты
300 раз {
  CLOCK(IN) -> 1
  CLOCK(IN) -> 0
  CLOCK(OUT) -> 1
  CLOCK(OUT) -> 0
}
// выставляем прочитанные входы на выход
LATCH(OUT) -> 0
avatar

burjui

  • 12 декабря 2015, 19:27
0
Похоже на то, что Eclipse пытается запустить ваш .elf как обычный исполняемый файл. Вероятно, у вас ошибка в отладочной конфигурации, или вместо подключения к GDB server используется обычная. А вообще, данная статья устарела, лучше перепроверить по другим источникам.
avatar

burjui

  • 18 июля 2015, 14:24
0
Боюсь, никак — это врождённый недостаток подобных дисплеев. По-хорошему, если хочется настоящей универсальности, следует использовать графические дисплеи, т.к. там можно нарисовать что угодно, и можно просто создать свой шрифт.
avatar

burjui

  • 27 июня 2015, 23:09
+2
В нашей лаборатории, с некоторых пор, живут тараканы. Если конкретнее — тараканы «Мёртвая голова»

Сенсация! По лаборатории RoboCraft разгуливают тараканы-нацисты. Шокирующие эксперименты российских учёных.
avatar

burjui

  • 13 мая 2015, 09:24
0
Работа отнимает много энергии, после неё не очень-то хочется кодить что-то ещё, даже для себя. Да и за время моего отлучения от написания статей по STM32 появилось огромное количество информации, поэтому если я и буду про них что-то писать, то, скорее, не в образовательном плане, а в более прикладном: не художественный пересказ документации, а какое-нибудь простенькое, но законченное устройство в каждой статье — желательно, полезное :) Статьи такого плана не только будет интереснее писать, но и получаться это будет ещё более неплохо (спасибо, кстати), т.к. не придётся делать самую нудятину — объяснять в деталях периферию. Думаю, инфы, необходимой для создания конкретного устройства, будет достаточно. К тому же, так можно быстрее добраться до крутых штук типа DMA.

А вообще, на работе я занимаюсь разработкой под Android, и возникали мысли сделать что-нибудь с использованием Android и STM32. Если есть интересные идеи на этот счёт — делитесь, с фантазией у меня туго. Беспроводная связь тут прямо-таки напрашивается, тема интересная.
avatar

burjui

  • 22 декабря 2014, 15:33
+1
Не могу сказать, что представлен передний край робототехники, по сравнению с любой другой отраслевой выставкой, конечно, очень бедно, но рост действительно виден невооружённым глазом.

Это точно: вон, робота на предпоследней фотке даже нижним бельём не укомплектовали.
avatar

burjui

  • 17 декабря 2014, 00:27
0
Доброго времени суток. Короче, ёпт, библиотеки кидай в папку libraries, где у тебя проекты Arduino лежат. Ну, или там, где Arduino IDE установлена. Вот так вот.
avatar

burjui

  • 17 июня 2014, 21:06
0
Правильно. Так странно, на первый взгляд, сделано по следующей причине: переменная captured_direction изменяется в прерывании (поэтому она объявлена как volatile) — это значит, что если мы станем использовать captured_direction в расчётах, может получиться такая картина:

// *** В данный момент captured_direction = FORWARD
if (captured_direction == BACKWARD)
{
   // что-нибудь делаем
}

// *** Здесь произошло прерывание таймера
// *** Сейчас уже captured_direction = BACKWARD,
// *** потому что переменная была перезаписана в прерывании.
// *** С этого момента любые расчёты, которые учитывают captured_direction,
// *** будут учитывать новое значение BACKWARD.

Вот поэтому сначала константа direction инициализируется значением captured_direction, а уже потом рассчёты предполагается вести с direction, которая в прерывании не меняется. Короче, мы работаем с копией данных, которые могут измениться в прерывании.
avatar

burjui

  • 5 марта 2014, 19:51
0
Крутим в одну сторону — 0, 1, 2, 3
Крутим в другую — 3, 2, 1, 0
Я говорю сейчас о кодах Грея (не Саши, а Франка). 2, 3, 1, 0 — это если читать числа, как есть. А в коде Грея это 3, 2, 1, 0. Если что-то не понятно, почитайте статью о коде Грея по приведённой в статье ссылке.
avatar

burjui

  • 1 июля 2013, 21:32
0
Отсыпьте мне вопросительных знаков, будьте любезны, а то у меня не хватает. Во-первых, не SSP, а SPP. Во-вторых, SPP — это, ВНЕЗАПНО, Serial Port Profile (Google не вчера изобрели). Это просто UART по Bluetooth. Не припомню что-то UART-клавиатур :D

Ясное дело, вам придётся найти прошивку или писать самому. В самом конце статьи есть ссылка на сведения о перепрошивке.
avatar

burjui

  • 27 июня 2013, 01:42
0
Вот поэтому я и говорю, что пользователям Arduino всё равно нужно знать C++, чтобы сделать что-либо, кроме стандартных примеров (:

В случае обработки нажатия кнопки вам нужно делать так:
reg_value = 0;
reg |= lamp_state_array[i] << i;
Дело в том, что запись
reg |= x;
эквивалентна записи
reg = reg | x;
Естественно, что вам нужно обнулять значение reg перед циклом на каждое нажатие кнопки.
avatar

burjui

  • 23 июня 2013, 20:02
0
Я не понимаю сути вопроса. У вас проблемы со сдвиговым регистром, с массивами или с битовыми операциями? Допустим, у вас есть массив 8 значений — 0 или 1, и вы хотите, чтобы каждый элемент массива «управлял» соответствующим выводом регистра, тогда код будет таким:

uint8_t array[8] = ...;
uint8_t reg_value = 0;

for (int i = 0; i < 8; ++i)
    reg_value |= array[i] << i;

digitalWrite(REG_SELECT, LOW);
SPI.transfer(reg_value);
digitalWrite(REG_SELECT, HIGH);
avatar

burjui

  • 23 июня 2013, 13:34
0
Решение корявенькое, конечно. Оно правда работает? Судя по коду, не должно. К тому же, что будет при попытке вывести один и тот же строковый литерал два раза подряд? Обычно компилятор назначает одинаковым строковым литералам одинаковые адреса памяти, чтобы минимизировать использование памяти. Это работает корректно, т.к. строковые литералы по стандарту C++ являются указателями на константные данные (const char *) и неизменяемыми. В вашем же коде переданный литерал («Привет, мир!») меняется

data[i] = RusChar(data[i])
и так делать — плохо.

Как бы там ни было, если оно-таки работает, я бы рекомендовал сделать что-то вроде:
char* RusStr(const char *in, char *out)
{
  for ( ; *in != 0; ++in, ++out)
    *out = RusChar(*in);

  return data;
}
Ну, и объявление utf_hi_char должно, по смыслу кода, быть таким:
static uint8_t utf_hi_char;
avatar

burjui

  • 16 мая 2013, 21:21
0
Возможно, я ошибся при сборке утилиты stlink, не положив нужные библиотеки (*.dll). Так или иначе, на сегодняшний день статья несколько устарела, и вместо stlink лучше использовать OpenOCD, который работает быстро и надёжно. В дистрибутиве OpenOCD в папке scripts/board есть готовые конфиги для плат STM32xxxDiscovery, только нужно установить фирменный драйвер для отладчика ST-Link.
avatar

burjui

  • 5 мая 2013, 15:14