STC15Fxx Печать
Добавил(а) microsin   

Серия STC15Fxx представляет однокристальные микроконтроллеры компании STC MCU Limited (STCmicro) [1], основанные на высокопроизводительном ядре 1T с архитектурой ядра 80C51. Например, расширенное ядро STC15F204EA выполняет инструкции за 1..6 тактов (что в 6..7 раз быстрее стандартного устройства 8051), с сохранением полной совместимости со ставшей индустриальным стандартом серией микроконтроллеров 80C51. Технологии самопрограммирования (In-System-Programming, ISP) и доступа к энергонезависимым данным из работающего приложения (In-Application-Programming, IAP) предоставляют пользователям возможность обновлять программу и данные в системе. ISP позволяет загружать новый код программы без извлечения микроконтроллера из конечного изделия; IAP означает, что устройство может само записывать сохраняемые при выключении питания данные в память Flash прямо из работающего кода приложения. У STC15F204EA есть 9 источников прерывания, 10-битный ADC (АЦП), встроенный в кристалл высокоточный RC-генератор и однократно разрешаемый сторожевой таймер (Watch-Dog Timer, WDT). Другие микроконтроллеры серии имеют аналогичные параметры по быстродействию и напряжениям питания, отличаясь количеством портов GPIO и возможно отсутствующим АЦП.

Примечание: в тексте часто используется термин "серия STC15Fxx", и под этим подразумевается весь ассортимент микроконтроллеров STC15Fxx: STC15F100, STC15F101, STC15F101E, STC15F102, STC15F102E, STC15F103, STC15F103E, STC15F104, STC15F104E, STC15F105, STC15F105, STC15F105E, IAP15F106, STC15L100, STC15L101, STC15L101E, STC15L102, STC15L102E, STC15L103, STC15F10LE, STC15L104, STC15L104E, STC15L105, STC15L105, STC15L105E, IAP15L106, STC15F201A, STC15F201EA, STC15F202A, STC15F202EA, STC15F203A, STC15F203EA, STC15F204A, STC15F204EA, STC15F205A, STC15F205EA, IAP15F206A, STC15L201A, STC15L201EA, STC15L202A, STC15L202EA, STC15L203A, STC15L203EA, STC15L204A, STC15L204EA, STC15L205A, STC15L205EA, IAP15L206A.

Основные возможности серии на примере микроконтроллера STC15F204EA:

• Улучшенное ядро (CPU) 80C51, работающее в 6..7 раз быстрее, чем стандартный микроконтроллер (MCU) 8051.
• Рабочий диапазон напряжений питания: 3.8-5.5V или 2.4V-3.6V (последнее для низковольтной серии STC15L204EA).
• Рабочий диапазон тактовых частот 5..35 МГц, что по скорости работы эквивалентно частотам 60..420 МГц для стандартного 8051.
• Высокоточный внутренний RC-генератор с уходом по температуре ±1% (в диапазоне температур -40..+85°C).
• Внутренний RC-генератор имеет настраиваемый ряд частот 5.5296 МГц / 11.0592 МГц / 22.1184 МГц / 33.1776 МГц.
• Встроенную в кристалл оперативную память (ОЗУ, RAM) на 256 байт и 1..6K байт памяти программ (code flash) с гибкой возможностью перепрограммирования ISP/IAP.
• Функция EEPROM.
• Защита доступа к коду, записанному в память flash.
• Два 16-битных таймера/счетчика Timer0/Timer1 с режимом 0 (16-битный режим с автоматической перезагрузкой), режимом 1 (16-битный таймер) и режимом 2 (8-битный режим с автоматической перезагрузкой).
• Симуляция UART может быть реализована на выводах портов P3.0, P3.1 с помощью таймеров.
• 8-канальный, 10-битный ADC с поддержкой прерывания, работающий на скорости до 300 тысяч выборок в секунду.
• 9 источников прерывания.
• Один 15-битный сторожевой таймер (Watch-Dog-Timer, WDT) с 8-битным прескалером. WDT может быть разрешен однократно после сброса, после чего не может быть запрещен.
• Три режима экономии энергии: idle mode (режим ожидания), slow down mode (режим замедления) и power-down mode (режим отключения). Из power down mode MCU можно разбудить внешним выводом INTx (INT0/P3.2, INT1/P3.3, INT2, INT3, INT4).
• Отличные параметры в контексте малой генерации радиопомех, очень низкое энергопотребление.
• Поддерживает 2-проводный интерфейс последовательного программирования (GND/P3.0/P3.1/VCC).
• Функция выхода программируемой тактовой частоты. T0 выводит такты на ножке порта P3.5, T1 выводит такты на ножке порта P3.4.
• Имеется 26 конфигурируемых портов ввода/вывода (I/O ports, GPIO), и по умолчанию (после сброса) они работают как квази-двунаправленные (quasi-bidirectional). Все ножки портов могут быть независимо друг от друга сконфигурированы в 4 режимах: quasi-bidirectional, push-pull output (двухтактный выход), input-only (только вход) или open drain output (выход с открытым стоком). Каждая ножка порта может коммутировать ток до 20 mA, однако рекомендуется ограничить суммарный ток не более 90 mA на корпус чипа.
• Выпускается в корпусах типа SOP-28, SKDIP-28.

Другие модели процессоров серии STC15Fxx также выпускаются и в корпусах SOP-8, DIP-8, SOP-20, DIP-20.

CPU (процессорное ядро) серии STC15Fxx полностью совместимо со стандартным 8051 MCU по мнемоникам инструкций, с сохранением двоичной совместимости кода. С применением значительных улучшений в архитектуре серия STC15Fxx может выполнять самые быстрые инструкции за 1 период тактовой частоты (для сравнения: стандартное ядро 8051 требует для этого 12 тактов). Увеличение производительности каждой конкретной программы зависит от используемых в ней инструкций.

Блок-схема MCU типа STC15F101E:

STC15F101E series Block Diagram

Блок-схема MCU типа STC15F204EA:

STC15F204EA series Block Diagram

Цоколевка корпуса SOP-28/SKDIP-28 чипа серии STC15F204EA:

STC15F204EA series pinout

Описание выводов серии STC15F204EA:

Мнемоника Вывод Описание  
P0.0/RST/SYSclkO 11 P0.0 Порт GPIO.
RST Вход для внешнего сигнала сброса.
SYSclkO Выход внутренней системной тактовой частоты.
P0.1 13 P0.1 Порт GPIO.
P1.0/ADC0 3 P1.0 Порт GPIO.
ADC0 Вход АЦП канала 0.
P1.1/ADC1 4 P1.1 Порт GPIO.
ADC1 Вход АЦП канала 1.
P1.2/ADC2 5 P1.2 Порт GPIO.
ADC2 Вход АЦП канала 2.
P1.3/ADC3 6 P1.3 Порт GPIO.
ADC3 Вход АЦП канала 3.
P1.4/ADC4 7 P1.4 Порт GPIO.
ADC4 Вход АЦП канала 4.
P1.5/ADC5 8 P1.5 Порт GPIO.
ADC5 Вход АЦП канала 5.
P1.6/ADC6 9 P1.6 Порт GPIO.
ADC6 Вход АЦП канала 6.
P1.7/ADC7 10 P1.7 Порт GPIO.
ADC7 Вход АЦП канала 7.
P2.0/RSTOUT_LOW 23 P2.0 Порт GPIO.
RSTOUT_LOW После включения питания на этом выходе появится лог. 0. Измените значение в выходном регистре на лог. 1 перед тем, как настроить этот порт как вход.
P2.1 24 P2.1 Порт GPIO.
P2.2 25 P2.2
P2.3 26 P2.3
P2.4 27 P2.4
P2.5 28 P2.5
P2.6 1 P2.6
P2.7 2 P2.7
P3.0/INT4 15 P3.0 Порт GPIO.
~INT4 Один из входов внешнего прерывания. Это прерывание срабатывает только по отрицательному перепаду сигнала (1 -> 0), с приоритетом Lease, и может вывести MCU из режима отключения (из power-down mode).

Также эта ножка программно эмулирует вход порта UART, что используется для загрузки программного обеспечения по технологии ISP.
P3.1 16 P3.1 Порт GPIO. Также эта ножка программно эмулирует выход порта UART, что используется для загрузки программного обеспечения по технологии ISP.
P3.2/INT0 17 P3.2 Порт GPIO.
INT0 Один из входов внешнего прерывания. Прерывание может быть сконфигурировано для срабатывания как по положительному перепаду уровня логики (0 -> 1), так и по отрицательному (1 -> 0), либо только по отрицательному перепаду. Отрицательный перепад вызовет срабатывание прерывания, если установлен бит IT0 (бит 0 регистра TCON), и будет произведено срабатывание прерывания по обоим перепадам, если бит IT0 сброшен. Также прерывание INT0 может вывести MCU из power-down mode.
P3.3/INT1 18 P3.3 Порт GPIO.
INT1 Один из входов внешнего прерывания. Прерывание может быть сконфигурировано для срабатывания как по положительному перепаду уровня логики (0 -> 1), так и по отрицательному (1 -> 0), либо только по отрицательному перепаду. Отрицательный перепад вызовет срабатывание прерывания, если установлен бит IT1 (бит 2 регистра TCON), и будет произведено срабатывание прерывания по обоим перепадам, если бит IT1 сброшен. Также прерывание INT1 может вывести MCU из power-down mode.
P3.4/T0/CLKOUT1 19 P3.4 Порт GPIO.
T0 Вход T0 для Timer0.
CLKOUT1 Выход частоты, равной частоте переполнения Timer1, поделенной на 2. Для того, чтобы это работало, выполните установку бита T1CLKO (бит 1 регистра INT_CLKO).
P3.5/T1/CLKOUT0 20 P3.5 Порт GPIO.
T1 Вход T1 для Timer1.
CLKOUT0 Выход частоты, равной частоте переполнения Timer0, поделенной на 2. Для того, чтобы это работало, выполните установку бита T0CLKO (бит 0 регистра INT_CLKO).
P3.6/INT2 21 P3.6 Порт GPIO.
~INT2 Один из входов внешнего прерывания. Это прерывание срабатывает только по отрицательному перепаду сигнала (1 -> 0), с приоритетом Lease, и может вывести MCU из режима отключения (из power-down mode).
P3.7/INT4 22 P3.7 Порт GPIO.
~INT3 Один из входов внешнего прерывания. Это прерывание срабатывает только по отрицательному перепаду сигнала (1 -> 0), с приоритетом Lease, и может вывести MCU из режима отключения (из power-down mode).
Vcc 12 Плюс напряжения питания.
GND 14 Земля, минус напряжения питания, общий провод для всех сигналов.

Таблица выбора по общим параметрам серии STC15F204EA:

Тип
VCC, V
FLASH,
байт

SRAM,
байт
EEPROM,
байт
TIMER
Серия 15F (5V питание)
STC15F201A 3.8-5.5 1K 256 - 2
STC15F201EA 3.8-5.5 1K 256 2K 2
STC15F202A 3.8-5.5 2K 256 - 2
STC15F202EA 3.8-5.5 2K 256 2K 2
STC15F203A 3.8-5.5 3K 256 - 2
STC15F203EA 3.8-5.5 3K 256 2K 2
STC15F204A 3.8-5.5 4K 256 - 2
STC15F204EA 3.8-5.5 4K 256 1K 2
STC15F205A 3.8-5.5 5K 256 - 2
STC15F205EA 3.8-5.5 5K 256 1K 2
IAP15F206A 3.8-5.5 6K 256 IAP 2
Серия 15L (3.3V питание)
STC15L201A 2.4-3.6 1K 256 - 2
STC15L201EA 2.4-3.6 1K 256 2K 2
STC15L202A 2.4-3.6 2K 256 - 2
STC15L202EA 2.4-3.6 2K 256 2K 2
STC15L203A 2.4-3.6 3K 256 - 2
STC15L203EA 2.4-3.6 3K 256 2K 2
STC15L204A 2.4-3.6 4K 256 - 2
STC15L204EA 2.4-3.6 4K 256 1K 2
STC15L205A 2.4-3.6 5K 256 - 2
STC15L205EA 2.4-3.6 5K 256 1K 2
IAP15L206A 2.4-3.6 6K 256 IAP 2

У серии отсутствуют следующие аппаратные возможности: нет UART, нет специального таймера для выхода из режима сна/режима выключения.

