В микроконтроллере 1986ВЕ1Т реализован так называемый режим StandAlone. Это режим, в котором остаются активны только периферийные блоки Ethernet и ГОСТ Р 52070-2003 (он же MIL-STD-1553, он же МКИО). Все остальные блоки, включая ядро, отключаются и не тактируются.
По сути, микроконтроллер становится интерфейсной микросхемой, в которой через внешнюю шину можно обратиться к регистрам и памяти блоков Ethernet и МКИО. Образно говоря, если в обычном режиме микроконтроллер сам обращается к блокам и реализует тот или иной функционал, то в случае StandAlone вместо него это делает какое-то внешнее устройство - например, микроконтроллер, у которого таких блоков нет.
Доступ к блокам осуществляется по внешней шине, которая в режиме StandAlone работает в ведомом режиме. То есть адрес и управляющие сигналы nCE, nWR и т.д. читаются, а не выставляются на шину как в обычном режиме работы МК. Адресная шина в режиме StandAlone 13-битная, поэтому на шину адреса необходимо подавать смещения регистров блока относительно базового адреса. Например, для обращения к регистру CONTORL блока МКИО на шину необходимо подать адрес 0х1000 (см. спецификация - Описание регистров блока ГОСТ Р 52070-2003).
Выбор же самого периферийного блока (базовый адрес), к которому идет обращение, задается внешними сигналами:
Блок | Канал | ITCMLAEN | nCE1 | nCE2 |
---|---|---|---|---|
Ethernet | - | 1 | x | x |
МКИО | MIL-STD-1553B1 | 0 | 0 | 1 |
MIL-STD-1553B2 | 0 | 1 | 0 |
Прерывания от обоих блоков МКИО выводятся наружу, когда выбран активным хотя бы один блок МКИО, т.е. один из nCEх = 0. Сигналы прерываний не выводятся наружу, только если nCE1=nCE2=1.
В спецификации представлена таблица выводов, активных в режиме StandAlone - "Таблица 3 – Описание выводов микроконтроллера в режиме StandAlone в металлокерамическом корпусе". Она представлена в разделе "3 - Описание Выводов", а не в разделе про StandAlone. Размещение не вполне очевидное и по этой причине информация о выводах часто остается не замеченной при знакомстве с режимом StandAlone. В этой таблице указано, какими выводами выбирается активный блок, на какие пины выдается сигнал прерывания от блоков и т.д.
Необходимо обратить внимание, что выводы, указанные в таблице 3, настраиваются аппаратно при входе в StandAlone. Т.е. никакой программной настройки и назначения выводов GPIO не требуется.
Как видно из той-же таблицы 3, разрядность шины данных определяется тем, какой блок активен.
В ранних ревизиях 1986ВЕ1Т блок МКИО имел в регистре CONTROL только 19 бит, поэтому шина данных была "растянута" до 19 бит. Биты в остальных регистрах блока МКИО не выходят за пределы 16-ти разрядов. Это же относится и к блоку Ethernet, в нем все регистры вообще 16-ти разрядные. С 6-й ревизии МК появились дополнительные биты в регистре CONTROL, доступ к которым по 19-ти битной шине невозможен. Данные биты необходимо настраивать до входа в режим StandAlone. Stick биты так-же не доступны в StandAlone режиме.
В целом, работа с блоками производится аналогично тому, как это производится самим контроллером в обычном режиме. Через регистры производится настройка, а по прерываниям, которые также выведены на внешние выводы, необходимо обрабатывать те или иные события блоков. Но необходимо учитывать, что шина доступа имеет ограничение по скорости. Скорость работы внешней шины ограничена 50МГц.
В частности, это относится к блоку МКИО в котором до 6-й ревизии не было "защелкивания" флагов случившихся событий. Т.е. можно пропустить выставление и сброс какого-либо флага, пока происходит вход и обработка прерывания. С 6-й версии микроконтроллера, такие "статические" флаги зафиксированных событий были добавлены.
Как определить ревизию см. - "Определение ревизии микроконтроллера"
Вход в режим StandAlone всегда программный и есть два способа входа в этот режим.
В разделе "9 Загрузочное ПЗУ и режимы работы микроконтроллера" представлены три варианта входа в режим StandAlone из начального загрузчика по уровням, выставленным на выводах MODE[2:0].
MODE[2:0] | Режим | ITCMLAEN | Активный блок |
---|---|---|---|
b001 | StandAlone1 | 1 | Ethernet |
b010 | StandAlone2 | 0 | МКИО |
b011 | StandAlone3 | 0 | МКИО |
1 | Ethernet |
В разделе "18 Режим Stand Alone" как раз приведен тот код, что исполняется в начальном загрузчике, при выборе одного из вариантов MODE. На форуме можно найти исходники начального загрузчика для 1986ВЕ1Т, вот выдержка касающаяся StandAlone:
#define BKP_REG_0E_JTAGA ((uint32_t)0x00000040) #define BKP_REG_0E_JTAGB ((uint32_t)0x00000080) switch ( Mode ) { ... case mode_StandAlone1 : RST_CLK->PLL_CONTROL=0x304; RST_CLK->HS_CONTROL=3; RST_CLK->CPU_CLOCK=0x00000107; RST_CLK->ETH_CLOCK=0x19000000; BKP->REG_0E = (~BKP_REG_0E_JTAGB) & BKP_REG_0E_JTAGA; break; //Instruction is unreachable case mode_StandAlone2 : RST_CLK->PLL_CONTROL=0x904; RST_CLK->HS_CONTROL=1; RST_CLK->CPU_CLOCK=0x00000106; RST_CLK->PER_CLOCK=mask_PCLK_RST_CLK | 0x00000600 | mask_PCLK_BKP; RST_CLK->ETH_CLOCK=0x02000000; BKP->REG_0E = (~BKP_REG_0E_JTAGB) & BKP_REG_0E_JTAGA; break; //Instruction is unreachable case mode_StandAlone3 : { RST_CLK->PLL_CONTROL=0x304; RST_CLK->HS_CONTROL=3; RST_CLK->CPU_CLOCK=0x00000107; RST_CLK->PER_CLOCK = mask_PCLK_RST_CLK | 0x00000600 | mask_PCLK_BKP; RST_CLK->ETH_CLOCK=0x1B000000; BKP->REG_0E = (~BKP_REG_0E_JTAGB) & BKP_REG_0E_JTAGA; break; //Instruction is unreachable } .... }
Как видно, код аналогичен тому, что приведен в спецификации. Конечно, за исключением того, что использованы неправильные названия битов. Т.е. BKP_REG_0E_JTAGA - это бит 6 регистра BKP_REG_0E, и в спецификации он назван Stand_Alone. (Судя по всему, за основу был взят код от серии МК 1986ВЕ9х, где действительно два интерфейса Jtag, и 6-й бит это и есть разрешение интерфейса JtagA).
Кроме этого, по комментариям в коде видно, что после выставления 6-го бита в регистре BKP_REG_0E микроконтроллер переходит в режим StandAlone. При этом ядро выключается и команды более не исполняются. По этой причине в комментариях указано - "Instruction is unreachable".
Кроме входа из загрузчика, ничто не мешает осуществить тот же вход в StandAlone из пользовательской программы в любое удобное для пользователя время. Этот подход более гибкий и позволяет перед входом в StandAlone осуществить дополнительные настройки доступной периферии. Выбор, правда, здесь не велик. Как следует из спецификации, можно использовать блок PLL и вместо резонатора на HSE осуществить настройку на использование внешнего генератора, то есть включить режим byPass.
Спецификация умалчивает, можно ли заранее настроить сами блоки Ethеrnet и МКИО. И не произойдет ли сброс регистров при входе в StandAlone. Это наверное было бы удобно, ведь внешнему устройству не пришлось бы потом прописывать регистры снаружи по внешней шине для инициализации блоков. С другой стороны, если внешнему устройству необходимо уметь переинициализировать блоки Ethеrnet и МКИО, осуществлять из сброс и т.д., то настройка блоков все равно должна быть реализована снаружи.
При работе с режимом StandAlone проявилась интересная особенность. Оказалось, что при входе под отладчиком в режим StandAlone, ядро остается активным. Вероятно, наличие подключенного отладчика не дает ядру отключиться и уйти в режим Sleep. Косвенное подтверждение этому можно найти у ARM, чье ядро Cortex-M1 служило прототипом для 1986ВЕ1Т - ARM Info Center.
Debug Port
The Debug Port is the ARM CoreSight component that connects to an external debug interface. The ARM Cortex-M1 processor is supplied with a Serial Wire JTAG Debug Port (SWJ-DP). The debug port can wake the processor from a sleep state by using the power-up handshake signals that are part of the ARM Debug Interface v5 Architecture Specification.
Принципиально, данную особенность можно использовать для того чтобы выяснить, сбрасываются ли настройки блоков Ethеrnet и МКИО при входе в StandAlone. Т.е. можно попробовать проинициализировать регистры, а затем по шагам в отладчике пройти вход в StandAlone и проверить состояние регистров. Если значения не изменились, то сброса блоков не происходит.