Когда вы давно занимаетесь разработкой прошивок и у вас сформировался некий костяк инструментария, то вы наверняка снабдили себя всеми необходимыми программами, или по крайней мере, знаете как снабдить. А если вы только что планируете освоить STM32, то совсем неочевидно как собрать весь софт для работы с нуля и как заставить его работать. Тут и там пишут, "чтобы скачать это, перейдите на страницу официального сайта и зарегистрируйтесь.." И тут, начинается настоящий квест с обходом блокировок, невозможностью обновлений репозитариев. Когда у вас нет людей, у которых вы можете что-то спросить, вы буквально вынуждены бросить любое обучение и дожидаться лучших времен. Однако я немножечко всем помогу, прямо в этой статье, расскажу куда идти, что качать. Этого хватит для учебы. На первое время.

Аналогово-цифровой преобразователь - это узел, который "оцифровывает" мгновенное значение напряжения. В STM32F1 содержится два 12-битных преобразователя, а это значит, напряжения на любом канале АЦП будут представлены значением от 0 до 4095. Какое напряжение на канале на самом деле, вы сможете понять, если наверняка знаете напряжение питания АЦП (VDDA). Предположим, что питание микроконтроллера 3.30V, это значит, что показание АЦП 4095 соответствует этому напряжению, 3.30V. Показание АЦП 2048 единиц, это будет 1/2 от VDDA, а конкретно 1.65V. Эти величины меняются линейно, в зависимости от напряжения на канале АЦП. При напряжении питания 3.3В "вес единицы" АЦП будет 0.806 мВ. При напряжении питания 2.8В "вес единицы" АЦП будет 0.684 мВ. Думаю, принцип вы уже поняли.

АЦП не может замерять напряжение на нескольких каналах одновременно. Между АЦП и каналами стоит мультиплексор, который может захватывать только один из десяти возможных каналов. Однако если измерять каналы быстро по очереди, то можно создать эффект параллельности измерений. Эффективно и достаточно точно значения измеряются при меньшей частоте работы АЦП и большем Sampleticks. Более-менее сносно можно делать около 18000 замеров (выборок) в секунду. Минимальное время выборки для 12-битного режима - 1 мкс (то есть до 1000000 выборок в секунду при тактовой частоте АЦП 14 МГц).

В этом уроке мы будем пользоваться АЦП STM32F103 в самом простом режиме — одиночной конверсии. Это когда за одно преобразование мы обрабатываем только один канал. В этом уроке я покажу неблокирующую работу с АЦП (без прерываний) на разных каналах.

Широтно-импульсная модуляция в микроконтроллерах STM32F1 реализована через таймеры общего назначения TIM1, TIM2, TIM3. К каждому из этих таймеров можно «подцепить» до четырех выходных каналов. Принцип работы ШИМ очень прост: 
1) таймер тактируется от своей шины через Prescaler (делитель частоты) и считает, допустим, «вверх».
2) Как только счетчик таймера достигает значения равного значению регистра ARR (Auto-reload register), то он (счетчик) перезагружается, или, простыми словами, обнуляется и считает заново.
3) У каждого канала есть регистр CCR (Capture/compare register). Когда значение счетчика меньше CCR, на канале PWM (на выходе) высокий уровень. Когда значение счетчика равно CCR или больше, то на канале низкий уровень.
4) Работа таймеров, и, следовательно ШИМ, не занимает процессорного времени, они работают независимо друг от друга.

Tags: ,

Казалось бы, что может быть знакомее старой доброй AVR? Она на начало 2025-го настолько уже мне была неинтересна, что я даже не подозревал как сильно она мне понадобится. А еще, меня обескуражило то, как это непросто и нетривиально: работать с ATTINY10. Эта история для вас будет поучительной, потому что задача решена и остается лишь взять наш опыт на вооружение. Здесь нет никаких революционных открытий, но все же я делаю упор на предоставление расширенной информации. То что мне не удавалось прочитать "между строк" где-то в одном месте, но пришлось собирать информацию по сети, проверять и конечно - делиться!

Это синхронная шина обмена данными в которой присутствует один Master (ведущий) и от одного до нескольких Slave (ведомых). Соединены все по трем проводам GND, SDA (данные), SCL (тактирование).

Конфигурирование периферии I2C начинается с разрешения ее тактирования, затем нужно настроить GPIO, к которым будет подключена I2C. В примере ниже, I2C1 расположена на PB7 (SDA) и PB6 (SCL). Оба этих пина настраиваются как Alternate output Open-Drain (CNF=11, MODE=11).

Далее я приведу пример настройки интерфейса I2C в режиме мастера на скорости 100 кГц. Данный режим будет использоваться мной для работы с EEPROM памятью серии 24Сxx.

Tags: ,