======Режим StandAlone в 1986ВЕ1Т======
В микроконтроллере 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, разрядность шины данных определяется тем, какой блок активен.
* Шина адреса: 13-бит
* Шина данных:
* 16 бит для Ethernet
* 19 бит для МКИО
В ранних ревизиях 1986ВЕ1Т блок МКИО имел в регистре CONTROL только 19 бит, поэтому шина данных была "растянута" до 19 бит. Биты в остальных регистрах блока МКИО не выходят за пределы 16-ти разрядов. Это же относится и к блоку Ethernet, в нем все регистры вообще 16-ти разрядные. С 6-й ревизии МК появились дополнительные биты в регистре CONTROL, доступ к которым по 19-ти битной шине невозможен. Данные биты необходимо настраивать до входа в режим StandAlone. Stick биты так-же не доступны в StandAlone режиме.
В целом, работа с блоками производится аналогично тому, как это производится самим контроллером в обычном режиме. Через регистры производится настройка, а по прерываниям, которые также выведены на внешние выводы, необходимо обрабатывать те или иные события блоков. Но необходимо учитывать, что шина доступа имеет ограничение по скорости. Скорость работы внешней шины ограничена 50МГц.
В частности, это относится к блоку МКИО в котором до 6-й ревизии не было "защелкивания" флагов случившихся событий. Т.е. можно пропустить выставление и сброс какого-либо флага, пока происходит вход и обработка прерывания. С 6-й версии микроконтроллера, такие "статические" флаги зафиксированных событий были добавлены.
//Как определить ревизию см. - [[doc:doclist:revision|"Определение ревизии микроконтроллера"]]//
=====Вход в режим StandAlone=====
Вход в режим StandAlone всегда программный и есть два способа входа в этот режим.
- Вход из Bootloader при задании соответствующих выводов MODE[2:0].
- Вход из пользовательской программы.
====Аппаратный вход в StandAlone по выводам MODE====
В разделе //"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 из пользовательской программы в любое удобное для пользователя время. Этот подход более гибкий и позволяет перед входом в StandAlone осуществить дополнительные настройки доступной периферии. Выбор, правда, здесь не велик. Как следует из спецификации, можно использовать блок PLL и вместо резонатора на HSE осуществить настройку на использование внешнего генератора, то есть включить режим byPass.
Спецификация умалчивает, можно ли заранее настроить сами блоки Ethеrnet и МКИО. И не произойдет ли сброс регистров при входе в StandAlone. Это наверное было бы удобно, ведь внешнему устройству не пришлось бы потом прописывать регистры снаружи по внешней шине для инициализации блоков. С другой стороны, если внешнему устройству необходимо уметь переинициализировать блоки Ethеrnet и МКИО, осуществлять из сброс и т.д., то настройка блоков все равно должна быть реализована снаружи.
При работе с режимом StandAlone проявилась интересная особенность. Оказалось, что при входе под отладчиком в режим StandAlone, ядро остается активным. Вероятно, наличие подключенного отладчика не дает ядру отключиться и уйти в режим Sleep. Косвенное подтверждение этому можно найти у ARM, чье ядро Cortex-M1 служило прототипом для 1986ВЕ1Т - [[http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0216a/index.html|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 и проверить состояние регистров. Если значения не изменились, то сброса блоков не происходит.