Цветовая маркировка резисторов используется чтобы размещать информацию на корпусе малого размера, в читаемом виде и устойчивом к частичной утрате этой читаемости например из за повреждения корпуса, частичной покраски или закрытию обзора части корпуса соседними элементами. На корпусе обычно, цветными полосами, указывается сопротивление и допуск (т.е. неточность с которой указано сопротивление). Чтобы прочитать эту информацию нужно повернуть резистор так чтобы ближайшая к выводу или самая широкая цветная полоса располагалась слева. В т.с. самая левая полоса укажет первую цифру сопротивления, самая правая полоса укажет допуск (чаще всего она золотого, серебрянного или черного цвета (по этому признаку также, с большой долей вероятности можно определить стороны))(и если это не трехполосый резистор у которого допуск не указывается и всегда +-20%), вторая справа полоса укажет множитель на который следует умножить число составленное из цифр по самым левым полосам чтобы получилось сопротивление в омах. Сопротивления входят в стандартные ряды например E12, E24, E96. У резистора с 3мя цветными полосами могут быть сопротивления из ряда E12, У резистора c 4мя из E24 и у резистора с 5ю из Е96. 3х полосые резисторы самые не точные. 5ти полосые прецезионные а 4х полосые самые распространенные. Ниже приведен кодер/декодер цветовой маркировки резисторов для всех трех вариантов.
Ранее мы рассматривали аппаратный DIY генератор шума на транзисторах который совсем не трудно изготовить самостоятельно. Однако если возможностей самодельного аппаратного генератора не хватает или он по каким то причинам не подходит то можно воспользоваться программным генератором на данной странице. У данного генератора есть кнопка запуска и остановки, возможность записи и сохранения шума, таймер сна, регулировки громкости, частоты среза фильтра низких частот, динамики изменения шума (можно поставить на 0 если не нужна) и некоторые предустановленные режимы настроек.
Если вдруг генератор перестал работать из за частых переключений то для восстановления его работы можно перезагрузить страницу.
Одной из не обязательных но тем не менее весьма полезных функций в микроконтроллерах STM32 является DMA (Direct Memory Access) т.е. дословно "прямой доступ к памяти". В микроконтроллерах такую функцию обычно выполняет специальный контроллер. Также таких контроллеров может быть больше одного. DMA контроллер может выполнять передачу данных из одной области памяти в другую область минуя центральный процессор, который в этот момент может выполнять какие то более сложные функции. Поскольку передача данных это очень частая в практике и очень ресурсозатратная операция то наличие DMA контроллера позволяет значительно повысить производительности микроконтроллера в целом. Даже с учетом того что шина данных используемая и процессором и DMA контроллером одна и это отчасти несколько ограничивает эффективность такого распараллеливания, в целом всё равно использование DMA имеет смысл. Например нам нужно чтобы данные поступающие из UART или SPI попадали в массив расположенный в оперативной памяти. Возьмем для начала UART1 и попробуем через DMA передать данные в GPIO для наглядности. Как обычно сперва добавляем заголовочные файлы библиотек и макросы. Использовать макросы не рекомендуется для лучшей удобочитаемости кода. Однако они всё таки могут быть полезны. Например можно использовать макросы для простой и быстрой настройки каких либо часто используемых режимов какой либо периферии. Ниже пример макросов для настройки на самые часто используемые режимы GPIO и включение тактирования.
Данные будем брать из UART1 и передавать в порт B а чтобы было видно результат, можно подключить трехцветный светодиод на свободные пины порта B
Порт B используется потому что на порту A работает UART1 и передача данных туда, может помешать работе UART1. Далее, как обычно, настраиваем пины и uart (о том как это делается см. предыдущие уроки по STM32) но только на этот раз дополнительно устанавливаем 6й бит третьего управляющего регистра UART чтобы включить DMA приемник.
USART1->CR3 |= 1<<6;
В используемом микроконтроллере имеется 2 DMA контроллера. У первого есть 7 каналов у второго 5. Каждый канал может проводить только определенные запросы от определенной периферии. Для того чтобы выяснить какая периферия каким каналам соответствует есть две таблицы в мануале. Одна для первого DMA вторая для второго. Т.к. UART1 есть на DMA1 то нас интересует первая таблица. Из неё мы находим нужный нам канал. Это пятый канал первого DMA по тому что на нем uart1 приемник.
DMA1_Channel5
Также ещё важно не забыть включить тактирование DMA1.
RCC->AHBENR |= 1;
В регистр периферии DMA1 передаем адрес регистра данных UART1. В регистр памяти DMA1 передаем адрес порта B. Т.о. обозначив направление передачи данных.
// 2. Указываем адрес периферии (регистр данных UART1)
DMA1_Channel5->CPAR = (uint32_t)&(USART1->DR);
// 3. Указываем адрес назначения (регистр ODR порта GPIOB)
DMA1_Channel5->CMAR = (uint32_t)&(GPIOB->ODR);
В регистр количества пересылок записываем единицу по тому что больше пока не требуется.
DMA1_Channel5->CNDTR = 1;
В конфигурационном регистре устанавливаем только биты 5 для циклического режима т.е. неоднократной передачи и бит 1 для включения DMA1. Остальное установлено по умолчанию так как нужно.
DMA1_Channel5->CCR = 1<<5 | 1;
Основной цикл пуст (при желании его можно заполнить), прерывания тоже не используются. Можно сказать что всю нужную работу, в данном случае, выполняет только DMA и если всё заработает то значит работает DMA. Полный код:
В итоге всё заработало. После загрузки прошивки, визуально светодиод начал реагировать на поступающие на плату символы.
Адрес биткоин кошелька для поддержки блога - bc1qlhrmmkh77x2lzhqe4lt9qwkglswj64tsqt2l5g