понедельник, 2 декабря 2013 г.

О моем основном проекте и этом блоге

мой основной проект - http://kystari.ru/
Тематика - светотехника, электротехника и автоэлектрика, авторемонт. 
В этот блог буду продолжать писать свои писать переводы datasheets и reference manual на stm8l

пятница, 4 октября 2013 г.

0x05. STM8 - периферия. Порты ввода-вывода

мой основной проект - http://kystari.ru/
С портами все как у всех - используются для обмена данными с внешним миром,  каждый порт может содержать до 8 линий ввода/вывода. Каждый пин (линия) порта может быть настроен на вход или выход независимо от других пинов этого же порта. Некоторые порты имеют дополнительные функции - аналоговые входы, внешние прерывания, линии ввода/вывода периферийных устройств. Каждому порту соответствует пять регистров:
Px_ODR - регистр выходных данных
Px_IDR - регистр входных данных
Px_DDR - регистр настройки направления работы порта
Px_CR1 - регистр настройки подтягивающих резисторов при включении порта на вход/режима работы порта при включении на выход
Px_CR2 - регистр настройки внешних прерываний при включении порта на вход/скорости переключения при включении на выход
Схема порта (можно увеличить, кликнув на изображение).
   
Сводная таблица конфигурации портов (можно увеличить, кликнув на изображение).
Примечания:
(1) - для пинов, поддерживающих уровни 5в,  диод на Vdd отсутсвует (во избежание попадания напряжения в 5в на питание, у  STM8L оно 1.65-3.6в)
(2) - в режиме открытого стока диод, подключенный на Vdd не работает. 
   Не все порты имеют полные 8 линий ввода/вывода, но биты, соответствующие этим линиям в регистрах существуют. Во избежания каких-либо нежелательных эффектов, STM в reference manual настоятельно рекомендует настраивать эти несуществующие линии как вход с подтяжкой без разрешения прерывания от данной линии и следить за сохранностью этого состояния во время работы с реальными линиями порта. 
     В течение перезагрузки и после нее пины портов ввода/вывода находятся в состоянии входа без подтяжки, но некоторые пины могут вести себя иначе - необходимо посмотреть описание портов конкретного микроконтроллера в даташите. Поэтому всегда после перезагрузки желательно вручную задавать режим работы каждого порта.
  Неиспользуемые пины рекомендуется настраивать в режим входа без подтяжки и подключать к фиксированным уровням напряжения, либо подключать для них подтяжку или переключать на выход; главное что бы они не болтались в воздухе без подтяжки - возможны наводки и постоянное переключение их из одного состояния в другое, что увеличивает потребление энергии микроконтроллером.
     Электрические характеристики портов контроллера находятся в даташите на конкретный контроллер. Рассмотрим характеристики на примере STM8L15xx.
По уровню допустимого входного сигнала, пины могут быть 3.6 и 5-вольтовыми (TT и FT), если это не указано, значит на вход можно подавать не больше напряжения питания контроллера.  По максимально допустимому выходному току - почти все выдают до 20мА (HS), некоторые 5мА. При этом входной ток через все ножки HS - максимум 20мА, А0 может пропустить через себя до 80мА. Всего через все порты контроллера в сумме нельзя пропускать более 80мА.


вторник, 24 сентября 2013 г.

0x04. STM8 - режимы адресации

мой основной проект - http://kystari.ru/
Ядро STM8 поддерживает 18 различных режимов адресации которые можно разделить на 8 основных групп:
врожденная (inherent) - NOP
непосредственная (immediate) - LD A,#$55
прямая (direct) - LD A,$55
индексная (index) - LD A,($55,X)
индексная стековая (SP index) -  LD A,($55,SP)
косвенная (indirect) - LD A,([$55],X)
относительная (relative) - JRNE loop
битовые операции (bit operation) - BSET byte,#5
  Для минимизации длины инструкций, большинство режимов адресации можно сгруппировать в 3 группы: расширенный режим, "длинный" и "короткий". 
    Расширенный (extended) режим адресации "e" - позволяет обратиться к любому байту из всего 16-мегабайтного пространства, платой за это является большая длина команды по сравнению с "длинным" и "коротким" режимами адресации. Кроме того, количество инструкций с данным типом адресации ограничено ( это инструкции CALLF, RETF, JPF и LDF).
     "Длинный" (long) режим  адресации "w" - наиболее удобный вариант адресации для работы в одной и той же секции, оптимизирован для работы с первыми 64-килобайтами адресного пространства (0x000000 - 0x00FFFF) с полным набором инструкций, однако длина команд больше, чем при "коротком" режиме адресации.
     "Короткий" (short) режим адресации "b" - обеспечивает доступ только к нулевой странице памяти (0x000000 - 0x0000FF), длина инструкций минимальна.
      В таблице ниже - обзор режимов адресации из programming manual.

   Полный список команд, поддерживающих каждый тип адресации можно найти  в programming manual начиная с таблицы 18.Там же - подробное описание всех команд. 
   

суббота, 21 сентября 2013 г.