Имеются следующие аппаратные возможности: 26 ножек портов ввода/вывода (GPIO), прерывание по недопустимому снижению напряжения питания, может конфигурироваться порог недопустимого снижения напряжения питания, 5 внешних прерываний могут выводит микроконтроллер из режима выключения (power down mode), имеется 10-битный 8-канальный АЦП, сторожевой таймер (WDT).

Цоколевка корпуса SOP-8/DIP-8 чипа серии STC15F101E:

STC15F101E series pinout

Описание выводов серии STC15F101E:

Мнемоника Вывод Описание  
P3.0/INT4 5 P3.0 Порт GPIO.
~INT4 Один из входов внешнего прерывания. Это прерывание срабатывает только по отрицательному перепаду сигнала (1 -> 0), с приоритетом Lease, и может вывести MCU из режима отключения (из power-down mode).

Также эта ножка программно эмулирует вход порта UART, что используется для загрузки программного обеспечения по технологии ISP.
P3.1 6 P3.1 Порт GPIO. Также эта ножка программно эмулирует выход порта UART, что используется для загрузки программного обеспечения по технологии ISP.
P3.2/INT0 7 P3.2 Порт GPIO.
INT0 Один из входов внешнего прерывания. Прерывание может быть сконфигурировано для срабатывания как по положительному перепаду уровня логики (0 -> 1), так и по отрицательному (1 -> 0), либо только по отрицательному перепаду. Отрицательный перепад вызовет срабатывание прерывания, если установлен бит IT0 (бит 0 регистра TCON), и будет произведено срабатывание прерывания по обоим перепадам, если бит IT0 сброшен. Также прерывание INT0 может вывести MCU из power-down mode.
P3.3/INT1/RSTOUT_LOW 8 P3.3 Порт GPIO.
INT1 Один из входов внешнего прерывания. Прерывание может быть сконфигурировано для срабатывания как по положительному перепаду уровня логики (0 -> 1), так и по отрицательному (1 -> 0), либо только по отрицательному перепаду. Отрицательный перепад вызовет срабатывание прерывания, если установлен бит IT1 (бит 2 регистра TCON), и будет произведено срабатывание прерывания по обоим перепадам, если бит IT1 сброшен. Также прерывание INT1 может вывести MCU из power-down mode.
RSTOUT_LOW После включения питания на этом выходе появится лог. 0. Измените значение в выходном регистре на лог. 1 перед тем, как настроить этот порт как вход.
P3.4/RST/T0/CLKOUT1
/~INT2/SYSclkO
1 P3.4 Порт GPIO.
RST Вход для внешнего сигнала сброса.
T0 Вход T0 для Timer0.
CLKOUT1 Выход частоты, равной частоте переполнения Timer1, поделенной на 2. Для того, чтобы это работало, выполните установку бита T1CLKO (бит 1 регистра INT_CLKO).
~INT2 Один из входов внешнего прерывания. Это прерывание срабатывает только по отрицательному перепаду сигнала (1 -> 0), с приоритетом Lease, и может вывести MCU из режима отключения (из power-down mode).
SYSclkO Выход внутренней системной тактовой частоты.
P3.5/T1/CLKOUT0/~INT3 3 P3.5 Порт GPIO.
T1 Вход T1 для Timer1.
CLKOUT0 Выход частоты, равной частоте переполнения Timer0, поделенной на 2. Для того, чтобы это работало, выполните установку бита T0CLKO (бит 0 регистра INT_CLKO).
~INT3 Один из входов внешнего прерывания. Это прерывание срабатывает только по отрицательному перепаду сигнала (1 -> 0), с приоритетом Lease, и может вывести MCU из режима отключения (из power-down mode).
Vcc 2 Плюс напряжения питания.
GND 4 Земля, минус напряжения питания, общий провод для всех сигналов.

Таблица выбора по общим параметрам серии STC15F101E:

Тип
VCC, V
FLASH,
байт

SRAM,
байт
EEPROM,
байт
TIMER
Серия 15F (5V питание)
STC15F100 3.8-5.5 512 128 - 2
STC15F101 3.8-5.5 1K 128 - 2
STC15F101E 3.8-5.5 1K 128 2K 2
STC15F102 3.8-5.5 2K 128 - 2
STC15F102E 3.8-5.5 2K 128 2K 2
STC15F103 3.8-5.5 3K 128 - 2
STC15F103E 3.8-5.5 3K 128 2K 2
STC15F104 3.8-5.5 4K 128 - 2
STC15F104E 3.8-5.5 4K 128 1K 2
STC15F105 3.8-5.5 5K 128 - 2
STC15F105E 3.8-5.5 5K 128 1K 2
IAP15F106 3.8-5.5 6K 128 IAP 2
Серия 15L (3.3V питание)
STC15L100 2.4-3.6 512 128 - 2
STC15L101 2.4-3.6 1K 128 - 2
STC15L101E 2.4-3.6 1K 128 2K 2
STC15L102 2.4-3.6 2K 128 - 2
STC15L102E 2.4-3.6 2K 128 2K 2
STC15L103 2.4-3.6 3K 128 - 2
STC15L103E 2.4-3.6 3K 128 2K 2
STC15L104 2.4-3.6 4K 128 - 2
STC15L104E 2.4-3.6 4K 128 1K 2
STC15L105 2.4-3.6 5K 128 - 2
STC15L105E 2.4-3.6 5K 128 1K 2
IAP15L106 2.4-3.6 6K 128 IAP 2

У серии отсутствуют следующие аппаратные возможности: нет АЦП, нет UART, нет специального таймера для выхода из режима сна/режима выключения.

Имеются следующие аппаратные возможности: 6 ножек портов ввода/вывода (GPIO), прерывание по недопустимому снижению напряжения питания, может конфигурироваться порог недопустимого снижения напряжения питания, 5 внешних прерываний могут выводит микроконтроллер из режима выключения (power down mode), имеется сторожевой таймер (WDT).

STC15S204EA series pinout

Описание выводов серии STC15S204EA:

Мнемоника Вывод Описание  
P0.0/RST/SYSclkO 7 P0.0 Порт GPIO.
RST Вход для внешнего сигнала сброса.
SYSclkO Выход внутренней системной тактовой частоты.
P0.1 9 P0.1 Порт GPIO.
P1.0/ADC0 20 P1.0 Порт GPIO.
ADC0 Вход АЦП канала 0.
P1.1/ADC1 19 P1.1 Порт GPIO.
ADC1 Вход АЦП канала 1.
P1.2/ADC2 1 P1.2 Порт GPIO.
ADC2 Вход АЦП канала 2.
P1.3/ADC3 2 P1.3 Порт GPIO.
ADC3 Вход АЦП канала 3.
P1.4/ADC4 3 P1.4 Порт GPIO.
ADC4 Вход АЦП канала 4.
P1.5/ADC5 4 P1.5 Порт GPIO.
ADC5 Вход АЦП канала 5.
P1.6/ADC6 5 P1.6 Порт GPIO.
ADC6 Вход АЦП канала 6.
P1.7/ADC7 6 P1.7 Порт GPIO.
ADC7 Вход АЦП канала 7.
P3.0/INT4 11 P3.0 Порт GPIO.
~INT4 Один из входов внешнего прерывания. Это прерывание срабатывает только по отрицательному перепаду сигнала (1 -> 0), с приоритетом Lease, и может вывести MCU из режима отключения (из power-down mode).

Также эта ножка программно эмулирует вход порта UART, что используется для загрузки программного обеспечения по технологии ISP.
P3.1 12 P3.1 Порт GPIO. Также эта ножка программно эмулирует выход порта UART, что используется для загрузки программного обеспечения по технологии ISP.
P3.2/INT0 13 P3.2 Порт GPIO.
INT0 Один из входов внешнего прерывания. Прерывание может быть сконфигурировано для срабатывания как по положительному перепаду уровня логики (0 -> 1), так и по отрицательному (1 -> 0), либо только по отрицательному перепаду. Отрицательный перепад вызовет срабатывание прерывания, если установлен бит IT0 (бит 0 регистра TCON), и будет произведено срабатывание прерывания по обоим перепадам, если бит IT0 сброшен. Также прерывание INT0 может вывести MCU из power-down mode.
P3.3/INT1 14 P3.3 Порт GPIO.
INT1 Один из входов внешнего прерывания. Прерывание может быть сконфигурировано для срабатывания как по положительному перепаду уровня логики (0 -> 1), так и по отрицательному (1 -> 0), либо только по отрицательному перепаду. Отрицательный перепад вызовет срабатывание прерывания, если установлен бит IT1 (бит 2 регистра TCON), и будет произведено срабатывание прерывания по обоим перепадам, если бит IT1 сброшен. Также прерывание INT1 может вывести MCU из power-down mode.
P3.4/T0/CLKOUT1 15 P3.4 Порт GPIO.
T0 Вход T0 для Timer0.
CLKOUT1 Выход частоты, равной частоте переполнения Timer1, поделенной на 2. Для того, чтобы это работало, выполните установку бита T1CLKO (бит 1 регистра INT_CLKO).
P3.5/T1/CLKOUT0 16 P3.5 Порт GPIO.
T1 Вход T1 для Timer1.
CLKOUT0 Выход частоты, равной частоте переполнения Timer0, поделенной на 2. Для того, чтобы это работало, выполните установку бита T0CLKO (бит 0 регистра INT_CLKO).
P3.6/INT2 17 P3.6 Порт GPIO.
~INT2 Один из входов внешнего прерывания. Это прерывание срабатывает только по отрицательному перепаду сигнала (1 -> 0), с приоритетом Lease, и может вывести MCU из режима отключения (из power-down mode).
P3.7/INT4 18 P3.7 Порт GPIO.
~INT3 Один из входов внешнего прерывания. Это прерывание срабатывает только по отрицательному перепаду сигнала (1 -> 0), с приоритетом Lease, и может вывести MCU из режима отключения (из power-down mode).
Vcc 8 Плюс напряжения питания.
GND 10 Земля, минус напряжения питания, общий провод для всех сигналов.

Таблица выбора по общим параметрам серии STC15S204EA:

Тип
VCC, V
FLASH,
байт

SRAM,
байт
EEPROM,
байт
TIMER
Серия 15S (5V питание)
STC15S201A 3.8-5.5 1K 256 - 2
STC15S201EA 3.8-5.5 1K 256 2K 2
STC15S202A 3.8-5.5 2K 256 - 2
STC15S202EA 3.8-5.5 2K 256 2K 2
STC15S203A 3.8-5.5 3K 256 - 2
STC15S203EA 3.8-5.5 3K 256 2K 2
STC15S204A 3.8-5.5 4K 256 - 2
STC15S204EA 3.8-5.5 4K 256 1K 2
STC15S205A 3.8-5.5 5K 256 - 2
STC15S205EA 3.8-5.5 5K 256 1K 2
IAP15S206A 3.8-5.5 6K 256 IAP 2
Серия 15V (3.3V питание)
STC15V201A 2.4-3.6 1K 256 - 2
STC15V201EA 2.4-3.6 1K 256 2K 2
STC15V202A 2.4-3.6 2K 256 - 2
STC15V202EA 2.4-3.6 2K 256 2K 2
STC15V203A 2.4-3.6 3K 256 - 2
STC15V203EA 2.4-3.6 3K 256 2K 2
STC15V204A 2.4-3.6 4K 256 - 2
STC15V204EA 2.4-3.6 4K 256 1K 2
STC15V205A 2.4-3.6 5K 256 - 2
STC15V205EA 2.4-3.6 5K 256 1K 2
IAP15V206A 2.4-3.6 6K 256 IAP 2

Серия STC15S204EA это специальная версия серии STC15F204EA, но для неё пока не предоставляется образцов. Основные аппаратные возможности такие же, отличается только количество выводов корпуса, и соответственно количество портов GPIO.

Размеры корпусов MCU разных моделей SOP-8, DIP-8, SOP-20, DIP-20, SOP-28, SKDIP-28 см. в даташитах STC15F100-en.pdf, STC15F204EA-en.pdf [2].

[Система именования моделей MCU серии STC15Fxx]

Так обозначаются типы линейки моделей STC15F204EA:

STC15F204EA series MCU naming rules

Так обозначаются типы линейки моделей STC15F101E:

STC15F101E series MCU naming rules

[Минимальная схема подключения STC15F101E]

STC15F101E Typical Application Circuit

Вывод P3.4/RST/T0/CLKOUT1/INT2/SYSclk по умолчанию (как чипы поставляются с завода) настроен как ножка GPIO, и его можно сконфигурировать на функцию вывода RESET с помощью утилиты STC-ISP Writer/Programmer. В чип также встроена надежная схема сброса, не требующая подключения внешних RC-цепей. Внутренний точный RC-генератор имеет уход в зависимости от температуры ±1%(в диапазоне -40°C..+80°C), что не требует применения дорогого внешнего кварцевого резонатора.

