Найти тему
Uninterest

STM8S Система тактирования разбираемся

#разбираемся

И так прочитав первую иностранную статью про тактирование надо бы разобраться подробнее, что это и с чем это едят.

Что же мы имеем? Ссылаться не буду на ардуино или контроллеры атмега. У них все это устанавливается с помощью фьюз битов. Кроме того, я в итоге даже не добирался до момента можно ли в случае аварии внешнего кварца переключиться на внутренний RC генератор в контроллерах атмега.

У нас же тут есть следующая страшная картинка:

На первый взгляд картинка страшная и не понятная. Если разобраться, то ничего сложного в ней нет.

И так видим, что у stm 8s есть три источника тактирования.

· Внешний кварц по-иностранному (High Speed External ) HSE

· Внутренний высокоскоростной RC -генератор по-иностранному (High Speed Internal ) HSI

· Внутренний низкоскоростной RC -генератор по-иностранному (Low Speed Internal ) LSI

Переключатель, который (Master Clock Hex ) это, по сути, регистры в которых можно задать один из источников тактирования установкой битов. На деле при использовании стандартной периферийной библиотеки это делается с помощью функций.

Так же как мы можем увидеть у высокоскоростного RC -генератора, есть делитель. С помощью которого можно установить деление частоты на 1, 2, 4, 8. Я так понимаю это предназначено для того, чтобы можно было подогнать частоту под частоту внешнего кварца, если нет необходимости использовать 16МГц. Так как в контроллере есть система аварийного переключения с внешнего кварца на внутренний в случае, если по каким-то причинам внешний кварц перестал работать.

Далее тактовая частота после переключателя может быть так же поделена для ядра и тут есть возможность уже частоту получаемую с внешнего кварца или с внутренних кварцев поделить на 1, 2, 4, 8, 16, 32, 64, 128.

Так же можете обратить внимание на то, что внутренний низкоскоростной кварц используется для сторожевых таймеров и для системы пробуждения контроллера. Причем систему пробуждения контроллера можно завести и от внешнего кварца.

NB ! Но так как в опубликованных переведенных статьях не было еще разговора о сторожевом таймере и системе пробуждения мы пока рассматривать их не будем наша задача разобраться с тактированием.

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

Минус данной системы в том, что в случае срабатывании, контроллер перевести обратно на внешний кварц невозможно без перезагрузки. Я так понимаю это состояние воспринимается, как критическая ошибка, требующая внимания. А перевод на внутренний генератор предназначен, чтоб контроллер перешел в безопасное состояние и сообщил о том, что у него все плохо.

Еще одна из вкусняшек это возможность вывода тактирующего сигнала на ножку контроллера. Назначение этой фишки мне пока не понятно, но одно из предположений, что в данном случае есть возможность тактировать, какую-то внешнюю логику от микроконтроллера. А для нас это отличная возможность посмотреть, как когда и на что переключается источник тактирования.

Так же можно обратиться внимание, что для вывода на ножку доступны разные источники. От главного источника тактирования, до встроенного низкоскоростного RC -генератора.

Имея все выше сказанное в качестве начальных знаний воспользуемся этим для наших экспериментов.

Но для начала для владельцев STM 8S -Discovery с контроллером STM 8S 003 и, наверное, и с контроллером STM 8S 105 необходимо обратить внимание, что внешний кварц на данной плате не распаян. И необходимо добавить следующее: кварц для моих экспериментов я выбрал 4МГц, два конденсатора 22пФ в корпусе 0805, и резистор на 60Ом в корпусе 0805. Забавно, что, когда я в первый раз добавлял кварц пропустил на схеме резистор и долго не мог понять почему же это у меня не запускается внешний кварц.

Кстати, резистор можно заменить и на обычную перемычку, что я и сделал.

-2
-3
-4

Начинаем:

Как было ранее рассказано создаем проект в нашем рабочем пространстве и подготавливаем необходимы заголовочные файлы и файлы с исходным кодом. В нашем проекте нам понадобиться:

Система тактирования stm8s_clk

Система ввода и вывода stm 8s _gpio

Это будет базовый вариант, в котором мы будем ковыряться и пробовать функции из стандартной периферийной библиотеки.

Что мы тут сделали.

1. Чтоб наблюдать состояние флагов настроили ножку, к которой подключен светодиод на выход.

2. Подготовили систему тактирования и запустили ее от внутреннего RC -генератора с делителем 4. Для процессора поставили делитель 1. То есть ядро будет работать на частоте 4МГц.

3. Вывели сигнал тактирования на внешнюю ножку от внешнего кварца.

4. В основном цикле смотрим на состояние готовности внешнего генератора.

Что тут можно по наблюдать:

1. Частота от внешнего кварца на ножке, с помощью осциллографа или логического анализатора.

-5

2. Готовность внешнего генератора и выход его на режим. Для того чтоб посмотреть, как реагирует светодиод достаточно после перезагрузки замкнуть ножки кварца между собой светодиод не будет светиться. Как только вы разомкнете генератор выйдет на режим и флаг будет установлен.

-6
-7
-8

Теперь переключим сточник тактирования для ножки на главную тактовую частоту.

CLK_CCOConfig(CLK_OUTPUT_MASTER);

Так же на осциллографе мы видим, что теперь выводиться главная частота и замыкание кварца не срывает генерацию.

-9

Теперь поставим делитель для RC -генератора на 1. И переключимся на внешний кварц.

Добавим строчку для ожидания выхода на режим внешнего кварца:

while(CLK_GetFlagStatus(CLK_FLAG_HSERDY) == FALSE);

Строку с делителем поменяем на следующую:

CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV2);

Посмотрим какая частота будет выведена на ножку

-10

И строчку переключения поменяем на:

CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE, CLK_CURRENTCLOCKSTATE_ENABLE);

Смотрим на частоту на ножке:

-11

Как видим, она вернулась к частоте 4МГц, так же можно похулиганить и замкнуть кварц заставив зависнуть контроллер, так как основанная тактовая частота перестанет работать.

-12

И, наверное, последнее пока, можно посмотреть, как работает система переключения с внешнего кварца, на внутренний генератор.

Для этого в основном цикле будем отслеживать флаг срабатывания системы контроля за кварцем:

if(CLK_GetFlagStatus(CLK_FLAG_CSSD)==TRUE)

И включать светодиод, как мы делали до этого.

А в части, где настраиваем генератор добавим строчку:

CLK_ClockSecuritySystemEnable();

И можем по наблюдать:

-13

И после замыкания кварца:

-14

Как видим, основная частота переключилась на внутренний генератор. На фотографии плохо видно, что светодиод светиться.

На данный момент пока этой информации должно хватить для будущих маленьких проектов. По мере необходимости я добавлю еще части по системе тактирования.

Небольшая мотивашка (это же так модно) я пониманию, что сложно переключиться с ардуино на какие-то иные контроллеры, там все понятно и просто. Если вам хочется изучить что-то новое стоит начать собирать в конце концов для данного контроллера не требуется огромной обвязки достаточно схемы сброса, вывести четыре пина SWIM и добавить один конденсатор Vcap .

Да корпуса у них мелкие, но это решаем, например с помощью фена какой-то матери и переходника:

-15

Данный переходник доступен, как у китайцев, так и в некоторых магазинчиках, где продают электронный шурумбурум.

И так для демонстрации, так как я вижу, что на фотографиях плохо видно, что происходит я сниму видосик.