Микроконтроллеры STC90C51RC/RD+, которые выпускает компания STC MCU Limited [1], это 8-битный однокристальный микроконтроллер, полностью совместимый по системе команд с индустриальным стандартом микроконтроллеров семейства 8051. STC90C51RC/RD+ имеют до 64K байт встроенной памяти flash для программы приложения, которая используется совместно с кодом ISP (In-System-Programming, программирование в системе. Технология ISP и IAP (In-Application-Programming, программирование из кода приложения, т. е. самопрограммирование) предоставляют пользователю обновлять программу и данные прямо в системе. ISP позволяет пользователю загружать код без необходимости извлекать микроконтроллер из конечного изделия; IAP означает, что устройство может записывать энергонезависимые данные в памяти Flash прямо из работающей программы приложения. Имеется 1280 байт или 512 байт находящейся на кристалле памяти RAM, что достаточно для широкого диапазона приложений. Пользователь может конфигурировать процессор MCU, чтобы он работал на скорости 12 тактов на один машинный цикл, давая такое быстродействие, что и стандартный MCU 80C51, или 6 тактов на машинный цикл, удваивая тем самым производительность. STC90C51RC/RD+ сохраняет все аппаратные возможности стандартного 80C51 (этим серия STC90xx очень похожа на серию STC89xx, см. предыдущую врезку). Дополнительно MCU серии STC90xx предоставляют дополнительный порт ввода вывода P4 (порт GPIO), Timer2, 8-источников прерывания с 4 уровнями приоритета, встроенный кварцевый генератор и однократно разрешаемый сторожевой таймер (Watchdog Timer, WDT).
Список возможностей серии STC90xx:
• Улучшенное ядро 80C51, которое по выбору может работать на скорости 6T (6 тактов на машинный цикл, ускорение в 2 раза) или 12T (12 тактов на машинный цикл, как на старой архитектуре MCS51). • Рабочий диапазон напряжений питания: 3.3..5.5V (серия STC90C51RC/RD+) или 2.0..3.6V (серия STC90LE51RC/RD+). • Рабочий диапазон тактовых частот: 0..80 МГц (режим 12T) или 0..40 МГц (режим 6T). • Встроенная в кристалл память программ FLASH размером 4K/8K/13K/16K/32K/40K/48K/56K/61K, с гибкой возможностью перепрограммирования ISP/IAP (в зависимости от модели микроконтроллера). • Встроенная в кристалл память ОЗУ размером 256/512/1280 байт. • Можно адресовать до 64K байт внешней RAM. • Можно адресовать до 64K байт внешней памяти. • Два указателя (DPTR) для ускорения перемещения данных. • Три 16-битных таймера/счетчика. Timer 2 может считать вверх и вниз, с возможностью вывода программируемой частоты на ножке порта P1.0. • 8 адресов векторов прерываний с 4 уровнями приоритета. • Улучшенный UART с аппаратным распознаванием адреса, функцией детектирования ошибки фрейма и собственным генератором скорости. • Один 15-битный сторожевой таймер с 8-битным прескалером (с функцией однократного разрешения). • Интегрирован супервизор сброса MAX810. • Три режима управления питанием: normal mode (обычный рабочий режим), idle mode (режим ожидания), power-down mode (режим выключения). • Низкая генерация помех (EMI): есть возможность запрета генерации ALE. • Из режима power down микроконтроллер можно разбудить прерываниями INT0 (ножка порта P3.2), INT1 (ножка порта P3.3), T0 (ножка порта P3.4), T1 (ножка порта P3.5), RXD (ножка порта P3.0), INT2 (ножка порта P4.3), INT3 (ножка порта P4.2). • Максимум доступно до 39 программируемых портов ввода/вывода (GPIO), в зависимости от типа корпуса. • Имеется четыре 8-битных двунаправленных порта; дополнительный 4-битный порт P4 доступен в корпусах PLCC-44 и LQFP-44. • Рабочий диапазон температур: -40..+85°C (индустриальное исполнение) / 0..75°C (коммерческое исполнение). • Типы корпусов: LQFP-44, PDIP-40, PLCC-44.
Серия STC90xx отличается от серии STC89xx в основном следующим: повышенная тактовая частота, больше вариантов выбора по объему встроенной памяти. Серия STC90xx может полностью заметить микроконтроллеры STC89xx, как по двоичному коду, так и по цоколевке корпуса.
[Внутренняя организация]
Ядро CPU серии STC90xx полностью совместимо со стандартным микроконтроллером 8051, с поддержкой всех мнемоник инструкций и сохранением совместимости по двоичному коду. Серия STC90xx может выполнять код в 2 раза быстрее, чем стандартный 8051 (режим тактирования 6T) или с обычной скоростью (режим тактирования 12T). Улучшение производительности отдельных программ зависит от реально используемых инструкций.
Рис. 1. Блок-диаграмма STC90xx.
[Таблица выбора микроконтроллеров STC90xx по общим параметрам]
Тип
|
VCC, V
|
Max частота, МГц |
FLASH, байт
|
SRAM, байт
|
TIMER
|
UART
|
DPTR
|
EEPROM, байт
|
5V |
3V |
Серия STC90C/LE51 |
STC90C51 |
3.3-5.5 |
80 |
|
4K |
256 |
3 |
1 |
2 |
- |
STC90C52 |
3.3-5.5 |
80 |
|
8K |
256 |
3 |
1 |
2 |
- |
STC90LE51 |
2.0-3.6 |
|
80 |
4K |
256 |
3 |
1 |
2 |
- |
STC90LE52 |
2.0-3.6 |
|
80 |
8K |
256 |
3 |
1 |
2 |
- |
Серия STC90C/LE51RC |
STC90C51RC |
3.3-5.5 |
80 |
|
4K |
512 |
3 |
1 |
2 |
4K |
STC90C52RC |
3.3-5.5 |
80 |
|
8K |
512 |
3 |
1 |
2 |
4K |
STC90C53RC |
3.3-5.5 |
80 |
|
13K |
512 |
3 |
1 |
2 |
- |
STC90C12RC |
3.3-5.5 |
80 |
|
12K |
512 |
3 |
1 |
2 |
1K |
STC90LE51RC |
2.0-3.6 |
|
80 |
4K |
512 |
3 |
1 |
2 |
4K |
STC90LE52RC |
2.0-3.6 |
|
80 |
8K |
512 |
3 |
1 |
2 |
4K |
STC90LE53RC |
2.0-3.6 |
|
80 |
13K |
512 |
3 |
1 |
2 |
- |
STC90LE12RC |
2.0-3.6 |
|
80 |
12K |
512 |
3 |
1 |
2 |
1K |
Серия STC90C/LE51RD+ |
STC90C54RD+ |
3.3-5.5 |
80 |
|
16K |
1280 |
3 |
1 |
2 |
45K |
STC90C58RD+ |
3.3-5.5 |
80 |
|
32K |
1280 |
3 |
1 |
2 |
29K |
STC90C510RD+ |
3.3-5.5 |
80 |
|
40K |
1280 |
3 |
1 |
2 |
21K |
STC90C512RD+ |
3.3-5.5 |
80 |
|
48K |
1280 |
3 |
1 |
2 |
13K |
STC90C514RD+ |
3.3-5.5 |
80 |
|
56K |
1280 |
3 |
1 |
2 |
5K |
STC90C516RD+ |
3.3-5.5 |
80 |
|
61K |
1280 |
3 |
1 |
2 |
- |
STC90LE54RD+ |
2.0-3.6 |
|
80 |
16K |
1280 |
3 |
1 |
2 |
45K |
STC90LE58RD+ |
2.0-3.6 |
|
80 |
32K |
1280 |
3 |
1 |
2 |
29K |
STC90LE510RD+ |
2.0-3.6 |
|
80 |
40K |
1280 |
3 |
1 |
2 |
21K |
STC90LE512RD+ |
2.0-3.6 |
|
80 |
48K |
1280 |
3 |
1 |
2 |
13K |
STC90LE514RD+ |
2.0-3.6 |
|
80 |
56K |
1280 |
3 |
1 |
2 |
5K |
STC90LE516RD+ |
2.0-3.6 |
|
80 |
61K |
1280 |
3 |
1 |
2 |
- |
У всех перечисленных в таблице моделей имеется прерывание по снижению VCC ниже допустимого уровня (INT Low VCC), 8 аппаратных внешних прерывания с 4 уровнями приоритета, 4 аппаратных прерывания могут выводить MCU из режима сна (power down mode), сторожевой таймер (WDT).
Дополнительные аппаратные функции, которые не реализованы: PCA, PWM, D/A, ADC, настройка нижнего предела срабатывания прерывания порога допустимого напряжения питания, специальный таймер для пробуждения.
Повышенная эффективность STC90xx означает, что на той же тактовой частоте и в более широком диапазоне напряжений возможно получить быстродействие как минимум в 2 раза выше, сохраняя при этом низкое энергопотребление и полную совместимость по системе команд с традиционным режимом 12 тактов на машинный цикл. Если MCU не использует двойное ускорение, внешняя частота делится на 2, чтобы снизить частоту и энергопотребление. В таблице ниже показаны различные варианты использования STC90xx.
Напряжение питания |
Внешняя тактовая частота |
Обычная скорость (как у стандартного 8052) |
Реальная тактовая частота ядра |
Удвоенная скорость |
Реальная тактовая частота ядра |
Функции IAP/ISP |
4.5V - 5.5V |
0 - 44 МГц |
0 - 44 МГц |
0 - 20 МГц |
0 - 80 МГц |
0 - 40 МГц |
read, program, erase |
3.8V - 5.5V |
0 - 33 МГц |
0 - 33 МГц |
0 - 16.5 МГц |
0 - 66 МГц |
0 - 33 МГц |
read, program, erase |
3.6V - 5.5V |
0 - 24 МГц |
0 - 24 МГц |
0 - 12 МГц |
0 - 48 МГц |
0 - 24 МГц |
read, program, erase |
3.4V - 5.5V |
0 - 20 МГц |
0 - 20 МГц |
0 - 10 МГц |
0 - 40 МГц |
0 - 20 МГц |
только read |
Низковольтные модели STC90LE51RC/RD+ работают в диапазоне напряжений 2.0-3.6V. Когда рабочее напряжение находится на уровне приблизительно 1.9-2.3V, то функции перепрограммирования памяти ISP/IAP не работают.
[Цоколевка, описание выводов]
Мнемоника |
PDIP40 |
QFP44 |
PLCC44 |
Описание |
P0.0 - P0.7 |
39..32 |
37..30 |
43..36 |
Port0, 8-битный двунаправленный порт ввода/вывода (GPIO) со встроенными резисторами pull-up. Этот порт также мультиплексирован с аппаратной функцией вывода младшего байта шины адреса (A7..A0) и шины данных (D7..D0), когда осуществляется доступ к внешней памяти программ и данных. |
P1.0 - P1.7 |
1..8 |
40..44, 1..3 |
2..9 |
Port1, 8-битный двунаправленный порт ввода/вывода (GPIO) со встроенными резисторами pull-up. Когда в Port1 записываются единички, мощная подтяжка pull-up включается драйверами CMOS только на 2 периода тактовой частоты, и затем подключается слабая подтяжка pull-up резисторами, подтягивая уровень вывода порта к лог. 1. P1.0 также используется как источник сигнала события для Timer2, или выводит выходной сигнал Timer2. P1.1 также используется как один из источников сигнала управления захватом для Timer2. |
P1.0/T2 |
1 |
40 |
2 |
P1.1/T2EX |
2 |
41 |
3 |
P2.0 - P2.7 |
21..28 |
18..25 |
24..31 |
Port2, 8-битный двунаправленный порт ввода/вывода, со встроенными резисторами pull-up. Кроме GPIO, этот порт имеет мультиплексируемую аппаратную функцию вывода старшего байта адреса (A15..A8), когда осуществляется доступ к внешней памяти программ и данных. |
P3.0/RXD |
10 |
5 |
11 |
Port3, 8-битный двунаправленный порт ввода/вывода, со встроенными резисторами weak pull-up. Когда в Port3 записываются единички, мощная подтяжка pull-up включается драйверами CMOS только на 2 периода тактовой частоты, и затем подключается слабая подтяжка pull-up резисторами, подтягивая уровень вывода порта к лог. 1. Port3 также поддерживает множество различных аппаратных функций. Ножки P3.0 и P3.1 работают как вход приемника и выход передатчика для UART. P3.2 и P3.3 работают как источники внешнего прерывания /INT0 и /INT1. P3.4 и P3.5 работают как источники событий индивидуально для Timer0 и Timer1. P3.6 также работает как аппаратный сигнал записи /WR, активизируемый при доступе к внешней памяти. P3.7 работает также как аппаратный сигнал чтения /RD, активизируемый при доступе к внешней памяти. |
P3.1/TXD |
11 |
7 |
13 |
P3.2/INT0 |
12 |
8 |
14 |
P3.3/INT1 |
13 |
9 |
15 |
P3.4/T0 |
14 |
10 |
16 |
P3.5/T1 |
15 |
11 |
17 |
P3.6/WR |
16 |
12 |
18 |
P3.7/RD |
17 |
13 |
19 |
P4.0 |
|
17 |
23 |
Port4, расширенный порт ввода/вывода, который работает наподобие Port1. Port4 доступен только для вариантов корпусов LQFP44, PLCC44. P4.2 и P4.3 работают как источники внешнего прерывания /INT3 и /INT2. |
P4.1 |
|
28 |
34 |
P4.2/INT3 |
|
39 |
1 |
P4.3/INT2 |
|
6 |
12 |
P4.4/PSEN |
29 |
26 |
32 |
Порт GPIO P4.4. Строб чтения для внешней памяти, активный уровень лог. 0. |
P4.5/ALE |
30 |
27 |
33 |
Порт GPIO P4.5. Выходной импульс для защелкивания младшего байта адреса при доступе к внешней памяти. |
P4.6/EA |
31 |
29 |
35 |
Порт GPIO P4.6. Ножка /EA должна удерживаться в лог. 0, чтобы MCU брало исполняемый код из внешней памяти вместо внутренней. На этом выводе имеется встроенный резистор pull-up. |
RST |
9 |
4 |
10 |
Сигнал сброса RESET. Лог. 1 на этом выводе в течение как минимум 2 периодов тактовой частоты приведет к сбросу устройства. |
XTAL1 |
19 |
15 |
21 |
Вывод для подключения внешнего кварцевого резонатора, вход встроенного генератора. Может принимать тактовый сигнал от внешнего генератора. |
XTAL2 |
18 |
14 |
20 |
Вывод для подключения внешнего кварцевого резонатора, инвертирующий выход встроенного генератора. Этот вывод должен оставаться не подключенным, когда используется внешний генератор тактов. |
VCC |
40 |
38 |
44 |
Плюс напряжения питания. |
GND |
20 |
16 |
22 |
Минус напряжения питания, общий провод для всех сигналов, земля. |
Кроме 44-выводных корпусов LQFP-44 и PLCC-44 серия STC90C51RC/RD+ имеет также 44-выводный корпус PQFP, причем корпуса PLCC-44 и PQFP-44 использовать не рекомендуется. Производитель почему-то рекомендует использовать корпуса LQFP-44.
Причины для выбора микроконтроллеров STC: ниже стоимость и повышенная производительность. Все оригинальное программное обеспечение может быть напрямую перенесено на новый процессор даже без изменения аппаратуры системы. Пользователи могут загрузить свой код (в двоичном формате BIN или HEX-формате) в память микроконтроллера STC MCU с помощью готовой утилиты программирования (Writer / Programmer tool — STC-ISP.exe).
Внутренняя память Flash может быть перезаписана более чем 100 тысяч раз.
[Минимальная рабочая схема для STC90C51RC/RD+]
Выбор емкости C2 и C3 в зависимости от частоты кварца показана в таблице ниже. Емкость каждого из этих конденсаторов по отдельности должна быть выбрана равной емкости, указанной в столбце "C".
Таблица 1. Рекомендуемая емкость корректирующих конденсаторов на ножках XTAL1, XTAL2.
Частота кварца X1, МГц |
C |
4 |
100 |
6 |
47..100 |
12..25 |
47 |
Для внешней RC-цепи сброса обычно выбирают конденсатор C1 емкостью 10 мкф и резистор R1 10 кОм. У версии HD микроконтроллеров RC/RD+ ножка RESET имеет внутренний pull-down резистор номиналом 45..100 кОм.
По умолчанию вывод P4.6/EA работает как ножка порта GPIO, и её можно оставить не подключенной, если она не используется. Ножка P4.5/ALE по умолчанию работает как сигнал ALE (Address Latch Enable, сигнал разрешения защелки адреса), который можно перенастроить на работу как ножки GPIO P4.5 с помощью утилиты программирования STC-ISP.exe (см. [2]). Ножка P4.4/PSEN по умолчанию работает как порт GPIO, и её можно оставить не подключенной, если она не используется.
[Схема для STC90C51RC/RD+ с поддержкой ISP]
Номиналы корректирующих конденсаторов C2, C3 указываются в соответствии с выбранной рабочей частотой по таблице 1. Если рабочая частота превышает 33 МГц, то рекомендуется использовать внешний активный генератор, выход которого подключен к ножке XTAL1. В случае использования внешнего тактового генератора корректирующие конденсаторы C2, C3 не нужны.
Для обновления программного обеспечения используются ножки порта UART P3.0/P3.1, которые должны быть подключены через адаптер преобразования уровней к стандартному интерфейсу RS-232, или специальному переходничку USB-UART с уровнями TTL []. Программирование осуществляет утилита STC-ISP.exe. Имея всего 4 сигнала Gnd/P3.1/P3.0/Vcc для подключения к такому программатору, можно обновлять программу, не извлекая микроконтроллер из системы. Применяют также подключение для программирования по 6 проводам Gnd/P3.1/P3.0/Vcc/P1.1/P1.0. Если у Вас есть возможность подключить 7 сигнальных линий для программирования Gnd/P3.1/P3.0/Vcc/P1.1/P1.0/Reset, то можно применять специальную отдельную плату загрузки, "offline download board" (без использования компьютера).
Теория и руководство по ISP-программированию изложены в разделе "STC90 Series MCU Development / Programming Tools Help".
[Размеры корпусов]
Микроконтроллеры серии STC90xx выпускаются в стандартных корпусах LQFP-44, PDIP-40, PLCC-44, сохраняя цоколевку традиционных микроконтроллеров семейства MCS51. Размеры корпусов см. в даташите STC90C51RC-en.pdf [2].
[Принцип наименования типов STC90C51RC/RD+]
Уменьшение излучения помех. Для снижения радиопомех можно выключить сигнал ALE программированием бита ALEOFF в регистре AUXR (подробное описание регистра AUXR и его бит см. в даташите STC90C51RC-en.pdf [2]).
Также можно в 2 раза снизить тактовую частоту и переключиться на режим тактирования 6T, когда на один машинный цикл CPU приходится не 12 тактов системной частоты, а 6 тактов. Производительность CPU при этом не снизится. Режим тактирования 6T/12T можно поменять при конфигурировании опций микроконтроллера с помощью утилиты программирования STC-ISP Writter/Programmer [2]. Если частота генератора меньше 12 МГц, то также можно снизить усиление генератора, при этом уровень помех и потребляемый ток также уменьшатся.
[Режимы энергопотребления, управление питанием]
Всего есть 3 режима, в которых может находиться микроконтроллер: нормальный режим, режим ожидания (Idle mode, его использование не рекомендуется) и режим выключения (Power-down mode). В нормальном режиме работы ток потребления может меняться в диапазоне 4..7 мА, в режиме ожидания ток составит 2 мА (поэтому использовать этот режим практически не имеет смысла), и в режиме выключения ток потребления составит менее 0.1 мкА. Из режима выключения микроконтроллер можно вывести внешним прерыванием (при этом выполнение программы продолжится после выхода из обработчика прерывания) или сигналом сброса (начнется выполнение кода с адреса 0).
Переход в режим ожидания и режим выключения осуществляется битами IDL и PD регистра PCON.
Имеется 2 режима экономией энергопотребления (power saving modes), которые можно выбрать программируя регистр PCON.
PCON
Бит |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Имя |
SMOD |
SMOD0 |
- |
POF |
GF1 |
GF0 |
PD |
IDL |
SMOD. Выбор двойной скорости UART для режимов UART 1, 2 или 3. 0: обычная скорость (по умолчанию), 1: двойная скорость.
SMOD0. Бит SM0/FE выбора для SCON.7. Если этот бит установлен, то SCON.7 носит функцию детектирования ошибки фрейма (Frame Error). Если этот бит очищен, то SCON.7 используется как один из бит выбора режима UART.
B5. Зарезервирован.
POF. Power-On flag, флаг включения. Этот бит устанавливается действием включения (power-off-on), и его можно очистить только программно.
GF1. General-purposed flag 1, флаг общего назначения.
GF0. General-purposed flag 0, флаг общего назначения.
PD: Power-Down bit, бит выключения.
IDL: Idle mode bit, бит режима ожидания.
Idle Mode (режим ожидания). Инструкция, которая установит бит IDL (PCON.0) приведет к тому, что она будет последней, которая была выполнена перед входом в idle mode. В этом режиме внутреннее тактирование отключается от ядра CPU, но не от функций блока прерываний, таймеров, WDT и последовательного порта. Статус CPU полностью сохраняет свое состояние: указатель стека (Stack Pointer, SP), счетчик инструкций (Program Counter, PC), слово состояния (Program Status Word, PSW), аккумулятор (Accumulator, A) и другие регистры будут хранить свои данные во время режима ожидания. Ножки портов будут удерживать свое логическое состояние, какое они имели в момент активации режима ожидания. На ножках ALE и PSEN удерживается лог. 1. Idle mode оставляет периферийные устройства работать, так что они могут разбудить CPU, когда генерируется прерывание. Timer 0, Timer 1, Timer 2 и UART будут продолжать свою работу в режиме ожидания.
Есть два способа прервать режим ожидания. Во-первых, активация любого разрешенного прерывания приведет к тому, что будет аппаратно очищен бит IDL, завершая тем самым действие idle mode. Прерывание будет обработано, и инструкция RETI на выходе из ISR продолжит выполнение программы со следующей инструкции, находящейся после инструкции, которая ввела микроконтроллер в режим ожидания.
Биты флагов (GFO и GF1) могут использоваться, чтобы искусственно показать, было ли прерывание сгенерировано во время обычной работы или во время режима ожидания. Например, если инструкция, активирующая idle mode, установила один или оба этих флага вместе с битом IDL (операцией OR над регистром PCON). Тогда если выход из idle mode был осуществлен прерыванием, то прерывание может заметить этот факт, анализируя содержимое флагов GF0 и GF1.
Во-вторых, пробуждение процессора будет вызвано подтягиванием ножки сброса RESET к лог. 1, вызывая генерацию внутреннего аппаратного сброса. Поскольку тактовый генератор все еще работает, аппаратный сброс должен удерживаться в активном состоянии только на 2 системных тактовых цикла, чтобы сброс был завершен.
Power Down (PD) Mode. Инструкция, которая установит бит PD (PCON.1), приведет к тому, что это будет последняя выполненная инструкция перед входом в режим выключения (Power-Down mode). В Power-Down mode, будут выключены встроенный генератор и память FLASH, чтобы минимизировать потребление энергии. В этом режиме потреблять ток будет только схема включения (power-on circuit). Содержимое встроенной памяти RAM и регистров специального назначения (Special Finction Register, SFR) сохраняется.
Есть только один способ разбудить микроконтроллер, чтобы вывести его из power-down mode - аппаратный сброс (ножка RESET) или внешнее прерывание (/INT0../INT3, вывод RXD, выводы T0, T1). Когда пробуждение было выполнено ножкой сброса RESET, программа продолжит свое выполнение с адреса 0000h.
Будьте внимательны к формированию импульса сброса на выводе RESET - он должен быть активен (активный уровень лог. 1) на время как минимум 10 мс, чтобы частота тактов могла застабилизироваться. Если пробуждение произошло от прерывания ножек GPIO, то CPU возобновит свою работу с перехода на соответствующий обработчик прерывания (interrupt service routine, ISR). Перед запуском кода ISR подача тактовой частоты на CPU блокируется, пока не пройдет 32768 тактов, чтобы исключить подачу нестабильной тактовой частоты на ядро. Чтобы использовать для пробуждения ножки GPIO, до входа в режим выключения должны быть должным образом разрешены прерывания в соответствующих регистрах. Обратите внимание, что за инструкцией, которая выключает процессор (это та инструкция, которая вводит микроконтроллер в power-down установкой бита PD), должна находиться инструкция NOP, если используется пробуждение от ножки GPIO. Когда завершается режим Power-down по прерыванию, период пробуждения контролируется внутренней схемой задержки. По отрицательному перепаду на ножке, генерирующей прерывание, запускается генератор, и внутренний таймер схемы задержки начинает счет. Подача внутренних тактов на ядро по возобновление вычислительного процесса CPU разрешается только после того, как таймер задержки переполнится. После этого периода таймаута начнет выполняться код соответствующего ISR. Чтобы предотвратить повторное срабатывание прерывания, код ISR перед своим завершением должен запретить это прерывание. Ножка прерывания должна удерживаться в лог. 0, пока не истечет таймаут запуска ядра и не начнется выполнение кода ISR. Программа пользователя не должна пытаться войти (или повторно войти) в power-down mode как минимум 4 мкс после того, как произошло одно из следующих событий: начало выполнения кода (после любого типа сброса) или выход из power-down mode.
Примеры кода, демонстрирующие выход из power-down mode по внешнему прерыванию на языках C и ассемблера см. в даташите STC90C51RC-en.pdf [2].
Если нет источников прерывания, которые можно использовать для пробуждения MCU, то есть возможность применить следующую схему:
Как эта схема работает, процесс по шагам:
1. Порт ввода/вывода, подключенный к резистору 300 ом, сначала конфигурируются как двухтактный выход с мощной верхней нагрузкой (push-pull output, strong pull-up). 2. Записывается лог. 1 в этот порт, и через диод конденсатор C1 быстро заряжается до высокого напряжения. 3. Записывается 0 в порт, и сразу же MCU переводится в режим power-down. 4. Пока микроконтроллер спит, C1 медленно разряжается через резистор R1. Когда напряжение на C1 станет меньше 0.8V, вывод INTx сгенерирует прерывание, которое автоматически выведет MCU из режима сна.
Управление сбросом, работа вывода RESET, сброс по включению питания (Power-On Reset, POR), программный сброс, описание встроенного супервизора MAX810, описание регистра PCON, описание работы сторожевого таймера (Watch-Dog-Timer, WDT), пример кода с WDT, см. в даташите STC90C51RC-en.pdf [2].
[Источники сброса]
У микроконтроллеров серии STC90xx имеется 4 источника, которые могут генерировать внутренний сброс. Это ножка вывода RST, программный сброс (software reset), встроенная схема сброса при включении питания (power-on-reset) и сброс от сторожевого таймера (Watch-Dog-Timer, WDT).
Ножка сброса RST. Вывод RST может принудительно сбросить MCU по наличию импульса лог. 1 от внешнего источника. На входе RST присутствует триггер Шмитта. Появление на ножке RST импульса лог. 1 длительностью как минимум 24 такта + 10 мкс приведут к генерации сброса. После того, как уровень на ножке RST вернется к лог. 0, MCU завершит состояние сброса и начнет выполнение кода с адреса 0.
Software RESET. Запись лог. 1 в бит SWRST регистра ISP_CONTR приведет к генерации программного сброса. Бит SWBS того же регистра управляет переключением области запуска программного сброса:
;Software reset из области программы пользователя (appliction program, AP)
; и переключение на область AP для запуска программы:
MOV ISP_CONTR, #00100000B ;SWBS = 0 (выбор области AP), SWRST = 1 (Software reset)
;Software reset из области программы монитора внутрисхемного программирования
; (области ISP) и переключение на область AP для запуска программы:
MOV ISP_CONTR, 00100000B ;SWBS = 0 (выбор области AP), SWRST = 1 (Software reset)
;Software reset из области программы пользователя (appliction program, AP)
; и переключение на область ISP для запуска программы:
MOV ISP_CONTR, 01100000B ;SWBS = 1 (выбор области ISP), SWRST = 1 (Software reset)
;Software reset из области программы монитора внутрисхемного программирования
; (области ISP) и переключение на область ISP для запуска программы:
MOV ISP_CONTR, 01100000B ;SWBS = 1 (выбор области ISP), SWRST = 1 (Software reset)
Software reset сбрасывает всю системы целиком, все регистры SFR и порты GPIO вернутся в свое состояние по умолчанию.
Power-On Reset (POR). Когда VCC снижается ниже порога детектирования сбоя питания схемы POR, вся логика устройства будет сброшена. Когда VCC вернется обратно к нормальному уровню, выход из состояния внутреннего сброса произойдет автоматически после 2048 тактов (для версии HD) или 32768 тактов (для версии 90C).
Флаг включения питания Power-On Flag, POF/PCON.4, установится аппаратно, чтобы сообщить о событии снижения VCC ниже порога системы POR. Этот флаг помогает пользователю проверить, был ли запуск программы осуществлен от включения питания, или от вывода RST, или от программного сброса, или от сброса сторожевого таймера. Бит POF должен быть очищен программно.
Watch-Dog-Timer. Сброс MCU может быть осуществлен также и от сторожевого таймера, если его работа была разрешена. Сторожевой таймер управляется регистром WDT_CONTR, и его работа может быть разрешена однократно. Если сторожевой таймер разрешен, то программа должна его регулярно сбрасывать, чтобы не произошел сброс системы. Сторожевой таймер можно разрешить программно или настройкой опций с помощью утилиты программирования STC-ISP Writter/Programmer. Подробнее про сторожевой таймер см. даташит STC90C51RC-en.pdf [2].
Warm Boot, Cold Boot Reset. MCU может осуществить так называемую "теплую" (Warm Boot) и холодную (Cold Boot) загрузку, см. таблицу.
Тип сброса |
Источник сброса |
Результат |
Warm boot |
Сторожевой таймер (WDT) |
Сброс системы приведет к переходу к выполнению кода AP по адресу 0000h, и начнет выполняться программа пользователя. |
Ножка сброса (RST) |
20H -> ISP_CONTR |
60H -> ISP_CONTR |
Сброс системы приведет к переходу к выполнению кода программы монитора ISP, и если не будет обнаружена легитимная команда ISP, то произойдет автоматический переход к коду пользователя AP. |
Cold boot |
Power On (включение питания) |
[Организация памяти]
Микроконтроллер (далее сокращенно MCU) серии STC89xx имеют раздельные адресные пространства для памяти программ (Program Memory) и памяти данных (Data Memory), это так называемая Гарвардская архитектура (см. Википедию).
Различают раздельные пространства памяти программ (Program memory) и память данных. У микроконтроллеров STC90C54RD+ имеется 256 байт встроенной внутренней оперативной памяти (scratch-pad RAM) и 1024 байт встроенной расширенной оперативной памяти (expanded RAM, XRAM). У микроконтроллеров STC90C51RC имеется 256 байт внутренней scratch-pad RAM и 256 байт встроенной expanded RAM (XRAM). У микроконтроллеров STC90C51 имеется только 256 байт внутренней scratch-pad RAM. Также для серии STC90C51RC/RD+ есть доступ к 64K байт внешней расширенной оперативной памяти (external expanded RAM).
Program memory. Это память, в которой хранятся выполняемые ядром CPU инструкции (в архитектуре MCS51 также в этой памяти могут храниться табличные данные и таблицы переходов). Можно адресовать до 64K байт памяти flash для хранилища программы и хранилища данных для MCU серии STC90xx. Встроенная память flash может быть размером 4K/8K/13K/16K/32K/40K/48K/56K/62K байт, в зависимости от модели микроконтроллера. Дизайн позволяет пользователям конфигурировать память как 3 отдельные раздела банков. Они называются регионом AP (application program), регионом IAP (In-Application-Program) и регионом загрузки ISP (In-System-Program boot). Регион AP это пространство, где размещается программа пользователя. Регион IAP (In-Application-Program) это энергонезависимая память данных, которая может использоваться для сохранения важных параметров программы AP. Другими словами, функционал IAP серии STC90xx предоставляет пользователю возможность читать и записывать свои данные в регионе данных flash, что избавляет от необходимости использовать внешнюю память EEPROM. Регион ISP boot это пространство, которое позволяет разместить специальную программу, которую мы называем кодом самопрограммирования (программа ISP). Внутри региона ISP пользователь может также разрешить доступ на чтение/запись в маленькое пространство памяти для сохранения параметров специального назначения. Обычно назначение программы ISP - заполнить регион программы AP, чтобы обеспечить апгрейд кода без необходимости извлекать процессор из системы.
Серия MCU STC90xx имеет специальную внутреннюю конфигурационную информацию (что-то похожее на фьюзы AVR). Аппаратура MCU захватывает эту конфигурационную информацию в момент включения (power-up), и в соответствии с ней выполняет аппаратную защиту по управлению доступом в регионы памяти - по предопределенным критериям, заданным в процессе программирования конфигурационной информации). Критерии состоят в том, что разрешен или нет доступ к региону AP только из региона ISP, доступ к региону IAP из программы ISP и AP, и запрещен ли доступ к региону ISP из программы AP и из самой программы ISP. Однако если разрешена память данных FLASH ISP ("ISP data flash is enabled"), то программа ISP может читать/записывать эту область. Когда выполнены неправильные установки в ISP-IAP SFR, происходит выход за пределы допустимой области ("out-of-space"), и MCU серии STC90xx в соответствии с вышеуказанными критериями игнорирует недопустимую команду.
После сброса CPU начинает выполнение кода с адреса 0000H Program Memory, где должен начинаться код приложения пользователя (вектор сброса). Для обработки прерываний код ISR должен размещаться в памяти программ по специальным адресам, которые называют векторами прерываний. Вектора прерываний находятся в младших адресах пространства памяти программ, сразу за вектором сброса. Каждому прерыванию назначен фиксированный адрес вектора в памяти программ. Когда происходит прерывание, то CPU переходит к выполнению кода по вектору прерывания, приостанавливая выполнение основной программы (или менее приоритетного прерывания). Например, вектор External Interrupt 0 назначен на адрес 0003H. Если используется External Interrupt 0, то его ISR должен начинаться с адреса 0003H (обычно в этом месте находится команда безусловного перехода AJMP или LJMP). Если прерывание не используется, то место под код его вектора свободна как обычная память программ.
Ячейки векторов прерываний идут друг за другом с интервалом 8 байт: 0003H вектор для External Interrupt 0, 000BH для прерывания Timer 0, 0013H для External Interrupt 1, 001BH для Timer 1, и т. д. Если ISR достаточно короткий, то он может уложиться в этом 8-байтном интервале. Более длинные ISR могут использовать инструкцию перехода (AJMP или LJMP) для пропуска следующих на ней ячеек других векторов прерываний, если эти прерывания используются.
Ниже показано для примера распределение памяти микроконтроллера STC90C54RD+.
|
Память программ STC90C54RD+ |
Тип |
Program Memory |
STC90C/LE51 |
0000H~0FFFH (4K) |
STC90C/LE52 |
0000H~1FFFH (8K) |
STC90C/LE51RC |
0000H~0FFFH (4K) |
STC90C/LE52RC |
0000H~1FFFH (8K) |
STC90C/LE53RC |
0000H~33FFH (13K) |
STC90C/LE12RC |
0000H~2FFFH (12K) |
STC90C/LE54RD+ |
0000H~3FFFH (16K) |
STC90C/LE58RD+ |
0000H~7FFFH (32K) |
STC90C/LE510RD+ |
0000H~9FFFH (40K) |
STC90C/LE512RD+ |
0000H~BFFFH (48K) |
STC90C/LE514RD+ |
0000H~DFFFH (56K) |
STC90C/LE516RD+ |
0000H~FFFFH (64K) |
Data Memory. Это память, где могут размещаться только данные. Есть несколько разновидностей памяти данных.
On-chip Scratch-Pad RAM. Точно так же, как и у обычного микроконтроллера 8051, у MCU серии STC90xx имеется 256 байт сверхбыстрой памяти данных (SRAM), в которую входит пространство из 128 байт SFR. Младшие 128 памяти данных могут быть доступны как через прямую, так и через косвенную адресации. Старшие 128 байт памяти данных и 128 байт SFR используют общее адресное пространство. К этим старшим 128 байтам памяти данных можно получить доступ только с помощью косвенной адресации. К старшим 128 байтам SFR можно получить доступ только через прямую адресацию.
|
On-chip Scratch-Pad RAM |
Младшие 32 байта (с адресами 00H..1FH) памяти данных сгруппированы в 4 банка по 8 регистров в каждом. Инструкции программы обращаются к этим 8 регистрам как к регистрам R0..R7. Биты RS0 и RS1 регистра PSW (см. секцию "Регистры SFR для доступа к RAM") выбирают, какой из этих банков сейчас используется. Инструкции, использующие регистровую адресацию, будут осуществлять доступ только к регистрам указанного в настоящий момент банка. Это позволяет более эффективно использовать пространство кода, поскольку инструкции с регистровой адресацией короче, чем инструкции, использующие прямую адресацию.
|
Младшие 128 байт Internal SRAM |
Следующие 16 байт (20H..2FH) за банками регистров формируют блок области памяти, которую можно (с помощью специальных инструкций) адресовать как отдельные биты (флаги). Набор инструкций 80C51 включает в себя широкий набор инструкций для манипуляции одним битом, и 128 бит в этой области могут быть напрямую модифицированы этими инструкциями. Адреса бит в этой области могут быть в диапазоне 00H..7FH.
К младшим 128 байтам можно получить доступ либо прямой, либо косвенной адресацией, в то время как к старшим 128 байтам можно получить доступ только косвенной адресацией. Регистры специального назначения (SFR) включают защелки портов, регистры таймеров, управление периферийными устройствами и т. д. К этим регистрам можно получить доступ только прямой адресацией. 16 адресов в пространстве SFR могут быть адресованы и как байты, и как биты. SFR, которые могут быть адресованы как биты, имеют адреса, заканчивающиеся на 0H или 8H.
Auxiliary RAM. Имеется 1024 байт дополнительного ОЗУ данных (data RAM) доступного в микроконтроллерах серии STC90C54RD+ (в то время как 256 байт дополнительного data RAM доступно на STC90C51RC). К этой памяти можно получить доступ инструкциями MOVX @Ri или MOVX @DPTR. Управляющий бит EXTRAM находится в регистре AUXR.1 (см. ниже секцию "Регистры SFR для доступа к RAM") предназначен для контроля доступа к auxiliary RAM. Когда этот бит установлен, доступ к auxiliary RAM запрещен. Когда этот бит очищен (EXTRAM=0), то auxiliary RAM является целью по умолчанию для диапазона адресов 0x0000 .. 0x03FF, и к нему можно получить доступ через инструкцию косвенной адресации MOVX @Ri и MOVX @DPTR. Если EXTRAM=0 и целевой адрес больше 0x03FF, то происходит автоматическое переключение на доступ к внешней RAM. Когда EXTRAM=0, то при выполнении инструкции MOVX @Ri содержимое регистра DPH (это старшая половина 16-битного DPTR) игнорируется.
|
Auxiliary RAM STC90C54RD+ |
Для компилятора KEIL-C51 присваивание переменных, размещенных в Auxiliary RAM, должно использовать определение pdata или xdata. После компиляции переменные, декларированные через pdata и xdata, будут соответственно относиться к памяти, к которой осуществляется доступ через MOVX @Ri (для pdata) и MOVX @DPTR (для xdata). Таким способом можно корректно осуществлять аппаратный доступ к памяти MCU.
External RAM. Имеется 64K байт адресного пространства, к которому осуществляется доступ как к внешнему ОЗУ данных (external data RAM). Интерфейс доступа такой же, как и у стандартного 8051 - используются ножки портов P2, P0, сигнал ALE, и ножки портов P3.6 и P3.7 получают альтернативную функцию сигналов чтения и записи для доступа к external data RAM. Для доступа к внешней памяти данных бит EXTRAM должен быть установлен в лог. 1. Доступ к внешней памяти может быть либо по 16-битному адресу (инструкцией MOVX @DPTR), или по 8-битному адресу (инструкцией MOVX @Ri). 8-битный адрес часто используется в объединении с одной ножкой порта или большим их количеством для организации страничного доступа к RAM. Если используется 8-битный адрес, то Port 2 SFR сохраняет свое состояние во время цикла доступа к внешней памяти. Это упрощает страничный доступ. 16-битные адреса часто используют для доступа к 64K байт внешней памяти данных.
|
External RAM |
[Регистры SFR для доступа к RAM]
Ниже показаны некоторые SFR, которые имеют отношение к RAM.
Для быстрого перемещения данных серия STC89xx поддерживает 2 указателя данных. Они используют общий адрес SFR, и могут переключаться битом DPS (AUXR1.0).
PSW. Это слово состояния выполнения программы, (Program Status Word, сокращенно PSW).
Бит |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Имя |
CY |
AC |
F0 |
RS1 |
RS0 |
OV |
F1 |
P
|
CY: Carry (флаг переполнения, или переноса).
AC: Auxilliary Carry Flag (флаг дополнительного переноса, применяется для BCD-операций; BCD расшифровывается как Binary Coded Decimal).
F0: Flag 0 (доступен для пользователя как флаг общего назначения).
RS1: Register bank select control bit 1 (бит 1 для выбора банка регистров).
RS0: Register bank select control bit 0 (бит 0 для выбора банка регистров).
OV: Overflow (флаг переполнения).
F1: Flag 1. Флаг, определяемый пользователем.
P: Parity (флаг четности аккумулятора).
Регистр AUXR.
Бит |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Имя |
- |
- |
- |
- |
- |
- |
EXTRAM |
ALEOFF |
B7..B3: эти биты зарезервированы.
EXTRAM: переключает доступ к внутреннему/внешнему ОЗУ (Internal/External RAM access).
0: для серий RD+ разрешается встроенная в кристалл auxiliary RAM, и она размещена по адресам 0x0000 .. 0x03FF. И если адрес превышает 0x03FF, то автоматически адресуется внешняя память (external RAM), находящаяся вне кристалла MCU. Для серий RC разрешается встроенная в кристалл auxiliary RAM, и она размещена по адресам 00H .. FFH. И если адрес превышает FFH, то автоматически адресуется внешняя память (external RAM), находящаяся вне кристалла MCU. 1: встроенная в чип auxiliary RAM всегда запрещена.
ALEOFF: запрет/разрешение генерации сигнала ALE.
0: ALE выдается с постоянной частотой, равной 1/3 от системной (SYSclk) в режиме 6T, и 1/6 от SYSclk в режиме 12T. 1: ALE активен только во время выполнения инструкции MOVX или MOVC.
Регистр AUXR1.
Бит |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Имя |
- |
- |
- |
- |
GF2 |
- |
- |
DPS
|
GF2: флаг общего назначения, определяемый пользователем. Его может использовать программа приложения по любому назначению.
DPS: бит выбора регистров DPTR. Если 0, то выбран DPTR0 (по умолчанию); если 1, то для использования выбран вторичный DPTR (DPTR1).
Демонстрационный код для доступа к расширенной памяти см. в даташите STC89C51RC-en.pdf [2].
SP: Stack Pointer.
Указатель стека SP имеет разрядность 8 бит, и он предназначен для хранения текущего адреса сохраненных в стеке значений регистров и программного счетчика. SP инкрементируется перед тем, как данные будут сохранены в стеке инструкциями PUSH и CALL. Стек может размещаться в любом месте встроенной RAM. После сброса SP инициализируется в значение 07H, и это означает, что стек начинается с ячейки 08H, которая также соответствует первому регистру (R0) банка регистров 1. Таким образом, если используется больше одного банка регистров, то SP должен быть инициализирован в другое значение, которое не используется для хранения данных. Максимальная глубина стека может быть до 256 байт.
[Регистры специального назначения (SFR)]
Описание SFR и их адреса см. в даташите STC90C51RC-en.pdf [2].
[Порты GPIO]
Все порты ввода вывода GPIO (включая P4) могут быть сконфигурированы независимо друг от друга в один из трех режимов: псеводо-двунаправленный (quasi-bidirectional, стандартный режим выходного порта 8051), только вход (input-only, ножка порта имеет высокое сопротивление) или выход с открытым стоком. P1, P2, P3 и P4 по умолчанию (после сброса) находятся в режиме quasi-bidirectional (точно так же, как и порты стандартного 8051), в то же время P0 по умолчанию находится режиме выхода с открытым стоком. Когда P0 используется для расширения шины (младший байт адреса A7..A0 и байт данных D7..D0), резисторы pull-up добавлять не нужно. Однако когда ножки порта P0 используются как порты GPIO, необходимо подключить внешние резисторы pull-up (верхние подтягивающие резисторы) номиналом 4.7-10K. Режимы работы ножек портов серии STC90xx совпадают с аналогичными режимами серии STC89xx (см. предыдущую врезку).
Максимальный выходной ток, который могут коммутировать стоки ножек P0 микроконтроллеров STC90C51RC/RD+ для 5V версий составляет 12 мА, и выводы других портов могут коммутировать ток до 6 мА.
Максимальный выходной ток, который могут коммутировать стоки ножек P0 микроконтроллеров STC90LE51RC/RD+ для 3V версий составляет 8 мА, и выводы других портов могут коммутировать ток до 4 мА.
Описание регистров SFR для портов GPIO, описание их режимов, примеры применения, примеры кода см. в даташите STC90C51RC-en.pdf [2].
[Система команд]
Режимы адресации являются встроенной частью набора команд каждой процессорной архитектуры. Они определяют различными способами источник и/или место назначения данных, в зависимости от ситуации в программе. В архитектуре 8051 имеется 5 режимов адресации: непосредственная (Immediate), прямая (Direct), косвенная (Indirect), регистровая (Register), индексированная (Indexed).
Immediate Constant (IMM). Адрес указывается как значение константы, которая следует сразу за мнемоникой кода операции, например:
Эта команда загружает аккумулятор шестнадцатеричной константой 70h. То же самое число может быть указано в десятичной форме как 112.
Direct (DIR). В прямой адресации операнд указывается 8-битном поле адреса инструкции. Таким способом можно адресовать только 128 младших байт внутренней оперативной памяти данных (internal data RAM), и регистры SFR могут быть также доступны прямой адресацией.
Indirect (IND). В косвенной адресации инструкция указывает регистр, который содержит адрес операнда. Таким способом может быть адресована как внутренняя, так и внешняя оперативная память (internal RAM, external RAM).
Адресными регистрами для 8-битной адресации могут быть R0 или R1 выбранного банка, или указатель стека SP. Для 16-битной адресации адресным регистром может быть регистр DPTR.
Register (REG). К регистрам банка (каждый банк содержит регистры R0..R7) можно получить доступ определенными инструкциями, в коде которых 3 битами закодирован нужный регистр банка. Адресация таким способом самая эффективная, потому что состоит из 1 байта, и не требует для себя дополнительного байта для адреса. При выполнении этой инструкции осуществляется доступ к одному регистров R0..R7 выбранного банка.
Некоторые инструкции специфичны для определенного регистра. Например некоторые инструкции всегда работают только с аккумулятором, или только с указателем данных DPTR и т. п. Таким образом, для указания регистра в таких инструкциях не требуется дополнительный байт, вся необходимая адресная информация уже содержится в самом коде инструкции.
Index (IDX). Индексную адресацию можно использовать только для доступа к памяти программ, и только на чтение. Этот режим адресации предназначен для чтения таблиц данных (look-up tables), находящихся в памяти программ. 16-битный базовый регистр (в качестве которого может служить либо DPTR, либо PC) указывает на начальный адрес таблицы, и аккумулятор настраивается для указания на нужный объект в таблице.
Другой тип индексной адресации используется в инструкции условного перехода (conditional jump). В такой инструкции адрес назначения вычисляется как сумма адреса, находящегося в указателе базы и адреса, находящегося в аккумуляторе.
Подробное описание системы команд см. в даташите STC90C51RC-en.pdf [2].
[Система прерываний]
Серия STC90C51RC/RD+ поддерживает 8 аппаратных источника прерываний с 4 уровнями приоритета. Причем аппаратно поддерживается обработка вложенных друг в друга прерываний, что нечасто встречается даже в современных микроконтроллерах. 8 источников прерываний это external interrupt 0 (внешнее прерывание INT0), прерывание от Timer0, external interrupt 1 (внешнее прерывание INT1), прерывание от Timer1, прерывание от последовательного порта (UART), прерывание от Timer2, external interrupt 2 (внешнее прерывание INT2) и external interrupt 3 (внешнее прерывание INT3). Каждый источник прерывания привязан к одному или нескольким флагам запроса прерывания, находящихся в регистрах SFR. Также каждый источник прерывания привязан к своему вектору прерывания, находящемуся в таблице векторов, в начале адресного пространства памяти программ. Каждое прерывание может быть индивидуально разрешено или запрещено установкой или очисткой определенного бита в SFR-регистрах IE и XICON. Однако, чтобы система прерываний работала, её нужно разрешить глобально установкой бита EA (IE.7) в лог. 1, иначе отдельные прерывания не будут распознаваться и выполняться. Сброс бита EA в лог. 0 запрещает все источники прерывания, независимо от их индивидуальных настроек.
Если прерывания разрешены для определенного источника, то будет сгенерирован запрос на прерывание, когда установится флаг запроса для этого прерывания. Как только выполнение текущей инструкции завершится, CPU аппаратно сгенерирует вызов LCALL по заранее определенному адресу (вектору прерывания), что вызовет выполнение обработчика прерывания (interrupt service routine, ISR). Каждый ISR должен завершиться инструкцией RETI, которая вернет выполнение программы к следующей инструкции, на которой выполнение было прервано, если при этом не произошло новое прерывание. Если прерывания не разрешены, то флаг ожидающего обработки прерывания будет игнорирован аппаратно, и программа продолжит выполнение основного кода (не ISR). Флаг ожидания прерывания установится в лог. 1 независимо от того, разрешены или нет прерывания.
Каждый источник прерывания имеет 2 соответствующих бита, которые представляют приоритет прерывания. Они размещены в регистре SFR, который называется IPH, и другие такие биты размещены в регистре IP. Прерывания с самым высоким приоритетом не могут быть прерваны прерыванием с более низким приоритетом. Если одновременно пришел запрос на прерывание с разным приоритетом, то сначала будет обработано прерывание с более высоким приоритетом. Если одновременно пришли запросы прерываний с одинаковым приоритетом, то порядок их обработки будет определено внутренним механизмом опроса прерываний (internal polling sequence). Подробнее про систему прерываний, источники прерываний, адреса векторов, настройку приоритетов, описание соответствующих бит SFR, время реакции на прерывание см. даташит STC90C51RC-en.pdf [2].
Как обрабатываются прерывания. Прерывания от внешних выводов (External Interrupt) и от других источников (таймеры, последовательный порт) анализируются в начале выполнения каждой инструкции (в момент выборки инструкции, OPcode fetch cycle). Результат анализа обрабатывается в момент OPcode fetch cycle следующей инструкции. Если один из флагов прерывания был установлен на первом цикле, то на втором цикле система прерываний аппаратно генерирует LCALL для запуска соответствующего ISR, если этот запуск не заблокирован одним из следующих условий. Вот эти условия блокировки:
• В настоящий момент выполняется ISR прерывания с таким же приоритетом или более высокого приоритета. • Текущий цикл (цикл опроса, polling cycle) не последний цикл в процессе выполнения инструкции. • Выполняется инструкция RETI или любая запись в регистры IE, XICON, IP и IPH. • Идет процесс, связанный с активностью ISP/IAP.
Любое из этих 4 условий заблокируют аппаратный вызов LCALL в обработчик прерывания ISR. Второе условие гарантирует, что выполняющаяся инструкция завершится перед переходом в ISR. Третье условие гарантирует, что если выполняется инструкция RETI, или любой доступ к IE, XICON, IP или IPH, то как минимум одна или больше инструкций будут выполнены перед переходом в ISR.
Этот цикл опроса повторяется каждый последний такт в каждом цикле инструкции. Обратите внимание, что если активен флаг прерывания, но он не получает ответа из-за одного из вышеперечисленных условий блокировки, если этот флаг уже не активен в момент снятия условия блокировки, то соответствующее прерывание не будет обработано. Другими словами, когда флаг прерывания был один раз активен, и на него не поступил ответ обработки по вышеперечисленным блокировкам, то если этот флаг прерывания стал неактивен в момент снятия условия блокировки, то это временно заблокированное прерывание не будет обработано. Флаг прерывания, который был активен, но не обработан, не удерживается в памяти. Каждый цикл опроса является новым.
Обратите внимание, что если прерывание с более высоким приоритетом стало активным до начала третьего машинного цикла, то в соответствии с вышеописанными правилами оно будет перенаправлено во время пятого и шестого машинного цикла, без любой инструкции выполняемой подпрограммы ISR с более низким приоритетом.
Таким образом, процессор подтверждает запрос прерывания выполнением аппаратно сгенерированного LCALL в соответствующий ISR. В некоторых случаях это также приводит к очистке флага, который сгенерировал прерывание, и в некоторых случаях такая очистка флага не происходит. Никогда не очищаются флаги последовательного порта UART, очистку должен производить код пользователя. Автоматически очищаются запуском ISR флаги внешних прерываний (external interrupt IE0, IE1, IE2 или IE3) только если они были активированы переходом уровня. Аппаратно сгенерированный LCALL проталкивает содержимое программного счетчика PC в стек (но PSW автоматически в стек не проталкивается) и в PC загружается адрес, который зависит от обрабатываемого прерывания (адрес из таблицы векторов прерываний), как показано ниже.
Источник прерывания |
Адрес вектора |
IE0 (внешнее прерывание 0) |
0003h |
TF0 (таймер 0) |
000Bh |
IE1 (внешнее прерывание 1) |
0013h |
TF1 (таймер 1) |
001Bh |
RI+TI (UART) |
0023h |
TF2+EXF2 (таймер 2) |
002Bh |
IE2 (внешнее прерывание 2) |
0033h |
IE3 (внешнее прерывание 3) |
003Bh |
Выполнение кода продолжается от адреса вектора до места, где находится инструкция RETI. Инструкция RETI информирует процессор, что этот ISR закончился, и тогда два байта адреса возврата извлекаются из стека и перезагружаются в PC. Прерванный поток вычислений будет продолжен с того места, где он был оборван вызовом ISR.
Обратите внимание, что инструкция простого возврата из подпрограммы RET также вернет выполнение в место вызова подпрограммы, но она оставит систему обработки прерываний в состоянии, где она считает, что ISR все еще выполняется.
Подробнее про обработку прерываний и примеры кода см. даташит STC90C51RC-en.pdf [2].
[Таймеры/счетчики]
Всего имеется 3 таймера (Timer0, Timer1, Timer2), которые предназначены для аппаратного отсчета интервалов времени, генерации сигналов, захвата/подсчета внешних событий, измерения интервалов времени. Подробнее про работу таймеров см. даташит STC90C51RC-en.pdf [2].
[UART]
Последовательный порт UART может работать в 4 различных режимах, которые конфигурируются битами SM0 и SM1 SFR-регистра SCON. Режимы Mode1, Mode2 и Mode3 предназначены для асинхронного обмена данными (наподобие протокола RS-232). В режиме Mode0 порт UART используется как простой регистр сдвига. Подробнее про работу UART см. даташит STC90C51RC-en.pdf [2].
[IAP / EEPROM]
Технология ISP в MCU серии STC90xx делает возможным обновление программы приложения пользователя и энергонезависимых данных приложения (находящихся в памяти IAP) без извлечения чипа MCU из конечного изделия (рабочей системы, где MCU работает). Эта полезная функция делает возможным обновление программ прямо на месте использования изделия (field-update). Обратите внимание, что для функции ISP необходимо, чтобы в память ISP была предварительно запрограммирована программа загрузчика (bootloader). Обычно от потребителя не требуется знать тонкостей принципа работы ISP, потому что компания STC предоставляет готовый, стандартный инструментарий ISP (управляющую утилиту программирования наподобие stc-isp-15xx-v6.85p.exe, см. архив [2]) и встроенный код ISP в памяти поставляемых образцов микроконтроллеров STC. Однако при самостоятельной разработке годного программного обеспечения для реализации функции ISP программист должен понимать архитектуру встроенной энергонезависимой памяти программ (embedded flash) и данных.
Embedded flash состоит из максимум 90 страниц. Каждая страница содержит 512 байт. Работая с flash, пользователь должен стереть (erase) страницу целиком перед тем, как он сможет записать (запрограммировать) данные на эту страницу.
Стирание памяти flash означает установку байт её содержимого в значение FFH. Для этого чипа доступно 2 режима стирания. Один режим это mass mode, и другой (page mode). Mass mode работает быстрее, но он очищает всю память flash целиком. Page mode медленнее, но зато он более гибкий, поскольку позволяет стирать память по одной странице. Работа в реальном времени с RAM отличается от работы с flash при очистке и записи тем, что для записи (программирования) flash требуется тратить время на ожидание завершения процесса.
Кроме того, для стирания/программирования flash требуется специальная довольно сложная процедура. К счастью, чипы серии STC90xx поставляются с удобным механизмом, помогающим пользователю читать/изменять содержимое flash. Просто заполните целевой адрес и нужные данные в несколько регистров SFR, и сработает встроенная автоматическая процедура ISP, так что пользователь может просто стирать, читать и программировать встроенную память flash и регистры опций.
Функция IAP (In-Application Program) разработана для того, чтобы пользователь мог читать/записывать энергонезависимые данные (nonvolatile data) памяти flash. Это может значительно помочь сохранять параметры приложения независимо от событий включения и выключения питания. Другими словами, пользователь может сохранять некие данные в памяти flash, и после этого выключить или перезагрузить MCU, и иметь возможность восстановить оригинальные значения данных, которые он сохранил ранее до выключения/перезагрузки.
Пользователь может программировать flash данных (data flash) таким же способом, как и программировать приложение в память flash по технологии ISP, но требуется более глубокое понимание назначения регистров SFR: ISP_DATA, ISP_ADDRL, ISP_ADDRH, ISP_CMD, ISP_TRIG и ISP_CONTR.
В целом система ISP/IAP серии STC90xx работает так же, как и серии STC89xx. Подробнее про регистры системы ISP/IAP см. предыдущую врезку и даташит STC90C51RC-en.pdf [2].
[Таблица выбора STC90C51RC/RD+ по размеру внутреннего EEPROM]
Память данных FLASH серии STC90C51RC/RD+ (Data Flash, доступна внутри как EEPROM) и адресное пространство программ раздельны: если происходит запись данных/стирание сектора области пользователя в режиме IAP, то операторы модификации памяти будут игнорироваться. Программа в области приложения пользователя (application area, AP) может работать только с областью IAP/ISP памяти Data Flash (EEPROM).
Тип |
EEPROM, байт |
Секторов |
Начальный адрес |
Конечный адрес |
STC90C51RC/STC90LE51RC |
9K |
18 |
1000h |
33FFh |
STC90C52RC/STC90LE52RC |
5K |
10 |
2000h |
STC90C12RC/STC90LE12RC |
1K |
2 |
3000h |
STC90C54RD+/STC90LE54RD+ |
45K |
90 |
4000h |
F3FFh |
STC90C58RD+/STC90LE58RD+ |
29K |
58 |
8000h |
STC90C510RD+/STC90LE510RD+ |
21K |
42 |
A000h |
STC90C512RD+/STC90LE512RD+ |
13K |
26 |
C000h |
STC90C514RD+/STC90LE514RD+ |
5K |
10 |
E000h |
Примеры кода для программирования ISP/IAP/EEPROM см. в даташите STC90C51RC-en.pdf [2].
[Принцип работы ISP]
Если нужно загрузить код в память микроконтроллера серии STC90Cxx, выводы P1.0 и P1.1 должны быть подключены к GND. Если выбрана опция "Next program code, P1.0/1.1 need=0/0", то в следующий раз, когда Вам нужно будет перезагрузить код программы, то сначала выводы P1.0 и P1.1 должны быть подключены к земле. Приложение программатора STC-ISP.exe [2] должно послать первую команду в момент подачи питания на MCU. Таким образом, нужно подключить переходник USB-UART к выводам P3.0 и P3.1 UART, запустить STC-ISP.exe, и потом подать питание на программируемый MCU.
Процесс программирования по шагам с помощью утилиты STC-ISP.exe:
1. Соедините порт UART программируемого MCU (P3.0 RXD и P3.1 TXD) с соответствующими ножками приема и передачи переходничка USB-TTL_UART. Вход RXD MCU должен быть подключен к выходу TXD переходничка, и выход TXD MCU соответственно должен быть подключен ко входу RXD переходничка. Также шина GND MCU должна быть соединена с шиной GND переходничка. Желательно также на переходничке желательно установить уровни TTL, соответствующие уровням напряжения питания MCU (3.3V или 5V, если есть возможность установки уровня). 2. Подключите переходничок USB-TTL_UART к компьютеру. 3. Запустите утилиту STC-ISP.exe. 4. Выберите тип MCU (например STC90C51RC). 5. Загрузите файл двоичного кода программы (в формате *.bin или *.hex). 6. Выберите используемый номер последовательного порта (COMx). 7. Сконфигурируйте опции аппаратуры (hardware options). 8. Кликните на кнопку "ISP programming" или "Re-Programming" для загрузки кода программы пользователя. 9. Подайте питание на программируемый MCU. Код программы пользователя должен загрузиться.
Примечание: нужно сначала нажать на кнопку "ISP programming" или "Re-Programming", и только потом подать питание на MCU, иначе код не сможет загрузиться.
На демо-платах STC ножки P1.0, P1.1 и кнопка SW3 используются для выбора варианта загрузки, см. руководство пользователя платы.
[Компиляторы и эмуляторы]
Компилятор с языка C или ассемблера. Для STC MCU можно использовать любой традиционный компилятор/ассемблер, например популярный Keil. В опциях выбора типа процессора можно выбрать Intel 8052/87C52/87C52/87C58 или Philips P87C52/P87C54/P87C58. С сайта компании STC можно загрузить файл базы данных чипов STC.CDB.
Программатор. Вы можете использовать ISP-программатор компании STC. Программатор можно использовать как демонстрационную плату разработчика (demo-board).
Эмулятор. Компания STC не предоставляет специальный эмулятор для чипов STC. Вы можете использовать традиционный существующий эмулятор для 8051 для симуляции базовых функций 8052 микроконтроллеров STC.
[Программирование на языке ассемблера и языке C]
Ассемблер. Этот язык программирования экстремально близок к машинному языку процессора, если сравнивать с высокоуровневыми языками наподобие Pascal и C. Языки Pascal и C понятнее для человека, но они все-таки довольно далеки от "натурального" машинного кода, который выполняет процессор. Машинный код это последовательность байт, представляющих инструкции программы, которые может выполнить процессор.
Язык ассемблера заменяет двоичные коды машинного языка на более понятные мнемоники команд процессора, упрощая написание программы. Например, инструкция сложения на машинном языке может представлять собой код из последовательности бит 10110011. Эта последовательность бит может быть представлена мнемоникой ADD языка ассемблер. На машинном языке сейчас уже никто не программирует, для этого применяют ассемблер.
Конечно же, это далеко не полное описание языка ассемблер. Инструкции также могут оперировать данными, и место размещения данных указываются различными режимами адресации, привязанными к системе команд процессора. Таким образом, к примеру, может быть несколько вариантов инструкции ADD - в зависимости от того, какие операнды складываются и в какой памяти они находятся. Правила, по которым эти варианты указываются, относятся к основным правилам программирования на языке ассемблер для конкретной архитектуры.
Программа на ассемблере это текст, понятный пользователю, и она не может быть напрямую выполнена на целевом процессоре. После написания эта программа должна быть сначала преобразована, "скомпилирована" (или транслирована) в машинный код. В предыдущем примере процесс компилирования преобразует команду ADD в двоичный код наподобие 10110011. В зависимости от сложности окружения, в котором происходит программирование, процесс трансляции в машинный код может состоять из одного или нескольких шагов, в процессе выполнения которых будет получен готовый исполняемый машинный код. Как минимум должна быть преобразована программа на ассемблере одного главного модуля в машинный код. Если программа состоит из нескольких программных модулей и/или библиотек, то может потребоваться компиляция модулей кода по отдельности в объектный код плюс дополнительный шаг, который называется линковкой, когда модули объектного кода и библиотеки объединяются линкером в один исполняемый машинный код. Процесс линковки устанавливает абсолютные адреса в памяти, где будет размещен исполняемый код и данные программы. Чтобы было понятнее, введем несколько определений.
Программа на языке ассемблера это текстовый файл, который содержит в себе метки, мнемоники операторов, и каждый оператор соответствует какой-либо инструкции машинного кода. Программу на языке ассемблера часто называют исходным кодом или символическим кодом, он который не может непосредственно, без преобразования в машинный код, выполняться на целевом процессоре.
Программа в машинных кодах это программа, состоящая из двоичных кодов, которые непосредственно представляют инструкции, выполняемые целевым процессором. Машинный код обычно привязан к абсолютным адресам в памяти программ, и эта программа в машинном коде может быть непосредственно выполнена на целевом процессоре.
Программа на языке ассемблера может быть преобразована в программу в машинных кодах. Машинный код обычно получается через промежуточный, так называемый объектный код, который пока еще не привязан к абсолютным адресам процессора. Объектный код является перемещаемым, т. е. он может быть размещен в любом месте адресного пространства процессора. В процессе линковки, когда генерируется машинный код, осуществляется привязка перемещаемого объектного кода к абсолютным адресам памяти программ. Требуется выполнение линковки, чтобы программа получила абсолютные адреса для выполняемых инструкций.
Линкер это программа, которая комбинирует друг с другом отдельные перемещаемые объектные модули и в результате генерирует один не перемещаемый двоичный машинный код.
Сегментом называют область памяти программы или область данных. Перемещаемый сегмент имеет имя, тип и другие атрибуты, что позволяет линкеру комбинировать сегменты друг с другом, если это необходимо, и в результате правильно размещать их в памяти по абсолютным адресам. У абсолютного сегмента нет имени, и он не может быть скомбинирован с другими сегментами.
Модуль кода содержит один или большее количество сегментов, или части сегментов. У модуля есть имя, которое назначает пользователь. Определения в модуле задают область действия локальных символов в программе. Объектный файл может содержать код одного или большего количества модулей. Во многих случаях модулю может соответствовать один файл исходного кода.
Программа состоит из одного абсолютного модуля, объединяя в себе все абсолютные и перемещаемые сегменты из всех модулей. Исполняемый машинный код программы содержит двоичные коды инструкций (содержащие адреса и константы данных), которые напрямую понимает и может выполнить целевой процессор.
Подробное описание языка ассемблера MCU серии STC90xx см. в даташите STC90C51RC-en.pdf [2].
Язык C. Для практического программирования чаще применяют не язык ассемблера, а язык C (кроме отдельных специальных случаев). Программирование на C для архитектуры 8051 имеет неоспоримые достоинства по сравнению с программированием на ассемблере, но однако оно не лишено и недостатков.
Достоинства:
• Предоставляет все выгоды высокоуровневого, структурированного языка программирования, каким является язык C, включая простоту программирования с использованием подпрограмм и функций. • Часто освобождает программиста от оперирования некоторыми деталями аппаратной организации процессора, с которыми компилятор обращается от имени программиста. • Значительно упрощает написание кода, особенно для больших и сложных программ. • Исходный код получается более понятный и удобочитаемый. • Предоставляется доступ к стандартным библиотекам и большому массиву готового кода, который можно получить из различных источников.
Тем не менее, язык C для архитектуры 8051, будучи очень похожим на обычный C, страдает следующими недостатками. Эти недостатки прямое следствие удобств, которые дает C:
• Обычно генерирует машинный код размером больше, чем код на ассемблере. • У программиста меньше контроль и меньше возможностей для прямой работы с аппаратурой.
Компиляторы 8051 C. Для получения машинного кода требуется компилятор - как при использовании языка ассемблер, так и при использовании языка C. В настоящее время имеется множество компиляторов с языка C для платформы 8051. Все примеры кода, предоставляемые STC, были скомпилированы и проверены в среде Keil μVision 2 IDE. Это интегрированная среда разработки от компании Keil Software, в которой имеется собственный кросс-компилятор C51.
Примечание: кросс-компилятором называют компилятор, который запускается на компьютере PC, но генерирует код, предназначенный для другой аппаратной платформы.
Подробнее про язык ассемблера и язык C см. даташит STC90C51RC-en.pdf [2].
[Электрические характеристики]
Предельные эксплуатационные значения:
Параметр |
Символ |
MIN |
MAX |
Ед. |
Температура хранения |
TST |
-55 |
+125 |
°C |
Рабочая температура (индустриальное исполнение, I) |
TA |
-40 |
+85 |
°C |
Рабочая температура (коммерческое исполнение, C) |
TA |
0 |
+70 |
°C |
Напряжение питания (5V версия, относительно VSS, или GND) |
VDD |
-0.3 |
+6.0 |
V |
Напряжение питания (3V версия, относительно VSS, или GND) |
VDD |
-0.3 |
+4.0 |
V |
Напряжение на любом выводе (относительно VSS, или GND) |
|
-0.5 |
+5.5 |
V |
Рабочие параметры по постоянному току для 5V версий MCU:
Символ |
Параметр |
MIN |
Typ |
MAX |
Ед. |
Условия проверки |
VDD |
Рабочее напряжение |
3.8 |
5.0 |
5.5 |
V |
|
IPD |
Ток режима "выключено" (Power Down Current) |
- |
< 0.1 |
- |
μA |
5V |
IIDL |
Ток режима ожидания (Idle Current) |
- |
2.0 |
- |
mA |
5V |
ICC |
Рабочий ток |
- |
4 |
20 |
mA |
5V |
VIL1 |
Входное напряжение лог. 0 (P0, P1, P2, P3, P4) |
- |
- |
0.8 |
V |
5V |
VIL2 |
Входное напряжение лог. 0 (RESET, XTAL1) |
- |
- |
1.5 |
V |
5V |
VIH1 |
Входное напряжение лог. 1 (P0, P1, P2, P3, P4, /EA) |
2.0 |
- |
- |
V |
5V |
IOL1 |
Коммутируемый ток для вых. уровня лог. 0 (P1, P2, P3, P4) |
4 |
6 |
- |
mA |
5V |
IOL2 |
Коммутируемый ток для вых. уровня лог. 0 (P0, ALE, PSEN) |
8 |
12 |
- |
mA |
5V |
IOH1 |
Вытекающий ток для вых. уровня лог. 1 (P1, P2, P3, P4) |
150 |
220 |
- |
μA |
5V |
IOH2 |
Вытекающий ток для вых. уровня лог. 1 (ALE, PSEN) |
14 |
20 |
- |
mA |
5V |
IIL |
Входной ток лог. 0 (P1, P2, P3, P4) |
- |
18 |
50 |
μA |
Vpin=0V |
ITL |
Ток перехода от лог. 1 к лог. 0 (P1, P2, P3, P4) |
- |
270 |
600 |
μA |
Vpin=2.0V |
Рабочие параметры по постоянному току для 3V версий MCU:
Символ |
Параметр |
MIN |
Typ |
MAX |
Ед. |
Условия проверки |
VDD |
Рабочее напряжение |
2.4 |
3.3 |
3.8 |
V |
|
IPD |
Ток режима "выключено" (Power Down Current) |
- |
< 0.1 |
- |
μA |
3.3V |
IIDL |
Ток режима ожидания (Idle Current) |
- |
2.0 |
- |
mA |
3.3V |
ICC |
Рабочий ток |
- |
4 |
15 |
mA |
3.3V |
VIL1 |
Входное напряжение лог. 0 (P0, P1, P2, P3, P4) |
- |
- |
0.8 |
V |
3.3V |
VIL2 |
Входное напряжение лог. 0 (RESET, XTAL1) |
- |
- |
1.5 |
V |
3.3V |
VIH1 |
Входное напряжение лог. 1 (P0, P1, P2, P3, P4) |
2.0 |
- |
- |
V |
3.3V |
VIH2 |
Входное напряжение лог. 1 (RESET) |
3.0 |
- |
- |
V |
3.3V |
IOL1 |
Коммутируемый ток для вых. уровня лог. 0 (P1, P2, P3, P4) |
2.5 |
4 |
- |
mA |
3.3V |
IOL2 |
Коммутируемый ток для вых. уровня лог. 0 (P0, ALE, PSEN) |
5 |
8 |
- |
mA |
3.3V |
IOH1 |
Вытекающий ток для вых. уровня лог. 1 (P1, P2, P3, P4) |
40 |
70 |
- |
μA |
3.3V |
IOH2 |
Вытекающий ток для вых. уровня лог. 1 (ALE, PSEN) |
8 |
13 |
- |
mA |
3.3V |
IIL |
Входной ток лог. 0 (P1, P2, P3, P4) |
- |
8 |
50 |
μA |
Vpin=0V |
ITL |
Ток перехода от лог. 1 к лог. 0 (P1, P2, P3, P4) |
- |
110 |
600 |
μA |
Vpin=2.0V |
[Ссылки]
1. Микроконтроллеры STCmicro. 2. 170314STCmcu.zip - документация на английском языке по микроконтроллерам STC, утилита программирования. |