[Типовая схема подключения STC15F101E (рассчитанная на ISP)]

STC15F101E Typical Application Circuit for ISP

[Типовая схема подключения STC15F204A (рассчитанная на ISP)]

В кристалл чипа встроена схема внутреннего сброса, поэтому специальные внешние цепи для организации сброса не требуются. Внутренний точный RC-генератор с уходом чатоты от температуры ±1%(в диапазоне -40°C..+80°C) позволяет избавиться от подключения внешнего кварцевого резонатора.

STC15F204EA Typical Application Circuit for ISP

[Тактирование]

Имеется только один источник тактирования - внутренний RC-генератор, который может работать на частотах от 5 до 35 МГц. Уход частоты при этом составляет ±1% в рабочем диапазоне температур.

После настройки генератора можно задействовать для MCU замедляющий механизм в целях экономии потребляемой энергии. Замедление MCU осуществляется записью ненулевых значений в биты CLKS[2:0] регистра CLK_DIV. Эта функция особенно полезна для снижения потребления энергии в режиме ожидания (idle mode), если пользователь запишет в биты CLKS[2:0] ненулевое значение перед входом в idle mode.

CLK_DIV (регистр делителя тактовой частоты, адрес 97h).

Бит 7 6 5 4 3 2 1 0
Имя   -     -     -     -     -   CLKS2 CLKS1 CLKS0

Биты {CLKS2, CLKS1, CLKS0} задают коэффициент деления тактовой частоты:

000: тактовая частота RC-генератора не делится (поступает непосредственно на узлы MCU, это состояние по умолчанию).
001: частота делится на 2.
010: частота делится на 4.
011: частота делится на 8.
100: частота делится на 16.
101: частота делится на 32.
110: частота делится на 64.
111: частота делится на 128.

На скриншоте показан пример выбора тактовой частоты для MCU типа STC15F104E с помощью утилиты STC-ISP.exe:

STC15F104E select RC freq STC ISP

[Режимы работы, управление энергопотреблением]

MCU может находиться в 3 режимах: нормальный режим (режим по умолчанию, в котором MCU находится после сброса), режим ожидания (idle mode) и режим выключения (power down mode). В первых двух (нормальный и ожидания) режимах потребляемый ток зависит от частоты тактирования MCU. В последнем режиме (выключение) достигается самое малое потребление энергии.

Выбор режима работы осуществляется битами PD и IDL регистра PCON.

PCON (Power Control Register, регистр управления питанием, адрес 87h).

Бит 7 6 5 4 3 2 1 0
Имя   -     -   LVDF POF GF1 GF0 PD IDL

B7, B6. Зарезервированы.

LVDF. Low-Voltage Flag, флаг детектора снижения питания. Если было определено снижение напряжения питания меньше допустимого порога (VCC < LVD), то этот флаг установится аппаратно, и должен быть очищен программно.

POF. Power-On flag, флаг включения. Этот бит устанавливается действием включения (power-off-on), и его можно очистить только программно. Если на практике требуется узнать, как произошел сброс MCU, то программа инициализации должна использовать следующий алгоритм. Если POF=1, то это холодный старт (cold boot, Power-On Reset, POR), далее следует программно очистить флаг POF. Если POF=0, то это был внешний ручной сброс, или сброс от WDT, или программный сброс.

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 и другие периферийные устройства будут продолжать свою работу в режиме ожидания.

Есть два способа прервать режим ожидания. Во-первых, активация любого разрешенного прерывания приведет к тому, что будет аппаратно очищен бит IDL, завершая тем самым действие idle mode. Прерывание будет обработано, и инструкция RETI на выходе из ISR продолжит выполнение программы со следующей инструкции, находящейся после инструкции, которая ввела микроконтроллер в режим ожидания.

Биты флагов (GFO и GF1) могут использоваться, чтобы искусственно показать, было ли прерывание сгенерировано во время обычной работы или во время режима ожидания. Например, если инструкция, активирующая idle mode, установила один или оба этих флага вместе с битом IDL (операцией OR над регистром PCON). Тогда если выход из idle mode был осуществлен прерыванием, то прерывание может заметить этот факт, анализируя содержимое флагов GF0 и GF1.

Во-вторых, пробуждение процессора будет вызвано подтягиванием ножки сброса RESET к лог. 1, вызывая генерацию внутреннего аппаратного сброса. Поскольку тактовый генератор все еще работает, аппаратный сброс должен удерживаться в активном состоянии только на 2 системных тактовых цикла (24 такта системной частоты), чтобы сброс был завершен.

Slow Down Mode. Это нормальный режим, в котором частота тактирования была снижена настройкой делителя частоты, см. раздел "Тактирование". Потребляемый ток снижается приблизительно пропорционально снижению тактовой частоты процессора.

Power Down (PD) Mode. Это режим выключения, который еще называют режимом остановки (Stop Mode). Инструкция, которая установит бит PD (PCON.1), приведет к тому, что это будет последняя выполненная инструкция перед входом в режим выключения (Power-Down mode). В Power-Down mode, будут выключены встроенный генератор и память FLASH, чтобы минимизировать потребление энергии. В этом режиме потреблять ток будет только схема включения (power-on circuit). Содержимое встроенной памяти RAM и регистров специального назначения (Special Finction Register, SFR) сохраняется.

Вывести MCU из power-down mode можно через аппаратный сброс (ножка RESET) или внешнее прерывание (/INT0../INT4). Когда пробуждение было выполнено ножкой сброса RESET, программа продолжит свое выполнение с адреса 0000h.

Будьте внимательны к формированию импульса сброса на выводе RESET - он должен быть активен (активный уровень лог. 1) на время как минимум 10 мс, чтобы частота тактов могла застабилизироваться. Если пробуждение произошло от прерывания ножек GPIO, то CPU возобновит свою работу с перехода на соответствующий обработчик прерывания (interrupt service routine, ISR). Перед запуском кода ISR подача тактовой частоты на CPU блокируется, пока не пройдет 64 такта, чтобы исключить подачу нестабильной тактовой частоты на ядро.

Чтобы использовать для пробуждения ножки GPIO /INTx, до входа в режим выключения должны быть должным образом разрешены прерывания в соответствующих регистрах. Обратите внимание, что за инструкцией, которая выключает процессор (это та инструкция, которая вводит микроконтроллер в power-down установкой бита PD), должна находиться как минимум одна инструкция NOP, если используется пробуждение от ножки GPIO. Когда завершается режим Power-down по прерыванию, период пробуждения контролируется внутренней схемой задержки. По отрицательному перепаду на ножке, генерирующей прерывание, запускается генератор, и внутренний таймер схемы задержки начинает счет. Подача внутренних тактов на ядро по возобновление вычислительного процесса CPU разрешается только после того, как таймер задержки переполнится. После этого периода таймаута начнет выполняться код соответствующего ISR. Чтобы предотвратить повторное срабатывание прерывания, код ISR перед своим завершением должен запретить это прерывание. Ножка прерывания должна удерживаться в лог. 0, пока не истечет таймаут запуска ядра и не начнется выполнение кода ISR. Программа пользователя не должна пытаться войти (или повторно войти) в power-down mode как минимум 4 мкс после того, как произошло одно из следующих событий: начало выполнения кода (после любого типа сброса) или выход из power-down mode.

Если нет источников прерывания, которые можно использовать для пробуждения MCU, то есть возможность применить следующую схему:

STC90xx wake up MCU with RC

Как эта схема работает, процесс по шагам:

1. Порт ввода/вывода, подключенный к резистору 300 ом, сначала конфигурируются как двухтактный выход с мощной верхней нагрузкой (push-pull output, strong pull-up).
2. Записывается лог. 1 в этот порт, и через диод конденсатор C1 быстро заряжается до высокого напряжения.
3. Записывается 0 в порт, и сразу же MCU переводится в режим power-down.
4. Пока микроконтроллер спит, C1 медленно разряжается через резистор R1. Когда напряжение на C1 станет меньше 0.8V, вывод INTx сгенерирует прерывание, которое автоматически выведет MCU из режима сна.

Примеры кода, демонстрирующие выход из power-down mode по внешнему прерыванию на языках C и ассемблера см. в даташитах STC15F100-en.pdf, STC15F204EA-en.pdf [2].

[Сброс]

У MCU серии STC15F204EA имеется 6 источников генерации внутреннего сброса. Это ножка RESET (порт P0.0), программный сброс (software reset), сброс при включении питания (On-chip power-on-reset, сокращенно POR), сторожевой таймер (Watch-Dog-Timer, WDT), встроенный в кристалл супервизор MAX810, который выполняет POR с формированием задержки и детектированием недопустимого снижения напряжения питания. Сброс могут формировать следующие источники.

• Действие вывода Reset, этот процесс запускается пользователем.
• Software Reset через установку бита SWRST (IAP_CONTR.5), это также запускается пользователем.
• Переполнение сторожевого таймера (WDT overflow), запускается системой MCU.
• Сброс POR от супервизора MAX810 с задержкой ~45 мс, запускается системой MCU.
• Сброс от системы детектора снижения напряжения питания (Low-Voltage detector), запускается системой MCU.

Software RESET. В регистре IAP_CONTR находится бит SWBS, который показывает тип сброса, и бит SWRST, который позволяет выполнить программный сброс.

IAP_CONTR (ISP/IAP Control Register, регистр управления самопрограммированием, адрес C7h).

Бит 7 6 5 4 3 2 1 0
Имя IAPEN SWBS SWRST CMD_FAIL   -   WT2 WT1 WT0

SWBS. Software boot selection control bit, бит управления типом загрузки.

0: после сброса произойдет запуск кода пользователя.
1: после сброса запустится код ISP monitor.

SWRST. управление триггером программного сброса.

0: нет операции.
1: будет сгенерирован программный сброс системы (software system reset). Этот бит будет автоматически сброшен аппаратурой.

Система выполнит сброс и запустит код AP по адресу 0000H (выполнится программа пользователя), если будет выполнена команда ассемблера:

   MOV IAP_CONTR, #00100000B 

Система выполнит сброс и запустит код ISP по адресу 0000H (выполнится код монитора ISP), если будет выполнена команда ассемблера:

   MOV IAP_CONTR, #01100000B

Power-On Reset (POR). Это сброс при включении питания. Когда VCC падает ниже порога схемы POR, вся логика MCU сбрасывается. Когда VCC возвращается к нормальному уровню, внутренний сброс автоматически снимается после истечения задержки в 8192 тактов.

Watch-Dog-Timer. Сброс также может быть осуществлен от сторожевого таймера (Watch-Dog-Timer, WDT). Смысл использования WDT - борьба с неожиданными зависаниями программы. Будучи запущенным, WDT (запустить WDT можно только один раз, и отменить его работу может только сброс) начинает счет до момента своего переполнения. В момент переполнения WDT автоматически произойдет сброс MCU. Чтобы такого сброса не произошло, программа должна периодически напоминать о себе сбросом WDT, показывая тем самым, что она "жива" и система не зависла.

MAX810. Узел супервизора MAX810 генерирует задержку сброса, и может быть сконфигурирован специальными опциями (Option Register в памяти FLASH, наподобие фьюзов AVR). Если этот узел разрешен, то POR будет задержан на длительное время, примерно 45 мс.

Подробнее про управление сбросом, работу вывода RESET, сброс по включению питания (Power-On Reset, POR), детектор снижения напряжения питания, программный сброс, описание работы сторожевого таймера (Watch-Dog-Timer, WDT), пример кода с WDT, см. в даташитах STC15F100-en.pdf, STC15F204EA-en.pdf [2].

[Детектирование пониженного напряжения питания]

Помимо напряжения POR, для серии STC15Fxx есть более высокое пороговое напряжение, предназначенное для детектирования сбоя по питанию: Low Voltage Detection (LVD). Когда напряжение VCC упадет до уровня LVD, то аппаратно установится флаг низкого напряжения Low voltage Flag, LVDF (PCON.5). Обратите внимание, что при обычном включении питания этот флаг также установится, и пользователь должен очистить его программно сразу после запуска программы, чтобы впоследствии можно было определить понижение напряжения ниже порогового LVD. Флаг LVDF также может генерировать прерывание, если установлен в лог. 1 бит ELVD (IE.6).

