Содержание

Режим 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, разрядность шины данных определяется тем, какой блок активен.

В ранних ревизиях 1986ВЕ1Т блок МКИО имел в регистре CONTROL только 19 бит, поэтому шина данных была "растянута" до 19 бит. Биты в остальных регистрах блока МКИО не выходят за пределы 16-ти разрядов. Это же относится и к блоку Ethernet, в нем все регистры вообще 16-ти разрядные. С 6-й ревизии МК появились дополнительные биты в регистре CONTROL, доступ к которым по 19-ти битной шине невозможен. Данные биты необходимо настраивать до входа в режим StandAlone. Stick биты так-же не доступны в StandAlone режиме.

В целом, работа с блоками производится аналогично тому, как это производится самим контроллером в обычном режиме. Через регистры производится настройка, а по прерываниям, которые также выведены на внешние выводы, необходимо обрабатывать те или иные события блоков. Но необходимо учитывать, что шина доступа имеет ограничение по скорости. Скорость работы внешней шины ограничена 50МГц.

В частности, это относится к блоку МКИО в котором до 6-й ревизии не было "защелкивания" флагов случившихся событий. Т.е. можно пропустить выставление и сброс какого-либо флага, пока происходит вход и обработка прерывания. С 6-й версии микроконтроллера, такие "статические" флаги зафиксированных событий были добавлены.

Как определить ревизию см. - "Определение ревизии микроконтроллера"

Вход в режим StandAlone

Вход в режим StandAlone всегда программный и есть два способа входа в этот режим.

  1. Вход из Bootloader при задании соответствующих выводов MODE[2:0].
  2. Вход из пользовательской программы.

Аппаратный вход в 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Т - 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 и проверить состояние регистров. Если значения не изменились, то сброса блоков не происходит.