0x03. STM8 - конвейер команд

мой основной проект - http://kystari.ru/
 В семействе микроконтроллеров STM8 используется 3х-ступенчатый конвейер команд, для максимального ускорения передачи потока команд процессору. Конвейер позволяет выполнять одновременно три действия: выборку, декодирование и исполнение. Программный счетчик (PC) всегда указывает на инструкцию, находящуюся в стадии декодирования. 
     Рассмотрим подробнее каждую ступень конвейера.
 
 1. Стадия выборки. Инструкция загружается в 64-битный буфер выборки и 32-битный буфер пре-выборки, позволяющие работать с 3 словами F1,F2 и F3. Структура буферов позволяет загружать любую инструкцию (до 5 байт)  для декодирования сразу же после загрузки F1 ( F2). Инструкция доступна к загрузке из программной флэш-памяти по 32-битной шине и доступна с любого из адресов: 0xXXX0, 0xXXX4, 0xXXX8, 0xXXXC. Несмотря на то, что стадии декодирования и исполнения инструкций выполняются каждый рабочий цикл, выборка очередной инструкции из памяти происходит только при необходимости, доступ к памяти запрещается при заполнении буфера выборки.  Это сделано для снижения энергопотребления ядра процессора. Чтение программы из RAM происходит аналогично чтению из флеша. Однако из-за 8-битной шины передачи данных, выполняется четыре последовательных операции чтения для загрузки одного слова Fx, что означает гораздо более медленное выполнение программы из RAM, чем из ROM.
2. Стадия декодирования. Код инструкции состоит из двух частей: собственный код операции ( 1 ли 2 байта) и код данных/адреса (0-3 байта). Собственный код операции декодируется на данной стадии. При наличии кода адреса, он используется для вычисления адреса, в то время как непосредственно определенный операнд (константа) передается на стадию выполнения команды
   Для длинных инструкций (5 байт) выборка может занимать 2 операции чтения памяти подряд, и-за чего декодирование откладывается до конца выборки.
   При косвенной адресации процессор ожидает чтения указателя из оперативной памяти. Количество циклов ожидания зависит от размера указателя.
3. Стадия выполнения. Инструкция выполняется, результат помещается в аккумулятор, индексный регистр или оперативную память.
    В случае одновременного доступа к одной и той же области памяти на стадии декодирования одной инструкции и выполнения предыдущей инструкции, декодирование приостанавливается до завершения обращения к памяти стадией выполнения. Поэтому в зависимости от последовательности команд, количество циклов для исполнения может быть разным для одной и той же инструкции.


воскресенье, 15 сентября 2013 г.

0x02. STM8 - организация памяти.

мой основной проект - http://kystari.ru/
Семейство микроконтроллеров STM8 построено по гарвардской архитектуре, с разделением шин программ и данных. Несмотря на это, вся память расположена в едином линейном адресном пространстве в 16 Мбайт.  Ниже показано устройство интерфейса памяти.
     Имеется шины адреса, данных, контрольный сигнал чтения/записи, сигнал перевода CPU в режим совместимости с медленными интерфейсами памяти. В случае, когда интерфейс памяти работает медленнее CPU, процессор ожидает готовности памяти перед выполнением инструкции. Поскольку адресное пространство едино, данные могут быть расположены во flash-память (память программ), а программа может выполняться из RAM (оперативной памяти). В этом случае загрузка данных и считывание инструкций из памяти выполняется по одной шине, что замедляет выполнение программы.
   
Адресное пространство
     Т.к. адресация памяти 24-битная, для адресации с помощью 1,2 и 3 байтов все пространство разделяют на страницы и секции.
  • Page - страница - [с 0xXXXX00 до 0xXXXXFF] 256-байтная область памяти, XXXX определяет номер страницы.
  • Section - секция - [с 0xXX0000 до  0xFFXXXX] 64-килобайтная область памяти, XX определяет номер секции.
     Таблица векторов прерываний располагается с адреса 0x008000. Главная программа и обработчики прерываний могут быть размещены в любой области памяти. Для правильной работы программы, при вызове функции, находящейся в другой секции необходимо использовать инструкцию CALLF. Ошибочное считывание инструкции вызывает перезапуск микроконтроллера.
     Стек располагается в нулевой секции, там же располагают часто используемые данные для большей эффективности кода. Все указатели хранятся только в нулевой секции. Использование индексной адресации (с 16-битными индексными регистрами и длинным смещением) позволяет размещать данные вне 0 и 1 секции.
     Ниже представлена карта памяти на примере STM8L15x:

      (1) - граница адреса зависит от объема памяти в конкретном микроконтроллере. Начало стека - конец оперативной памяти.
   

среда, 11 сентября 2013 г.

0x01. STM8 - описание ядра.Регистры

мой основной проект - http://kystari.ru/
(Сразу же примечание! Большая часть теории в предполагаемом курсе - перевод оригинальной документации)
     Как было сказано ранее, все микроконтроллеры всех линеек STM8 имеют единое ядро.  Ядро это имеет 6 регистров, поддерживает 18 режимов адресации и 80 инструкций. Шесть внутренних регистров это:
1. Аккумуляторный 8-битный регистр А. Регистр общего назначения для хранения результата математических и логических действий. 
2,3. Индексные 16-битные регистры X и Y. Используются для адресации, для временного хранения данных при различных операциях. 
4. Программный счетчик PC. 24-битный регистр, используемый для хранения адреса следующей выполняемой инструкции процессором. 2^24 дает 16Мбайт доступной адресации памяти. 
5. Указатель стека SP. 16-битный регистр, содержащий адрес следующей свободной позиции в стеке. После перезагрузки МК, в указателе стека содержится верхняя граница стека. SP автоматически инкрементируется/декрементируется при удалении элемента из стека/добавлении элемента в стек. При переходе через нижнюю границу стека, в SP загружается адрес верхней границы, соответственно новая информация, помещаемая в стек затирает предыдущую.
6. Регистр состояния CC. 8-битный регистр, показывающий результат выполнения инструкций процессором. 6 бит в этом регистре не используется. Флаги:
V - флаг переполнения, 7 бит.
I1 - флаг прерывания, 5 бит. Вместе с флагом I0 определяет приоритет возникшего прерывания.
H - дополнительный флаг переноса, 4 бит. Устанавливается в 1 при заеме бита из старшей половины байта в младшую.
I0 - флаг прерывания, 3 бит. (см. I1, таблицу).
N - флаг отрицательного результата операции, 2 бит. Устанавливается в 1 при получении отрицательного результата выполнения операции (самый старший бит результата равен 1).
Z - флаг получения нулевого результата, 1 бит.
C - флаг переноса, 0 бит. Выход за границу байта. 

Стоит также упомянуть про регистр глобальной конфигурации CFG_GCR. Регистр 8-битный, содержит в себе 2 флага.
AL (1 бит)- задает режим работы контролера после выполнения обработчиков прерываний. 0 - после обработчика идет возврат в основную программу к следующей по очереди инструкции, 1 - после обработчика процессор уходит в режим энергосбережения (сна).
SWD (0 бит) - деактивация отладчика SWIM. 0 - SWIM включен, 1 - отключен. При включенном отладчике, пин используемого им порта не должен быть использован в качестве обычной линии ввода/вывода.

вторник, 10 сентября 2013 г.

0x00. STM8 - введение

мой основной проект - http://kystari.ru/
STM8 - восьмибитные микроконтроллеры от STMicroelectronics. Семейство появилось на свет в 2008 году, заменив собой семейство ST-7. С каждым годом их популярность растет, во многом из-за доступных фирменных демо-плат, программаторов и отладчиков. Для работы с STM8 уже не нужно собирать самодельные программаторы, искать рабочую схему в сети и думать чем запрограммировать контроллер для сборки программатора (рекурсия, лол). Достаточно купить фирменную демо-плату STM8L Discovery/STM8S Discovery/STM8SVL Discovery за 500-800 рублей и получить платку с самим контроллером (у меня STM8L Discovery, на ней -STM8L152C6T6), минимумом внешней периферии (светодиод, кнопка, жк-экранчик), но самое главное - со встроенным отладчиком st-link, с помощью которого можно прошивать и отлаживать любой контроллер из восьмого семейства.

STM8L-DISCOVERY



     Вторая причина нарастающей популярности - дешевизна. Например STM8L051f3p6 в удобном для радиолюбителей корпусе tssop-20 стоит около 20-30 рублей в розницу - отличная замена для, например, популярных ATtiny2313 (около 60 рублей)  или ATmega8/16 (70-80 рублей) от Atmel. 
   Следует также отметить, что кроме любителей, многие профессиональные разработчики отказываются от avr в пользу stm8, из-за сбоев поставок avr'ок.
     Что же представляют из себя эти контролеры? Все семейство STM8 делится на несколько линеек:

  • STM8AF - для применения в автомобильной электронике, повышенная помехозащищенность, расширенный температурный спектр работы.
  • STM8AL - все тоже самое, только еще и малопотребляющее. 
  • STM8S - основная линейка для любых устройств самые дешевые из всего семейства.
  • STM8L - малопотребляющие.
  • STM8T - для устройств с сенсорными элементами управления. 
   Все они основаны на едином CISC ядре stm8. Ядро имеет гарвардскую архитектуру (раздельные шины данных и команд), при этом для программиста вся память (регистры переферии, flash, ram, eeprom) имеет единое адресное пространство. Большинство команд выполняется за 1 такт, ядро поддерживает аппаратное умножение и деление. 
     В дальнейшем я буду рассматривать преимущественно малопотреблящую линейку L. Она разделяется на 3 подлинейки: 
  • STM8L05x - value-line микроконтроллеры (существенно дешевле из-за примененения дешевой памяти с меньшим количеством циклов перезаписи)
  • STM8L101 - меньше периферии, меньше энергопотребление. Самые экономные.
  • STM8L15x - практически аналог 05x, дороже за счет использования нормального флеша