Ниже в таблице для примера приведены пороговые напряжения LVD для STC15F101E (рабочее напряжение 5V). Значения в вольтах, перечисленные в таблице, можно поменять с помощью утилиты STC-ISP Writer/Programmer.

-40°C +25°C +85°C
4.74 4.64 4.60
4.41 4.32 4.27
4.14 4.05 4.00
3.90 3.82 3.77
3.69 3.61 3.56
3.51 3.43 3.38
3.36 3.28 3.23
3.21 3.14 3.09

Аналогичная таблица для 3V версии STC15L101E:

-40°C +25°C +85°C
3.11 3.08 3.09
2.85 2.82 2.83
2.63 2.61 2.61
2.44 2.42 2.43
2.29 2.26 2.26
2.14 2.12 2.12
2.01 2.00 2.00
1.90 1.89 1.89

На скриншоте показан пример выбора напряжения LVD, при котором будет прозведен сброс MCU:

STC15F104E select LVD STC ISP

Подробнее про детектор низкого напряжения питания и регистры см. даташиты STC15F100-en.pdf, STC15F204EA-en.pdf [2].

[Организация памяти]

STC15F204EA MCU имеет раздельное адресное пространство для памяти программ (Program Memory) и для памяти данных (Data Memory). Логическое разделение этих областей позволяет организовать доступ к обоим областям памяти по 8-битным адресам, которые можно быстро сохранять и которыми может эффективно манипулировать CPU.

Program memory (иногда её называют постоянной памятью, ROM) в обычном режиме работы кода может быть только прочитана, но не записана. MCU серии STC15Fxx вся память доступна только на кристалле чипа, без возможности доступа к внешней памяти (как в сериях STC89xx, STC90xx и традиционной архитектуре 8051), потому что в корпусе MCU отсутствуют сигналы External Access Enable (/EA) и Program Store Enable (/PSEN).

Оперативная память данных (ОЗУ) занимает отдельное от памяти программ адресное пространство. В серии STC15F204EA её размер составляет 256 байт, эта внутренняя память называется scratch-pad RAM (SRAM).

Program memory. Это память, в которой хранятся выполняемые ядром CPU инструкции (в архитектуре MCS51 также в этой памяти могут храниться табличные данные и таблицы переходов). Встроенная память серии STC15Fxx организована по технологии flash и может быть размером 0.5-6K байт, в зависимости от модели микроконтроллера. Дизайн позволяет пользователям конфигурировать память как 3 отдельные раздела банков. Они называются регионом AP (application program), регионом IAP (In-Application-Program) и регионом загрузки ISP (In-System-Program boot). Регион AP это пространство, где размещается программа пользователя. Регион IAP (In-Application-Program) это энергонезависимая память данных, которая может использоваться для сохранения важных параметров программы AP. Другими словами, функционал IAP предоставляет пользователю возможность читать и записывать свои данные в регионе данных flash, что избавляет от необходимости использовать внешнюю память EEPROM. Регион ISP boot это пространство, которое позволяет разместить специальную программу, которую мы называем кодом самопрограммирования (программа ISP). Внутри региона ISP пользователь может также разрешить доступ на чтение/запись в маленькое пространство памяти для сохранения параметров специального назначения. Обычно назначение программы ISP - заполнить регион программы AP, чтобы обеспечить апгрейд кода без необходимости извлекать процессор из системы.

Серия MCU STC15Fxx имеет специальную внутреннюю конфигурационную информацию (что-то похожее на фьюзы 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 серии STC15Fxx в соответствии с вышеуказанными критериями игнорирует недопустимую команду.

После сброса 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) для пропуска следующих на ней ячеек других векторов прерываний, если эти прерывания используются.

Ниже показано для примера распределение памяти микроконтроллеров серий STC15F101E, STC15F204EA.

STC15F101E Program Memory
Память программ STC15F101E

Тип Program Memory
STCF/L100 0000H~01FFH (512 байт)
STC15F/L101/L101E 0000H~03FFH (1K)
STC15F/L102/L102E 0000H~07FFH (2K)
STC15F/L103/L103E 0000H~0BFFH (3K)
STC15F/L104/L104E 0000H~0FFFH (4K)
STC15F/L105/L105E 0000H~13FFH (5K)
IAP15F/L106 0000H~17FFH (6K)

STC15F204EA Program Memory
Память программ STC15F204EA

Тип Program Memory
STC15F/L201A/EA 0000H~03FFH (1K)
STC15F/L202A/EA 0000H~07FFH (2K)
STC15F/L203A/EA 0000H~0BFFH (3K)
STC15F/L204A/EA 0000H~0FFFH (4K)
STC15F/L205A/EA 0000H~13FFH (5K)
IAP15F/L206A 0000H~17FFH (6K)

SRAM. Точно так же, как и у обычного микроконтроллера 8051, у MCU серии STC15Fxx имеется до 256 байт сверхбыстрой памяти данных (SRAM), в которую входит пространство из 128 байт SFR (у некоторых младших моделей, например STC15F101E, доступно только 128 байт SRAM). Младшие 128 памяти данных могут быть доступны как через прямую, так и через косвенную адресации. Старшие 128 байт памяти данных и 128 байт SFR используют общее адресное пространство. К этим старшим 128 байтам памяти данных можно получить доступ только с помощью косвенной адресации. К старшим 128 байтам SFR можно получить доступ только через прямую адресацию.

STC89xx on chip Scratch Pad RAM
On-chip Scratch-Pad RAM

Младшие 32 байта (с адресами 00H..1FH) памяти данных сгруппированы в 4 банка по 8 регистров в каждом. Инструкции программы обращаются к этим 8 регистрам как к регистрам R0..R7. Биты RS0 и RS1 регистра PSW (см. секцию "Регистры SFR для доступа к RAM") выбирают, какой из этих банков сейчас используется. Инструкции, использующие регистровую адресацию, будут осуществлять доступ только к регистрам указанного в настоящий момент банка. Это позволяет более эффективно использовать пространство кода, поскольку инструкции с регистровой адресацией короче, чем инструкции, использующие прямую адресацию.

STC89xx Lower 128 bytes Internal SRAM
Младшие 128 байт Internal SRAM

Следующие 16 байт (20H..2FH) за банками регистров формируют блок области памяти, которую можно (с помощью специальных инструкций) адресовать как отдельные биты (флаги). Набор инструкций 80C51 включает в себя широкий набор инструкций для манипуляции одним битом, и 128 бит в этой области могут быть напрямую модифицированы этими инструкциями. Адреса бит в этой области могут быть в диапазоне 00H..7FH.

К младшим 128 байтам можно получить доступ либо прямой, либо косвенной адресацией, в то время как к старшим 128 байтам можно получить доступ только косвенной адресацией. Регистры специального назначения (SFR) включают защелки портов, регистры таймеров, управление периферийными устройствами и т. д. К этим регистрам можно получить доступ только прямой адресацией. 16 адресов в пространстве SFR могут быть адресованы и как байты, и как биты. SFR, которые могут быть адресованы как биты, имеют адреса, заканчивающиеся на 0H или 8H.

Регистры SFR для доступа к RAM.

...

[Порты GPIO]

У серии STC15F204EA имеется 26 конфигурируемых независимо друг от друга портов ввода/вывода (GPIO): P0.0~P0.1, P1.0~P1.7, P2.0~P2.7, P3.0~P3.7. Port0 это 2-битный двунаправленный порт I/O (GPIO) с наличием внутреннего верхнего подтягивающего резистора (pull-up). Port1 также GPIO с внутренним pull-up. Когда единички записаны в Port1, мощная верхняя подтяжка подключается к выходу на 2 периода тактовой частоты, и затем подключается слабая подтяжка, удерживающая на выходе порта уровень лог. 1. Port2 это 8-битный двунаправленный GPIO также с наличием pull-up. Port3 это GPIO также с наличием слабого pull-up, с такой же системой мощной подтяжки на 2 такта при переходе уровня от лог. 0 к лог. 1. Port3 также обслуживает различные специальные функции.

Все порты STC15F204EA могут быть независимо друг от друга сконфигурированы в одном из 4 режимов: quasi-bidirectional (квази-двунаправленный, стандартный режим порта 8051), push-pull output (двухтактный выход), input-only (только вход) или open-drain output (выход с общим стоком). После сброса все порты находятся в режиме quasi-bidirectional. У каждого на входе имеется триггер Шмитта с целью улучшения подавления шума и помех. Нагрузочная способность каждой ножки порта до 20 mA, однако рекомендуется, чтобы общая нагрузка на весь корпус не превышала 90 mA.

Все режимы портов работают так же, как и у серии STC89xx, см. подробное описание в [3]. Подробное описание регистров и примеры применения GPIO см. также в даташитах STC15F100-en.pdf, STC15F204EA-en.pdf [2].

[Система команд, регистры]

Описание карты памяти SFR и системы команд см. в даташитах STC15F100-en.pdf, STC15F204EA-en.pdf [2].

Замечания, касающиеся совместимости с 8051. В регистре AUXR (SFR адрес 8Eh) биты T0x12 и T1x12 управляют тактовой частотой таймеров следующим образом:

Бит 7 6 5 4 3 2 1 0
Имя T0x12 T1x12   -     -     -     -     -     -  

T0x12

0: Timer0 тактируется от частоты Fosc/12.
1: Timer0 тактируется от частоты Fosc.

T1x12

0: Timer1 тактируется от частоты Fosc/12.
1: Timer1 тактируется от частоты Fosc.

INT_CLKO. В регистре INT_CLKO (SFR адрес 8Fh) назначение бит следующее:

Бит 7 6 5 4 3 2 1 0
Имя   -   EX4 EX3 EX2   -     -   T1CLKO T0CLKO

EX4

0: Запрет прерывания ~INT4.
1: Разрешение прерывания ~INT4.

EX3

0: Запрет прерывания ~INT3.
1: Разрешение прерывания ~INT3.

EX2

0: Запрет прерывания ~INT2.
1: Разрешение прерывания ~INT2.

T1CLKO

0: Запрет переключения вывода P3.4 при переполнении Timer1.
1: Разрешение переключения вывода P3.4 при переполнении Timer1.

T0CLKO

0: Запрет переключения вывода P3.5 при переполнении Timer0.
1: Разрешение переключения вывода P3.5 при переполнении Timer0.

Режимы адресации. Система адресации ячеек памяти, бит и SFR является частью набора инструкций каждой вычислительной архитектуры. Адресация позволяет задавать источник или назначение данных различными способами, в зависимости от конкретной ситуации в программе. Имеется 8 режимов адресации:

• Register (регистровая)
• Direct (прямая)
• Indirect (косвенная)
• Immediate (непосредственная)
• Relative (относительная)
• Absolute (абсолютная)
• Long (дальняя)
• Indexed (по индексу)

Direct (DIR). Это прямая адресация, когда операнд указывается 8-битным полем адреса инструкции. Таким способом можно адресовать только внутреннее ОЗУ данных (internal data RAM) и регистры специального назначения (SFR).

Indirect (IND). Это косвенная адресация, когда в инструкции указывается регистр, содержащий адрес операнда. Таким способом можно получить доступ к внутреннему и внешнему RAM, однако нужно помнить для для серии STC15Fxx нет доступа к внешней памяти, можно использовать только внутреннюю.

8-битным адресным регистром могут служить R0 или R1 выбранного банка, или указатель стека (Stack Pointer, SP). Для 16-битных адресов адресным регистром может служить только 16-битный указатель данных (data pointer register, DPTR).

Register (REG). В архитектуре 8051 имеется 4 банка регистров. Каждый банк содержит регистры от R0 до R7, к которым можно получить доступ определенными инструкциями, в которых содержится 3-битный номер регистра. Адресация такого типа наиболее эффективна с точки зрения экономии кода и быстродействия, потому что и код операции, и адрес операнда содержится в 1 байте инструкции, и не требуется дополнительный байт, чтобы передать адрес операнда. Однако такие инструкции могут работать только с 8 регистрами выбранного банка.

Инструкция, специфичная для регистра. Некоторые инструкции работают только с определенными регистрами. Например, некоторые инструкции работают только с аккумулятором или только с DPTR, и т. п. Для таких инструкций не нужен байт адреса, операнд указан в самой инструкции.

Immediate Constant (IMM). Значение операнда берется как константа, которая находится в памяти программ сразу за кодом инструкции.

