Первый старт с STM32-Discovery [Часть 7 – Система тактирования + RTC таймер]
Сегодня по плану: система тактирования и таймер часов реального времени RTC.
Система тактирования Согласно документации (Reference manual RM0041) в качестве источника тактовых сигналов (SYSCLK – системные тактовые сигналы) могут выступать три источника:
- HSI oscillator clock – внутренний высокочастотный генератор
- HSE oscillator clock – внешний высокочастотный генератор
- PLL clock – ситема ФАПЧ
HSE oscillator clock – внешний высокочастотный генератор
Источником сигналов для HSE генератора может быть как внешний тактовый генератор, так и обычный кварцевый или керамический резонатор.
Для установленного на плате STM32-Discovery микроконтроллера частота внешнего сигнала не должна превышать 24 МГц, в случае если вы используете внешний тактовый генератор, а при использовании кварцевого (керамического) резонатора его частота должна быть от 4 до 24 МГц.
Внешний сигнал может иметь форму пилы, синусоиды или прямоугольных импульсов со скважностью 50%.
HSI oscillator clock – внутренний высокочастотный генератор
HSI генератор представляет собой RC-генератор с частотой 8 МГц, он тактирует интерфейс программирования флеш-памяти, может быть источником тактовых сигналов (SYSCLK), а так же может служить источником опорных сигналов для ФАПЧ (однако при этом его частота делиться на два, т.е. составляет 4 МГц).
Данный генератор проходит калибровку на заводе и производитель гарантирует точность в 1% при температуре 25 градусов Цельсия.
PLL clock – ситема ФАПЧ
Система ФАПЧ (фазовая автоподстройка частоты) грубо говоря производит умножение опорного сигнала (доступны коэффициенты от 2 до 16), однако частота на выходе системы ФАПЧ должна лежать в пределах 16-24 МГц.
Так же имеются два вторичных источника тактовых сигналов:
- LSI RC – внутренний низкочастотный RC-генератор (40 кГц)
- LSE crystal – внешний низкочастотный кварцевый генератор (32 кГц)
От внутреннего низкочастотного RC-генератора тактируется сторожевой таймер, так же от него может тактироваться RTC-таймер, по сигналам которого можно выводить микроконтроллер из спящего режима.
Все эти источники можно независимо включать и выключать, это особенно актуально когда необходимо снизить потребляемую мощность.
После кратенького рассмотрения небольшой скриншот из документации:
Не плохо бы все это дело потрогать руками , к этому мы и переходим.
Работаем с источниками тактовых сигналов
Сразу несколько ссылок где можно почитать о работе с системой тактирования:
ARM. Учебный курс. Тактовый генератор STM32
Программирование STM32. Часть 2. Система тактирования STM32
Сегодня мне интересен внутренний низкочастотный RC-генератор (40 кГц), а так же внешний низкочастотный кварцевый генератор (32 кГц), так как на плате установлен кварц на 32768 Гц.
LSI RC – внутренний низкочастотный RC-генератор (40 кГц)
Для активации генератора достаточно разрешить его работу установкой соответствующего бита и дождаться установки бита готовности:
Для деактивации достаточно сбросить бит разрешения работы:
Не так уж и сложно :)
LSE crystal – внешний низкочастотный кварцевый генератор (32 кГц)
С этим генератором не много сложнее, так как он относится к резервной области (Backup domain) разработчики постарались максимально защитить работу узлов данной области, поэтому первым делом необходимо разрешить тактирование модулей управления питанием и управлением резервной областью:
После этого разрешить доступ:
И только после этого установить бит разрешения работы и дождаться установки бита готовности:
Выключить генератор можно только путем программного сброса:
Таймер часов реального времени RTC
Пожалуй самый простой таймер в данном микроконтроллере. Данный таймер так же относится к резервной области, следовательно что бы включить его и сконфигурировать нужно снять блокировку и он может работать от резервного источника питания, как правило это батарейка.
Наличие четырех байтного счетного регистра позволяет вести счет без переполнения до 2^32, т.е. при инкрементировании раз в секунду может считать без переполнения до 136 лет (если не ошибся :)).
У прощенная функциональная схема:
Я не зря остановился на двух низкочастотных генераторах, так именно они могу выступать в качестве источника тактовых сигналов (и ещё сигнал внешнего высокочастотного генератора деленного на 128). Поэтому если у вас не установлен внешний кварц используйте внутренний генератор.
Таймер ведет счет линейно следовательно нам необходимо парсить на временные составляющие: секунды, минуты, часы, дни и т.д. Однако ещё стоит вопрос делать ли просто часы-таймер, или же реализовывать полноценный режим с определением: дня недели, месяца, високосного года. Так как я сам ни разу этого не делал (использовал ИМС DS1307 - часы-календарь) решил замахнуться на полноценный режим работы, тем более что есть пример от производителя:
Скачать пример: AN2821 Clock/calendar implementation on the STM32F10xxx microcontroller RTC
Почитать в WiKi о “Вечном календаре”
Я не очень вдавался в алгоритм реализации часов в примере, так как хотелось немного размять мозги после праздников :) поэтому мое видение часов-календаря:
- за точку отсчета принимаем 2000 год, так как цикл составляет 400 лет (почему)
- что бы не усложнять алгоритм работы введем ограничение на время корректной работы до 2099 года, чего я думаю достаточно ;)
- на данный момент думаю не делать ввод времени, т.е. нам пока нужно понять сам принцип работы с RTC и разобраться с алгоритмом часов-календаря.
- для индикации используем двухстрочный ЖКИ.
Расчет дня недели взял из примера:
Результат число от 0 до 6 [воскресенье, понедельник, … суббота].
Кратко об алгоритме работы часов-календаря.
После старта проверяем активирован ли таймер, если нет преобразуем дату, заносим в счетный регистр и активируем таймер от внешнего генератор, если да просто считываем значение преобразуем и выводим на индикатор.
Конвертор даты в значение счетчика:
и обратное преобразование:
Если бы не наличие високосных лет, то было бы попроще :)
Для наглядности выставил предварительный делитель у таймера в 1, тем самым ускорив процесс:
С оптимизацией сильно не заморачивался, если кто захочет доделает.
Я так же немного поправил работу с портами, так как решил оставить в качестве базы заголовочник от производителя stm32f10x.h.
Задавали вопрос по компиляции, достаточно установить ПО, скачать архив с файлами проекта, распаковать в удобное для вас место и в корневой директории проекта выполнить команду make all, с данным проектом результат вывода вот такой:
Увидели ошибку напишите мне, хотя бы коммент ;).
Добавлено 2011-07-02
После разрешения доступа к RTC и Backup регистрам, нужно запретить доступ:
comments powered by Disqus