Серия STC12Cxx представляет однокристальные микроконтроллеры компании STC MCU Limited (STCmicro) [1], основанные на высокопроизводительном ядре 1T с архитектурой ядра 80C51. Например, расширенное ядро STC12C5A60S2 выполняет инструкции за 1..6 такт (что в 8..12 раз быстрее стандартного устройства 8051), с сохранением полной совместимости со ставшей индустриальным стандартом серией микроконтроллеров 80C51. Технологии самопрограммирования (In-System-Programming, ISP) и доступа к энергонезависимым данным из работающего приложения (In-Application-Programming, IAP) предоставляют пользователям возможность обновлять программу и данные в системе. ISP позволяет загружать новый код программы без извлечения микроконтроллера из конечного изделия; IAP означает, что устройство может само записывать сохраняемые при выключении питания данные в память Flash прямо из работающего кода приложения. У STC12C5A60S2 есть 10 источников прерывания с 4-уровневой структурой назначения приоритета, 8/10-битный ADC (АЦП), встроенный в кристалл RC-генератор и однократно разрешаемый сторожевой таймер (Watch-Dog Timer, WDT), двухканальный блок PCA и PWM, SPI, аппаратный UART. Другие микроконтроллеры серии имеют аналогичные параметры по быстродействию и напряжениям питания, отличаясь количеством портов GPIO и возможно количеством каналов АЦП, портов UART и т. п.
Основные возможности серии на примере микроконтроллера STC12C5A60S2 (самый мощный из серии по объему памяти):
• Улучшенное ядро (CPU) 80C51, работающее в 8..12 раз быстрее, чем стандартный микроконтроллер (MCU) 8051. • Рабочий диапазон напряжений питания: 3.5-5.5V или 2.2V-3.6V (последнее для низковольтной серии STC12LE5A60S2). • Рабочий диапазон тактовых частот 0..35 МГц, что по скорости работы эквивалентно частотам 0..420 МГц для стандартного 8051. • Простой внутренний RC-генератор и генератор с внешним кварцевым резонатором. • Встроенную в кристалл оперативную память (ОЗУ, RAM) на 1280 байт (из них 256 байт это обычная память scratch-pad RAM и 1024 байта auxiliary RAM) и 8..62K байт памяти программ (code flash) с гибкой возможностью перепрограммирования ISP/IAP. • Защита доступа к коду, записанному в память flash. • Есть возможность доступа к внешней памяти (XCODE, XDATA). • Четыре 16-битных таймера/счетчика. Timer0/Timer1 (совместимы с таймерами 8051) с режимом 0 (16-битный режим с автоматической перезагрузкой), режимом 1 (16-битный таймер) и режимом 2 (8-битный режим с автоматической перезагрузкой). 2 канала PCA можно использовать как 2 таймера. • Аппаратный UART с функциями распознавания адреса и детектированием ошибки фрейма. • Второй UART с собственным генератором скорости. • 8-канальный, 10-битный ADC с поддержкой прерывания, работающий на скорости до 100 тысяч выборок в секунду. • 10 источников прерывания с 4 уровнями назначения приоритета. • Один 15-битный сторожевой таймер (Watch-Dog-Timer, WDT) с 8-битным прескалером. WDT может быть разрешен однократно после сброса, после чего не может быть запрещен. • Интерфейс SPI, работающий в режимах Master и Slave. • 2 канала массивов программируемых счетчиков (Programmable Counter Array, PCA). • Три режима экономии энергии: idle mode (режим ожидания), slow down mode (режим замедления) и power-down mode (режим отключения). Из power down mode MCU можно разбудить прерываниями от PCA, RXD, T0/T1 и внешними прерываниями INT0, INT1. • Отличные параметры в контексте малой генерации радиопомех, очень низкое энергопотребление. • Два диапазона рабочих температур: индустриальный (-40..+85°C) и коммерческий (0..+75°C). • Функция выхода программируемой тактовой частоты. T0 выводит такты на ножке порта P3.4, T1 выводит такты на ножке порта P3.5. • Имеется 36/40/44 конфигурируемых портов ввода/вывода (I/O ports, GPIO). • Функция детектора пониженного внешнего напряжения (P4.6, на месте вывода EA стандартного 8051). • Выпускается в корпусах типа QFN-40, PDIP-40, PLCC-44, LQFP-44, LQFP-48. • Глобальный уникальный идентификатор каждого чипа.
Другие микроконтроллеры серии STC12Cxx могут отличаться объемом памяти, типом корпуса, количеством разрядов АЦП, количеством каналов PCA, количеством портов UART, отсутствием возможности доступа к внешней памяти и т. п.
Port1, 8-битный двунаправленный порт ввода/вывода (GPIO) со встроенными резисторами pull-up. Когда в Port1 записываются единички, мощная подтяжка pull-up включается драйверами CMOS только на 2 периода тактовой частоты, и затем подключается слабая подтяжка pull-up резисторами, подтягивая уровень вывода порта к лог. 1. P1.0-P1.7 используются как аналоговые входы коммутатора АЦП, и несут некоторые другие аппаратные функции.
P1.0/ADC0/CLKOUT0
12
18
20
16
P1.0
Ножка порта GPIO.
ADC0
Вход канала 0 АЦП.
CLKOUT0
Программируемый выход частоты от Timer0.
P1.1/ADC1/CLKOUT1
13
19
21
17
P1.1
Ножка порта GPIO.
ADC1
Вход канала 1 АЦП.
CLKOUT1
Программируемый выход частоты от Timer0
P1.2/ADC2
14
20
22
18
P1.2
Ножка порта GPIO.
ADC2
Вход канала 2 АЦП.
P1.3/ADC3
15
21
24
20
P1.3
Ножка порта GPIO.
ADC3
Вход канала 3 АЦП.
P1.4/ADC4/SS
16
22
25
21
P1.4
Ножка порта GPIO.
ADC4
Вход канала 4 АЦП.
~SS
Сигнал выборки подчиненного устройства SPI, активный уровень лог. 0.
P1.5/ADC5/MOSI
17
23
27
23
P1.5
Ножка порта GPIO.
ADC5
Вход канала 5 АЦП.
MOSI
Сигнал Master Out Slave In интерфейса SPI.
P1.6/ADC6/MISO
18
24
28
24
P1.6
Ножка порта GPIO.
ADC6
Вход канала 6 АЦП.
MISO
Сигнал Master In Slave Out интерфейса SPI.
P1.7/ADC7/SCLK
19
25
29
25
P1.7
Ножка порта GPIO.
ADC7
Вход канала 7 АЦП.
SCLK
Сигнал тактов интерфейса SPI.
P3.0 - P3.5, P3.7
2, 3, 6..9, 11
4, 5, 8..11, 17
4, 5, 9, 11..13, 19
32, 1, 5, 7..9, 15
Port3, 8-битный двунаправленный порт ввода/вывода, со встроенными резисторами weak pull-up. Когда в Port3 записываются единички, мощная подтяжка pull-up включается драйверами CMOS только на 2 периода тактовой частоты, и затем подключается слабая подтяжка pull-up резисторами, подтягивая уровень вывода порта к лог. 1. Port3 также поддерживает множество различных аппаратных функций.
P3.0/RXD
2
4
4
32
P3.0
Ножка порта GPIO.
RXD
Сигнал приема UART.
P3.1/TXD
3
5
5
1
P3.1
Ножка порта GPIO.
TXD
Сигнал передачи UART.
P3.2/INT0
6
8
9
5
P3.2
Ножка порта GPIO.
~INT0
Внешнее прерывание 0.
P3.3/INT1
7
9
11
7
P3.3
Ножка порта GPIO.
~INT1
Внешнее прерывание 1.
P3.4/T0/ECI
8
10
12
8
P3.4
Ножка порта GPIO.
T0
Вход тактирования Timer0.
ECI
Вход счетчика PCA.
P3.5/T1/PCA1/PWM1
9
11
13
9
P3.5
Ножка порта GPIO.
T1
Вход тактирования Timer1.
PCA1
Вход захвата модуля 1 PCA.
PWM1
Выход ШИМ модуля 1.
P3.7/PCA0/PWM0
11
17
19
15
P3.7
Ножка порта GPIO.
PCA0
Вход захвата модуля 0 PCA.
PWM0
Выход ШИМ модуля 0.
RST
1
3
3
31
Вход сброса.
XTAL1
5
7
8
4
Вывод для подключения внешнего кварцевого резонатора, вход встроенного генератора. Может принимать тактовый сигнал от внешнего генератора.
XTAL2
4
6
7
3
Вывод для подключения внешнего кварцевого резонатора, инвертирующий выход встроенного генератора. Этот вывод должен оставаться не подключенным, когда используется внешний генератор тактов.
VCC
20
28
32
28
Плюс напряжения питания.
GND
10
14
16
12
Минус напряжения питания, общий провод для всех сигналов, земля.
Корпуса DIP-20, SOP-20, TSSOP-20:
Корпуса SOP-28, SKDIP-28:
Корпус SOP-32:
Таблица выбора по общим параметрам:
Тип
VCC, V
FLASH, байт
SRAM, байт
EEPROM, байт
TIMER
UART
PCA
ADC, бит
Корп.
Серия STC12C2052AD (5V питание)
STC12C1052
3.5-5.5
1K
256
10K
2
1
2
-
20, 28, 32
STC12C1052AD
3.5-5.5
1K
256
10K
2
1
2
8
20, 28, 32
STC12C2052
3.5-5.5
2K
256
10K
2
1
2
-
20, 28, 32
STC12C2052AD
3.5-5.5
2K
256
10K
2
1
2
8
20, 28, 32
STC12C3052
3.5-5.5
3K
256
10K
2
1
2
-
20, 28, 32
STC12C3052AD
3.5-5.5
3K
256
10K
2
1
2
8
20, 28, 32
STC12C4052
3.5-5.5
4K
256
10K
2
1
2
-
20, 28, 32
STC12C4052AD
3.5-5.5
4K
256
10K
2
1
2
8
20, 28, 32
STC12C5052
3.5-5.5
5K
256
10K
2
1
2
-
20, 28, 32
STC12C5052AD
3.5-5.5
5K
256
10K
2
1
2
8
20, 28, 32
Серия STC12LE2052AD (3.3V питание)
STC12LE1052
2.2-3.6
1K
256
10K
2
1
2
-
20, 28, 32
STC12LE1052AD
2.2-3.6
1K
256
10K
2
1
2
8
20, 28, 32
STC12LE2052
2.2-3.6
2K
256
10K
2
1
2
-
20, 28, 32
STC12LE2052AD
2.2-3.6
2K
256
10K
2
1
2
8
20, 28, 32
STC12LE3052
2.2-3.6
3K
256
10K
2
1
2
-
20, 28, 32
STC12LE3052AD
2.2-3.6
3K
256
10K
2
1
2
8
20, 28, 32
STC12LE4052
2.2-3.6
4K
256
10K
2
1
2
-
20, 28, 32
STC12LE4052AD
2.2-3.6
4K
256
10K
2
1
2
8
20, 28, 32
STC12LE5052
2.2-3.6
5K
256
10K
2
1
2
-
20, 28, 32
STC12LE5052AD
2.2-3.6
5K
256
10K
2
1
2
8
20, 28, 32
Все перечисленные в таблице MCU также имеют сторожевой таймер (WDT), интерфейс SPI, функцию детектора внешнего пониженного напряжения с возможностью конфигурирования порога срабатывания.
Port0, 4-битный двунаправленный порт ввода/вывода (GPIO) со встроенными резисторами pull-up.
P1.0 - P1.7
12..19
18..25
20..22, 24, 25, 27..29
16..18, 20, 21, 23..25
Port1, 8-битный двунаправленный порт ввода/вывода (GPIO) со встроенными резисторами pull-up. Когда в Port1 записываются единички, мощная подтяжка pull-up включается драйверами CMOS только на 2 периода тактовой частоты, и затем подключается слабая подтяжка pull-up резисторами, подтягивая уровень вывода порта к лог. 1. P1.0-P1.7 используются как аналоговые входы коммутатора АЦП, и несут некоторые другие аппаратные функции.
P1.0/ADC0/CLKOUT0
12
18
20
16
P1.0
Ножка порта GPIO
ADC0
Вход канала 0 АЦП.
CLKOUT0
Программируемый выход частоты от Timer0.
P1.1/ADC1/CLKOUT1
13
19
21
17
P1.1
Ножка порта GPIO.
ADC1
Вход канала 1 АЦП
CLKOUT1
Программируемый выход частоты от Timer1.
P1.2/ADC2
14
20
22
18
P1.2
Ножка порта GPIO.
ADC2
Вход канала 2 АЦП.
P1.3/ADC3
15
21
24
20
P1.3
Ножка порта GPIO.
ADC3
Вход канала 3 АЦП.
P1.4/ADC4/~SS
16
22
25
21
P1.4
Ножка порта GPIO.
ADC4
Вход канала 4 АЦП.
~SS
Сигнал выборки подчиненного устройства SPI, активный уровень лог. 0.
P1.5/ADC5/MOSI
17
23
27
23
P1.5
Ножка порта GPIO.
ADC5
Вход канала 5 АЦП.
MOSI
Сигнал Master Out Slave In интерфейса SPI.
P1.6/ADC6/MISO
18
24
28
24
P1.6
Ножка порта GPIO.
ADC6
Вход канала 6 АЦП.
MISO
Сигнал Master In Slave Out интерфейса SPI.
P1.7/ADC7/SCLK
19
25
29
25
P1.7
Ножка порта GPIO.
ADC7
Вход канала 7 АЦП.
SCLK
Сигнал тактов интерфейса SPI.
P2.0 - P2.7
26, 27, 1, 2, 12, 13, 15, 16
30, 31, 1, 2, 14, 15, 17, 18
26, 27, 29, 30, 10, 11, 13, 14
Port2, 8-битный двунаправленный порт ввода/вывода, со встроенными резисторами pull-up.
P2.0/PCA2/PWM2
26
30
26
P2.0
Ножка порта GPIO.
PCA2
Вход захвата PCA модуля 2.
PWM2
Выход ШИМ модуля 2.
P2.1
27
31
27
P2.1
Ножка порта GPIO.
P2.2
1
1
29
P2.2
Ножка порта GPIO.
P2.3
2
2
30
P2.3
Ножка порта GPIO.
P2.4/PCA3/PWM3
12
14
10
P2.4
Ножка порта GPIO.
PCA3
Вход захвата PCA модуля 3.
PWM3
Выход ШИМ модуля 3.
P2.5
13
15
11
P2.5
Ножка порта GPIO.
P2.6
15
17
13
P2.6
Ножка порта GPIO.
P2.7
16
18
14
P2.7
Ножка порта GPIO.
P3.0 - P3.7
2, 3, 6..9, 11
4, 5, 8..11, 17
4, 5, 9, 11..13, 19
32, 1, 5, 7..9, 15
Port3, 8-битный двунаправленный порт ввода/вывода, со встроенными резисторами weak pull-up. Когда в Port3 записываются единички, мощная подтяжка pull-up включается драйверами CMOS только на 2 периода тактовой частоты, и затем подключается слабая подтяжка pull-up резисторами, подтягивая уровень вывода порта к лог. 1. Port3 также поддерживает множество различных аппаратных функций.
P3.0/RXD
2
4
4
32
P3.0
Ножка порта GPIO.
RXD
Вход приемника UART.
P3.1/TXD
3
5
5
1
P3.1
Ножка порта GPIO.
TXD
Выход передатчика UART.
P3.2/~INT0
6
8
9
5
P3.2
Ножка порта GPIO.
~INT0
Вход внешнего прерывания 0.
P3.3/~INT1
7
9
11
7
P3.3
Ножка порта GPIO.
~INT1
Вход внешнего прерывания 1.
P3.4/T0/ECI
8
10
12
8
P3.4
Ножка порта GPIO.
T0
Вход счета Timer0.
ECI
Вход счетчика PCA.
P3.5/T1/PCA1/PWM1
9
11
13
9
P3.5
Ножка порта GPIO.
T1
Вход счета Timer1.
PCA1
Вход захвата PCA модуля 1.
PWM1
Выход ШИМ модуля 1.
P3.7/PCA0/PWM0
11
17
19
15
P3.7
Ножка порта GPIO.
PCA0
Вход захвата PCA модуля 0.
PWM0
Выход ШИМ модуля 0.
RST
1
3
3
31
Вход сброса
XTAL1
5
7
8
4
Вывод для подключения внешнего кварцевого резонатора, вход встроенного генератора. Может принимать тактовый сигнал от внешнего генератора.
XTAL2
4
6
7
3
Вывод для подключения внешнего кварцевого резонатора, инвертирующий выход встроенного генератора. Этот вывод должен оставаться не подключенным, когда используется внешний генератор тактов.
VCC
20
28
32
28
Плюс напряжения питания.
GND
10
14
16
12
Минус напряжения питания, общий провод для всех сигналов, земля.
Примечание: цоколевка корпусов серии STC12C54xx совпадает с серией STC12C56xx.
Корпуса DIP-20, SOP-20, TSSOP-20:
Корпуса SOP-28, SKDIP-28:
Корпуса LQFP-32:
Корпуса SOP-32:
Таблица выбора по общим параметрам:
Тип
VCC, V
FLASH, байт
SRAM, байт
EEPROM
TIMER
ADC, бит
Серия STC12C5410AD (5V питание)
STC12C5401
3.5-5.5
1K
512
есть
2
-
STC12C5401AD
3.5-5.5
1K
512
есть
2
10
STC12C5402
3.5-5.5
2K
512
есть
2
-
STC12C5402AD
3.5-5.5
2K
512
есть
2
10
STC12C5404
3.5-5.5
4K
512
есть
2
-
STC12C5404AD
3.5-5.5
4K
512
есть
2
10
STC12C5406
3.5-5.5
6K
512
есть
2
-
STC12C5406AD
3.5-5.5
6K
512
есть
2
10
STC12C5408
3.5-5.5
8K
512
есть
2
-
STC12C5408AD
3.5-5.5
8K
512
есть
2
10
STC12C5410
3.5-5.5
10K
512
есть
2
-
STC12C5410AD
3.5-5.5
10K
512
есть
2
10
STC12C5412
3.5-5.5
12K
512
IAP
2
-
STC12C5412AD
3.5-5.5
12K
512
IAP
2
10
Серия STC12LE5410AD (3.3V питание)
STC12LE5401
2.2-3.6
1K
512
есть
2
-
STC12LE5401AD
2.2-3.6
1K
512
есть
2
10
STC12LE5402
2.2-3.6
2K
512
есть
2
-
STC12LE5402AD
2.2-3.6
2K
512
есть
2
10
STC12LE5404
2.2-3.6
4K
512
есть
2
-
STC12LE5404AD
2.2-3.6
4K
512
есть
2
10
STC12LE5406
2.2-3.6
6K
512
есть
2
-
STC12LE5406AD
2.2-3.6
6K
512
есть
2
10
STC12LE5408
2.2-3.6
8K
512
есть
2
-
STC12LE5408AD
2.2-3.6
8K
512
есть
2
10
STC12LE5410
2.2-3.6
10K
512
есть
2
-
STC12LE5410AD
2.2-3.6
10K
512
есть
2
10
STC12LE5412
2.2-3.6
12K
512
IAP
2
-
STC12LE5412AD
2.2-3.6
12K
512
IAP
2
10
Все перечисленные в таблице MCU также имеют улучшенный UART, память EEPROM (или IAP), сторожевой таймер (WDT), интерфейс SPI, функцию детектора внешнего пониженного напряжения с возможностью конфигурирования порога срабатывания, 4 канала 16-битных счетчиков PCA, встроенную схему генерации сброса.
Port0, 4-битный двунаправленный порт ввода/вывода (GPIO) со встроенными резисторами pull-up.
P1.0 - P1.7
12..19
18..25
20..22, 24, 25, 27..29
16..18, 20, 21, 23..25
Port1, 8-битный двунаправленный порт ввода/вывода (GPIO) со встроенными резисторами pull-up. Когда в Port1 записываются единички, мощная подтяжка pull-up включается драйверами CMOS только на 2 периода тактовой частоты, и затем подключается слабая подтяжка pull-up резисторами, подтягивая уровень вывода порта к лог. 1. P1.0-P1.7 используются как аналоговые входы коммутатора АЦП, и несут некоторые другие аппаратные функции.
P1.0/ADC0/CLKOUT0
12
18
20
16
P1.0
Ножка порта GPIO
ADC0
Вход канала 0 АЦП.
CLKOUT0
Программируемый выход частоты от Timer0.
P1.1/ADC1/CLKOUT1
13
19
21
17
P1.1
Ножка порта GPIO.
ADC1
Вход канала 1 АЦП
CLKOUT1
Программируемый выход частоты от Timer1.
P1.2/ADC2
14
20
22
18
P1.2
Ножка порта GPIO.
ADC2
Вход канала 2 АЦП.
P1.3/ADC3
15
21
24
20
P1.3
Ножка порта GPIO.
ADC3
Вход канала 3 АЦП.
P1.4/ADC4/~SS
16
22
25
21
P1.4
Ножка порта GPIO.
ADC4
Вход канала 4 АЦП.
~SS
Сигнал выборки подчиненного устройства SPI, активный уровень лог. 0.
P1.5/ADC5/MOSI
17
23
27
23
P1.5
Ножка порта GPIO.
ADC5
Вход канала 5 АЦП.
MOSI
Сигнал Master Out Slave In интерфейса SPI.
P1.6/ADC6/MISO
18
24
28
24
P1.6
Ножка порта GPIO.
ADC6
Вход канала 6 АЦП.
MISO
Сигнал Master In Slave Out интерфейса SPI.
P1.7/ADC7/SCLK
19
25
29
25
P1.7
Ножка порта GPIO.
ADC7
Вход канала 7 АЦП.
SCLK
Сигнал тактов интерфейса SPI.
P2.0 - P2.7
26, 27, 1, 2, 12, 13, 15, 16
30, 31, 1, 2, 14, 15, 17, 18
26, 27, 29, 30, 10, 11, 13, 14
Port2, 8-битный двунаправленный порт ввода/вывода, со встроенными резисторами pull-up.
P2.0/PCA2/PWM2
26
30
26
P2.0
Ножка порта GPIO.
PCA2
Вход захвата PCA модуля 2.
PWM2
Выход ШИМ модуля 2.
P2.1
27
31
27
P2.1
Ножка порта GPIO.
P2.2
1
1
29
P2.2
Ножка порта GPIO.
P2.3
2
2
30
P2.3
Ножка порта GPIO.
P2.4/PCA3/PWM3
12
14
10
P2.4
Ножка порта GPIO.
PCA3
Вход захвата PCA модуля 3.
PWM3
Выход ШИМ модуля 3.
P2.5
13
15
11
P2.5
Ножка порта GPIO.
P2.6
15
17
13
P2.6
Ножка порта GPIO.
P2.7
16
18
14
P2.7
Ножка порта GPIO.
P3.0 - P3.7
2, 3, 6..9, 11
4, 5, 8..11, 17
4, 5, 9, 11..13, 19
32, 1, 5, 7..9, 15
Port3, 8-битный двунаправленный порт ввода/вывода, со встроенными резисторами weak pull-up. Когда в Port3 записываются единички, мощная подтяжка pull-up включается драйверами CMOS только на 2 периода тактовой частоты, и затем подключается слабая подтяжка pull-up резисторами, подтягивая уровень вывода порта к лог. 1. Port3 также поддерживает множество различных аппаратных функций.
P3.0/RXD
2
4
4
32
P3.0
Ножка порта GPIO.
RXD
Вход приемника UART.
P3.1/TXD
3
5
5
1
P3.1
Ножка порта GPIO.
TXD
Выход передатчика UART.
P3.2/~INT0
6
8
9
5
P3.2
Ножка порта GPIO.
~INT0
Вход внешнего прерывания 0.
P3.3/~INT1
7
9
11
7
P3.3
Ножка порта GPIO.
~INT1
Вход внешнего прерывания 1.
P3.4/T0/ECI
8
10
12
8
P3.4
Ножка порта GPIO.
T0
Вход счета Timer0.
ECI
Вход счетчика PCA.
P3.5/T1/PCA1/PWM1
9
11
13
9
P3.5
Ножка порта GPIO.
T1
Вход счета Timer1.
PCA1
Вход захвата PCA модуля 1.
PWM1
Выход ШИМ модуля 1.
P3.7/PCA0/PWM0
11
17
19
15
P3.7
Ножка порта GPIO.
PCA0
Вход захвата PCA модуля 0.
PWM0
Выход ШИМ модуля 0.
RST
1
3
3
31
Вход сброса
XTAL1
5
7
8
4
Вывод для подключения внешнего кварцевого резонатора, вход встроенного генератора. Может принимать тактовый сигнал от внешнего генератора.
XTAL2
4
6
7
3
Вывод для подключения внешнего кварцевого резонатора, инвертирующий выход встроенного генератора. Этот вывод должен оставаться не подключенным, когда используется внешний генератор тактов.
VCC
20
28
32
28
Плюс напряжения питания.
GND
10
14
16
12
Минус напряжения питания, общий провод для всех сигналов, земля.
Примечание: цоколевка корпусов серии STC12C54xx совпадает с серией STC12C56xx.
Корпуса DIP-20, SOP-20, TSSOP-20:
Корпуса SOP-28, SKDIP-28:
Корпуса LQFP-32:
Корпуса SOP-32:
Таблица выбора по общим параметрам:
Тип
VCC, V
FLASH, байт
SRAM, байт
EEPROM
TIMER
ADC, бит
Серия STC12C5620AD (5V питание)
STC12C5604
3.5-5.5
4K
768
есть
2
-
STC12C5604AD
3.5-5.5
4K
768
есть
2
10
STC12C5608
3.5-5.5
8K
768
есть
2
-
STC12C5608AD
3.5-5.5
8K
768
есть
2
10
STC12C5612
3.5-5.5
12K
768
IAP
2
-
STC12C5612AD
3.5-5.5
12K
768
IAP
2
10
STC12C5616
3.5-5.5
16K
768
есть
2
-
STC12C5616AD
3.5-5.5
16K
768
есть
2
10
STC12C5620
3.5-5.5
20K
768
есть
2
-
STC12C5620AD
3.5-5.5
20K
768
есть
2
10
STC12C5624
3.5-5.5
24K
768
есть
2
-
STC12C5624AD
3.5-5.5
24K
768
есть
2
10
STC12C5628
3.5-5.5
28K
768
IAP
2
-
STC12C5628AD
3.5-5.5
28K
768
IAP
2
10
STC12C5630
3.5-5.5
30K
768
IAP
2
-
STC12C5630AD
3.5-5.5
30K
768
IAP
2
10
Серия STC12LE5620AD (3.3V питание)
STC12LE5604
2.2-3.6
4K
768
есть
2
-
STC12LE5604AD
2.2-3.6
4K
768
есть
2
10
STC12LE5608
2.2-3.6
8K
768
есть
2
-
STC12LE5608AD
2.2-3.6
8K
768
есть
2
10
STC12LE5612
2.2-3.6
12K
768
IAP
2
-
STC12LE5612AD
2.2-3.6
12K
768
IAP
2
10
STC12LE5616
2.2-3.6
16K
768
есть
2
-
STC12LE5616AD
2.2-3.6
16K
768
есть
2
10
STC12LE5620
2.2-3.6
20K
768
есть
2
-
STC12LE5620AD
2.2-3.6
20K
768
есть
2
10
STC12LE5624
2.2-3.6
24K
768
есть
2
-
STC12LE5624AD
2.2-3.6
24K
768
есть
2
10
STC12LE5628
2.2-3.6
28K
768
IAP
2
-
STC12LE5628AD
2.2-3.6
28K
768
IAP
2
10
STC12LE5630
2.2-3.6
30K
768
IAP
2
-
STC12LE5630AD
2.2-3.6
30K
768
IAP
2
10
Все перечисленные в таблице MCU также имеют улучшенный UART, память EEPROM (или IAP), сторожевой таймер (WDT), интерфейс SPI, функцию детектора внешнего пониженного напряжения с возможностью конфигурирования порога срабатывания, 2 канала 16-битных счетчиков PCA (или 4 канала 8-битной системы ШИМ), встроенную схему генерации сброса.
Примечание: микроконтроллеры, у которых в столбце EEPROM стоит IAP, позволяют программе пользователя модифицировать данные в памяти секции программы (AP). Это так называемая функция самопрограммирования.
Port0, 8-битный двунаправленный порт ввода/вывода (GPIO) со встроенными резисторами pull-up. Этот порт также мультиплексирован с аппаратной функцией вывода младшего байта шины адреса (A7..A0) и шины данных (D7..D0), когда осуществляется доступ к внешней памяти программ и данных.
P1.0 - P1.7
1..8
36..40, 1..3
40..44, 1..3
2..9
43..47, 2..4
Port1, 8-битный двунаправленный порт ввода/вывода (GPIO) со встроенными резисторами pull-up. Когда в Port1 записываются единички, мощная подтяжка pull-up включается драйверами CMOS только на 2 периода тактовой частоты, и затем подключается слабая подтяжка pull-up резисторами, подтягивая уровень вывода порта к лог. 1. P1.0-P1.7 используются как аналоговые входы коммутатора АЦП, и несут некоторые другие аппаратные функции.
P1.0/ADC0/CLKOUT2
1
36
40
2
43
P1.1/ADC1
2
37
41
3
44
P1.2/ADC2/ECI/RxD2
3
38
42
4
45
P1.3/ADC3/CCP0/TxD2
4
39
43
5
46
P1.4/ADC4/CCP1/SS
5
40
44
6
47
P1.5/ADC5/MOSI
6
1
1
7
2
P1.6/ADC6/MISO
7
2
2
8
3
P1.7/ADC7/SCLK
8
3
3
9
4
P2.0 - P2.7
21..28
16..23
18..25
24..31
19..23, 26..28
Port2, 8-битный двунаправленный порт ввода/вывода, со встроенными резисторами pull-up. Кроме GPIO, этот порт имеет мультиплексируемую аппаратную функцию вывода старшего байта адреса (A15..A8), когда осуществляется доступ к внешней памяти программ и данных.
P3.0 - P3.7
10..17
5..12
5, 7..13
11, 13..19
6, 8..14
Port3, 8-битный двунаправленный порт ввода/вывода, со встроенными резисторами weak pull-up. Когда в Port3 записываются единички, мощная подтяжка pull-up включается драйверами CMOS только на 2 периода тактовой частоты, и затем подключается слабая подтяжка pull-up резисторами, подтягивая уровень вывода порта к лог. 1. Port3 также поддерживает множество различных аппаратных функций.
P3.0/RXD
10
5
5
11
6
P3.1/TXD
11
6
7
13
8
P3.2/INT0
12
7
8
14
9
P3.3/INT1
13
8
9
15
10
P3.4/T0/INT/CLKOUT0
14
9
10
16
11
P3.5/T1/INT/CLKOUT1
15
10
11
17
12
P3.6/WR
16
11
12
18
13
P3.7/RD
17
12
13
19
14
P4.0 - P4.7
9, 29..31
4, 24..26
4, 6, 17, 26..29, 39
1, 10, 12, 23, 32..35
5, 7, 18, 29..32, 42
Port4, расширенный порт ввода/вывода, который работает наподобие Port1. Port4 доступен только для вариантов корпусов LQFP44, PLCC44, LQFP48. Сигнал ALE используется для доступа к внешней памяти (XDATA). EX_LVD вход детектора пониженного напряжения. RST это вход сброса, лог. 1 на котором в течение 2 машинных тактов приведет к сбросу MCU.
P4.0/SS
17
23
18
P4.1/ECI/MOSI
28
34
31
P4.2/CCP0/MISO
39
1
42
P4.3/CCP1/SCLK
6
12
7
P4.4/NA
29
24
26
32
29
P4.5/ALE
30
25
27
33
30
P4.6/EX_LVD/RST2
31
26
29
35
32
P4.7/RST
9
4
4
10
5
P5.0 - P5.3
1, 24, 25, 48
Port5: ножки порта GPIO, которые есть только для корпуса LQFP48.
XTAL1
19
14
15
21
16
Вывод для подключения внешнего кварцевого резонатора, вход встроенного генератора. Может принимать тактовый сигнал от внешнего генератора.
XTAL2
18
13
14
20
15
Вывод для подключения внешнего кварцевого резонатора, инвертирующий выход встроенного генератора. Этот вывод должен оставаться не подключенным, когда используется внешний генератор тактов.
VCC
40
35
38
44
41
Плюс напряжения питания.
GND
20
15
16
22
17
Минус напряжения питания, общий провод для всех сигналов, земля.
Типы корпусов:
Таблица выбора по общим параметрам:
Тип
VCC, V
FLASH, байт
SRAM, байт
EEPROM, байт
TIMER
UART
PCA
ADC, бит
Корп.
Серия STC12C5A60S2 (5V питание)
STC12C5A08S2
3.5-5.5
8K
1280
53K
4
2
2
10
40, 44, 48
STC12C5A16S2
3.5-5.5
16K
1280
45K
4
2
2
10
40, 44, 48
STC12C5A32S2
3.5-5.5
32K
1280
29K
4
2
2
10
40, 44, 48
STC12C5A40S2
3.5-5.5
40K
1280
21K
4
2
2
10
40, 44, 48
STC12C5A48S2
3.5-5.5
48K
1280
13K
4
2
2
10
40, 44, 48
STC12C5A52S2
3.5-5.5
52K
1280
9K
4
2
2
10
40, 44, 48
STC12C5A56S2
3.5-5.5
56K
1280
5K
4
2
2
10
40, 44, 48
STC12C5A60S2
3.5-5.5
60K
1280
1K
4
2
2
10
40, 44, 48
IAP12C5A62S2
3.5-5.5
62K
1280
IAP
4
2
2
10
40, 44, 48
Серия STC12LE5A60S2 (3.3V питание)
STC12LE5A08S2
2.1-3.6
8K
1280
53K
4
2
2
10
40, 44, 48
STC12LE5A16S2
2.1-3.6
16K
1280
45K
4
2
2
10
40, 44, 48
STC12LE5A32S2
2.1-3.6
32K
1280
29K
4
2
2
10
40, 44, 48
STC12LE5A40S2
2.1-3.6
40K
1280
21K
4
2
2
10
40, 44, 48
STC12LE5A48S2
2.1-3.6
48K
1280
13K
4
2
2
10
40, 44, 48
STC12LE5A52S2
2.1-3.6
52K
1280
9K
4
2
2
10
40, 44, 48
STC12LE5A56S2
2.1-3.6
56K
1280
5K
4
2
2
10
40, 44, 48
STC12LE5A60S2
2.1-3.6
60K
1280
1K
4
2
2
10
40, 44, 48
STC12LE5A62S2
2.1-3.6
62K
1280
IAP
4
2
2
10
40, 44, 48
Серия STC12C5A60AD (5V питание)
STC12C5A08AD
3.5-5.5
8K
1280
53K
4
1
2
10
40, 44, 48
STC12C5A16AD
3.5-5.5
16K
1280
45K
4
1
2
10
40, 44, 48
STC12C5A32AD
3.5-5.5
32K
1280
29K
4
1
2
10
40, 44, 48
STC12C5A40AD
3.5-5.5
40K
1280
21K
4
1
2
10
40, 44, 48
STC12C5A48AD
3.5-5.5
48K
1280
13K
4
1
2
10
40, 44, 48
STC12C5A52AD
3.5-5.5
52K
1280
9K
4
1
2
10
40, 44, 48
STC12C5A56AD
3.5-5.5
56K
1280
5K
4
1
2
10
40, 44, 48
STC12C5A60AD
3.5-5.5
60K
1280
1K
4
1
2
10
40, 44, 48
IAP12C5A62AD
3.5-5.5
62K
1280
IAP
4
1
2
10
40, 44, 48
Серия STC12LE5A60AD (3.3V питание)
STC12LE5A08AD
2.1-3.6
8K
1280
53K
4
1
2
10
40, 44, 48
STC12LE5A16AD
2.1-3.6
16K
1280
45K
4
1
2
10
40, 44, 48
STC12LE5A32AD
2.1-3.6
32K
1280
29K
4
1
2
10
40, 44, 48
STC12LE5A40AD
2.1-3.6
40K
1280
21K
4
1
2
10
40, 44, 48
STC12LE5A48AD
2.1-3.6
48K
1280
13K
4
1
2
10
40, 44, 48
STC12LE5A52AD
2.1-3.6
52K
1280
9K
4
1
2
10
40, 44, 48
STC12LE5A56AD
2.1-3.6
56K
1280
5K
4
1
2
10
40, 44, 48
STC12LE5A60AD
2.1-3.6
60K
1280
1K
4
1
2
10
40, 44, 48
IAP12LE5A62AD
2.1-3.6
62K
1280
IAP
4
1
2
10
40, 44, 48
Серия STC12C5A60PWM (5V питание)
STC12C5A08PWM
3.5-5.5
8K
1280
53K
4
2
2
10
40, 44, 48
STC12C5A16PWM
3.5-5.5
16K
1280
45K
4
2
2
10
40, 44, 48
STC12C5A32PWM
3.5-5.5
32K
1280
29K
4
2
2
10
40, 44, 48
STC12C5A40PWM
3.5-5.5
40K
1280
21K
4
2
2
10
40, 44, 48
STC12C5A48PWM
3.5-5.5
48K
1280
13K
4
2
2
10
40, 44, 48
STC12C5A52PWM
3.5-5.5
52K
1280
9K
4
2
2
10
40, 44, 48
STC12C5A56PWM
3.5-5.5
56K
1280
5K
4
2
2
10
40, 44, 48
STC12C5A60PWM
3.5-5.5
60K
1280
1K
4
2
2
10
40, 44, 48
IAP12C5A62PWM
3.5-5.5
62K
1280
IAP
4
2
2
10
40, 44, 48
Серия STC12LE5A60PWM (3.3V питание)
STC12LE5A08PWM
2.1-3.6
8K
1280
53K
4
2
2
10
40, 44, 48
STC12LE5A16PWM
2.1-3.6
16K
1280
45K
4
2
2
10
40, 44, 48
STC12LE5A32PWM
2.1-3.6
32K
1280
29K
4
2
2
10
40, 44, 48
STC12LE5A40PWM
2.1-3.6
40K
1280
21K
4
2
2
10
40, 44, 48
STC12LE5A48PWM
2.1-3.6
48K
1280
13K
4
2
2
10
40, 44, 48
STC12LE5A52PWM
2.1-3.6
52K
1280
9K
4
2
2
10
40, 44, 48
STC12LE5A56PWM
2.1-3.6
56K
1280
5K
4
2
2
10
40, 44, 48
STC12LE5A60PWM
2.1-3.6
60K
1280
1K
4
2
2
10
40, 44, 48
IAP12LE5A62PWM
2.1-3.6
62K
1280
IAP
4
2
2
10
40, 44, 48
Все перечисленные в таблице MCU также имеют сторожевой таймер (WDT), интерфейс SPI, функцию детектора внешнего пониженного напряжения с возможностью конфигурирования порога срабатывания. В 40-выводном варианте корпуса доступно 36 портов GPIO, 44-выводном 40 портов GPIO, 48-выводном 44 порта GPIO (столбец "Корп."). 7 источников прерывания могут вывести MCU из режима экономии питания/выключено (power down mode).
P4SW. Регистр P4SW (SFR-адрес BBh, значение после сброса x000xxxxb) используется для настройки дополнительных функций NA/P4.4, ALE/P4.5 и EX_LVD/P4.6.
Бит
7
6
5
4
3
2
1
0
Имя
-
LVD
ALE
NA
-
-
-
-
NA/P4.4. Настройка режима ножки P4.4.
0: значение по умолчанию (после сброса). NA/P4.4 имеет верхний слабый подтягивающий резистор (weak pull-up) и не несет никакой функции. 1: NA/P4.4 работает как порт GPIO (P4.4).
ALE/P4.5. Настройка режима ножки P4.5.
0: значение по умолчанию (после сброса). ALE/P4.5 работает как сигнал ALE, использующийся для доступа к внешней памяти. 1: ALE/P4.4 используется как порт GPIO (P4.5).
LVD/P4.6. Настройка режима ножки P4.6.
0: значение по умолчанию (после сброса). EX_LVD/P4.6 работает как вход детектора снижения уровня внешнего напряжения (External Low-Voltage Detection). 1: EX_LVD/P4.6 работает как порт GPIO (P4.6).
С помощью утилиты STC-ISP writter/programmer пользователь может выбрать, как будет работать вывод RST/P4.7: либо как сигнал сброса, либо как GPIO P4.7:
AUXR1. Регистр AUXR1 (SFR-адрес A2h, значение после сброса x00000x0b) используется для выбора альтернативных функций PCA/PWM/SPI/UART2 портов P1 или P4.
Бит
7
6
5
4
3
2
1
0
Имя
-
PCA_P4
SPI_P4
S2_P4
GF2
ADRJ
-
DPS
PCA _P4. Выбирает альтернативную функцию PCA.
0: значение по умолчанию. На ножках P1[4:2] работает функция PCA. 1: функция PCA выводов P1[4:2] переводится на выводы P4[3:1]. ECI переводится с P1.2 на P4.1, PCA0/PWM0 переводится с P1.3 на P4.2, PCA1/PWM1 переводится с P1.4 на P4.3.
SPI_P4. Выбирает альтернативную функцию SPI.
0: значение по умолчанию. Функция SPI работает на ножках P1[7:4]. 1: функция SPI переводится с ножек P1[7:4] на ножки P4[3:0]. SCLK переводится с P1.7 на P4.3, MOSI переводится с P1.6 на P4.2, MISO переводится с P1.5 на P4.1, SS переводится с P1.4 на P4.0.
S2_P4. Выбирает альтернативную функцию UART2.
0: значение по умолчанию. Функция UART2(S2) работает на выводах P1[3:2]. 1: функция UART2(S2) с выводов P1[3:2] переводится на выводы P4[3:2]. TxD2 переводится с P1.3 на P4.3, RxD2 переводится с P1.2 на P4.2.
GF2: General Flag, флаг общего назначения. Может использоваться произвольным образом в программном обеспечении пользователя.
ADRJ. Выбор представления результата преобразования АЦП.
0: 10-битный результат АЦП представлен как {ADC_RES[7:0], ADC_RESL[1:0]}. 1: 10-битный результат АЦП выровнен вправо и представлен как {ADC_RES[1:0], ADC_RESL[7:0]}.
DPS. Выбор указателя данных.
0: значение по умолчанию. DPTR0 выбирается как указатель данных. 1: произойдет переключение на использование второго DPTR.
[Минимальная схема подключения STC12C5A60S2]
Схема сброса. Когда тактовая частота ниже 12 МГц, рекомендуется не использовать C1 и R1, заменив их одним резистором 1 кОм, подключенным к шине земли (GND). Когда тактовые частоты выше 12 МГц, то рекомендуется использовать сброс RST2 от альтернативной функции порта (для STC12C5A60S2 это вывод RST2/EX_LVD/P4.6, для STC12C5201AD это вывод RST2/EX_LVD/P1.2). Ниже для примера показана минимальная схема, где для сброса используетcя RST2/P4.6.
Тактирование. Если используется внешняя тактовая частота выше 33 МГц, то рекомендуется использовать активные кварцевые генераторы. Если для тактирования используется внутренний R/C генератор (в условиях комнатной температуры тактовая частота для 5V MCU будет 11..17 МГц, для 3V MCU 8..12 МГц), то выводы XTAL1 и XTAL2 должны оставаться не подключенными. Если внешняя тактовая частота превышает 27 МГц, рекомендуется использовать кварц, у которого номинальная частота соответствует паспортной, или напрямую использовать внешние активные кварцевые генераторы, при этом тактовая частота от них должна подаваться на вход XTAL1, и вывод XTAL2 должен оставаться не подключенным. Не рекомендуется использовать кристаллы на третьей гармонике, иначе из-за несоответствия параметров кварц может запуститься на своей основной частоте, и реальная тактовая частота получится 1/3 от номинальной.
Вывод ALE традиционных MCU 8051 работает всегда, независимо от доступа к внешней шине, и этот вывод часто использоваться как вывод тактовой частоты, равной 1/12 от тактовой частоты MCU. Но иногда этот сигнал является источником нежелательных помех в системе. По этой причине в новых STC MCU добавлена функция разрешения/запрета выхода ALE, что снижает электромагнитные помехи, генерируемые MCU, и повышается стабильность и надежность системы. Если нужна тактовая частота для тактирования внешних периферийных устройств, то её можно получить с выводов CLKOUT0/P3.4, CLKOUT1/P3.5, CLKOUT2/P1.0 или даже с выхода XTAL2 (в последнем случае рекомендуется брать сигнал с вывода XTAL2 через последовательно подключенный резистор 200 ом).
[Схема подключения STC12C5A60S2 для ISP]
ISP расшифровывается In-System Programming, что означает программирование MCU прямо в собранной системе.
Пользователи в своих целевых системах часто используют P3.0/P3.1 как UART/RS-232, подключая его к порту RS-232 (COMx) через конвертер/преобразователь уровней (для этого есть специальные микросхемы). Это подключение можно использовать для обновления программного обеспечения. Это удобно, потому что для обновления программы устройства не требуется извлекать микроконтроллер. В общем случае на коннектор перепрограммирования ISP выводится 4 сигнала Gnd/P3.1/P3.0/Vcc, которые пользователь может напрямую использовать для перепрограммирования MCU. В таком случае аппаратным программатором может выступать простой преобразователь USB-TTL-UART.
В некоторых случаях рекомендуется использовать 6 выводов Gnd/P3.1/P3.0/Vcc/P1.1/P1.0, где дополнительные выводы P1.0/P1.1 используются как ISP ban, т. е. дополнительный сигнал срабатывания условия загрузки. Это полезно, если в момент включения на порт UART могут приходить внешние данные, что может быть ложно воспринято загрузчиком (). Если Вы можете вывести 7 сигналов Gnd/P3.1/P3.0/Vcc/P1.1/P1.0/Reset, то это самый универсальный вариант, позволяющий использовать "offline download board (no computer)" (внешний программатор, работающий без компьютера).
Теория и применение программирования ISP описаны в разделе "STC12C5201AD Series MCU Development / Programming Tools Help". Также компания STC предлагает бесплатную стандартную утилиту STC-ISP.exe, которая работает с загрузчиками UART всех STC MCU. Процесс программирования занимает несколько секунд, и отпадает нужда в покупке дорогостоящих программаторов сторонних производителей. Утилиту программирования STC-ISP.exe можно загрузить с сайта компании STCmicro [1], или см. архив по ссылке [2].
[Глобальный уникальный идентификатор]
Серия 12C5Axx предоставляет в каждом MCU уникальный числовой идентификатор (ID). Чтобы его прочитать в программе, пользователь может использовать инструкцию MOV @Ri для доступа к ячейкам памяти RAM по адресам F1h..F7h. Уникальный ID может использоваться для создания ключей шифрования, процедур детектирования незаконной модификации программного обеспечения, начального запуска генератора псевдослучайной последовательности и т. п. Пример чтения ID можно посмотреть в даташите STC12C5A60S2-en.pdf [2].
[Тактирование, управление питанием и сброс]
Выбор источника тактирования. Микроконтроллер STC12C5A60S2 имеет систему тактирования, которая может работать совместимо с традиционным 8051 MCU. Утилита STC-ISP.exe позволяет выбрать либо внутренний RC-генератор, либо внешний кварцевый резонатор (последний вариант также позволяет использовать внешний генератор вместо подключения кварцевого резонатора). Встроенный RC-генератор может использоваться для замены внешнего кварцевого резонатора или генератора в тех случаях, когда не требуется точная тактовая частота. Чтобы разрешить работу внутреннего генератора, нужно разрешить опцию "On-Chip R/C Clock" с помощью утилиты STC-ISP Writer/Programmer. По умолчанию, когда чип STC12C5A60S2 приходит с завода, выбран вариант "External crystal/clock" (предусматривает использование внешнего кварца или генератора).
Делитель для системной тактовой частоты. Регистр делителя (CLK_DIV) предназначен для замедления (slow down) работы STC12C5A60S2, чтобы динамически управлять энергопотреблением. Пользователь может замедлить 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.
Примечание: SFR-адрес регистра CLK_DIV для разных серий STC12Cxx MCU может отличаться. Например, регистр CLK_DIV микроконтроллера STC12C2052AD имеет SFR-адрес C7h. Подробнее см. даташит на соответствующий микроконтроллер [2].
Как узнать частоту внутреннего RC-генератора. Если MCU тактируется от кварца, то рабочую частоту MCU узнать довольно просто: достаточно прочитать маркировку на кварце или осциллографом проанализировать частоту на выводе XTAL2. Но как быть, если MCU работает от внутреннего генератора? Напомню, что использование внутреннего RC-генератора позволяет избавиться от подключения внешнего кварца, выводы XTAL1 и XTAL2 остаются не подключенными. К сожалению, частота RC-генератора не будет точной, поэтому тактирование от него не рекомендуется при использовании интерфейсов последовательного обмена данными (UART, SPI),
Есть несколько способов определить тактовую частоту (основные принципы указаны в статье [4]), но для STC 1T MCU 12C5Axx есть дополнительная возможность. Пользователь может использовать инструкцию MOV @Ri, чтобы прочитать RAM по адресам FC~FF и получить значение частоты внутреннего генератора, установленное на заводе. Также можно прочитать RAM по адресам F8..FB, чтобы получить частоту внутреннего генератора, используемую в последний раз для загрузки программ, с использованием внутреннего генератора, после выключения питания. Пример кода на языке C можно посмотреть в даташите STC12C5A60S2-en.pdf [2].
Примечание: адреса, где содержится информация о частоте для разных серий STC12Cxx MCU может отличаться, подробнее см. даташит на соответствующий микроконтроллер [2].
Программируемый вывод частоты. MCU серии STC12C5A60S2 имеет 3 программируемых канала, на которые можно выводить тактовые частоты. Это программируемый выход Timer0 CLKOUT0 (P3.4/T0), программируемый выход Timer1 CLKOUT1 (P3.5/T1) и программируемый выход тактов выделенного таймера для установки скорости UART (Baud-Rate Timer) CLKOUT2 (P1.0). Ниже в таблице показаны SFR-регистры, используемые для программирования выходов тактовой частоты.
Мнемоника регистра
Описание
Адрес SFR
Номера и мнемоника бит
Значение после сброса (POR или другого типа сброса)
7
6
5
4
3
2
1
0
AUXR
Auxiliary register
8Eh
T0x12
T1x12
UART_M0x6
BRTR
S2SMOD
BRTx12
EXTRAM
S1BRS
00000000b
WAKE_CLKO
CLK_Output Power down Wake-up control register
8Fh
PCAWAKEUP
RXD_PIN_IE
T1_PIN_IE
T0_PIN_IE
LVD_WAKE
BRTCLKO
T1CLKO
T0CLKO
00000000b
BRT
Dedicated Baud-Rate Timer register
9Ch
00000000b
AUXR: Auxiliary register (разряды этого регистра не находятся в адресном пространстве бит)
Бит
7
6
5
4
3
2
1
0
Имя
T0x12
T1x12
UART_M0x6
BRTR
S2SMOD
BRTx12
EXTRAM
S1BRS
T0x12. Этот бит задает источник тактирования для Timer0.
0: Timer0 тактируется от частоты SYSclk/12. Это режим совместимости с традиционным 80C51 MCU. 1: Timer0 тактируется от частоты SYSclk/1. Этот режим позволяет быстрее переключать выход T0, чем это может делать традиционный 80C51 MCU.
T1x12. Этот бит задает источник тактирования для Timer1.
0: Timer1 тактируется от частоты SYSclk/12. Это режим совместимости с традиционным 80C51 MCU. 1: Timer1 тактируется от частоты SYSclk/1. Этот режим позволяет быстрее переключать выход T1, чем это может делать традиционный 80C51 MCU.
UART_M0x6. Бит выбирает скорость работы UART1 в режиме Mode0.
0: Скорость UART в режиме 0 определяется SYSclk/12. 1: Скорость UART в режиме 0 определяется SYSclk/2.
0: значение по умолчанию, нормальная скорость работы UART2 (S2). 1: удвоенная скорость UART2 (S2).
BRTx12. Бит управления для Dedicated Baud-Rate Timer.
0: генератор baud-rate инкрементируется каждые 12 периодов системной тактовой частоты. 1: генератор baud-rate инкрементируется каждый период системной тактовой частоты.
EXTRAM. Бит управления доступом к внутренней / внешней оперативной памяти (RAM).
0: разрешен доступ к дополнительному встроенному ОЗУ (auxiliary RAM), и она размещена по адресам 0x0000..0x03FF. Для адресов, которые больше 0x03FF, автоматически происходит обращение к внешнему расширенному ОЗУ (expanded RAM). 1: доступ к auxiliary RAM всегда запрещен.
S1BRS. Бит выбора генератора скорости для UART1.
0: значение по умолчанию. Генератором baud-rate для UART1 служит Timer1. 1: Timer1 заменяется выделенным независимым генератором baud-rate, и он будет определять скорость работы UART. Полезный режим, позволяющий освободить Timer1 для других функций.
WAKE_CLKO, регистр управления выключением вывода тактов и пробуждением (разряды этого регистра не находятся в адресном пространстве бит)
Бит
7
6
5
4
3
2
1
0
Имя
PCAWAKEUP
RXD_PIN_IE
T1_PIN_IE
T0_PIN_IE
LVD_WAKE
BRTCLKO
T1CLKO
T0CLKO
PCAWAKEUP. Когда этот бит установлен, и соответствующие регистры управления прерываниями PCA корректно сконфигурированы, то разрешена PCA-функция вывода CEXn для пробуждения MCU и вывода его из состояния power-down.
RXD_PIN_IE. Когда этот бит установлен, и соответствующие регистры управления прерываниями UART корректно сконфигурированы, то выводу RXD (P3.0) разрешено выводить MCU из состояния power-down.
T1_PIN_IE. Когда этот бит установлен, и соответствующие регистры управления прерыванием Timer1 корректно сконфигурированы, то выводу T1 (P3.5) разрешено выводить MCU из состояния power-down.
T0_PIN_IE. Когда этот бит установлен, и соответствующие регистры управления прерыванием Timer0 корректно сконфигурированы, то выводу T0 (P3.4) разрешено выводить MCU из состояния power-down.
LVD_WAKE. Когда этот бит установлен, и соответствующие регистры управления прерыванием LVD корректно сконфигурированы, то выводу CMPIN разрешено выводить MCU из состояния power-down.
BRTCKLO. Когда этот бит установлен, для P1.0 разрешено работать как выход тактовой частоты, генерируемой Baud-Rate Timer (BRT). Частота равна частоте переполнения BRG, поделенной на 2.
T1CKLO. Когда этот бит установлен, для P3.5 разрешено работать как выход тактовой частоты, генерируемой Timer1. Частота равна частоте переполнения таймера, поделенной на 2.
T0CKLO. Когда этот бит установлен, для P3.4 разрешено работать как выход тактовой частоты, генерируемой Timer0. Частота равна частоте переполнения таймера, поделенной на 2.
BRT, регистр настройки выделенного таймера для генератора скорости UART, Baud-Rate Timer (разряды этого регистра не находятся в адресном пространстве бит). Этот регистр используется как значение для перезагрузки таймера, что определяет скорость работы (baud-rate) UART.
Подробнее про программирование вывода тактовых частот см. даташит STC12C5A60S2-en.pdf [2].
Примечание: генерация частот и содержание соответствующих SFR-регистров для разных серий STC12Cxx MCU может отличаться, подробнее см. даташит на соответствующий микроконтроллер [2].
Режимы управления питанием. Они такие же, как у MCU серии STC15Fxx. Подробнее см. статью STC15Fxx [5] и даташит STC12C5A60S2-en.pdf [2].
Источники сброса. Для STC12C5A60S2 имеется 5 источников, которые могут генерировать внутренний сброс. Это вывод RST, детектор понижения внешнего напряжения (функция external low-voltage detection вывода P4.6/RST2, что можно использовать как второй вход сброса RST2), программный сброс (software reset), внутренняя схема сброса при включении питания (power-on-reset, POR, который генерируется с помощью встроенной в кристалл схемы MAX810, что дает задержку 200 мс) и сброс от сторожевого таймера (Watch-Dog-Timer).
Вывод Reset. Ножка корпуса RST выполняет сброс MCU, если на этот вывод пришел импульс лог. 1 от внешнего источника. По умолчанию вывод P4.7/RST несет функцию сброса (вход, снабженный триггером Шмитта). Если сигнал на входе P4.7/RST перешел с лог. 1 на лог. 0, то MCU перейдет из состояния сброса и начнет выполнять код с адреса 0000h.
Если пользователю нужно сконфигурировать этот ввод как порт GPIO (должно использоваться внешнее тактирование), то для этого можно разрешить соответствующую опцию утилитой STC-ISP Writter/Programmer, как показано на скриншоте ниже.
Примечание: у некоторых моделей STC12Cxx MCU отсутствует порт P4, и ножка сброса RST может быть выделенная, подробнее см. даташит на соответствующий микроконтроллер [2].
External Low Voltage Detection Reset (вывод сброса RST2). У серии MCU STC12C5A60S2 добавлен второй, надежный сброс от вывода RST2/P4.6 (EX_LVD). Эта функция должна быть сконфигурирована утилитой STC-ISP Writter/Programmer, как показано на скриншоте ниже. Порог срабатывания по напряжению устанавливается с помощью 2 резисторов. Когда MCU тактируется от частоты выше 12 МГц, рекомендуется использовать сброс от RST2.
Пример схемы сброса EX_LVD показан ниже. Если напряжение питания 5V, то могут быть выбраны номиналы R1 и R2, показанные на схеме (пороговое напряжение сброса равно 1.33V).
Ниже приведен еще один пример, где сигнал сброса подается от входа стабилизатора постоянного напряжения. В этом случае номинал R2 должен быть подобран так, чтобы при заданном падении напряжения, которое должно вызывать сброс, на выводе RST2/P4.6 напряжение было 1.33V.
Использование EX_LVD для генерации прерывания. Вывод детектора пониженного напряжения порта P4.6 MCU серии STC12C5A60S2 может генерировать прерывание, когда напряжение питания/VCC падает ниже порога LVD. Момент понижения напряжения программа может определять либо с помощью прерывания, либо с помощью периодического опроса (polling). Пороговое напряжение Low Voltage Detection (LVD) равно 1.33V (±5%) и 1.31V (±3%) для серий STC12C5A60S2 и STC12LE5A60S2 соответственно.
Когда VCC упадет ниже порога LVD, аппаратно установится флаг низкого напряжения (Low voltage Flag, бит LVD, PCON.5). Обратите внимание, что при включении питания также установится этот флаг, и пользователь должен его сбросить программно, чтобы дальше можно было использовать функцию детектирования понижения напряжения. Также флаг LVD может генерировать прерывание, если установлен в лог. 1 бит ELVD (IE.6). Функцию прерывания LVD можно использовать для выхода из режима остановки / power-down mode и продолжения нормальной работы. Ниже показан типичный пример схемы, где вывод P4.6/RST2/EX_LVD используется для функции детектирования пониженного напряжения и прерывания.
Если питание стабилизатора 7805 подается от выпрямителя, то напряжение на входе 7805 может быть приблизительно 11V. Минимально допустимое входное напряжение для 7805 будет 8.5V, и соответственно этому напряжению следует рассчитать делитель R1 и R2, чтобы напряжение на выходе делителя получалось 1.33V.
Если вывод P4.6/RST2/EX_LVD используется для функции детектирования понижения напряжения, то для включения этой функции также используется утилита STC-ISP Writter/Programmer, как показано на рисунке ниже.
В таблице показаны некоторые SFR, которые связаны с функцией детектирования понижения напряжения STC12C5A60S2.
Мнемоника регистра
Описание
Адрес SFR
Номера и мнемоника бит
Значение после сброса (POR или другого типа сброса)
7
6
5
4
3
2
1
0
PCON
Power Control
87h
SMOD
SMOD0
LVDF
POF
GF1
GF2
PD
IDL
00000000b
WAKE_CLKO
CLK_Output Power down Wake-up control register
8Fh
PCAWAKEUP
RXD_PIN_IE
T1_PIN_IE
T0_PIN_IE
LVD_WAKE
BRTCLKO
T1CLKO
T0CLKO
00000000b
IE
Interrupt Enable
A8h
EA
ELVD
EADC
ES
ET1
EX1
ET0
EX0
00000000b
IP
Interrupt Priority Low
B8h
PPCA
PLVD
PADC
PS
PT1
PX1
PT0
PX0
00000000b
IPH
Interrupt Priority High
B7h
PPCAH
PLVDH
PADCH
PSH
PT1H
PX1H
PT0H
PX0H
00000000b
PCON (регистр управления питанием, SFR-адрес 87h)
Бит
7
6
5
4
3
2
1
0
Имя
SMOD
SMOD0
LVDF
POF
GF1
GF0
PD
IDL
LVDF. Флаг понижения напряжения. Установится аппаратно, когда напряжение VCC снизится ниже порога LVD. Этот флаг должен быть очищен программно (также этот флаг аппаратно установится и при включении питания, и также должен быть в этом случае сброшен программно, чтобы можно было дальше использовать детектирование понижения напряжения).
IE (регистр разрешения прерываний, SFR-адрес A8h)
Бит
7
6
5
4
3
2
1
0
Имя
EA
ELVD
EADC
ES
ET1
EX1
ET0
EX0
Установка бита в этом регистре разрешает прерывание, сброс запрещает.
EA. Этот бит, если он равен 0, запретит все прерывания. Если EA=1, то каждый источник прерывания индивидуально разрешается отдельным битом.
ELVD. Бит разрешения прерывания по событию Low volatge detection.
PLVDH, PLVD. Это биты, которые определяют уровень приоритета прерывания Low voltage detection.
PLVDH=0 и PLVD=0: самый слабый приоритет (priority 0). PLVDH=0 и PLVD=1: низкий приоритет (priority 1). PLVDH=1 и PLVD=0: высокий приоритет (priority 2). PLVDH=1 и PLVD=1: самый высокий приоритет (priority 3).
WAKE_CLKO (регистр управления генерацией тактов и пробуждением, SFR-адрес 8Fh)
Бит
7
6
5
4
3
2
1
0
Имя
PCAWAKEUP
RXD_PIN_IE
T1_PIN_IE
T0_PIN_IE
LVD_WAKE
BRTCLKO
T1CLKO
T0CLKO
LVD_WAKE. Когда этот бит установлен, и регистры управления прерыванием LVD корректно сконфигурированы, то выводу CMPIN разрешено выводить MCU из состояния power-down.
BRTCKLO. Когда этот бит установлен, то для вывода P1.0 разрешена работа как выхода тактов, генерируемых таймером скорости (Baud-Rate Timer, BRT). Частота тактов равна частоте переполнения BRG, поделенной на 2.
Примеры использования функции LVD см. в даташите STC12C5A60S2-en.pdf [2].
Примечание: у некоторых моделей STC12Cxx MCU могут не иметь специальный вывод детектора внешнего напряжения, подробнее см. даташит на соответствующий микроконтроллер [2].
Программный сброс (Software RESET). Запись лог. 1 в бит SWRST регистра IAP_CONTR приведет к генерации внутреннего сброса MCU.
IAP_CONTR: регистр управления ISP/IAP (SFR-адрес C7h)
Бит
7
6
5
4
3
2
1
0
Имя
IAPEN
SWBS
SWRST
CMD_FAIL
-
WT2
WT1
WT0
IAPEN. Бит разрешает работу ISP/IAP.
0: глобальный запрет всех функций ISP/IAP (program/erase/read). 1: разрешение функций программирования, очистки и чтения ISP/IAP.
SWBS. Бит управления загрузкой (software boot selection).
0: после сброса произойдет запуск кода из основной памяти (секция AP, код программы пользователя). 1: после сброса произойдет запуск кода из памяти ISP.
SWRST. Управление триггером программного сброса.
0: нет операции. 1: генерируется software system reset. Этот бит автоматически очистится после сброса аппаратурой MCU.
CMD_FAIL. Индикатор сбоя операции ISP/IAP.
0: последняя команда ISP/IAP завершилась успешно. 1: последняя команда ISP/IAP потерпела неудачу. Это могло произойти из-за того, что был запрещен доступ к памяти flash.
Система выполнит сброс и запустит код AP по адресу 0000H (выполнится программа пользователя), если будет выполнена команда ассемблера:
MOVIAP_CONTR, #00100000B
Система выполнит сброс и запустит код ISP по адресу 0000H (выполнится код монитора ISP), если будет выполнена команда ассемблера:
MOVIAP_CONTR, #01100000B
Power-On Reset (POR). Когда VCC падает ниже порога схемы POR, все логические схемы MCU будут сброшены. Когда VCC вернется снова к нормальному уровню, состояние внутреннего сброса будет отменено автоматически после истечения задержки в 32768 тактов. Номинальный порог детектирования POR равен около 1.9V для 3V версии MCU и 3.3V для 5V версии MCU. Аппаратная установка флага Power-On (POF/PCON.4) показывает, что напряжение VCC было ниже порога POR. Таким образом, этот бит помогает проверить, был ли выполнен сброс MCU от включения питания, либо от внешнего аппаратного сброса (выводом RST), либо от программного сброса, либо от сброса сторожевым таймером. Бит POF должен быть очищен программой пользователя.
Сброс MAX810. В STC12C5A60S2 интегрирован узел задержки POR на основе MAX810. Это специальная схема, которая конфигурируется утилитой STC-ISP Writter/Programmer (см. скриншот ниже). MAX810 просто добавляет дополнительную задержку 200 мс после сброса при включении питания. Таким образом, может быть определен еще один тип сброса.
Watch-Dog-Timer. Сторожевой таймер (Watch-Dog-Timer, WDT) STC12C5A60S2 состоит из 8-битного прескалера (делителя частоты тактов) и 15-битного счетчика. WDT можно разрешить однократно путем установки EN_WDT (WDT_CONTR.5). Очистка EN_WDT может остановить счет WDT. Когда WDT разрешен, программа должна всегда его сбрасывать (установкой бита CLR_WDT) с определенными интервалами не реже, чем счетчик WDT переполнится. Если программа не успеет сбросить WDT до переполнения счетчика (это может произойти из-за неожиданного нарушения работы программы, например из-за зависания), то WDT автоматически выполнит внутренний сброс MCU, как только счетчик сторожевого таймера переполнится. Таким образом, система перезагрузится и начнет работу заново, что в целом повышает надежность функционирования. Это стандартное, общепринятое поведение сторожевого таймера, как это реализовано в большинстве микроконтроллеров.
WDT настраивается SFR-регистрами, а также с помощью утилиты STC-ISP Writter/Programmer. Подробнее про это и примеры кода настройки WDT см. даташит STC12C5A60S2-en.pdf [2].
"Теплая" загрузка и загрузка по "холодному" сбросу. Теплой загрузкой (Warm Boot) называют загрузку заново либо программы пользователя, либо монитора ISP, которая была вызвана по команде программного обеспечения. Холодной загрузкой (Cold Boot) называют перезагрузку, вызванной включением или сбоем питания (POR). Ниже в таблице приведены действия MCU для разных типов сброса.
Тип сброса
Источник сброса
Результат
Warm boot (теплая загрузка)
Сторожевой таймер (Watch Dog Timer, WDT)
Сброс приведет к передаче управления в AP-область памяти по адресу 0000h, и начнет выполняться приложение пользователя
Вывод сброса (RST)
20h записано в регистр IAP_CONTR
60h записано в регистр IAP_CONTR
После сброса произойдет переход по адресу 0000h секции ISP, запустится программа монитора ISP (загрузчик). Если в этот момент (по истечении таймаута) не будет принята корректная команда ISP, то система выполнит программный сброс, и запустится приложение пользователя.
Cold boot (холодная загрузка)
Включение питания (Power-On Reset, POR)
[Организация памяти]
Как и все MCU архитектуры MCS-51/8051, MCU серии STC12C5A60S2 имеет раздельное адресное пространство для памяти программ (Program Memory) и для памяти данных (Data Memory). Логическое разделение этих областей позволяет организовать доступ к обоим областям памяти по 8-битным адресам, которые можно быстро сохранять и которыми может эффективно манипулировать CPU.
Program memory (иногда её называют постоянной памятью, ROM) в обычном режиме работы кода может быть только прочитана, но не записана. MCU серии STC12C5A60S2 вся память доступна только на кристалле чипа, без возможности доступа к внешней памяти (как в сериях STC89xx, STC90xx и традиционной архитектуре 8051), потому что в корпусе MCU для этого отсутствуют сигналы External Access Enable (/EA) и Program Store Enable (/PSEN).
Оперативная память данных (ОЗУ) занимает отдельное от памяти программ адресное пространство. В серии STC12C5A60S2 имеется 256 байт внутренней памяти оперативной памяти, ОЗУ (scratch-pad RAM, SRAM), а также 1024 байта внутреннего расширенного ОЗУ (expanded RAM, XRAM). Есть возможность доступа к 64K внешней оперативной памяти.
Program memory. Это память, в которой хранятся выполняемые ядром CPU инструкции (в архитектуре MCS51 также в этой памяти могут храниться табличные данные и таблицы переходов). Встроенная память серии STC12Cxx организована по технологии flash и может быть размером 8-62K байт, в зависимости от модели микроконтроллера. Дизайн позволяет пользователям конфигурировать память как 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 STC12Cxx имеет специальную внутреннюю конфигурационную информацию (что-то похожее на фьюзы 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) для пропуска следующих на ней ячеек других векторов прерываний, если эти прерывания используются.
Ниже показано для примера распределение памяти микроконтроллеров серии STC12C5A16S2.
Память программ STC12C5A16S2
Тип
Program Memory
STC12C/LE5A08S2/AD
0000h~1FFFh (8K)
STC12C/LE5A16S2/AD
0000h~3FFFh (16K)
STC12C/LE5A20S2/AD
0000h~4FFFh (20K)
STC12C/LE5A32S2/AD
0000h~7FFFh (32K)
STC12C/LE5A40S2/AD
0000h~9FFFh (40K)
STC12C/LE5A48S2/AD
0000h~BFFFh (48K)
STC12C/LE5A52S2/AD
0000h~0FFFh (52K)
STC12C/LE5A56S2/AD
0000h~DFFFh (56K)
STC12C/LE5A60S2/AD
0000h~EFFFh (60K)
IAP12C/LE5A62S2/AD
0000h~F7FFh (62K)
Память данных. Как уже упоминалось, память данных состоит из Scratch-Pad RAM (находится на кристалле MCU), внутренней expanded RAM (также находится на кристалле MCU) и внешней expanded RAM (может подключаться к кристаллу STC12C5A16S2 снаружи).
Scratch-Pad RAM. Точно так же, как и у стандартного микроконтроллера 8051, на кристалле STC12C5A60S2 имеется 256 байт SRAM (память данных) плюс 128 байт SFR-регистров. К младшим 128 байтам SRAM можно обращаться с помощью как прямой, так и косвенной адресации. Старшие 128 байт SRAM и 128 байт SFR лежат в одном адресном пространстве. К старшим 128 байтам SRAM можно получить доступ только с помощью косвенной адресации. 128 байт SFR доступны только прямой адресацией.
Младшие 32 байта памяти данных сгруппированы в 4 банка по 8 регистров в каждом. Инструкции программы могут обращаться к байтам банка как к регистрам R0..R7 (регистровая адресация). Биты RS0 и RS1 регистра PSW позволяют выбрать используемый в настоящий момент банк регистров. Инструкции, использующие регистровую адресацию, могут получить доступ только к текущему установленному банку. Это позволяет более эффективно использовать пространство кода, поскольку инструкции с регистровой адресацией короче, чем инструкции с прямой адресацией.
Следующие 16 байт (20..2Fh), находящиеся за банками, формируют пространство памяти, которую можно адресовать как отдельные биты (bit-addressable memory space). Система команд 80C51 включает в себя широкий набор инструкций, ориентированных на манипуляцию над одиночными битами, и 128 бит в этой памяти могут напрямую адресованы этими инструкциями (битовое адресное пространство занимает область 00..7Fh).
Все байты, адрес которых меньше 128, доступны как прямой, так и косвенной адресацией, в то время к остальным 128 байтам доступ осуществляется по-разному.
Если используется прямая адресация для старших 128 байт, то адресуются SFR: защелки портов, регистры таймеров, регистры управления периферийными устройствами и т. п. Это так называемые регистры специального назначения (Special Function Register, SFR), к ним можно получить доступ только прямой адресацией. 16 адресов SFR могут быть адресованы и как байты, и как отдельные биты. Адресуемые битами SFR имеют адреса, которые оканчиваются на 0h или на 8h.
К старшим 128 байтам SRAM можно получить доступ только косвенной адресацией.
Внутреннее встроенное ОЗУ (Scratch-Pad RAM)
Распределение младшей половины памяти RAM (127 ячеек ОЗУ по адресам 00h..7Fh)
SP: Stack Pointer (указатель стека). Регистр указания стека 8-битный. Он получает инкремент перед тем, как данные будут сохранены в стеке при выполнении инструкций PUSH и CALL (т. е. стек растет в сторону старших адресов). Стек может быть размещен в любом месте RAM. После сброса SP инициализируется значением 07h, так что стек начинается с ячейки 08h, которая соответствует первому регистру (R0) банка 1. Таким образом, если используется больше одного банка регистров, SP должен быть инициализирован на адрес области памяти, выделенной под стек, которая не используется под какие-либо данные. Максимальная, теоретическая глубина стека может быть 256 байт, но такого конечно никогда не бывает.
Auxiliary RAM. У STC12C5A60S2 есть 1024 байта дополнительного ОЗУ. К нему можно получить доступ специальными инструкциями, предназначенными для обращения к внешней памяти (XDATA): MOVX @Ri или MOVX @DPTR. Управляющий бит EXTRAM, который находится в регистре AUXR (разряд AUXR.1) запрещает/разрешает доступ к auxiliary RAM. Когда этот бит установлен, доступ к auxiliary RAM запрещен. Когда этот бит сброшен (EXTRAM=0), то это auxiliary RAM является целью при доступе по адресам 0x0000..0x03FF (адрес помещается в Ri или DPTR при использовании инструкций MOVX @Ri или MOVX @DPTR). Если EXTRAM=0 и целевой адрес превышает 0x03FF, то автоматически осуществляется доступ к внешнему ОЗУ (external RAM). Когда EXTRAM=0, содержимое DPH игнорируется, когда выполняется инструкция MOVX @Ri.
Для компилятора KEIL-C51, чтобы разместить переменные в Auxiliary RAM, должны использоваться определения переменных с ключевыми словами pdata или xdata. После того, как программа скомпилирована, к переменным, декларированным с использованием pdata и xdata, будет производиться доступ инструкциями MOVX @Ri и MOVX @DPTR соответственно. Таким образом, язык C получает возможность корректно работать с аппаратурой STC12C5A60S2. Примеры кода, работающего с памятью, см. в даташите STC12C5A60S2-en.pdf [2].
Внутреннее расширенное ОЗУ (internal expanded RAM, или Auxiliary RAM, адресное пространство XDATA)
Внешняя расширяемая память ОЗУ 64K. STC12C5A60S2 может обращаться к адресному пространству внешней памяти размером 64K байт, это так называемое пространство внешней оперативной памяти данных, external data RAM. Подключение этой памяти такое же, как и стандартного 8051, через порты P2, P0, ALE, и ножки портов P3.6 и P3.7 (эти порты получают альтернативную функцию аппаратной шины для доступа к внешней памяти). Дополнительно имеется новый регистр BUS_SPEED (SFR-адрес A1h) для управления интервалами времени сигналов доступа инструкции MOVX. В регистре BUS_SPEED биты {ALES1 и ALES0} расширяют время установки и удержания (setup time и hold time) относительно отрицательного перепада ALE, и биты {RW2, RW1, RW0} расширяют ширину импульса /WR(P3.6) и /RD(P3.7). Регистр BUS_SPEED этими настройками может менять время цикла инструкции, что позволяет STC12C5A60S2 удовлетворять требования при интервалам времени доступа как к быстрым, так и к медленным периферийным устройствам.
Внешнее расширенное ОЗУ (external expanded RAM, адресное пространство XDATA)
Ниже приведено описание некоторых регистров и их бит, которые относятся к работе с памятью.
PSW (SFR-адрес D0h)
Бит
7
6
5
4
3
2
1
0
Имя
CY
AC
F0
RS1
RS0
OV
F1
P
RS1, RS0. Это биты, которые выбирают один из 4 банков RAM.
RS1
RS0
Рабочий банк регистров (R0..R7), по каким адресам он находится
0
0
Bank 0 (00h..07h)
0
1
Bank 1 (08h..0Fh)
1
0
Bank 2 (10h..17h)
1
1
Bank 3 (18h..1Fh)
AUXR (SFR-адрес 8Eh, состояние после сброса 00000000b)
Бит
7
6
5
4
3
2
1
0
Имя
T0x12
T1x12
UAR_M0x6
BRTR
S2SM0D
BRTx12
EXTRAM
S1BRS
EXTRAM. Бит управляет доступом к внутренней или внешней расширенной памяти (XRAM).
0: разрешена встроенная в кристалл MCU память auxiliary RAM, и она размещена по адресам 0x0000..0x03FF. Для адресов свыше 0x03FF автоматически адресуется внешняя память. 1: внутренняя auxiliary RAM всегда запрещена, и при обращении к XDATA по любым адресам всегда адресуется внешняя память.
BUS_SPEED (регистр управления скоростью шины, SFR-адрес A1h, состояние после сброса xx10x011b)
Бит
7
6
5
4
3
2
1
0
Имя
-
-
ALES1
ALES0
-
RWS2
RWS1
RWS0
ALES1
ALES0
Управление интервалами сигнала ALE при доступе к внешней памяти (XCODE, XDATA)
0
0
Время установки адреса на выводах P0 и время удержания для отрицательного перепада ALE составляет 1 такт системной частоты.
0
1
Время установки адреса на выводах P0 и время удержания для отрицательного перепада ALE составляет 2 такта системной частоты.
1
0
Время установки адреса на выводах P0 и время удержания для отрицательного перепада ALE составляет 3 такта системной частоты.
1
1
Время установки адреса на выводах P0 и время удержания для отрицательного перепада ALE составляет 4 такта системной частоты.
RWS2
RWS1
RWS0
Управление интервалами сигнала ALE при доступе к внешней памяти (XCODE, XDATA)
0
0
0
Время импульса чтения/записи для инструкции MOVX составляет 1 такт системной частоты.
0
0
1
Время импульса чтения/записи для инструкции MOVX составляет 2 такта системной частоты.
0
1
0
Время импульса чтения/записи для инструкции MOVX составляет 3 такта системной частоты.
0
1
1
Время импульса чтения/записи для инструкции MOVX составляет 4 такта системной частоты (состояние по умолчанию).
1
0
0
Время импульса чтения/записи для инструкции MOVX составляет 5 тактов системной частоты.
1
0
1
Время импульса чтения/записи для инструкции MOVX составляет 6 тактов системной частоты.
1
1
0
Время импульса чтения/записи для инструкции MOVX составляет 7 тактов системной частоты.
1
1
1
Время импульса чтения/записи для инструкции MOVX составляет 8 тактов системной частоты.
Когда осуществляется доступ во внутреннюю auxiliary RAM (XDATA), настройки регистра BUS_SPEED не влияют на время доступа.
В таблице показано время доступа к внешней памяти при пересылке 1 байта в сравнении со стандартным 8051 MCU. Последний столбец "Эфф." показывает выигрыш по скорости выполнения инструкции.
Мнемоника
Описание
Время в тактах
Эфф.
8051 MCU
STC 1T MCU
MOVX A, @Ri
Пересылка байта из внешнего ОЗУ (8-битный адрес) в аккумулятор
24
3
x8
MOVX @Ri, A
Пересылка байта из аккумулятора во внешнее ОЗУ (8-битный адрес)
24
4
x6
MOVX A, @DPTR
Пересылка байта из внешнего ОЗУ (16-битный адрес) в аккумулятор
24
3
x8
MOVX @DPTR, A
Пересылка байта из аккумулятора во внешнее ОЗУ (16-битный адрес)
24
3
x8
MOVX A, @Ri
Пересылка байта из внешнего ОЗУ (8-битный адрес) в аккумулятор
24
7+?
(*)
MOVX @Ri, A
Пересылка байта из аккумулятора во внешнее ОЗУ (8-битный адрес)
24
7+?
(*)
MOVX A, @DPTR
Пересылка байта из внешнего ОЗУ (16-битный адрес) в аккумулятор
24
7+?
(*)
MOVX @DPTR, A
Пересылка байта из аккумулятора во внешнее ОЗУ (16-битный адрес)
24
7+?
(*)
Примечание (*): количество тактов, необходимое для доступа к внешней expanded RAM, равно 7 + 2 * ALE_Bus_Speed + RW_Bus_Speed. Параметр ALE_Bus_Speed управляется битами ALES1 и ALES0 регистра BUS_SPEED. Параметр RW_Bus_Speed управляется битами RWS2, RWS1, RWS0 регистра BUS_SPEED.
Диаграмма времени сигналов для инструкции MOVX @DPTR, A (запись во внешнюю память) без растягивания интервалов:
Диаграмма времени сигналов для инструкции MOVX A, @DPTR (чтение из внешней памяти) без растягивания интервалов:
Диаграмма времени сигналов для инструкции MOVX @DPTR, A (запись во внешнюю память) с растягиванием интервалов. Растягивание выполнено настройкой бит {RWS2,RWS1,RWS0} = 111, время Twr = 8 тактов (Twr растянуто на 7 тактов):
Диаграмма времени сигналов для инструкции MOVX A, @DPTR (чтение из внешней памяти) с растягиванием интервалов. Растягивание выполнено настройкой бит {RWS2,RWS1,RWS0} = 111, время Trd = 8 тактов (Twr растянуто на 7 тактов). Биты {ALES1,ALES0} = 11 растянули время установки и удержания ALE на 3 такта:
[Порты GPIO]
Все порты ввода/вывода, или GPIO (включая порты P4 и P5) STC12C5A60S2 могут быть независимо друг от друга быть сконфигурированы в одном из 4 режимов путем установки сотвествующих бит в двух регистрах режима PxMn (где x=0..5, n=0 или 1). Вот эти режимы: quasibidirectional (квази-двунаправленный режим, это стандартный режим по умолчанию для выходов порта 8051), push-pull (двухтактный выход), только вход или open-drain (выход с открытым коллектором). Все ножки портов по умолчанию после сброса находятся в квази-двунаправленном режиме. Каждая ножка порта по входу имеет триггер Шмитта, что улучшает помехозащищенность. Любая ножка порта может коммутировать ток до 20 мА, однако желательно, чтобы суммарный ток всех портов на корпус для STC12C5A60S2 не превышал 120 мА.
Выводы P4.4, P4.5, P4.6 и P4.7 находятся на местах выводов PSEN, ALE, EA и RST стандартного 80C51. Обратите внимание, что дополнительные биты управления регистра P4SW используются для разрешения функции GPIO у этих выводов. Перед тем, как использовать эти выводы как GPIO, пользователи должны установить соответствующий бит, чтобы разрешить нужный вывод в режиме GPIO.
Ниже показано, как конфигурируются P5..P0.
P5 (SFR-адрес равен C8h, разряды этого регистра доступны в адресном пространстве бит)
Бит
7
6
5
4
3
2
1
0
Имя
-
-
-
-
P5.3
P5.2
P5.1
P5.0
P5M1 (SFR-адрес равен C9h, биты этого регистра недоступны в битовом адресном пространстве)
Бит
7
6
5
4
3
2
1
0
Имя
-
-
-
-
P5M1.3
P5M1.2
P5M1.1
P5M1.0
P5M0 (SFR-адрес равен CAh, биты этого регистра недоступны в битовом адресном пространстве)
Квази-двунаправленный (quasi-bidirectional), как у стандартного MCU 8051 (состояние по умолчанию). Может работать или как выход с открытым стоком, или как вход со слабым внутренним pull-up резистором, без необходимости перенастройки. Втекающий ток, который может коммутировать лог. 0 до 20 мА, вытекающий ток лог. 1 примерно 230 мкА (разброс из-за ошибок процесса производства может составлять 150..250 мкА).
0
1
Двухтактный выход (push-pull). Мощный выход, который может коммутировать ток лог. 0 и лог. 1 до 20 мА. Для ограничения выходного тока нужно применять внешние токоограничивающие резисторы.
1
0
Только вход, ножка порта имеет высокое сопротивление, внутренний pull-up отключен.
1
1
Открытый сток. Внутренний pull-up отключен, для формирования напряжения логических уровней требуется подключение внешней нагрузки (обычно это резистор между выходом и VCC).
Пример конфигурации:
MOVP5M1, #xxxx1010BMOVP5M0, #xxxx1100B
;P5.3 настроен как выход с открытым стоком (Open Drain),
;P5.2 настроен как мощный двухтактный выход (strong push-pull output),
;P5.1 настроен как вход с высоким сопротивлением,
;P5.0 настроен как квази-двунаправленный порт (quasibidirectional) со слабым
; верхним нагрузочным резистором (weak pull-up).
P4 (SFR-адрес равен C0h, разряды этого регистра доступны в адресном пространстве бит)
Бит
7
6
5
4
3
2
1
0
Имя
P4.7
P4.6
P4.5
P4.4
P4.3
P4.2
P4.1
P4.0
P4M1 (SFR-адрес равен B3h, биты этого регистра недоступны в битовом адресном пространстве)
Бит
7
6
5
4
3
2
1
0
Имя
P4M1.7
P4M1.6
P4M1.5
P4M1.4
P4M1.3
P4M1.2
P4M1.1
P4M1.0
P4M0 (SFR-адрес равен B4h, биты этого регистра недоступны в битовом адресном пространстве)
Бит
7
6
5
4
3
2
1
0
Имя
P4M0.7
P4M0.6
P4M0.5
P4M0.4
P4M0.3
P4M0.2
P4M0.1
P4M0.0
Конфигурируются ножки портов P4.7 - P4.0 с помощью битов P4M1 и P4M0 точно так же, как и для порта P5 битами P5M1 и P5M0 (см. таблицу выше).
Пример конфигурации:
MOVP4M1, #10100000BMOVP4M0, #11000000B
;P4.7 настроен как выход с открытым стоком (Open Drain),
;P4.6 настроен как мощный двухтактный выход (strong push-pull output),
;P4.5 настроен как вход с высоким сопротивлением,
;P4.4-P4.0 настроены как квази-двунаправленный порты (quasibidirectional) со слабым
P3 (SFR-адрес равен B0h, разряды этого регистра доступны в адресном пространстве бит)
Бит
7
6
5
4
3
2
1
0
Имя
P3.7
P3.6
P3.5
P3.4
P3.3
P3.2
P3.1
P3.0
P3M1 (SFR-адрес равен B1h, биты этого регистра недоступны в битовом адресном пространстве)
Бит
7
6
5
4
3
2
1
0
Имя
P3M1.7
P3M1.6
P3M1.5
P3M1.4
P3M1.3
P3M1.2
P3M1.1
P3M1.0
P3M0 (SFR-адрес равен B2h, биты этого регистра недоступны в битовом адресном пространстве)
Бит
7
6
5
4
3
2
1
0
Имя
P3M0.7
P3M0.6
P3M0.5
P3M0.4
P3M0.3
P3M0.2
P3M0.1
P3M0.0
P2 (SFR-адрес равен A0h, разряды этого регистра доступны в адресном пространстве бит)
Бит
7
6
5
4
3
2
1
0
Имя
P2.7
P2.6
P2.5
P2.4
P2.3
P2.2
P2.1
P2.0
P2M1 (SFR-адрес равен 95h, биты этого регистра недоступны в битовом адресном пространстве)
Бит
7
6
5
4
3
2
1
0
Имя
P2M1.7
P2M1.6
P2M1.5
P2M1.4
P2M1.3
P2M1.2
P2M1.1
P2M1.0
P2M0 (SFR-адрес равен 96h, биты этого регистра недоступны в битовом адресном пространстве)
Бит
7
6
5
4
3
2
1
0
Имя
P2M0.7
P2M0.6
P2M0.5
P2M0.4
P2M0.3
P2M0.2
P2M0.1
P2M0.0
P1 (SFR-адрес равен 90h, разряды этого регистра доступны в адресном пространстве бит)
Бит
7
6
5
4
3
2
1
0
Имя
P1.7
P1.6
P1.5
P1.4
P1.3
P1.2
P1.1
P1.0
P1M1 (SFR-адрес равен 91h, биты этого регистра недоступны в битовом адресном пространстве)
Бит
7
6
5
4
3
2
1
0
Имя
P1M1.7
P1M1.6
P1M1.5
P1M1.4
P1M1.3
P1M1.2
P1M1.1
P1M1.0
P1M0 (SFR-адрес равен 92h, биты этого регистра недоступны в битовом адресном пространстве)
Бит
7
6
5
4
3
2
1
0
Имя
P1M0.7
P1M0.6
P1M0.5
P1M0.4
P1M0.3
P1M0.2
P1M0.1
P1M0.0
P0 (SFR-адрес равен 80h, разряды этого регистра доступны в адресном пространстве бит)
Бит
7
6
5
4
3
2
1
0
Имя
P0.7
P0.6
P0.5
P0.4
P0.3
P0.2
P0.1
P0.0
P0M1 (SFR-адрес равен 93h, биты этого регистра недоступны в битовом адресном пространстве)
Бит
7
6
5
4
3
2
1
0
Имя
P0M1.7
P0M1.6
P0M1.5
P0M1.4
P0M1.3
P0M1.2
P0M1.1
P0M1.0
P0M0 (SFR-адрес равен 94h, биты этого регистра недоступны в битовом адресном пространстве)
Бит
7
6
5
4
3
2
1
0
Имя
P0M0.7
P0M0.6
P0M0.5
P0M0.4
P0M0.3
P0M0.2
P0M0.1
P0M0.0
Порты P4 и P5 у STC12C5A60S2. Процедура доступа к ножкам портов P4 и P5 такая же, как и для портов P3..P0, все ножки портов могут управляться и их состояние может быть прочитано через битовое адресное пространство.
Адрес SFR-регистра порта P4 равен C0h. При этом каждый разряд P4 доступен в адресном пространстве бит по следующим адресам:
Бит
P4.7
P4.6
P4.5
P4.4
P4.3
P4.2
P4.1
P4.0
Адрес бита
C7h
C6h
C5h
C4h
C3h
C2h
C1h
C0h
Адрес SFR-регистра порта P5 равен C8h. При этом каждый разряд P5 доступен в адресном пространстве бит по следующим адресам:
Бит
-
-
-
-
P5.3
P5.2
P5.1
P5.0
Адрес бита
-
-
-
-
CBh
CAh
C9h
C8h
Ножки P4.4, P4.5, P4.6 и P4.7 несут функции PSEN, ALE, EA и RST стандартного 80C51. Обратите внимание, что для разрешения функции GPIO этих выводов используются дополнительные биты управления регистра P4SW. Перед использованием этих ножек портов как GPIO нужно установить соответствующий бит, чтобы разрешить эту функцию.
P4SW, регистр настройки вторичной функции выводов NA/P4.4, ALE/P4.5 и EX_LVD/P4.6 (SFR-адрес BBh, состояние после сброса x000xxxxb)
Бит
7
6
5
4
3
2
1
0
Имя
-
LVD_P4.6
ALE_P4.5
NA_P4.4
-
-
-
-
NA/P4.4. По умолчанию (после сброса) этот бит равен 0, что соответствует наличию на ножке NA/P4.4 слабого pull-up и отсутствие какой-либо функции. Если этот бит программно установить в 1, то ножка NA/P4.4 работает как порт GPIO (P4.4).
ALE/P4.5. По умолчанию (после сброса) этот бит равен 0, что соответствует функции ALE/P4.5 в качестве сигнала ALE, используемого для организации доступа к внешней памяти данных. Если этот бит программно установить в 1, то ножка ALE/P4.4 работает как порт GPIO (P4.5).
LVD/P4.6: По умолчанию (после сброса) этот бит равен 0, что соответствует функции EX_LVD/P4.6 в качестве детектора низкого внешнего напряжения (External Low-Voltage Detection). Если этот бит программно установить в 1, то ножка EX_LVD/P4.6 работает как порт GPIO (P4.6).
Функция сброса для ножки RST/P4.7 настраивается с помощью утилиты STC-ISP writter/programmer, см. картинку.
AUXR1 (SFR-адрес A2h) используется для выбора, на каком порту работают функции PCA/PWM/SPI/UART2, на P1 или P4.
Бит
7
6
5
4
3
2
1
0
Имя
-
PCA_P4
SPI_P4
S2_P4
GF2
ADRJ
-
DPS
PCA _P4. Управление размещением PCA.
0: значение по умолчанию. Функция PCA работает на P1[4:2]. 1: функция PCA перемещается с P1[4:2] на P4[3:1]. ECI переключается с P1.2 на P4.1, PCA0/PWM0 переключается с P1.3 на P4.2, PCA1/PWM1 переключается с P1.4 на P4.3.
SPI_P4. Управление размещением SPI.
0: значение по умолчанию. Функция SPI работает на P1[7:4]. 1: функция SPI перемещается с P1[7:4] на P4[3:0]. SCLK переключается с P1.7 на P4.3, MOSI переключается с P1.6 на P4.2, MISO переключается с P1.5 на P4.1, SS переключается с P1.4 на P4.0.
S2_P4. Управление размещением UART2.
0: значение по умолчанию. Функция UART2 (S2) работает на P1[3:2]. 1: функция UART2(S2) перемещается с P1[3:2] на P4[3:2]. TxD2 переключается с P1.3 на P4.3, RxD2 переключается с P1.2 на P4.2,
GF2. General Flag, флаг общего назначения. Может использоваться произвольным образом в программе пользователя.
ADRJ. Управление представлением результата ADC (АЦП).
0: 10-битный результат преобразования ADC размещен как {ADC_RES[7:0], ADC_RESL[1:0]}. 1: 10-битный результат преобразования ADC выровнен вправо, и размещен в {ADC_RES[1:0], ADC_RESL[7:0]}.
DPS. Используемый указатель данных.
0: значение по умолчанию. DPTR0 выбран как указатель данных. 1: происходит переключение на использование второго DPTR.
[Режимы портов ввода/вывода (GPIO)]
Quasi-bidirectional I/O. В этом режиме ножки порта работают так же, как и ножки портов стандартного 8051. В квазидвунаправленном режиме порт используется одновременно и как выход, и как вход, без необходимости переконфигурирования порта. Это возможно по той причине, что ножка имеет открытый сток и слабую подтяжку вверх нагрузочным резистором (weak pull-up), позволяя внешним устройствам подтягивать уровень к лог. 0, если на выход выведена лог. 1. Если же на выход ножки порта выведен лог. 0, то транзистор открытого стока открывается, и может проводить большой ток на GND от внешних цепей (например, может управлять светодиодом).
Однако для того, чтобы обеспечить крутые перепады сигнала от 0 к 1, ножки порта имеют сложную организацию верхних нагрузок с ключами на 3 транзисторах (см. рисунок ниже). В момент переключения на лог. 1 к выходу подключается верхняя мощная подтяжка (strong pull-up) с задержкой на 2 такта, чем обеспечивается быстрое нарастание уровня напряжения на выводе порта.
Push-pull Output. Это режим двухтактного выхода, который может коммутировать большой ток лог. 0 и лог. 1.
Input-only. В этом режиме ножка порта работает только как вход с высоким сопротивлением. На каждом входе присутствует триггер Шмитта, все верхние внутренние нагрузочные резисторы отключены.
Open-drain Output. Это чистый выход с открытым коллектором, без подключенных внутренних нагрузочных резисторов. Чтобы на выходе получалась лог. 1, к выводу порта должны быть подключены внешние цепи, подтягивающие уровень напряжения к VCC.
Ножки портов всех MCU семейства 8051 от компании STC устроены одинаково. Подробнее про работу портов ввода вывода см. статью stc89xx [3], раздел "Конфигурации GPIO". Примеры использования портов GPIO (управление транзисторным ключом, светодиодом, согласование уровней логики 3.3V и 5V, прямое управление сегментами ЖКИ, динамическое управление 7-сегментным светодиодным индикатором) см. в даташите STC12C5A60S2-en.pdf [2].
Как обеспечить после сброса появление лог. 0 на выводе порта. У традиционного MCU архитектуры 8051 после сброса на всех портах (кроме P0) подключаются верхние нагрузочные резисторы номиналом около 50 кОм (weak pull-high), поэтому после сброса на выходах появляется лог. 1. В некоторых приложениях, где строго требуется наличие после сброса на выходе лог. 0, будут в таких условиях работать неправильно. Решить проблему можно, если добавить нижний подтягивающий резистор номиналом 1..3 кОм (см. схему).
Из-за того, что тока внутреннего pull-up не хватит для появления на выводе лог. 1, то сразу после сброса на выводе порта будет лог. 0. Если нужно вывести лог. 1, то порт переключается на двухтактный выход, и верхний транзистор может обеспечить ток порядка 20 мА, что гарантированно может подать на выход уровень лог. 1.
Состояние ножки порта при выводе ШИМ (PWM). Ниже приведена небольшая таблица, показывающая, как работает ножка порта в разных его режимах при выводе ШИМ.
Перед выводом PWM
Во время вывода PWM
Quasi-bidirectional
Push-Pull (мощный двухтактный выход).
Push-Pull
Push-Pull (мощный двухтактный выход).
Input only
Режим только вход недопустим для вывода ШИМ.
Open-drain
Открытый сток. Для формирования сигнала ШИМ требуется внешняя верхняя нагрузка (обычно это резистор 1..10 кОм, подключенный к VCC).
Для двухтактного выхода желательно подключение последовательно с нагрузкой резистора от 1 кОм до 10 кОм (чтобы избежать перегрузки ключевых транзисторов).
Использование АЦП для подключения кнопок клавиатуры. Когда не хватает ножек для подключения кнопок, встроенный АЦП можно использовать для подключения клавиатуры.
Первая схема проще, она позволяет декодировать даже некоторые одновременные нажатия нескольких кнопок. Для практических применений нужно подобрать номиналы резисторов для гарантированного определения нужных комбинаций кнопок.
Следующая схема позволяет подключать 10 кнопок и более, однако она не позволяет определять одновременные нажатия. Схема генерирует уровни нажатий с ошибкой не более ±0.25V, что позволяет правильно определять нажатия при изменении температуры. Чем меньше кнопок, тем можно обеспечить более высокую надежность и стабильность определения нажатий при разбросе номиналов резисторов.
[Система команд, режимы адресации]
Режимы адресации. Система адресации ячеек памяти, бит и 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). Это инструкция ветвления, при которой адрес назначения вычисляется как сумма базового указателя и аккумулятора.
В зависимости от типа инструкции, архитектура STC 1T дает ускорение выполнения кода в 3..12 раз. Подробнее описание системы команд см. в даташите STC12C5A60S2-en.pdf [2].
[Система прерываний]
STC12C5A60S2 поддерживает 10 источников прерывания с 4 уровнями приоритета - причем с аппаратной поддержкой вытеснения с учетом приоритетов, что в мире MCU встречается довольно редко (аппаратного вытеснения нет в более современных архитектурах наподобие AVR, и нет даже в мощной архитектуре DSP Blackfin). Вот список поддерживаемых прерываний: внешнее прерывание 0 (INT0), прерывание Timer0, внешнее прерывание 1 (INT1), прерывание Timer1, прерывание последовательного порта 1 (UART1), прерывание АЦП (ADC), прерывание детектора низкого напряжения (LVD), прерывание PCA, прерывание последовательного порта 2 (UART2) и прерывание SPI. Каждый источник прерывания связан с одним или несколькими флагами запроса прерывания, находящимися с SFR-регистрах. К каждому прерыванию привязан соответствующий вектор в таблице прерываний, и все источники прерывания могут быть разрешены или запрещены индивидуально установкой или сбросом соответствующих бит в SFR-регистрах IE, CCON и IE2. Также все прерывания могут быть разрешены или отключены глобально установкой или сбросом бита EA (IE.7). Сброс бита EA в лог. 0 запретит все источники прерывания, независимо от индивидуальных разрешающих настроек каждого прерывания.
Если прерывания разрешены для определенного источника, то запрос на прерывание генерируется, когда установится флаг запроса на прерывание. Как только завершится выполнение текущей инструкции, CPU сгенерирует LCALL на заранее определенный адрес (вектор прерывания), чтобы запустить на выполнение обработчик прерывания (interrupt service routine, ISR). Каждый ISR должен заканчиваться инструкцией RETI, которая вернет управление в программу на следующую инструкцию, которая идет за инструкцией, на выполнении которой произошло прерывание (которая выполнилась бы, если бы прерывание не возникло). Если прерывания не разрешены, то флаг ожидания прерывания аппаратно игнорируется, и выполнение программы продолжается нормальным образом. Таким образом, флаг прерывания установится в лог. 1 независимо от того, разрешено или запрещено индивидуально это прерывание (можно обрабатывать события прерывания по опросу вместо использования реальных прерывания, хотя это не эффективно).
Каждый источник прерывания привязан к двум битам, которые позволяют настроить приоритет этого прерывания. Некоторые такие биты размещены в SFR-регистрах IPH и IP. Выполнение прерывания с более высоким приоритетом не могут быть вытеснены прерыванием с более низким приоритетом. Если одновременно произошли 2 прерывания с разным приоритетом, то сначала выполнится более приоритетное прерывание, выполнение прерывания с приоритетом ниже будет отложено до окончания прерывания с более высоким приоритетом. Если были одновременно получены запросы на прерывания с одинаковым приоритетом, то для определения, какое именно прерывание будет сначала выполнено, используется внутренняя фиксированная последовательность (polling sequence), определяемая порядковым номером вектора прерывания. В следующей таблице показана эта последовательность для прерываний с одинаковым уровнем приоритета и разными адресами векторов прерываний.
Источник
Адрес вектора
Polling Sequence
Биты установки приоритета
Флаг запроса прерывания
Биты управления прерыванием
INT0
0003h
0 (высший приоритет)
PX0H, PX0
IE0
EX0/EA
Timer0
000Bh
1
PT0H, PT0
TF0
ET0/EA
INT1
0013h
2
PX1H, PX1
IE1
EX1/EA
Timer1
001Bh
3
PT1H, PT1
TF1
ET1/EA
UART1
0023h
4
PSH, PS
RI, TI
ES/EA
ADC
002Bh
5
PADCH, PADC
ADC_FLAG
EADC/EA
LVD
0033h
6
PLVDH, PLVD
LVD
ELVD/EA
PCA
003Bh
7
PPCAH, PPCA
CF, CCF0, CCF1
(ECF, ECCF0, ECCF1)/EA
UART2 (S2)
0043h
8
PS2H, PS2
S2RI, S2TI
ES2/EA
SPI
004Bh
9 (самый низкий приоритет)
PSPIH, PSPI
SPIF
ESPI/EA
В среде Keil C номер в polling sequence (и одновременно вектор прерывания) определяется числом, которое указывается вместе с ключевым словом interrupt:
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 UART_Routine(void) interrupt 4;
void ADC_Routine(void) interrupt 5;
void LVD_Routine(void) interrupt 6;
void PCA_Routine(void) interrupt 7;
void UART2_Routine(void) interrupt 8;
void SPI_Routine(void) interrupt 9;
На рисунке показана структура организации прерываний и их приоритетов для STC12C5A60S2:
Внешние прерывания INT0 и INT1 могут срабатывать либо по уровню (level-activated), либо по переходу уровня (transition-activated), в зависимости от установки бит IT0 и IT1 в регистре TCON. Флаги, установка которых вызовет эти прерывания - биты IE0 и IE1 в регистре TCON, они устанавливаются аппаратно. Когда генерируется внешнее прерывание, то флаг, который сгенерировал прерывание (IE0 или IE1), будет аппаратно очищен, когда произошел переход по вектору соответствующего ISR, если только прерывание было активировано по переходу уровня, иначе флагом будет управлять внешний источник прерывания, а не аппаратура кристалла MCU.
Прерывания от таймеров Timer0 и Timer1 генерируются флагами TF0 и TF1, которые в большинстве случаев устанавливаются при переполнении регистров счетчиков соответствующего таймера. Когда генерируется прерывание таймера, то флаг, сгенерировавшний прерывание, автоматически очистится аппаратурой MCU, когда произойдет переход по адресу ISR.
Прерывания последовательного порта (UART) генерируется операцией ИЛИ над флагами RI и TI. Ни один их этих флагов не будет очищен при переходе в ISR. Фактически это сделано для того, чтобы в коде ISR имелась возможность по состоянию бит RI и TI определить, какое событие вызвало прерывание - прием (заполнение буфера приема) или передача (опустошение буфера передачи), и бит, вызвавший прерывание, должен быть очищен программно. Прерывание АЦП генерирует установка флага ADC_FLAG, он также должен быть очищен программно.
Прерывание детектора понижения напряжения (Low Voltage Detect) генерируется флагом LVDF в регистре PCON (PCON.5), этот бит должен быть очищен аппаратно.
Прерывание PCA генерируется операцией ИЛИ над флагами CF, CCF0 и CCF1. ISR PCA должно проанализировать состояние флагов CF и CCF0, CCF1, чтобы определить, какой запрос вызвал прерывание, и его флаг должен быть очищен программно.
Прерывание от второго порта UART генерируется операцией ИЛИ над флагами S2RI и S2TI. Ни один их этих флагов не будет очищен при переходе в ISR. Эти флаги должны быть сброшены программно после анализа в коде ISR.
Прерывание SPI генерируется по флагу SPIF. Он может быть очищен программно, если записать в него лог. 1.
Все эти флаги могут быть программно установлены или очищены с тем же результатом, как если бы они были установлены или очищены аппаратно. Другими словами, можно программно генерировать прерывания, и можно программно отменять прерывания, ожидающие обработки.
Ниже в таблице перечислены регистры, участвующие в системе обработки прерываний.
Мнемоника регистра
Описание
Адрес SFR
Номера и мнемоника бит
Значение после сброса (POR или другого типа сброса)
7
6
5
4
3
2
1
0
IE
Interrupt Enable (разрешение прерываний)
A8h
EA
ELVD
EADC
ES
ET1
EX1
ET0
EX0
00000000b
IP
Interrupt Priority Low, установка уровня приоритета
B8h
PPCA
PLVD
PADC
PS
PT1
PX1
PT0
PX0
00000000b
IPH
Interrupt Priority High, установка уровня приоритета
B7h
PPCAH
PLVDH
PADCH
PSH
PT1H
PX1H
PT0H
PX0H
00000000b
IE2
Второй регистр разрешения прерываний
AFh
-
-
-
-
-
-
ESPI
ES2
xxxxxx00b
IP2
Второй регистр (младший) установки уровня приоритета
B5h
-
-
-
-
-
-
PSPI
PS2
xxxxxx00b
IP2H
Второй регистр (старший) установки уровня приоритета
B6h
-
-
-
-
-
-
PSPIH
PS2H
xxxxxx00b
TCON
Timer Control (управление таймерами)
88h
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
00000000b
SCON
Управление последовательным портом
98h
SM0/FE
SM1
SM2
REN
TB8
RB8
TI
RI
00000000b
AUXR
Auxiliary register
8Eh
T0x12
T1x12
UART_M0x6
BRTR
S2SMOD
BRTx12
EXTRAM
S1BRS
00000000b
PCON
Power Control (управление питанием)
87h
SMOD
SMOD0
LVDF
POF
GF1
GF0
PD
IDL
00010000b
WAKE_CLKO
Регистр управления выводом тактов и управления засыпанием/пробуждением
8Fh
PCAWAKEUP
RXD_PIN_IE
T1_PIN_IE
T0_PIN_IE
LVD_WAKE
BRTCLKO
T1CLKO
T0CLKO
00000000b
ADC_CONTR
ADC control (управление АЦП)
BCh
ADC_POWER
SPEED1
SPEED0
ADC_FLAG
ADC_START
CHS2
CHS1
CHIS0
00000000b
CCON
Управление PCA
D8h
CF
CR
-
-
-
-
CCF1
CCF0
00xxxx00b
CMOD
Установка режима PCA
D9h
CIDL
-
-
-
CPS2
CPS1
CPS0
ECF
0xxx0000b
CCAPM0
Регистр режима модуля 0 PCA
DAh
-
ECOM0
CAPP0
CAPN0
MAT0
TOG0
PWM0
ECCF0
x0000000b
CCAPM1
Регистр режима модуля 1 PCA
DBh
-
ECOM1
CAPP1
CAPN1
MAT1
TOG1
PWM1
ECCF1
x0000000b
SPSTAT
Регистр статуса SPI
CDh
SPIF
WCOL
-
-
-
-
-
-
00xxxxxxb
Подробнее описание регистров, участвующих в работе системы прерываний см. в даташите STC12C5A60S2-en.pdf [2].
Приоритеты прерываний. Каждый из источников прерывания может быть индивидуально запрограммирован на один из 4 уровней приоритета путем установки/очистки бит в SFR-регистрах IP или IP2 и IPH или IP2H. Прерывание с настроенным низким приоритетом может быть прервано прерыванием с более высоким приоритетом, но не другим низкоприоритетным прерыванием. Прерывание с самым высоким приоритетом не может быть прервано никаким прерыванием.
Если два запроса с разными уровнями приоритета будут приняты одновременно, то будет обработан запрос от более выскоприоритетного прерывания. Если у запросов одинаковый приоритет, и они поступили одновременно, то для принятия решения, какое прерывание будет обработано в первую очередь, используется внутренний список опроса (internal polling sequence). Чем меньше номер приоритета в этом списке (т. е. чем ближе его вектор к началу таблицы векторов прерываний), тем выше приоритет для этого списка. Вот этот список polling sequence:
Источник
Polling Sequence
INT0
0 (высший приоритет)
Timer0
1
INT1
2
Timer1
3
UART1
4
ADC
5
LVD
6
PCA
7
UART2 (S2)
8
SPI
9 (самый низкий приоритет)
Обратите внимание, что список "приоритет на одном уровне" используется только для случая одновременного поступления запросов прерываний с одинаковым уровнем приоритетов.
Как обрабатываются прерывания. Выводы внешних прерываний и прерывания от других источников захватываются по положительному перепаду цикла выборки каждого кода инструкции (OPcode fetch cycle. The samples are polled during the next instruction OPcode fetch cycle). Если один из флагов, сигнализирующих о наступлении условия разрешенного прерывания, был установлен на первом такте, то на втором такте система проведет анализ его приоритета, и если условие запуска выполняется, то будет сгенерирован аппаратный вызов LCALL для запуска соответствующего обработчика прерывания (ISR). Запуск будет произведен, если его не отменяют следующие условия блокировки:
• В настоящее время выполняется обработка прерывания с таким же уровнем приоритета, или более высоким уровнем. • Текущий цикл (polling cycle) не последний цикл в процессе выполнения инструкции. • Если выполняется инструкция RETI, или любая запись в регистры IE, IE2, IP, IP2, IPH и IP2H. • В настоящее время имеет место активность ISP/IAP.
Любое из этих 4 условий будет заблокирована аппаратная генерация LCALL в обработчик прерывания. Второе условие гарантирует, что выполняемая инструкция завершится перед передачей управления в любой ISR. Третье условие гарантирует, что если выполняется инструкция RETI или любой доступ к IE, IE2, IP, IP2, IPH или IP2H, то как минимум одна или большее количество инструкций будут выполнены перед передачей управления в любое прерывание.
Цикл опроса (polling cycle) повторяется с последним тактом каждого цикла инструкции. Обратите внимание, что если флаг прерывания активен, но на него не поступил ответ от системы из-за блокировки по одному из вышеперечисленных условий, и если флаг перестал быть активным, когда условие блокировки снято, то это отложенное прерывание не будет обработано. Другими словами, не запоминается тот факт, что флаг прерывания был один раз активен, но не был обработан из-за одного из условий блокировки, и если флаг перестал быть активным после снятия условия блокировки, то временно заблокированное прерывание не будет обработано. Флаг, который стал активным, но не был обработан, не удерживается в памяти, каждый цикл опроса является новым.
Обратите внимание, что если стало активным прерывания с более высоким приоритетом перед положительным перепадом третьего машинного такта, то в соответствии с вышеуказанными правилами блокировки управление на это прерывание будет передано во время пятого и шестого машинного такта, без любой выполняемой инструкции менее приоритетного прерывания.
Таким образом, процессор подтверждает запрос на прерывание передачей управления в ISR аппаратной генерацией LCALL на соответствующий вектор. В некоторых случаях также очищается флаг, который привел к генерации прерывания, и в некоторых случаях этот флаг не очищается. Никогда не очищаются флаги прерывания последовательного порта (UART), они должны быть явным образом очищены программно. Аппаратно очищаются при входе в ISR флаги внешнего прерывания (IE0 или IE1) только в том случае, если они были активированы перепадом уровня. Аппаратно генерируемый LCALL проталкивает в стек содержимое счетчика команд (Program Counter, регистр PC, но состояние процессора в регистре PSW в стек не проталкивается), и перезагружает PC адресом (вектором прерывания), значение которого зависит обрабатываемого прерывания (см. таблицу ниже).
Источник
Адрес вектора
INT0
0003h
Timer0
000Bh
INT1
0013h
Timer1
001Bh
UART1
0023h
ADC
002Bh
LVD
0033h
PCA
003Bh
UART2 (S2)
0043h
SPI
004Bh
Выполнения продолжается с вектора прерывания до места, где находится инструкция RETI. Инструкция RETI оповещает процессор, что закончился обработчик ISR, после чего из стека извлекаются 2 байта и загружаются в PC. Выполнение программы продолжается с того места, где она была прервана.
Обратите внимание, что простая инструкция RET также вернет управление в прерванную программу, но система управления прерываниями будет думать, что обработчик прерывания все еще продолжает свою работу.
Время реакции на прерывание. Уровни ~INT0 и ~INT1 инвертируются и защелкиваются во флаги IE0 и IE1 по положительному перепаду каждого системного такта.
Флаги таймеров Timer0 и Timer1 flags, TF0 и TF1, установятся после переполнения счетчика таймера. Тогда их значения будут опрошены схемой процессора по положительному перепаду следующего системного такта.
Если активен запрос на прерывание, и подтверждены условия его запуска, то аппаратно генерируемый вызов в его ISR будет выполнен на следующей выполняемой инструкции. Вызов сам по себе занимает 6 системных тактов. Таким образом, пройдет как минимум 7 системных тактов между активацией запроса на прерывание и выполнением первой инструкции в ISR.
Время ответа может быть больше, если запрос был заблокирован одним из 4 условий, перечисленных выше. Если в настоящий момент выполняется другой ISR прерывания с таким же или более высоким приоритетом, то дополнительное время ожидания очевидно зависит от кода, который выполняется в этом другом ISR. Если выполнение инструкции находится не на своем последнем цикле, то дополнительное время ожидания не может быть больше 3 тактов, поскольку самая длинная инструкция (LCALL) занимает только 6 тактов, и если выполняется инструкция RETI или доступ к IE или IP, то дополнительное время ожидания не может быть больше 5 тактов (максимуи 1 дополнительный такт для завершения выполняемой инструкции, плюс 6 тактов для завершения следующей инструкции, если эта инструкция LCALL).
Таким образом, в системе с одним разрешенным прерыванием время реакции на него всегда больше 7 тактов и меньше 12 тактов.
Подробнее про обработку внешних прерываний, прерываний таймера, UART, SPI и ADC и примеры кода см. в даташите STC12C5A60S2-en.pdf [2].
[Таймеры/счетчики Timer0 и Timer1]
Timer0 и Timer1 устроены так же, как и в стандартном 8051, оба они могут быть индивидуально сконфигурированы как таймеры или как счетчики событий.
В режиме таймера регистр счетчика инкрементируется каждые 12 системных тактов, или каждый системный такт в зависимости от настройки бит AUXR.7 (T0x12) и AUXR.6 (T1x12) для Timer0 и Timer1 соответственно. В состоянии по умолчанию таймер тактируется точно так же, как и в стандартном 8051. В режиме x12 скорость счета равна системной тактовой частоте.
В режиме счетчика регистр инкрементируется при перепадах 1 -> 0 на соответствующем входе T0 или T1. Вход опрашивается по положительному перепаду каждого такта системной частоты. Когда опрос входа показал, что на одном такте сигнал был в лог. 1, а на следующем такте он оказался лог. 0, то счетчик инкрементируется. Новое значение появляется в регистре счетчика по окончании такта, который следует за моментом определения перепада. Поскольку определение перепада занимает 2 машинных цикла (24 системных такта), то максимальная скорость счета (частота входного сигнала, импульсы которого можно считать) равна 1/24 от частоты системы. Нет никаких ограничений на скважность внешнего входного сигнала, однако нужна гарантия, что имеющийся уровень зарегистрирован один раз перед своим изменением, т. е. уровень его должен держаться как минимум в течение 1 полного машинного цикла.
В дополнение к выбору режима таймера или счетчика, Timer0 и Timer1 имеют для выбора 4 рабочих режима. Функция таймер или счетчик выбирается битами управления C/T в SFR-регистре TMOD. Эти 2 таймера/счетчика имеют 4 рабочих режима, которые выбираются парами бит (M1, M0) в регистре TMOD. Режимы 0, 1 и 2 одинаковы для обоих таймеров/счетчиков, режим 3 имеет отличия.
Подробнее про режимы таймеров счетчиков, его регистры и примеры кода см. даташит STC12C5A60S2-en.pdf [2].
[Последовательный интерфейс UART]
MCU серии STC12C5A60S2 имеет два универсальных асинхронных приемопередатчика (Universal Asychronous Receivers/Transmitter, сокращенно UART): UART1 и UART2. Оба они полнодуплексные, это означает, что они могут одновременно работать и на прием, и на передачу. Они также имеют буфер приеме, т. е. могут осуществлять прием второго байта, пока первый принятый байт вычитывается из регистра приема (однако если первый байт не был прочитан до завершения приема второго байта, то этот первый байт будет потерян, потому что его перезапишет второй принятый байт). UART1 и для приема и для передачи используют один и тот же SFR-адрес SBUF, однако в действительности ему соответствует 2 отдельных регистра, один из которых хранит данные для передачи, другой хранит данные для приема. Точно так же устроены буферы UART2: его SFR-регистр S2BUF объединяет в себе функции и приема, и передачи.
Оба последовательных порта UART1 и UART2 могут работать в 4 разных режимах: режим 0 предоставляет синхронный обмен, в то время как режимы 1, 2 и 3 предоставляют асинхронный обмен. Асинхронный обмен работает как полнодуплексный универсальный приемник и передатчик (Universal Asynchronous Receiver/Transmitter, UART), который может передавать и принимать на разных скоростях.
Последовательный обмен подразумевает передачу бит данных в одном направлении только через 1 провод. Данные передаются бит за битом в синхронном или асинхронном формате. Синхронный обмен передает весь блок символов синхронно с опорной тактовой частотой, в то время как асинхронный обмен передает по одному символу, что может происходить в любой случайный момент времени, независимо от какого-либо синхронизирующего сигнала.
Подробнее про режимы UART, его регистры и примеры кода см. даташит STC12C5A60S2-en.pdf [2].
[Аналого-цифровой преобразователь (ADC)]
MCU серии STC12C5A60S2 содержат функцию аналого-цифрового преобразования (ADC, АЦП) с 8-канальным коммутатором по входу и 10-битной разрядностью. Скорость оцифровки сигнала составляет до 250 кГц (250 тысяч выборок в секунду). 8-каналов коммутатора ADC находятся на ножках порта P1 (P1.0-P1.7), можно использовать для измерения температуры, определения напряжения батареи, сканирования кнопок, анализа спектра сигнала и т. д. После сброса ножки порта P1 находятся в состоянии квазидвунаправленного порта со слабыми верхними внутренними нагрузочными резисторами. Пользователи могут программно установить подключение любого из 8 каналов ко входу АЦП. Порты, которые не используются под функцию АЦП, могут использоваться как обычные ножки GPIO.
Примечание: некоторые модели MCU серий STC12Cxx могут вообще не иметь на борту ADC, или также могут иметь не 10, а 8-битный преобразователь ADC. Подробнее см. даташит на соответствующий микроконтроллер [2].
ADC у STC12C5A60S2 работает по принципу последовательного приближения (successive-approximation). Опорное напряжение для DAC преобразователя берется от напряжения питания VCC, и ток потребления для него составляет 600 мкА .. 1 мА.
Преобразование АЦП запускается установкой бита ADC_STRAT (ADC_CONTR.3). Перед запуском преобразования должен быть предварительно установлен бит ADC_POWER/ADC_CONTR.7, чтобы включить питание внутренних схем ADC. Также перед началом преобразования нужные ножки потов GPIO, которые используются как входы для аналогового напряжения, должны быть программно настроены либо как входы, либо как выходы с открытым стоком, без подключения внутренних резисторов pull-up. Преобразователь тратит примерно четверть времени преобразования на выборку аналогового уровня сигнала, и остальные 3 четверти на шаги последовательного приближения при оцифровке. Общее время преобразования управляется двумя битами регистра SPEED1 и SPEED0. Биты {CHS2,CHS1,CHS0} выбирают, какая из ножек порта P1 подключена ко входу ADC. Когда преобразование завершено, результат будет сохранен в биты {ADC_RES, ADC_RESL[1:0]} регистра, если AUXR1.2 (ADRJ) == 0, или в биты {ADC_RES[1:0], ADC_RESL} если ADRJ == 1.
Представление результата, когда ADRJ==0:
Представление результата, когда ADRJ==1:
После того, как результат преобразования сохранен в регистрах, установится бит ADC_FLAG, сигнализирующий об окончании преобразования. Флаг ADC_FLAG связан с битом разрешения прерывания от АЦП IE.5 (EADC). Бит ADC_FLAG должен быть очищен программно. Вектор прерывания ADC находится по адресу 002Bh. Когда MCU входит в режим ожидания (idle mode) или в режим выключения (power-down mode), питание ADC будет отключено аппаратурой MCU.
Когда ADRJ = 0, если пользователь хочет получить 10-битный результат измерения из АЦП, то напряжение Uin на входе АЦП может быть рассчитано по следующей формуле:
Когда ADRJ = 0, если пользователь хочет получить 8-битный результат измерения из АЦП, то напряжение Uin на входе АЦП может быть рассчитано по следующей формуле:
ADC_RES[7:0] = 256 * (Uin / VCC)
Когда ADRJ = 1, если пользователь хочет получить 10-битный результат измерения из АЦП, то напряжение Uin на входе АЦП может быть рассчитано по следующей формуле:
В этих формулах Uin это входное напряжение в вольтах, а VCC это реальное напряжение питания.
Источник опорного напряжения для АЦП. У микроконтроллеров серий STC12Cxx опорное напряжение для ADC берется напрямую от напряжения питания MCU, так что для не очень точных измерений источник опорного напряжения не требуется. Если же требуется очень точное измерение напряжения, то можно использовать отдельный внешний источник опорного напряжения, подключенный к одному из каналов АЦП. В результате АЦП может определить напряжение на этом опорном источнике по отношению к напряжению питания VCC, и в результате точно вычислить напряжение VCC. После этого вычисленное VCC может быть использовано для точного измерения напряжения на входе других каналов АЦП. Например, Вы подключили к каналу ADC0 источник опорного напряжения 1.25V, и получили в регистрах ADC_RES, ADC_RESL результат 258. Следовательно, напряжение питания VCC = (1024 * 1.25) / 258 = 4.96V. Теперь, точно зная напряжение VCC, Вы можете пересчитать напряжение, считанное с любого другого канала АЦП (если предположить, что VCC в течение короткого промежутка времени остается постоянным).
Результаты преобразования АЦП могут быть прочитаны по прерыванию или периодическим опросом. Подробнее про режимы ADC, его регистры, схемы подключения и примеры кода см. даташит STC12C5A60S2-en.pdf [2].
[Массив программируемых счетчиков (PCA)]
Массив программируемых счетчиков (Programmable Counter Array, сокращенно PCA) это специальный 16-битный таймер, который имеет 2 связанных с ним 16-битных модуля захвата/сравнения. Каждый из этих модулей может быть запрограммирован для работы в одном из 4 режимов: захват значения счетчика по положительному и/или отрицательному перепаду сигнала (что позволяет вычислить длительность интервалов лог. 0 и лог. 1 импульсов), программный таймер, высокоскоростной вывод или широтно-импульсный модулятор (pulse width modulator, PWM, ШИМ). Каждый модуль имеет вывод, связанный с портом P1. В MCU серии STC12C5A60S2 модуль 0 подключен к P1.3, модуль 1 к P1.4. В серии STC12C5201AD модуль 0 подключен к выводу P3.7, модуль 1 к выводу P3.5.
Таймер PCA работает на основе общего тактирования для обоих двух модулей, и может быть запрограммирован на тактовую частоту 1/12 от системной, 1/2 от системной, на частоту переполнения Timer0 или от вывода ECI (P1.2). От какого из этих источников будет тактироваться таймер - определяют биты CPS1 и CPS0 в SFR-регистре CMOD.
Подробнее про режимы PCA, его регистры, схемы подключения и примеры кода см. даташит STC12C5A60S2-en.pdf [2].
[Последовательный интерфейс SPI]
STC12C5A60S2 предоставляет другой высокоскоростной способ последовательного данными - через интерфейс SPI (кто не знает, что это такое, см. [6]). SPI осуществляет полнодуплексный, синхронный обмен данными на высокой скорости, работая в двух режимах: Master mode (главное устройство) и Slave mode (подчиненное устройство). На частоте SYSclk=12MHz можно достичь скоростей до 3 мегабит/сек в любом из этих двух режимов. Два флага статуса SPI служат для определения момента завершения передачи и события коллизии при записи.
Основные сигналы SPI реализованы на 3 выводах P1: SCLK (P1.7), MISO (P1.6), MOSI (P1.5). Еще один дополнительный вывод SS (P1.4) разработан для конфигурирования SPI в режимах работы Master или Slave. SCLK, MOSI и MISO обычно соединены друг с другом параллельно на всех устройствах, участвующих в обмене на шине SPI (в обмене могут участвовать 2 и большее количество устройств). Поток данных идет от устройства Master к устройствам Slave по сигналу MOSI (Master Out Slave In), и от устройства Slave к устройству Master через вывод MISO (Master In Slave Out). Сигнал SCLK работает как выход в режиме Master и как вход в режиме Slave. Если система SPI запрещена, т. е. SPEN (SPCTL.6) == 0, то эти выводы сконфигурированы как обычные порты GPIO (P1.4 - P1.7).
Ножка SS работает как сигнал выборки подчиненного устройства. В типичной конфигурации Master SPI выставляет лог. 0 на одной из своих ножек портов для выбора одного из устройств, подключенных к шине SPI, в качестве текущего устройства обмена. Устройство SPI Slave использует этот вывод SS, чтобы определить, выбрано ли оно для обмена. Однако если бит SPEN == 0, или бит SSIG (SPCTL.7) == 1, то вывод SS игнорируется. Обратите внимание, что даже если SPI сконфигурирован как Master (MSTR/SPCTL.4 == 1), он все еще может быть преобразован в Slave-устройство, если перевести его вывод SS в лог. 0. Когда это происходит, будет установлен бит SPIF (SPSTAT.7).
Два устройства обмениваются данными по шине SPI в такт с сигналом SCLK. Для одного из устройств (для Master) это выход, а для другого (для Slave) это вход. Пользователю следует учитывать 2 момента: во-первых, защелкивание данных происходит по отрицательному или по положительному перепаду сигнала тактов, что называется полярностью тактирования. Во-вторых, нужно удерживать тактовый сигнал в лог. 0 или в лог. 1 в состоянии ожидания на шине, что называется фазой тактирования. Получается 4 разных варианта из комбинацией этих двух настроек, которые называются режимом SPI: SPI-MODE-0, SPI-MODE-1, SPI-MODE-2, SPI-MODE-3. Многие устройства по разному реализуют свой внутренний механизм работы, требуя использования каких-то определенных режимов, однако некоторые из них могут адаптироваться к любому из вышеперечисленных режимов. Серия STC12C5A60S2 может гибко конфигурироваться, чтобы быть адаптированным для другого устройства в любом из режимов MODE-0, MODE-1, MODE-2 или MODE-3 SPI, и играть при этом роль устройства Master и Slave, по выбору.
Ниже приведено описание основных регистров SPI.
Мнемоника регистра
Описание
Адрес SFR
Номера и мнемоника бит
Значение после сброса (POR или другого типа сброса)
7
6
5
4
3
2
1
0
SPCTL
SPI Control Register (управление SPI)
CEh
SSIG
SPEN
DORD
MSTR
CPOL
CPHA
SPR1
SPR0
00000100b
SPSTAT
SPI Status Register (состояние SPI)
CDh
SPIF
WCOL
-
-
-
-
-
-
00xxxxxxb
SPDAT
SPI Data Register (регистр данных)
CFh
00000000b
AUXR1
Auxiliary register 1
A2h
-
PCA_P4
SPI_P4
S2_P4
GF2
ADRJ
-
DPS
x00000x0b
SPCTL. SPI Control register, регистр управления SPI (SFR-адрес CEh, биты этого регистра недоступны в адресном пространстве бит).
Бит
7
6
5
4
3
2
1
0
Имя
SSIG
SPEN
DORD
MSTR
CPOL
CPHA
SPR1
SPR0
SSIG. Бит, который управляет действием сигнала SS (игнорируется он или нет).
1: бит MSTR (SPCTL.4) управляет, как будет работать устройство, как master или как slave. 0: уровень на выводе SS управляет, как работает устройство. Если SS==0, то устройство работает как slave, если SS==1, то устройство работает как master. Ножка SS может использоваться как порт GPIO.
SPEN. SPI enable bit, бит разрешения работы SPI.
0: SPI запрещен, и все его ножки портов работают как обычные порты GPIO. 1: SPI разрешен.
DORD. Устанавливает порядок следования бит данных при приеме и передаче.
1: первым передается LSB (младший бит) слова данных. 0: первым передается MSB (старший бит) слова данных.
MSTR. Выбор режима устройства (Master/Slave).
0: SPI играет роль подчиненного устройства на шине (Slave). 1: SPI работает как главное устройство на шине (Master).
CPOL. SPI clock polarity, выбор полярности сигнала тактов.
1: SPICLK находится в лог. 1 в режиме ожидания (idle mode). Начальный перепад тактов будет отрицательный (спад уровня, переход 1 -> 0), и конечный перепад будет положительный (нарастание уровня, переход 0 -> 1). 0: SPICLK находится в лог. 0 в режиме ожидания. Начальный перепад тактов будет положительный (нарастание уровня, переход 0 -> 1), и конечный перепад будет отрицательный (спад уровня, переход 1 -> 0).
CPHA. SPI clock phase, выбор фазы сигнала тактов SPI.
1: данные переключаются по начальному перепаду SPICLK, и считываются по конечному перепаду. 0: данные выводятся, когда вывод SS находится в лог. 0 (SSIG=0), и переключаются по конечному перепаду SPICLK. Данные считываются по начальному перепаду SPICLK (замечание: если SSIG=1, то CPHA не должен быть 0, иначе поведение системы будет не определено).
SPR1, SPR0. SPI clock rate select, выбор скорости SPI (когда SPI работает в режиме Master). В таблице ниже показано действие этих бит (CPU_CLK это тактовая частота, на которой работает микроконтроллер).
SPR1
SPR0
Частота тактов SPI (SCLK)
0
0
CPU_CLK/4
0
1
CPU_CLK/16
1
0
CPU_CLK/64
1
1
CPU_CLK/128
SPSTAT. SPI State register, регистр состояния SPI (SFR-адрес CDh, биты этого регистра недоступны в адресном пространстве бит).
Бит
7
6
5
4
3
2
1
0
Имя
SPIF
WCOL
-
-
-
-
-
-
SPIF. SPI transfer completion flag, флаг завершения передачи. Когда передача завершится, аппаратно установится бит SPIF, и будет сгенерирован запрос на прерывание, если установлены оба бита, ESPI (IE.6) и EA (IE.7). Если SS работает как вход, и на него снаружи пришел лог. 0, когда SPI работает в режиме Master с SSIG = 0, то флаг SPIF также установится, сигнализируя об изменении режима ("mode change", устройство перейдет из режима Master в режим Slave). SPIF очищается программно путем записи в него лог. 1.
WCOL. SPI write collision flag, флаг коллизии записи. Бит WCOL установится, если регистр данных SPDAT был записан во время процесса передачи данных. Флаг WCOL очищается программно путем записи в него лог. 1.
SPDAT. SPI Data register, регистр данных (SFR-адрес CFh, биты этого регистра недоступны в адресном пространстве бит).
Бит
7
6
5
4
3
2
1
0
Имя
Этот регистр содержит передаваемые (при доступе на запись) и принимаемые (при доступе на чтение) данные. Физически это два раздельных регистра, доступные по одному и тому же SFR-адресу.
AUXR1. Регистр, переключающий SPI-функцию с порта P1 на порт P4 (SFR-адрес A2h, биты этого регистра недоступны в адресном пространстве бит).
Бит
7
6
5
4
3
2
1
0
Имя
-
PCA_P4
SPI_P4
S2_P4
GF2
ADRJ
-
DPS
SPI_P4. Выбирает альтернативную функцию SPI.
0: значение по умолчанию. Функция SPI работает на ножках P1[7:4]. 1: функция SPI переводится с ножек P1[7:4] на ножки P4[3:0]. SCLK переводится с P1.7 на P4.3, MOSI переводится с P1.6 на P4.2, MISO переводится с P1.5 на P4.1, SS переводится с P1.4 на P4.0.
Регистры, которые относятся к прерыванию SPI: IE, IE2 (разрешение прерывания), IP2 и IP2H (настройка уровня приоритета).
Подробнее про режимы SPI, его регистры, схемы подключения и примеры кода см. даташит STC12C5A60S2-en.pdf [2].
[IAP / EEPROM]
ISP. Технология ISP в серии STC12C5A60S2 дает возможность обновлять программу приложения в памяти микроконтроллера, а также энергонезависимые данные (в памяти IAP) без необходимости извлекать чип MCU из конечного рабочего устройства. Это полезная возможность для обновления программы прямо на месте у заказчика (конечного потребителя устройства). Обратите внимание, что для работы ISP требуется наличие заранее запрограммированной программы загрузчика в памяти ISP. Обычно пользователю не требуется ничего знать о том, как работает ISP, потому что компания STC предоставляет специальное стандартное программное обеспечение ISP (утилита STC-ISP.exe [2]) вместе со встроенным кодом ISP в поставляемых образцах микроконтроллеров STC. Однако чтобы разработать годное программное обеспечение для функции ISP, от пользователя требуется понимание архитектуры встроенной памяти flash.
Встроенная память flash поделена на 16 страниц. Каждая из них содержит 512 байт. Работая с flash на запись, пользователь должен предварительно стереть страницу целиком перед тем, как записать (запрограммировать) данные на неё. Стирание памяти flash означает, что все байты её содержимого становятся равными FFh. Для этого чипа имеется 2 режима стирания - один стирает все страницы сразу (mass mode), и другой позволяет стирать страницы по одной (page mode). Mass mode стирает быстрее, чем однако page mode, однако page mode позволяет более гибко управлять энергонезависимой памятью. В отличие от памяти RAM, которая работает на чтение и запись в режиме реального времени, стирание flash или её запись (программирование) занимает больше времени на ожидание окончания процесса.
Кроме того процедура выдерживания интервалов времени для стирания/программирования довольно сложная. К счастью, серия STC12C5A60S2 имеет удобный механизм, помогающий пользователю читать и менять содержимое памяти flash. Процесс заключается в том, что заполняются адрес и данные в несколько SFR-регистров, и срабатывает внутренний автомат ISP, что позволяет пользователю проще стирать, читать и программировать встроенную память flash.
IAP. Функция программирования памяти из кода приложения (In-Application Program, сокращенно IAP) разработана для чтения/записи энергонезависимых данных flash. Это может сильно помочь в хранении параметров приложения, чтобы они сохранялись между циклами выключения и включения питания, так что не нужно применять для этой цели дополнительные внешние микросхемы EEPROM. Другими словами, пользователь может сохранить некие данные в памяти flash, и затем выключить питание MCU или перезагрузить его, и после этого получить оригинальные сохраненные значения.
Пользователь может программировать данные flash таким же способом, каким записывает программу по технологии ISP. Для программирования из кода приложения нужно понимать назначение SFR-регистров IAP_DATA, IAP_ADDRL, IAP_ADDRH, IAP_CMD, IAP_TRIG и IAP_CONTR.
SFR для IAP / EEPROM. В таблице показаны регистры, которые связаны с функциями IAP/ISP/EEPROM. Все эти регистры доступны из приложения пользователя.
Символ
Описание регистра
Адрес
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
SMOD
SMOD0
LVDF
POF
GF1
GF0
PD
IDL
00110000b
IAP_DATA, регистр данных ISP/IAP (содержимое этого регистра недоступно в битовом адресном пространстве). Это порт данных для функционирования ISP/IAP. Данные, которые приложение записало в IAP_DATA, будут записаны по нужному адресу операцией записи ISP/IAP, и этот регистр таже работает как окно данных для операции чтения ISP/IAP.
IAP_ADDRH и IAP_ADDRL, регистры адреса Flash ISP/IAP (содержимое этих регистров недоступно в битовом адресном пространстве). IAP_ADDRH это старший байт адреса для всех режимов ISP/IAP. Биты IAP_ADDRH[7:5] должны быть очищены в 000, и если один из этих бит будет установлен, то операция записи IAP_ADDRH[7:5] должна завершиться неудачно. IAP_ADDRL это младший байт адреса для всех режимов ISP/IAP. При стирании страницы этот регистр игнорируется.
IAP_CMD, регистр команды ISP/IAP (содержимое этого регистра недоступно в битовом адресном пространстве).
Бит
7
6
5
4
3
2
1
0
Имя
-
-
-
-
-
-
MS1
MS0
B7..B2. Эти биты зарезервированы.
MS1, MS0. Определяет выбор рабочего режима ISP/IAP. Таким образом, IAP_CMD используется для выбора режима flash для выполнения разных функций ISP/IAP, или используется для доступа к защищенным SFR-регистрам.
00: Standby (система ISP/IAP не используется). 01: чтение Flash/EEPROM. 10: программирование данных Flash/EEPROM. 11: очистка страницы данных Flash/EEPROM.
IAP_TRIG, регистр запуска операции IAP_TRIG (содержимое этого регистра недоступно в битовом адресном пространстве). IAP_TRIG порт команды, который работает как триггер активности ISP/IAP и защищенного доступа к SFR-регистрам. Если IAP_TRIG заполнен последовательностью байт 0x5Ah, 0xA5h, и если IAPEN(IAP_CONTR.7) = 1, то запускается активность ISP/IAP, или разрешается доступ к защищенным регистрам SFR.
IAP_CONTR, регистр управления ISP/IAP (содержимое этого регистра недоступно в битовом адресном пространстве).
Бит
7
6
5
4
3
2
1
0
Имя
IAPEN
SWBS
SWRST
CMD_FAOL
-
WT2
WT1
WT0
IAPEN. Бит разрешения работы ISP/IAP.
0: общий запрет всех функций ISP/IAP (операции program/erase/read запрещены). 1: разрешение функций программирования/очистки/чтения ISP/IAP.
SWBS. Управление выбором программной загрузки (software boot selection control).
0: после сброса произойдет загрузка из основной памяти. 1: после сброса произойдет загрузка из памяти ISP (программа загрузчика).
SWRST. Управление срабатыванием программного сброса.
0: нет операции. 1: генерируется программный сброс системы (software system reset). Этот бит очистится автоматически аппаратурой после завершения сброса.
CMD_FAIL. Флаг сбоя операции ISP/IAP.
0: последняя команда ISP/IAP завершилась успешно. 1: последняя команда ISP/IAP потерпела неудачу. Причина этого может быть в том, что доступ к памяти flash был запрещен.
B3. Этот бит зарезервирован. Программа должна записать сюда 0, когда записывается регистр IAP_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
Примечание: действие программного сброса вызовет сброс других SFR, но никак не повлияет на биты IAPEN и SWBS. Биты IAPEN и SWBS будут очищены только действием сброса по включению питания (power-up reset, POR), но не программным сбросом.
Внимание: когда рабочее напряжение слишком мало, функция EEPROM / IAP должна быть запрещена. Для определения пониженного напряжения может использоваться бит LVDF регистра PCON и ножка детектора пониженного напряжения LVD.
PCON (регистр управления питанием, SFR-адрес 87h)
Бит
7
6
5
4
3
2
1
0
Имя
SMOD
SMOD0
LVDF
POF
GF1
GF0
PD
IDL
LVDF. Это флаг вывода детектора низкого напряжения, Low-Voltage Detector Flag. Как только детектор определит недопустимое снижение напряжения (напряжение питания, прошедшее через делитель, см. схему ниже, опустилось ниже порога LVD), этот бит установится аппаратно, в результате чего может сработать прерывание, если оно было разрешено. Этот флаг должен быть очищен программно (также этот флаг аппаратно установится и при включении питания, и также должен быть в этом случае сброшен программно, чтобы можно было дальше использовать детектирование понижения напряжения).
Если вся система питается от сети 220V переменного тока через адаптер, который выдает постоянное напряжения, то схема подключения детектора пониженного напряжения может быть примерно такая:
Если используется обычный линейный стабилизатор 7805, то для него минимальное входное напряжение, при котором он еще может стабилизировать, составляет 8.5V. По этому напряжению резисторы делителя R1 и R2 должны быть рассчитаны так, чтобы при снижении напряжения на входе 7805 ниже 8.5V напряжение на выходе делителя опускалось ниже порога LVD. Программа может определить момент недопустимого падения напряжения либо периодически опрашивая флаг LVDF, либо используя для этого прерывание. При первом включении питания программа должна сбросить флаг LVDF, и после этого прочитать его снова. Если в процессе работы было определено, что флаг LVDF находится в лог. 1, то это может означать пониженное напряжения, и тогда нужно немедленно сохранить пользовательские данные. После того, как сохранение было завершено, проверка LVDF продолжается. Если LVDF все еще в состоянии лог. 1, то программа ждет, пока не восстановится напряжение, и если LVDF в лог. 0, то можно продолжить выполнять нормальный рабочий алгоритм кода.
Внимание: у других моделей серий STC12xx могут отличаться SFR-адреса регистров управления IAP/ISP.
[Выбор микроконтроллеров серий STC12C5xx по размеру EEPROM]
STC12C2052. У микроконтроллеров серии STC12C2052AD адрес Data Flash (внутреннее EEPROM) и адрес пространства программ разделены: если выполняется действие по IAP-записи сектора flash программы, то этот оператор команды игнорируется, и программа перейдет к выполнению следующей инструкции. Программа пользователя в области приложения (область AP), может работать функциями IAP/ISP только для памяти Data Flash (EEPROM).
Микроконтроллеры STC12C5052AD и STC12LE5052AD являются исключением, здесь программа пользователя может модифицировать свою же секцию памяти AP.
Тип
EEPROM, байт
Секторов
Начальный адрес
Конечный адрес
Серия STC12Cxx52AD (5V питание), STC12LExx52AD (3.3V питание)
1052AD
10K
20
0000h
27FFh
2052AD
10K
20
3052AD
10K
20
4052AD
10K
20
5052AD
-
10
STC12C5A60S2. У микроконтроллеров серии STC12C5A60S2 адрес Data Flash (внутреннее EEPROM) и адрес пространства программ разделены: если выполняется действие по IAP-записи сектора flash программы, то этот оператор команды игнорируется, и программа перейдет к выполнению следующей инструкции. Программа пользователя в области приложения (область AP), может работать функциями IAP/ISP только для памяти Data Flash (EEPROM).
Тип
EEPROM, байт
Секторов
Начальный адрес
Конечный адрес
Серия STC12C5AxxS2, STC12C5AxxAD, STC12C5AxxPWM (5V питание)
STC12C5A08
8K
16
0000h
1FFFh
STC12C5A16
8K
16
1FFFh
STC12C5A20
8K
16
1FFFh
STC12C5A32
28K
56
6FFFh
STC12C5A40
20K
40
4FFFh
STC12C5A48
12K
24
2FFFh
STC12C5A52
8K
16
1FFFh
STC12C5A56
4K
8
0FFFh
STC12C5A60
1K
2
03FFh
IAP12C5A62
IAP
124
F7FFh
Серия STC12LE5AxxS2, STC12LE5AxxAD, STC12LE5AxxPWM (3.3V питание)
STC12LE5A08
8K
16
0000h
1FFFh
STC12LE5A16
8K
16
1FFFh
STC12LE5A20
8K
16
1FFFh
STC12LE5A32
28K
56
6FFFh
STC12LE5A40
20K
40
4FFFh
STC12LE5A48
12K
24
2FFFh
STC12LE5A52
8K
16
1FFFh
STC12LE5A56
4K
8
0FFFh
STC12LE5A60
1K
2
03FFh
IAP12LE5A62
IAP
124
F7FFh
У микроконтроллеров IAP12C5A60S2 и IAP12LE5A60S2 блоки ADC и PWM исключены, и некоторые типы MCU могут менять данные в области кода приложения.
Подробнее про алгоритмы работы с ISP/IAP, примеры кода см. даташит STC12C5A60S2-en.pdf [2].
[Руководство по средствам программирования серии STC12C5xx]
Принцип программирования 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.
Вывод ALE традиционных 8051 выводит сигнал частоты независимо от активности по внешней памяти XDATA, что обычно использовалось для получение частоты, равной 1/12 от системной тактовой частоты. Этот сигнал может давать ненужные помехи в системе. По этой причине в MCU компании STC добавлена функция разрешения/запрета работы ALE, что снижает электромагнитные помехи от MCU и повышает стабильность и надежность работы системы. Если нужно получить сигнал тактовой частоты для других периферийных устройств, то кроме вывода ALE можно использовать генерацию на выводах CLKOUT0/P3.4, CLKOUT1/P3.5, CLKOUT2/P1.0 или XTAL2 (если используется выход XTAL2, то рекомендуется снимать сигнал тактовой частоты с него через подключенный последовательно резистор 200 ом).
Процесс программирования по шагам с помощью утилиты 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).
8. Кликните на кнопку "ISP programming" или "Re-Programming" для загрузки кода программы пользователя.
9. Подайте питание на программируемый MCU. Код программы пользователя должен загрузиться.
Примечание: нужно сначала нажать на кнопку "ISP programming" или "Re-Programming", и только потом подать питание на MCU, иначе код не сможет загрузиться.
[Компиляторы и эмуляторы]
Компилятор с языка 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, квази-двунаправленный режим)
150
230
-
μ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.2
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, квази-двунаправленный режим)
40
70
-
μ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 серией STC12]
Примечание: в этих рекомендациях по замене производится сравнение серии микроконтроллеров STC12C5A60S2 с серией STC89xx [3], потому что серия STC89xx максимально совместима с традиционными MCU архитектуры 8051.
Таймеры/счетчики, вычисление задержек. У MCU серии STC12C5Axx Timer0/Timer1 полностью совместимы с традиционным 8051 MCU. После сброса при включении питания источником тактирования таймеров по умолчанию будет частота тактов MCU поделенная на 12, и генератором скорости для UART будет Timer1. Добавлен независимый генератор скорости, который позволяет сохранить Timer2 в системе 8052. Скорость выполнения инструкции быстрее традиционного 8051 в 8..12 раз в одинаковых рабочих условиях, так что этот факт должны учитывать подпрограммы задержки.
ALE. У традиционных 8051 на вывод ALE выводится частота, равная 1/6 от системной тактовой частоты, что иногда использовалось как тактовая частота для различных устройств в системе. Если запретить вывод генерацию тактов на ALE, то при необходимости Вы можете получить аналогичную тактовую частоту с выводов CLKOUT0 (P3.4), CLKOUT1 (P3.5), CLKOUT2 (P1.0), или SYSclk (XTAL2). Для вывода частоты с XTAL2 рекомендуется использовать последовательно подключенный резистор 200 ом.
В системах, использующих традиционные 8051, частота на выводе ALE служила источником высокочастотных помех. MCU серии STC89xx для устранения этой проблемы имеют специальный бит ALEOFFF в регистре AUXR. В то же время серия STC12C5Axx MCU напрямую запрещает выдавать частоту 1/6 от системной на вывод ALE, так что проблема генерации помех исключается. Ниже для сравнения показаны регистры AUXR серии STC89xx и серии STC12C5A60S2.
Регистр AUXR серии STC89xx (SFR-адрес 8Eh, значение после сброса xxxxxx00b):
Бит
7
6
5
4
3
2
1
0
Имя
-
-
-
-
-
-
EXTRAM
ALEOFF
Регистр AUXR серии STC12C5A60S2 (SFR-адрес 8Eh, значение после сброса 00000000b):
Бит
7
6
5
4
3
2
1
0
Имя
T0x12
T1x12
UART_M0x6
BRTR
S2SMOD2
BRTx12
EXTRAM
S1BRS
PSEN. Традиционные 8051 выполняют программу из внешней памяти с участием сигнала PSEN, однако в концепции серии STC12C5A60S2 в кристалл MCU интегрирована память программ большой емкости, что обычно устраняет необходимость расширения памяти программ. Поэтому у серии STC12C5A60S2 сигнала PSEN нет (доступ к внешней памяти программ отсутствует в принципе), и вывод ножки PSEN можно использовать как дополнительный порт GPIO.
GPIO в квази-двунаправленном режиме. Доступ к вводу/выводу у традиционных 8051 (определение перехода сигнала на входе или чтение состояния) занимает время 12 тактов системной частоты, в то время как серия STC12C5A60S2 требует для этого только 4 тактов. Когда Вам нужно прочитать уровень внешнего сигнала, то на традиционном 8051 одна такая процедура займет 12 тактов, но на MCU серии STC12C5A60S2 это займет 4 такта, так что чтобы скомпенсировать время обработки чтения (если это необходимо), то следует добавить нужное количество команд NOP (обычно достаточно 1..2 команды NOP).
Порт P4. У микроконтроллеров STC12C5A60S2 интегрирован порт P4 (ножки GPIO P4.7-P4.0), и он программно доступен по адресу C0h. Также отсутствуют расширенные сигналы прерываний INT2/INT3. Этим STC12C5A60S2 отличается от серии STC89 (у MCU серии STC89 имеется половинка порта P4, ножки GPIO P4.3-P4.1, доступные по адресу E8H, и имеются расширенные сигналы прерываний INT2/INT3).
Совместимость по нагрузочной способности GPIO. Ножки портов серии STC12C5A60S2 могут коммутировать ток 20 mA, и могут выдерживать этот ток длительное время без каких-либо последствий. Ножки портов серии STC89xx могут коммутировать ток только до 6 mA. Для приложений, где требуется высокая нагрузочная способность выходов портов, рекомендуется использовать MCU серии STC12C5A60S2.
Сторожевой таймер (WatchDog Timer, WDT). У MCU серии STC12C5A60S2 регистр управления сторожевого таймера (WDT_CONTR) находится по другому адресу C1H, и добавлен флаг сброса сторожевого таймера (WDT_FLAG). Ниже для сравнения показаны регистры WDT_CONTR серий STC89xx и STC12C5A60S2.
Регистр 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 серии STC12C5A60S2 (SFR-адрес C1h, значение после сброса xx000000b):
Бит
7
6
5
4
3
2
1
0
Имя
-
-
EN_WDT
CLR_WDT
IDL_WDT
PS2
PS1
PS0
В серии MCU STC12C5A60S2 после обновления ISP сторожевой таймер автоматически разрешается, но так не делается для серии STC89xx, так что серия STC12C5A60S2 более надежно защищена сторожевым таймером.
EEPROM. Таблица SFR-регистров, связанных с EEPROM, показывает различия в адресации серии STC12C5A60S2 от традиционных MCU архитектуры 8051:
Мнемоника
Описание регистра
STC12Cxx
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: для STC12C5A60S2 последовательная запись 5Ah и A5h вызывает срабатывание команды EEPROM flash, и у серии STC89xx последовательность для этой операции другая - 46h и B9h. У серии STC12C5A60S2 память EEPROM начинается с адреса 0000h, но у серии STC89xx это не так.
Тактовый генератор. У MCU серии STC12C5A60S2 есть опциональная возможность использовать внутренний RC-генератор. Обычно заводская установка для MCU в корпусе на 40/44 вывода подразумевает использование генератора на основе внешнего кварца, и для корпусов 16/18/20 выводов установка по умолчанию использует внутренний RC-генератор. С помощью утилиты STC-ISP.exe пользователь может выбрать, какой тип генератора используется. Для серии STC89xx нет возможности использовать внутренний RC-генератор, выводы XTAL1 и XTAL2 должны оставаться не подключенными, потому что используются для организации тактирования (либо с помощью внешнего кварцевого резонатора, либо с помощью внешнего генератора).
Если для STC12C5A60S2 Вам нужно использовать внутренний RC-генератор, то выводы XTAL1 и XTAL2 должны оставаться не подключенными. Если используется внешний активный генератор тактов, то вывод XTAL1 работает как вход тактовой частоты, а вывод XTAL2 должен оставаться не подключенным.
Энергопотребление, питание. Потребляемый системой ток имеет 2 составляющие: схема усилителя кварцевого генератора и цифровые узлы. Серия STC12C5A60S2 потребляет меньше энергии, чем серия STC89xx. Для цифровых схем чем выше тактовая частота, тем больше энергопотребление. Серия STC12C5A60S2 выполняет инструкции на том же рабочем окружении в 3..24 раза быстрее, чем серия STC89xx, поэтому если Вам нужна повышенная эффективность по потребляемой энергии, то требуемая частота (и соответственно потребление тока) для серии STC12C5A60S2 будет меньше, чем у серии STC89xx MCU.
Для фильтрации помех и развязки по питанию между VCC и GND должен быть предусмотрен электролитический конденсатор 47 мкф и параллельно ему подключенный керамический конденсатор 0.1 мкф.
Пробуждение из режима глубокого сна (PowerDown Wakeup). Серия STC12C5A60S2 MCU поддерживает выход из по низкому уровню или по спаду уровня, в зависимости от режима работы внешнего прерывания, но серия STC89xx поддерживает выход из сна только по низкому уровню. Дополнительно у STC12C5Axx имеется опциональная задержка при переходе из режима power-down (отключение, вход в сон) в wake-up (пробуждение): 32768, 16384, 8192 или 4096 тактов.
Схема сброса. Если тактовая частота системы меньше 12 МГц, то внешняя схема сброса не требуется. Вывод сброса может быть подключен к GND либо напрямую, либо через резистор 1 кОм. Но при разработке печатной платы рекомендуется разводить RC-цепочку для сброса, даже если впоследствии она не будет использоваться.
Есть два выпрямителя с контролерами на 12C5410AD разных ревизий. Пины для программирования выведены на плате. Необходимо считать прошивки из обоих, сравнить их, если разные, то залить более свежую ревизию в более раннюю. Как это правильно сделать? Утилиту скачал, USB-UART TTL переходник есть.
Вопрос вот все рассказали про STC12C5A60s2, но ни где не сказано, какая среда требуется для работы с этим контроллером. Практически к каждой серии и типов контроллеров разработчик предлагает своё программное обеспечение. А какая среда нужна для этого контроллера? Так как есть только программатор, но про симулятор и компилятор ничего не сказано. Подскажите пожалуйста, с чего надо начинать, что скачать, что установить?
microsin: для написания кода можете использовать текстовый редактор Блокнот, Notepad2, Notepad+, или любой другой редактор plain-текста. В качестве компилятора можно использовать любой компилятор для платформы MCS51. Обычно это Keil μVision, IAR Embedded Workbench, SDCC. Если раньше не слышали про эти инструменты, то прогуглите. В качестве среды разработки мне очень нравится Visual Studio. Про аппаратный отладчик и специально заточенный эмулятор мне ничего неизвестно, к сожалению. Как вариант, можно писать код по принципу - написал-попробовал, а отлаживаться с помощью сообщений в последовательной консоли UART и/или светодиода. Как стартовую точку возьмите любой готовый проект с исходным кодом, научитесь его компилировать, прошивать и запускать на живом MSU STC.
Комментарии
microsin: для написания кода можете использовать текстовый редактор Блокнот, Notepad2, Notepad+, или любой другой редактор plain-текста. В качестве компилятора можно использовать любой компилятор для платформы MCS51. Обычно это Keil μVision, IAR Embedded Workbench, SDCC. Если раньше не слышали про эти инструменты, то прогуглите. В качестве среды разработки мне очень нравится Visual Studio. Про аппаратный отладчик и специально заточенный эмулятор мне ничего неизвестно, к сожалению. Как вариант, можно писать код по принципу - написал-попробовал, а отлаживаться с помощью сообщений в последовательно й консоли UART и/или светодиода. Как стартовую точку возьмите любой готовый проект с исходным кодом, научитесь его компилировать, прошивать и запускать на живом MSU STC.
RSS лента комментариев этой записи