Indexed. Это индексная адресация, она позволяет получить доступ только к памяти программ, и только на чтение. Этот режим адресации предназначен для выборки/чтения данных из таблиц, находящихся в памяти программ (look-up table). Например, это может быть знакогенератор для матричного индикатора. 16-битный базовый регистр (которым может быть либо DPTR, либо PC) указывает на начало таблицы, и в аккумулятор помещается индекс (номер ячейки в таблице), указывающий на нужный считываемый операнд.

Другой тип индексной адресации используется в инструкции условного перехода (conditional jump). Это инструкция ветвления, при которой адрес назначения вычисляется как сумма базового указателя и аккумулятора.

[Система прерываний]

У STC15F204EA имеется 9 векторов прерываний. С каждым вектором прерывания связан определенный источник прерывания, который может быть индивидуально разрешен или запрещен установкой или очисткой битов регистров IE и INT_CLKO (по умолчанию после сброса все прерывания запрещены). В регистре IE также содержится бит глобального управления всеми прерываниями EA, который может быть очищен, и этим будет запрещена работа всех прерываний (это состояние по умолчанию после сброса).

Все источники прерываний, за исключением внешних прерываний ~INT2 (external interrupt 2), ~INT3 (external interrupt 3), ~INT4 (external interrupt 4), имеют соответствующий бит для указания приоритета прерывания, размещенный в SFR-регистре IP (имя этот регистр получил от сокращения Interrupt Priority). Если у прерывания приоритет выше, то оно не может быть прервано другим прерыванием, у которого такой же приоритет, или ниже. Если одновременно произошли 2 прерывания с разным уровнем приоритета, то сначала будет обработано то прерывание, у которого приоритет выше. Если одновременно поступили запросы на прерывание от источников прерывания с одинаковым приоритетом, то для определения, какое прерывание будет обработано первым, будет использоваться внутренняя порядковая последовательность (internal polling sequence). В следующей таблице показана система выбора приоритета (столбец Polling Sequence, чем меньше цифра в столбце, тем выше приоритет) для прерываний с одинаковым приоритетом и адреса векторов этих прерываний (серым шрифтом показаны прерывания, источники которых не реализованы или зарезервированы).

Источник Адрес вектора Polling Sequence Бит установки приоритета Флаг запроса прерывания Биты управления прерыванием
INT0 0003h 0 (высший приоритет) PX0 IE0 EX0/EA
Timer0 000Bh 1 PT0 TF0 ET0/EA
INT1 0013h 2 PX1 IE1 EX1/EA
Timer1 001Bh 3 PT1 TF1 ET1/EA
UART1 (отсутствует) 0023h 4      
ADC 002Bh 5 PADC ADC_FLAG EADC/EA
LVD 0033h 6 PLVD LVDF ELVD/EA
PCA (отсутствует) 003Bh 7      
UART2 (отсутствует) 0043h 8      
SPI (отсутствует) 004Bh 9      
INT2 0053h 10   не доступен  EX2/EA
INT3 005Bh 11   не доступен  EX3/EA
BRT_INT 0063H 12      
- 006Bh 13      
Зарезервировано системой 0073h 14      
007Bh 15      
INT4 0083h 16     EX4/EA

На рисунке ниже схематично показана структура прерываний MCU STC15F204EA.

STC15F204EA series Interrupt System

Оба внешних прерывания INT0 и INT1 могут срабатывать как по спаду уровня, так и по его нарастанию, в зависимости от настроек бит IT0 и IT1 регистра TCON. Когда бит ITx (x=0 или 1) установлен, то соответствующее внешнее прерывание INTx активируется по спаду лог. уровня (1 -> 0). Когда бит ITx очищен, то оба перепада сигнала, и отрицательный (1 -> 0), и положительный (0 -> 1) приведут к срабатыванию соответствующего прерывания INTx. Флаги, которые сигнализируют о запросе этих прерываний - IE0 и IE1 в регистре TCON. Флаг прерывания автоматически очистится после подтверждения запуска обработчика прерывания. Прерывания INT0 и INT1 могут вывести CPU из режима сна, даже глубокого (power-down mode).

Прерывания таймеров Timer0 и Timer1 генерируются по флагам TF0 и TF1, которые в большинстве случаев устанавливаются при переполнении соответствующего счетчика таймера. Когда генерируется прерывание таймера, то соответствующий флаг TFx (x=0, 1) аппаратно очистится, когда произойдет передача управления в обработчик прерывания таймера.

Прерывание ADC (аналого-цифровой преобразователь) генерируется по флагу ADC_FLAG (ADC_CONTR.4). Этот флаг должен быть очищен программно.

Прерывание Low Voltage Detect (детектора снижения напряжения питания ниже допустимого уровня) генерируется по флагу LVDF (PCON.5) в регистре PCON. Этот флаг должен быть очищен программно.

Внешние прерывания INT2..INT4 могут срабатывать только по отрицательному перепаду логического сигнала на входе (1 -> 0). Наличие флага прерывания подразумевается, но он недоступен для пользователя. Этот флаг прерывания будет очищен после входа в обработчик прерывания, либо когда сброшен соответствующий бит разрешения прерывания EXn (n=2, 3, 4). INTx (x=2, 3, 4) при срабатывании прерывания могут вывести CPU из режима сна, даже глубокого (power-down mode).

Все биты, которые генерируют прерывания (кроме флагов прерываний INT2..INT4), могут быть установлены или очищены программно, что приведет к тому же результату, как если бы они были установлены или очищены аппаратно. Другими словами, прерывания можно генерировать программно, либо можно программно отменять прерывания, ожидающие своей обработки.

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

Мнемоника регистра
Описание
Адрес SFR
Номера и мнемоника бит Значение после сброса (POR или другого типа сброса)
7 6 5 4 3 2 1 0
IE Interrupt Enable (разрешение прерываний) A8h EA ELVD EADC - ET1 EX1 ET0 EX0 000x0000b
IP Interrupt Priority (установка повышенного приоритета) B8h - PLVD PADC - PT1 PX1 PT0 PX0 x00x0000b
TCON Timer Control (управление таймерами) 88h TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 00000000b
PCON Power Control (управление питанием) 87h - - LVDF POF GF1 GF0 PD IDL xx110000b
INT_CLKO Регистр разрешения внешних прерываний и вывода сигнала тактирования 8Fh - EX4 EX3 EX2 - - T1CLKO T0CLKO x000xx00b
ADC_CONTR ADC control (управление АЦП) BCh ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHIS0 00000000b

IE (Interrupt Enable Register)

Бит 7 6 5 4 3 2 1 0
Имя EA ELVD EADC   -   ET1 EX1 ET0 EX0

EA. Этот флаг может запретить все прерывания сразу, если записать в него лог. 0. Если в него записан лог. 1, то работа каждого прерывания будет зависеть от его бита разрешения прерывания (ELVD, EADC, ET1, EX1, ET0, EX0).

ELVD. Разрешение прерывания, когда детектор обнаружил сбой по питанию.

0: запрет прерывания по снижению напряжения питания ниже допустимого уровня.
1: разрешение прерывания по снижению напряжения питания ниже допустимого уровня.

EADC. Разрешение прерывания ADC.

0: запрет прерывания по завершению преобразования АЦП.
1: разрешение прерывания по завершению преобразования АЦП.

ET1. Timer1 interrupt enable, разрешение прерывания от Timer1.

0: запрет прерывания Timer1.
1: разрешение прерывания Timer1.

EX1. Разрешение внешнего прерывания 1.

0: запрет прерывания INT1.
1: разрешение прерывания INT1.

Отрицательный перепад на INT1 приведет к прерыванию, если бит IT1 (TCON.2) установлен, и оба перепада, и отрицательный, и положительный, приведут к прерыванию, если IT1 (TCON.2) очищен. Флаг прерывания IE1 (TCON.3) будет автоматически очищен после подтверждения прерывания (передачи управления по вектору прерывания). Прерывание INT1 может вывести CPU из режима сна, даже глубокого (power-down mode).

ET0. Timer0 interrupt enable, разрешение прерывания от Timer0.

0: запрет прерывания Timer0.
1: разрешение прерывания Timer0.

EX0. Разрешение внешнего прерывания 0.

0: запрет прерывания INT0.
1: разрешение прерывания INT0.

Отрицательный перепад на INT0 приведет к прерыванию, если бит IT0 (TCON.0) установлен, и оба перепада, и отрицательный, и положительный, приведут к прерыванию, если IT0 (TCON.0) очищен. Флаг прерывания IE0 (TCON.1) будет автоматически очищен после подтверждения прерывания (передачи управления по вектору прерывания). Прерывание INT0 может вывести CPU из режима сна, даже глубокого (power-down mode).

IP (Interrupt Priority Register)

Бит 7 6 5 4 3 2 1 0
Имя   -   PLVD PADC   -   PT1 PX1 PT0 PX0

Если бит в этом регистре установлен, то это повышает приоритет соответствующего прерывания.

PLVD. Бит повышения приоритета прерывания Low voltage detection.

PADC. Бит повышения приоритета прерывания ADC.

PT1. Бит повышения приоритета прерывания Timer1.

PX1. Бит повышения приоритета прерывания INT1.

PT0. Бит повышения приоритета прерывания Timer0.

PX0. Бит повышения приоритета прерывания INT0.

TCON (Timer/Counter Control Register)

Бит 7 6 5 4 3 2 1 0
Имя TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

TF1. Timer1 overflow Flag, флаг переполнения Timer1, устанавливается аппаратно при переполнении счетчика таймера. Очищается аппаратно, когда MCU передает управление по вектору обработчика прерывания.

IE1. Interrupt 1 Edge flag, флаг прерывания по перепаду на входе INT1. Устанавливается аппаратно, когда был определен перепад лог. уровня. Очищается, когда обрабатывается прерывание.

TR1. Timer1 Run control bit. Устанавливается или очищается программно, что соответственно разрешает или запрещает работу таймера/счетчика.

IT1. Intenupt 1 Type control bit. Устанавливается или очищается программно, чтобы настроить нужный для срабатывания вид перепада на INT1 (по спаду или по низкому уровню).

TF0. Timer0 overflow Flag, флаг переполнения Timer0, устанавливается аппаратно при переполнении счетчика таймера. Очищается аппаратно, когда MCU передает управление по вектору обработчика прерывания.

IE0. Interrupt 0 Edge flag, флаг прерывания по перепаду на входе INT0. Устанавливается аппаратно, когда был определен перепад лог. уровня. Очищается, когда обрабатывается прерывание.

TR0. Timer0 Run control bit. Устанавливается или очищается программно, что соответственно разрешает или запрещает работу таймера/счетчика.

IT0. Intenupt 0 Type control bit. Устанавливается или очищается программно, чтобы настроить нужный для срабатывания вид перепада на INT0 (по спаду или по низкому уровню).

PCON (Power Control Register)

Бит 7 6 5 4 3 2 1 0
Имя   -     -   LVDF POF GF1 GF0 PD IDL

LVDF. Low-Voltage Flag, флаг снижения напряжения питания ниже допустимого уровня. Если было определено событие сбоя по питанию (VCC снизилось ниже порогового уровня LVD), то этот бит установится аппаратно (и должен быть очищен программно).

POF. Power-On flag, флаг, сигнализирующий о включении питания. Устанавливается, когда было обнаружено появление питания, и должен быть очищен программно.

GF1. General-purposed flag 1, флаг общего назначения, который может использоваться в программе пользователя.

GF0. General-purposed flag 0, флаг общего назначения, который может использоваться в программе пользователя.

PD. Power-Down bit, флаг выключения MCU.

IDL. Idle mode bit, флаг перевода MCU в режим ожидания.

INT_CLKO

Бит 7 6 5 4 3 2 1 0
Имя   -   EX4 EX3 EX2   -     -   T1CLKO T0CLKO

EX4. Разрешение внешнего прерывания 4.

0: запрет прерывания INT4.
1: разрешение прерывания INT4.

Только отрицательный перепад на INT4 приведет к прерыванию. Наличие флага прерывания подразумевается, но он недоступен для пользователя. Этот флаг прерывания будет очищен, когда произошел вход в обработчик прерывания, или когда прерывание INT4 запрещено (EX4=0). Прерывание INT4 может вывести CPU из режима сна, даже глубокого (power-down mode).

EX3. Разрешение внешнего прерывания 3.

Все то же самое, только для INT3.

EX2. Разрешение внешнего прерывания 2.

Все то же самое, только для INT2.

T1CLKO. Когда этот бит установлен, то на вывод P3.4 разрешен вывод тактовой частоты, которую генерирует Timer1. Значение частоты будет равно частоте переполнения Timer1, поделенной на 2.

