Flash память STM32

Те кто знаком с восьмибитными контроллерами типа AVR и PIC, наверняка хорошо знают о такой нужной вещи как встроенная EEPROM память. Она позволяет сохранять в нее некоторые данные и потом считывать их после выключения/включения контроллера. Энергонезависимая память одним словом. Перейдя на контроллеры STM32 я с удивлением обнаружил, что такой памяти у них просто нет! Но как потом оказалось, существует аж целых две альтернативы такой памяти. Первая - использовать backup домен. Это не совсем энергонезависимая память, чтоб информация не разрушалась после выключения основного питания, к определенному выводу контроллера должна быть подключена батарейка (вроде тех, которые стоят в материнских платах). Об этом я подробнее расскажу в следующей статье. А сейчас мы рассмотрим второй способ энергонезависимого хранения пользовательских данных — flash память контроллера.

ЦАП в STM32

ЦАП (или DAC по-буржуйски)  это АЦП с точностью до наоборот - он преобразовывает некоторые цифровые данные в их аналоговое представление (читай напряжение). Говоря еще проще - ЦАП позволит нам относительно плавно изменять напряжение на ноге контроллера. Области практического применения: генерация звука, и сигналов произвольной формы. Можно прикрутить к контроллеру SD карточку и сделать wav плеер. Производительности контроллера точно хватит, ибо я делал такое даже на AVR, а у них кстати нет ни какого встроенного ЦАПа и я прикручивал внешний. Работать с ЦАПом очень легко, и в этой статейке я попробую рассказать все, что мне известно о ЦАПе в STM32. На картинке ниже - генерация синуса при помощи ЦАПа

stm32 dac

Генерация ШИМ в STM32

В предыдущей статье про базовые таймеры, мы в очередной раз мигали светодиодами, а в этот раз пойдем гораздо дальше и попробуем вкурить как заставить контроллер STM32 генерировать ШИМ. Для этого нам придётся использовать один из таймеров общего назначения, ведь именно у них есть всё что для этого нужно. Весь остальной  функционал  этих таймеров конечно впечатляет, но в моей практике он пока не пригодился. Хотя возможно, что в будущем мне пригодятся такие полезные фичи как функция подсчёта внешних импульсов и возможность аппаратно обрабатывать повороты энкодера. Но пока займемся ШИМом. Есть вот такая схема из контроллера, трех резисторов и RGB светодиода которым мы будем управлять. Управление заключается в том, чтоб плавно зажечь и погасить каждый цвет. Разумеется можно взять три разных светодиода если нет RGB.
 
rgb leds
 

Basic таймеры в STM32

Таймеры - это такая периферия контроллера STM32 позволяющая нам очень точно отсчитывать интервалы времени. Это пожалуй одна из самых важных и наиболее используемых функций, однако есть и другие. Следует начать с того, что в контроллерах STM32 существуют таймеры разной степени крутости. Самые простые это Basic timers. Они хороши тем, что очень просто настраиваются и управляются при помощи минимума регистров. Все что они умеют это отсчитывать временные интервалы и генерировать прерывания когда таймер дотикает до заданного значения. Следующая группа (general-purpose timers) гораздо круче первой, они умеют генерировать ШИМ, умеют считать испульсы поступающие на определённые ножки, можно подключать энкодер итд. И самый крутой таймер это advanced-control timer, думаю что его я использовать не буду еще очень долго так как мне пока без надобности управлять трехфазным электродвигателем. Начать знакомство с таймерами следует с чего попроще, я решил взяться за Basic таймеры. Задача которую я себе поставил: Заставить таймер генерить прерывания каждую секунду.

Прерывания в STM32

В этой статье я планирую поделиться с читателями своими скромными познаниями в области прерываний. Начать следует с того, что же представляют собой прерывания. Прерывание - это событие как правило связанное с каким-либо блоком периферии микроконтроллера STM32. Событий которые могут породить прерывание может быть множество. Например если речь о таком блоке периферии как UART, то там могут быть такие события: передача завершена, приём завершен, возникла ошибка чётности итд. Использование прерываний позволит нашей программе мгновенно регировать на подобные события. Сам термин прерывание говорит о том, что что-то должно прерваться и в нашем случае прервется выполнение основного кода вашей программы и управление будет передано некоторому другому куску кода который называется обработчиком прерывания. Таких обработчиков достаточно много, ибо периферийных устройств в STM32 предостаточно. Стоит отметить важный момент: В случае возникновения двух разных прерываний от одного блока периферии возникает одно и тоже прерывание. Например если произойдет прерывание по приёму байта через UART и прерывание по завершению передачи через тот же UART, то в обоих случаях будет вызван один и тот же обработчик. Для того чтоб определить какое из возможных прерываний произошло нужно смотреть на флаги состояния. И само собой очищать их перед выходом из прерывания. Когда обработчик прерывания отработает, управление будет передано той самой строчке кода, во время выполнения которой наступило прерывание. То есть основная программа продолжит работать дальше как ни в чем не бывало.