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