T0CLKO. Когда этот бит установлен, то на вывод P3.5 разрешен вывод тактовой частоты, которую генерирует Timer0. Значение частоты будет равно частоте переполнения Timer0, поделенной на 2.

ADC_CONTR (AD Control register)

Бит 7 6 5 4 3 2 1 0
Имя ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0

ADC_POWER. Когда этот бит очищен, то блок АЦП выключен. Когда установлен, то на блок АЦП подается питание.

ADC_FLAG. ADC interrupt flag, флаг прерывания по окончанию преобразования АЦП.

ADC_START. ADC start bit, этот бит запускает преобразование ADC. Будет автоматически очищен, когда устройство завершило преобразование.

Как обрабатываются прерывания. На языке программирования C определены специальные имена для функций обработчиков прерывания (Interrupt Service Routine, ISR). В разных средах программирования обработчики ISR декларируются по-разному, но принцип всегда один и тот же - декларация должна явно указывать, что это ISR, и к какому вектору прерывания он относится. Например, в среде разработки Keil C они могут быть определены следующим образом:

void Int0_Routine(void) interrupt 0;
void Timer0_Rountine(void) interrupt 1;
void Int1_Routine(void) interrupt 2;
void Timer1_Rountine(void) interrupt 3;
void ADC_Routine(void) interrupt 5;
void LVD_Routine(void) interrupt 6;
void Int2_Routine(void) interrupt 10;
void Int3_Routine(void) interrupt 11;
void Int4_Routine(void) interrupt 16;

Здесь ключевое слово interrupt является расширением языка C для компилятора Keil, и оно представляет номер вектора соответствующего прерывания и его приоритет, назначаемый по принципу опроса по порядковому номеру. Имя функции произвольное, и оно определяется пользователем.

Выводы внешних прерывания и другие источники прерываний опрашиваются по фронту нарастания цикла выборки каждой инструкции (instruction OPcode fetch cycle). Результат опроса анализируется во время цикла выборки OPcode следующей инструкции. Если один флагов в заданном наборе был установлен на первом цикле, то на втором цикле это будет обнаружено, и система прерываний сделает аппаратный вызов LCALL (дальний вызов подпрограммы по 16-битному адресу) в соответствующий ISR, пока это не было заблокировано одним из следующих условий:

• В настоящий момент выполняется ISR прерывания с таким же приоритетом или более высокого приоритета.
• Текущий цикл (цикл опроса, polling cycle) не последний цикл в процессе выполнения инструкции.
• Выполняется инструкция RETI или любая запись в регистры IE, XICON, IP и IPH.
• Идет процесс, связанный с активностью ISP/IAP.

Любое из этих 4 условий заблокируют аппаратный вызов LCALL в обработчик прерывания ISR. Второе условие гарантирует, что выполняющаяся инструкция завершится перед переходом в ISR. Третье условие гарантирует, что если выполняется инструкция RETI, или любой доступ к IE, IP, то как минимум одна или больше инструкций будут выполнены перед переходом в ISR.

Этот цикл опроса повторяется каждый последний такт в каждом цикле инструкции. Обратите внимание, что если активен флаг прерывания, но он не получает ответа из-за одного из вышеперечисленных условий блокировки, если этот флаг уже не активен в момент снятия условия блокировки, то соответствующее прерывание не будет обработано. Другими словами, когда флаг прерывания был один раз активен, и на него не поступил ответ обработки по вышеперечисленным блокировкам, то если этот флаг прерывания стал неактивен в момент снятия условия блокировки, то это временно заблокированное прерывание не будет обработано. Флаг прерывания, который был активен, но не обработан, не удерживается в памяти. Каждый цикл опроса является новым.

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

Таким образом, процессор подтверждает запрос прерывания выполнением аппаратно сгенерированного LCALL в соответствующий ISR. В некоторых случаях это также приводит к очистке флага, который сгенерировал прерывание, и в некоторых случаях такая очистка флага не происходит, тогда очистку должен производить код пользователя. Аппаратно сгенерированный LCALL проталкивает содержимое программного счетчика PC в стек (но PSW автоматически в стек не проталкивается) и в PC загружается адрес, который зависит от обрабатываемого прерывания (адрес из таблицы векторов прерываний), как показано ниже.

Источник прерывания Адрес вектора
IE0 (внешнее прерывание 0) 0003h
TF0 (таймер 0) 000Bh
IE1 (внешнее прерывание 1) 0013h
TF1 (таймер 1) 001Bh
- 0023h
ADC (прерывание АЦП) 002Bh
LVD (прерывание при сбое по питанию) 0033h
- 003Bh
- 0043h
- 004Bh
IE2 (внешнее прерывание 2) 0053h
IE3 (внешнее прерывание 3) 005Bh
- 0063h
- 006Bh
- 0073h
- 007Bh
IE4 (внешнее прерывание 4) 0083h

Выполнение кода продолжается от адреса вектора до места, где находится инструкция RETI. Инструкция RETI информирует процессор, что этот ISR закончился, и тогда два байта адреса возврата извлекаются из стека и перезагружаются в PC. Прерванный поток вычислений будет продолжен с того места, где он был оборван вызовом ISR.

Обратите внимание, что инструкция простого возврата из подпрограммы RET также вернет выполнение в место вызова подпрограммы, но она оставит систему обработки прерываний в состоянии, где она считает, что ISR все еще выполняется.

Подробнее про обработку внешних прерываний, прерываний таймеров, АЦП и детектора сбоя питания, а также примеры кода см. в даташите STC15F204EA-en.pdf [2].

[Таймеры/счетчики]

Имеется 2 аппаратных таймера, Timer0 и Timer1, которые работают практически так же, как такие же таймеры стандартного MCU 8051. Оба этих таймера можно индивидуально сконфигурировать для отсчета реального времени (режим таймера), либо для подсчета внешних событий (режим счетчика входных импульсов).

В режиме таймера его регистры счетчика таймера (это может быть один регистр в 8-битном режиме или 2 регистра в 16-битном режиме, которые работают как один 16-битный регистр) инкрементируются каждые 12 системных тактов, или каждый системный такт, в зависимости от установки бита AUXR.7 (T0x12) и AUXR.6 (T1x12). По умолчанию таймеры работают точно так же, как таймеры стандартного MCU 8051. В режиме x12 скорость счета равна частоте тактирования MCU (в 12 раз быстрее).

В режиме счетчика импульсов регистры счетчика таймера инкрементируются по переходам входного логического сигнала 1 -> 0 на соответствующей ножке корпуса T0 или T1. В этом режиме внешний вывод анализируется по положительному перепаду каждого такта системной частоты. Когда в одном из тактов было определено, что уровень был лог. 1, и на другом такте было определено, что уровень стал лог. 0, то происходит инкремент счетчика. В регистре счетчика новое значение появится во время последнего цикла, который идет за тем, в момент которого был детектирован перепад входного уровня. Поскольку процесс распознавания перехода 1 -> 0 занимает 2 машинных цикла (24 такта системной частоты), то максимальная частота входных импульсов может составлять не больше 1/24 от системной тактовой частоты. Здесь нет ограничений по скважности внешнего входного сигнала, однако должно быть гарантировано, что имеющийся уровень должен быть проанализирован как минимум 1 раз перед тем, как он изменится, и должен удерживать свой уровень как минимум в течение одного полного машинного цикла.

В дополнение к режимам таймера или счетчика, таймеры Timer0 и Timer1 имеют 4 режима работы, которые может выбрать пользователь. Функции таймера или счетчика выбираются управляющими битами C/T в SFR-регистре TMOD. Один из 4 режимов этих двух таймеров/счетчиков выбираются парами бит (M1, M0) в регистре TMOD. Режимы 0, 1 и 2 одинаковы для Timer/Counter0 и Timer/Counter01. Режим 3 имеет отличия.

Подробнее про различные режимы работы таймеров, отличие их от стандартных таймеров 8051, описание регистров таймеров, а также примеры кода работы с таймерами см. даташитах STC15F100-en.pdf, STC15F204EA-en.pdf [2].

[Порт UART]

Серия MCU STC15Fxx не имеет аппаратного последовательного порта, однако его можно эмулировать программно. В даташитах STC15F100-en.pdf, STC15F204EA-en.pdf [2] приведены примеры кода, использующие Timer0 или Timer1 для реализации симуляции последовательного порта.

[ADC]

ADC серии STC15F204EA это АЦП средней скорости оцифровки, с 10-битным разрешением, работающий по технологии последовательного приближения результата (successive-approximation).

STC15F204EA series ADC

Преобразование для получения результата оцифровки запускается установкой бита ADC_START (ADC_CONTR.3). Перед запуском преобразования должен быть предварительно установлен бит ADC_POWER (ADC_CONTR.7), чтобы включить подачу питания на аналоговые узлы ADC. Перед преобразованием ADC также должны быть соответствующим образом сконфигурированы порты ввода вывода (GPIO), чтобы они работали только как входы, либо только как выход с открытым стоком, на который выведена лог. 1. Тогда схема портов не окажет влияния на результат преобразования сигнала на входе АЦП.

Процесс преобразования занимает около четверти всего цикла для выборки аналогового уровня входного сигнала, и другие 3 четверти для осуществления шагов последовательной аппроксимации. Общее время преобразования управляется двумя битами SPEED1 и SPEED0 (ADC_CONTR.6 и ADC_CONTR.5).

АЦП подключен к 8 каналам на порту P1, и в любой момент времени для преобразования может быть выбран только один из каналов, в зависимости от состояния бит выбора канала {CHS2,CHS1,CHS0} (ADC_CONTR[2:0]). Когда преобразование завершено, результат будет сохранен в регистры {ADC_RES, ADC_RESL[1:0]}. После того, как результат сформирован и сохранен, установится флаг ADC_FLAG, связанный с битом регистра разрешения прерывания IE.5 (EADC). Флаг ADC_FLAG должен быть очищен программно, обычно это делается в обработчике прерывания ADC (ADC ISR). ADC ISR находится по вектору 2Bh. Когда кристалл MCU входит в idle mode или power-down mode, питание блока ADC аппаратно выключается.

Опорное напряжение для АЦП берется от напряжения питания VCC. Если пользователю требуется 10-битное преобразование АЦП, то результат преобразования Vin (уровень напряжения на входе выбранного канала АЦП) может быть получен по следующей формуле:

        (ADC_RES[7:0], ADC_RESL[1:0]) * VCC
Vin = ---------------------------------------
                       1024
Если пользователю требуется 8-битное преобразование АЦП, то результат преобразования Vin (уровень напряжения на входе выбранного канала АЦП) может быть получен по следующей формуле:

        ADC_RES[7:0] * VCC
Vin = ----------------------
               256

Регистры ADC. Работа АЦП связана с регистрами P1xASF (SFR-адрес 9Dh), ADC_CONTR (SFR-адрес BCh), ADC_RES (SFR-адрес BDh), ADC_RESL (SFR-адрес BEh), IE (SFR-адрес A8h), IP (SFR-адрес B8h).

P1xASF (регистр управления режимом ножек портов АЦП)

Бит 7 6 5 4 3 2 1 0
Имя P17ASF P16ASF P15ASF P14ASF P13ASF P12ASF P11ASF P10ASF

0: вывод порта P1.x работает как порт ввода вывода общего назначения (general-purpose I/O, GPIO).
1: вывод P1.x работает как канал АЦП номер x.

ADC_CONTR (AD Control register)

Бит 7 6 5 4 3 2 1 0
Имя ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0

ADC_POWER. Когда этот бит очищен, то блок АЦП выключен. Когда установлен, то на блок АЦП подается питание.

SPEED1, SPEED0. Выбор скорости преобразования АЦП.

00: для преобразования требуется 540 тактов системной частоты.
01: для преобразования требуется 360 тактов системной частоты.
10: для преобразования требуется 180 тактов системной частоты.
11: для преобразования требуется 90 тактов системной частоты.

ADC_FLAG. ADC interrupt flag, флаг прерывания по окончанию преобразования АЦП. Он должен быть очищен программой пользователя.

ADC_START. ADC start bit, этот бит запускает преобразование ADC. Будет автоматически очищен, когда устройство завершило преобразование.

CHS2, CHS1, CHS0. Используются для выбора одного из 8 каналов АЦП.

000: как вход АЦП используется ножка порта P1.0 (по умолчанию).
001: как вход АЦП используется ножка порта P1.1.
...
111: как вход АЦП используется ножка порта P1.7.

Примечание: перед запуском преобразования АЦП для работы входов должны быть правильно сконфигурированы биты регистра P1ASF. Установленные биты регистра P1ASF должны соответствовать используемым каналам.

ADC_RES (ADC result register)

Бит 7 6 5 4 3 2 1 0
Имя ADC_B9 ADC_B8 ADC_B7 ADC_B6 ADC_B5 ADC_B4 ADC_B3 ADC_B2

ADC_B9..ADC_B2. Эти биты содержат старшую часть 10-битного результата преобразования АЦП.

ADC_RESL (ADC result register, младшие биты)

Бит 7 6 5 4 3 2 1 0
Имя   -     -     -     -     -     -   ADC_B1 ADC_B0

ADC_B1, ADC_B0. Эти биты содержат младшую часть 10-битного результата преобразования АЦП.

IE (Interrupt Enable Register)

Бит 7 6 5 4 3 2 1 0
Имя EA ELVD EADC   -   ET1 EX1 ET0 EX0

EA. Этот флаг может запретить все прерывания сразу, если записать в него лог. 0. Если в него записан лог. 1, то работа каждого прерывания будет зависеть от его бита разрешения прерывания (ELVD, EADC, ET1, EX1, ET0, EX0).

EADC. Разрешение прерывания ADC.

0: запрет прерывания по завершению преобразования АЦП.
1: разрешение прерывания по завершению преобразования АЦП.

IP (Interrupt Priority Register)

Бит 7 6 5 4 3 2 1 0
Имя   -   PLVD PADC   -   PT1 PX1 PT0 PX0

PADC. Бит повышения приоритета прерывания ADC.

0: прерывание АЦП имеет обычный приоритет.
1: прерывание АЦП имеет повышенный приоритет.

Примеры кода работы с АЦП см. в даташите STC15F204EA-en.pdf [2].

[IAP / EEPROM]

Технология ISP в MCU серии STC15Fxx делает возможным обновление программы приложения пользователя и энергонезависимых данных приложения (находящихся в памяти 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 состоит из максимум 10 страниц. Каждая страница содержит 512 байт. Работая с flash, пользователь должен стереть (erase) страницу целиком перед тем, как он сможет записать (запрограммировать) данные на эту страницу.

Стирание памяти flash означает установку байт её содержимого в значение FFH. Для этого чипа доступно 2 режима стирания. Один режим это mass mode, и другой (page mode). Mass mode работает быстрее, но он очищает всю память flash целиком. Page mode медленнее, но зато он более гибкий, поскольку позволяет стирать память по одной странице. Работа в реальном времени с RAM отличается от работы с flash при очистке и записи тем, что для записи (программирования) flash требуется тратить время на ожидание завершения процесса программирования.

Кроме того, для стирания/программирования flash требуется специальная довольно сложная процедура. К счастью, чипы серии STC15F204EA поставляются с удобным механизмом, помогающим пользователю читать/изменять содержимое flash. Просто заполните целевой адрес и нужные данные в несколько регистров SFR, и сработает встроенная автоматическая процедура ISP, так что пользователь может просто стирать, читать и программировать встроенную память flash и регистры опций.

Функция IAP (In-Application Program) разработана для того, чтобы пользователь мог читать/записывать энергонезависимые данные (nonvolatile data) памяти flash. Это может значительно помочь сохранять параметры приложения независимо от событий включения и выключения питания. Другими словами, пользователь может сохранять некие данные в памяти flash, и после этого выключить или перезагрузить MCU, и иметь возможность восстановить оригинальные значения данных, которые он сохранил ранее до выключения/перезагрузки.

Пользователь может программировать flash данных (data flash) таким же способом, как и программировать приложение в память flash по технологии ISP, но требуется более глубокое понимание назначения регистров SFR: IAP_DATA, IAP_ADDRL, IAP_ADDRH, IAP_CMD, IAP_TRIG и IAP_CONTR.

Регистры управления IAP/ISP. Ниже в таблице показаны регистры специальных функций (special function registers, SFR), относящихся к работе IAP/ISP. Все эти регистры могут быть доступны программно в приложении пользователя. Столбец POR/Reset показывает состояние регистра после включения питания / сброса.

Символ Описание регистра Адрес MSB Адрес бита и символ LSB POR/Reset
IAP_DATA ISP/IAP Flash Data C2h   11111111b
IAP_ADDRH ISP/IAP Flash Address High C3h   00000000b
IAP_ADDRL ISP/IAP Flash Address Low C4h   00000000b
IAP_CMD ISP/IAP Flash Command C5h - - - - - - MS1 MS0 xxxxx000b
IAP_TRIG ISP/IAP Flash Command Trigger C6h   xxxxxxxxb
IAP_CONTR ISP/IAP Control C7h IAPEN SWBS SWRST CMD_FAIL - WT2 WT1 WT0 0000x000b
PCON Power Control 87h - - LVDF POF GF1 GF0 PD IDL xx110000b

IAP_DATA: ISP/IAP Flash Data

Бит 7 6 5 4 3 2 1 0
Имя              

IAP_DATA это регистр порта данных для функционирования ISP/IAP. Данные IAP_DATA будут записаны по нужному адресу при операции записи ISP/IAP, и это также предоставляет доступ в окно данных при операции чтения ISP/IAP.

IAP_ADDRH: ISP/IAP Flash Address High

Бит 7 6 5 4 3 2 1 0
Имя              

IAP_ADDRH это порт для старшего байта адреса всех режимов ISP/IAP. Биты IAP_ADDRH[7:5] должны быть очищены (000b), и если хотя бы один из битов ISP_ADDRH[7:5] установлен, то операция записи IAP/ISP должна завершиться неудачно.

IAP_ADDRL: ISP/IAP Flash Address Low

Бит 7 6 5 4 3 2 1 0
Имя              

IAP_ADDRL это порт для младшего байта адреса всех режимов ISP/IAP. При операции очистки страницы (page erase) эта половина адреса игнорируется.

IAP_CMD: ISP/IAP Flash Command

Бит 7 6 5 4 3 2 1 0
Имя - - - - - - MS1 MS0

Это регистр команд для управления операциями ISP/IAP. IAP_CMD используют для выбора режима flash при выполнении нескольких функций или используется для доступа к защищенным SFR.

B7..B2. Эти биты зарезервированы.

MS1, MS0. Эти биты выбирают режим операции ISP/IAP:

00: выключение (Standby).
01: чтение (Data Flash/EEPROM read).
10: программирование/запись (Data Flash/EEPROM program).
11: очистка страницы (Data Flash/EEPROM page erase).

IAP_TRIG: ISP/IAP Flash Command Trigger

Бит 7 6 5 4 3 2 1 0
Имя

Регистр IAP_TRIG это порт команд для запуска активности ISP/IAP и доступа к защищенным SFR. Если IAP_TRIG заполнен следующими друг за другом байтами 5Ah, A5h, и если IAPEN (IAP_CONTR.7)=1, то сработает запуск активности ISP/IAP или доступ к защищенным SFR.

ISP_CONTR: ISP/IAP Control

Бит 7 6 5 4 3 2 1 0
Имя IAPEN SWBS SWRST CMD_FAOL - WT2 WT1 WT0

Это регистр управления ISP/IAP.

IAPEN. Разрешает работу ISP/IAP.

0: общий запрет всего функционала ISP/IAP функций (program/erase/read).
1: разрешение функций program/erase/read для ISP/IAP.

SWBS. Управление выбором программы загрузчика (software boot).

0: загрузка из основной памяти после сброса.
1: загрузка из памяти ISP после сброса.

SWRST. Управление срабатыванием программного сброса.

0: нет операции.
1: генерируется программный сброс системы. Этот бит будет автоматически очищен аппаратурой.

CMD_FAIL. Бит показывает результат операции ISP/IAP.

0: последняя команда ISP/IAP была завершена успешно.
1: последняя команда ISP/IAP потерпела неудачу. Это могло произойти из-за того, что доступ к памяти flash был запрещен.

B3. Этот бит зарезервирован. Программа должна записать в этот бит 0, когда записывается ISP_CONTR.

WT2..WT0. Выбор времени ожидания, когда память flash занята.

Биты установки времени ожидания Сколько ждет CPU в тактах системной частоты
Рекомендуемая системная частота, МГц
WT2 WT1 WT0 Чтение Программирование,
55 мкс
Стирание сектора, 21 мс
1 1 1 2 55 21012 < 1
1 1 0 2 110 42024 < 2
1 0 1 2 165 63036 < 3
1 0 0 2 330 126072 < 6
0 1 1 2 660 252144 < 12
0 1 0 2 1100 420240 < 20
0 0 1 2 1320 504288 < 24
0 0 0 2 1760 672384 < 30

Примечание: программный сброс (software reset) сбросит только другие SFR, не влияя на биты IAPEN и SWBS. Биты IAPEN и SWBS будут сброшены только действием сброса по включению питания (power-up, сброс POR), программное обеспечение не может выполнить такой сброс.

Пример работы с IAP/EEPROM см. в даташитах STC15F100-en.pdf, STC15F204EA-en.pdf [2].

[Руководство по средствам программирования серии STC15Fxx]

Принцип программирования ISP. Для ISP используется загрузка по протоколу UART через выводы P3.0 и P3.1. Условие загрузки определяется в момент POR (сброс при включении питания), если была получена допустимая команда ISP.

Если MCU используется в системе, где выводы P3.0 и P3.1 подключены к какому-то оборудованию, которое может генерировать данные в момент включения питания, то эта ситуация может привести к нежелательному запуску загрузчика (монитора ISP). Для выхода из этой ситуации предусмотрена специальная защита, которая использует уровни на портах P1.0 и P1.1 как дополнительное условие для запуска загрузчика (если условие не соблюдается, то всегда запуститься программа пользователя). Таким образом, если нужно загрузить код в память программ (flash) MCU серии STC15F204EA, то при использовании этой опции выводы P1.0 и P1.1 должны быть подключены к GND. Если вы выбрали опцию "Next program code, P1.0/1.1 need=0/0", то в следующий раз, когда Вам потребуется повторно загрузить код программы, то сначала должны быть подключены к GND выводы портов P1.0 и P1.1.

Ниже показан алгоритм работы ISP. Имейте в виду, что для запуска загрузчика ISP требуется обязательно сброс по включению питания (Power-On Reset, POR), другие виды сброса приведут к запуску кода пользователя из секции AP, не кода загрузчика. Приложение программатора STC-ISP.exe [2] должно послать первую команду в момент подачи питания на MCU. Таким образом, нужно подключить переходник USB-UART к выводам P3.0 и P3.1, запустить STC-ISP.exe, и потом подать питание на программируемый MCU.

STC90xx ISP principle

Процесс программирования по шагам с помощью утилиты 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 (например STC15F204EA).
5. Загрузите файл двоичного кода программы (в формате *.bin или *.hex).
6. Выберите используемый номер последовательного порта (COMx).
7. Сконфигурируйте опции аппаратуры (hardware options).
8. Кликните на кнопку "ISP programming" или "Re-Programming" для загрузки кода программы пользователя.
9. Подайте питание на программируемый MCU. Код программы пользователя должен загрузиться.

Примечание: нужно сначала нажать на кнопку "ISP programming" или "Re-Programming", и только потом подать питание на MCU, иначе код не сможет загрузиться.

STC15Fxx STC ISP application usage01

Печатная плата разработчика с поддержкой STC-ISP ver3.0A PCB может быть рассчитана на различные модели MCU. Компания STC поставляет MCU в корпусах на 16/20/28/32 вывода, и соответствующая маркировка нанесена на обратную сторону демо-платы, на что пользователю следует обратить внимание. Платы для загрузки используют 40-выводный сокет, и в этот сокет могут быть установлены и другие микроконтроллеры в DIP-корпусах с меньшим количеством выводов, поскольку вывод 20 у 40-выводного корпуса подключается к GND, что совпадает с цоколевкой вывода GND других корпусов.

Для программирования кода пользователя с помощью платы загрузки выполните следующее:

1. Выберите нужное напряжение питания в соответствии с типом MCU:
   A. Для 5V MCU используйте установку перемычки JP1 для подключения MCU-VCC к выводу +5V.
   B. Для 3.3V MCU используйте установку перемычки JP1 для подключения MCU-VCC к выводу +3.3V.

2. Подключите кабель загрузки (предоставляется компанией STC).
   A. Для старых PC подключите коннектор DB9 к последовательному интерфейсу RS-232 компьютера.
   B. Подключите интерфейс USB к порту USB компьютера для подачи питания на плату.
   C. Подключите другой конец кабеля USB к плате загрузки STC.

3. Другие интерфейсы подключать не нужно.

4. Если SW1 находится вы разомкнутом состоянии, то светодиод индикации напряжения MCU-VCC не горит.

5. Настройка SW3:
   P1.0/P1.1 = 1/1, когда SW3 не нажат.
   P1.0/P1.1 = 0/0, когда SW3 нажат.

Если при загрузке Вы выбрали опцию "Next program code, P1.0/P1.1 Need = 0/0", то SW3 должен находиться в "нажатом" состоянии.

6. Поместите программируемый MCU в сокет U1, и поверните рычажок сокета, чтобы зафиксировать MCU.

7. Кликните на кнопку "Download" в программе STC-ISP.exe.

8. Нажмите на SW1 платы загрузки, чтобы подать питание на программируемый MCU.

9. После успешной загрузки (об этом сообщит утилита STC-ISP.exe) отключите питание от demo board и извлеките MCU из сокета.

Для программирования MCU Вы можете использовать ISP в готовых устройствах. Также можно использовать программаторы ISP, поставляемые компанией STC (продаются на сайте aliexpress).

[Компиляторы и эмуляторы]

Компилятор с языка 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.

[Электрические характеристики]

Предельные эксплуатационные значения:

Параметр Символ MIN MAX Ед.
Температура хранения TST -55 +125 °C
Рабочая температура (индустриальное исполнение, I) TA -40 +85 °C
Рабочая температура (коммерческое исполнение, C) TA 0 +70 °C
Напряжение питания (5V версия, относительно VSS, или GND) VDD -0.3 +5.5 V
Напряжение питания (3V версия, относительно VSS, или GND) VDD -0.3 +3.6 V
Напряжение на любом выводе (относительно VSS, или GND)   -0.5 VCC+0.3 V

Рабочие параметры по постоянному току для 5V версий MCU:

Символ Параметр MIN Typ MAX Ед. Условия проверки
VDD Рабочее напряжение 3.3 5.0 5.5 V  
IPD Ток режима "выключено" (Power Down Current) - < 0.1 - μA 5V
IIDL Ток режима ожидания (Idle Current) - 3.0 - mA 5V
ICC Рабочий ток - 4 20 mA 5V
VIL1 Входное напряжение лог. 0 (P0, P1, P2, P3) - - 0.8 V 5V
VIH1 Входное напряжение лог. 1 (P0, P1, P2, P3) 2.0 - - V 5V
VIH2 Входное напряжение лог. 1 (RESET) 2.2 - - V 5V
IOL1 Коммутируемый ток для вых. уровня лог. 0 (P0, P1, P2, P3) - 20 - mA 5V, Vpin=0.45V
IOH1 Вытекающий ток для вых. уровня лог. 1 (P0, P1, P2, P3, квази-двунаправленный режим) 200 270 - μA 5V
IOH2 Вытекающий ток для вых. уровня лог. 1 (P0, P1, P2, P3, режим двухтактного выхода) - 20 - mA 5V, Vpin=2.4V
IIL Входной ток лог. 0 (P0, P1, P2, P3) - - 50 μA Vpin=0V
ITL Ток перехода от лог. 1 к лог. 0 (P0, P1, P2, P3) 100 270 600 μA Vpin=2.0V

Рабочие параметры по постоянному току для 3V версий MCU:

Символ Параметр MIN Typ MAX Ед. Условия проверки
VDD Рабочее напряжение 2.4 3.3 3.6 V  
IPD Ток режима "выключено" (Power Down Current) - < 0.1 - μA 3.3V
IIDL Ток режима ожидания (Idle Current) - 2.0 - mA 3.3V
ICC Рабочий ток - 4 10 mA 3.3V
VIL1 Входное напряжение лог. 0 (P0, P1, P2, P3) - - 0.8 V 3.3V
VIH1 Входное напряжение лог. 1 (P0, P1, P2, P3) 2.0 - - V 3.3V
VIH2 Входное напряжение лог. 1 (RESET) 2.2 - - V 3.3V
IOL1 Коммутируемый ток для вых. уровня лог. 0 (P0, P1, P2, P3) - 20 - mA 3.3V, Vpin=0.45V
IOH1 Вытекающий ток для вых. уровня лог. 1 (P0, P1, P2, P3, квази-двунаправленный режим) 140 170 - μA 3.3V
IOH2 Вытекающий ток для вых. уровня лог. 1 (P0, P1, P2, P3, режим двухтактного выхода) - 20 - mA 3.3V
IIL Входной ток лог. 0 (P0, P1, P2, P3) - 8 50 μA Vpin=0V
ITL Ток перехода от лог. 1 к лог. 0 (P0, P1, P2, P3) - 110 600 μA Vpin=2.0V

[Замечания по замене стандартных микроконтроллеров 8051 серией STC15F204EA]

Примечание: в этих рекомендациях по замене производится сравнение серии микроконтроллеров STC15F204EA с серией STC89xx [3], потому что серия STC89xx максимально совместима с традиционными MCU архитектуры 8051.

Таймеры/счетчики, вычисление задержек. У MCU серии STC15F204EA Timer0/Timer1 полностью совместимы с традиционным 8051 MCU. После сброса при включении питания источником тактирования таймеров по умолчанию будет частота тактов MCU поделенная на 12.

Скорость выполнения инструкции у STC15Fxx быстрее традиционного 8051 в 8..12 раз в одинаковых рабочих условиях, так что этот факт должны учитывать подпрограммы задержки.

ALE. У традиционных 8051 на вывод ALE выводится частота, равная 1/6 от системной тактовой частоты, что иногда использовалось как тактовая частота для различных устройств в системе. Однако MCU серии STC15Fxx не имеют вывода ALE, и при необходимости Вы можете получить аналогичную тактовую частоту с выводов CLKOUT1 (P3.4), CLKOUT0 (P3.5) или SYSclk (P0.0).

В системах, использующих традиционные 8051, частота на выводе ALE служила источником высокочастотных помех. MCU серии STC89xx для устранения этой проблемы имеют специальный бит ALEOFFF в регистре AUXR. Серия STC15Fxx MCU вообще не имеет вывода ALE на корпусе, так что проблема генерации помех полностью исключается. Ниже для сравнения показаны регистры AUXR серии STC89xx и серии STC15F204EA.

Регистр AUXR серии STC89xx (SFR-адрес 8Eh, значение после сброса xxxxxx00b):

Бит 7 6 5 4 3 2 1 0
Имя   -     -     -     -     -     -   EXTRAM ALEOFF

Регистр AUXR серии STC15F204EA (SFR-адрес 8Eh, значение после сброса 00xxxxxxb):

Бит 7 6 5 4 3 2 1 0
Имя T0x12 T1x12   -     -     -     -     -     -  

PSEN. Традиционные 8051 выполняют программу из внешней памяти с участием сигнала PSEN, однако серия STC15F204EA вообще не имеет сигнала PSEN (доступ к внешней памяти программ отсутствует в принципе).

GPIO в квази-двунаправленном режиме. Доступ к вводу/выводу у традиционных 8051 (определение перехода сигнала на входе или чтение состояния) занимает время 12 тактов системной частоты, в то время как серия STC15F204EA требует для этого только 4 тактов. Когда Вам нужно прочитать уровень внешнего сигнала, то на традиционном 8051 одна такая процедура займет 12 тактов, но на MCU серии STC15F204EA это займет 4 такта, так что чтобы скомпенсировать время обработки чтения (если это необходимо), то следует добавить нужное количество команд NOP (обычно достаточно 1..2 команды NOP).

Совместимость по нагрузочной способности GPIO. Ножки портов серии STC15F204EA могут коммутировать ток 20 mA, и могут выдерживать этот ток длительное время без каких-либо последствий. Ножки портов серии STC89xx могут коммутировать ток только до 6 mA. Для приложений, где требуется высокая нагрузочная способность выходов портов, рекомендуется использовать MCU серии STC15F204EA.

Сторожевой таймер (WatchDog Timer, WDT). У MCU серии STC15F204EA регистр управления сторожевого таймера (WDT_CONTR) находится по другому адресу C1H, и добавлен флаг сброса сторожевого таймера (WDT_FLAG). Ниже для сравнения показаны регистры WDT_CONTR серий STC89xx и STC15F204EA.

Регистр WDT_CONTR серии STC89xx (SFR-адрес E1h, значение после сброса xx000000b):

Бит 7 6 5 4 3 2 1 0
Имя WDT_FLAG   -   EN_WDT CLR_WDT IDL_WDT PS2 PS1 PS0

Регистр WDT_CONTR серии STC15F204EA (SFR-адрес C1h, значение после сброса xx000000b):

Бит 7 6 5 4 3 2 1 0
Имя   -     -   EN_WDT CLR_WDT IDL_WDT PS2 PS1 PS0

В серии MCU STC15F204EA после обновления ISP сторожевой таймер автоматически разрешается, но так не делается для серии STC89xx, так что серия STC15F204EA более надежно защищена сторожевым таймером.

EEPROM. Таблица SFR-регистров, связанных с EEPROM, показывает различия в адресации серии STC15F204EA от традиционных MCU архитектуры 8051:

Мнемоника
Описание регистра
STC15Fxx STC89xx
Адрес
IAP_DATA ISP/IAP Flash Data C2h E2h
IAP_ADDRH ISP/IAP Flash Address High C3h E3h
IAP_ADDRL ISP/IAP Flash Address Low C4h E4h
IAP_CMD ISP/IAP Flash Command C5h E5h
IAP_TRIG ISP/IAP Flash Command Trigger C6h E6h
IAP_CONTR ISP/IAP Control C7h E7h

Имеются также отличия в системе команд ISP/IAP: для STC15F204EA последовательная запись 5Ah и A5h вызывает срабатывание команды EEPROM flash, и у серии STC89xx последовательность для этой операции другая - 46h и B9h. У серии STC15F204EA память EEPROM начинается с адреса 0000h, но у серии STC89xx это не так.

Энергопотребление, питание. Потребляемый системой ток имеет 2 составляющие: схема усилителя кварцевого генератора и цифровые узлы. У серии STC15F204EA нет схемы усилителя кварцевого генератора, поэтому эта серия потребляет меньше энергии, чем серия STC89xx. Для цифровых схем чем выше тактовая частота, тем больше энергопотребление. Серия STC15F204EA выполняет инструкции на том же рабочем окружении в 3..24 раза быстрее, чем серия STC89xx, поэтому если Вам нужна повышенная эффективность по потребляемой энергии, то требуемая частота (и соответственно потребление тока) для серии STC15F204EA будет меньше, чем у серии STC89xx MCU.

Для фильтрации помех и развязки по питанию между VCC и GND должен быть предусмотрен электролитический конденсатор 47 мкф и параллельно ему подключенный керамический конденсатор 0.1 мкф.

Пробуждение из режима глубокого сна (PowerDown Wakeup). Серия STC15F204EA MCU может выходить из сна как по фронту нарастания сигнала, так по спаду (в зависимости от режима внешних прерываний и используемых выводов), но серия STC89xx поддерживает выход из сна только по отрицательному перепаду.

Схема сброса. Для серии STC89xx, если тактовая частота системы меньше 12 МГц, то внешняя схема сброса не требуется. Вывод сброса может быть подключен к GND либо напрямую, либо через резистор 1 кОм. Но при разработке печатной платы для серии STC89xx рекомендуется разводить RC-цепочку для сброса, даже если впоследствии она не будет использоваться. В то же время серия STC15F204EA имеет свою внутреннюю надежную систему сброса, и не требует наличия внешней схемы сброса.

Тактовый генератор. Для серии STC89xx нет возможности использовать внутренний RC-генератор. Если в качестве источника тактов используется встроенный генератор, работающий от внешнего кварцевого резонатора, то выводы XTAL1 и XTAL2 подключаются к кварцу, и для других функций их использовать нельзя. Если Вы используете внешний активный кварцевый генератор, то такты от него подаются на вывод XTAL1, и вывод XTAL2 остается не подключенным. В случае применения серии STC15F204EA можно использовать только внутренний высокоточный RC-генератор, у которого температурная зависимость ухода частоты составляет ±1% в рабочем диапазоне температур, что достаточно для большинства приложений и позволяет отказаться от необходимости применять дорогой внешний кварцевый резонатор.

[Ссылки]

1. Микроконтроллеры STCmicro.
2. 170314STCmcu.zip - документация на английском языке по микроконтроллерам STC, утилита программирования.
3. STC89xx.