|
Информационный портал технической поддержки Центра проектирования интегральных микросхем |
После включения питания или после любого сигнала сброса МК К1986ВЕ8Т начинает выполнять загрузочную программу, которая по состоянию выводов MODE[7:0] (PE[31:24]) определяет, в каком из режимов будет функционировать МК. Полный список режимов работы МК приведён в спецификации, пункт «Режимы работы микроконтроллера». В данной статье будут рассмотрены режимы запуска МК из внешней памяти: EXTBUS_8_ECC и EXTBUS_CFG.
В составе МК реализован контроллер внешней шины (EXTBUSCNTR), который позволяет выполнять программу непосредственно из внешней памяти, т.е. позволяет микроконтроллеру работать в режиме микропроцессора. В загрузочной программе для этого предназначены 4 режима работы, приведённые в таблице 1.
Таблица 1 - Режимы работы МК для выполнения программы из внешней памяти|
Биты ЕСС MODE[7:4] |
Биты режима MODE[3:0] |
Режим |
Краткое описание |
|
1100 |
0011 |
EXTBUS_8_ECC+JB |
Запуск из внешней памяти с (0x1000_0000), сконфигурированной в минимальный режим: - шина данных D[7:0] ( {PE[5:0], PD[31:30]} ); - шина адреса A[15:0] ( {PD[13:0], PC[31:30]} ); - сигнал OEn[0] ( PD[23] ) c последовательной организацией ECC с базового адреса 0x1000_9000 с включенным интерфейсом отладки через выводы JTAG_B. |
|
1101 |
0100 |
EXTBUS_8_ECC+JA |
Запуск из внешней памяти с (0x1000_0000), сконфигурированной в минимальный режим: - шина данных D[7:0] ( {PE[5:0], PD[31:30]} ); - шина адреса A[15:0] ( {PD[13:0], PC[31:30]} ); - сигнал OEn[0] ( PD[23] ) с последовательной организацией ECC с базового адреса 0x1000_9000 с включенным интерфейсом отладки через выводы JTAG_A.
|
|
1010 |
0101 |
EXTBUS_CFG+JB |
Запуск из внешней памяти с (0x1000_0000) c чтением конфигурации в режиме: - шина данных D[7:0] ( {PE[5:0], PD[31:30]} ); - шина адреса A[10:3] ( {PD[8:1]} ); - сигнал OEn[0] ( PD[23] ).
Читается DATA[7:0] = {ECC[3:0], CFGx[3:0]}, где: - CFG0 = Режим запуска (8, 16, 32, 64); - CFG1 = Режим ЕСС (нет, послед., параллельн.); - CFG2 = ECCBASE[3:0]; - CFG3 = ECCBASE[7:4]; … - CFG9 = ECCBASE[31:28] с включенным интерфейсом отладки через выводы JTAG_B.
|
|
0110 |
0110 |
EXTBUS_CFG+JA |
Запуск из внешней памяти с (0x1000_0000) c чтением конфигурации в режиме: - шина данных D[7:0] ( {PE[5:0], PD[31:30]} ); - шина адреса A[10:3] ( {PD[8:1]} ); - сигнал OEn[0] ( PD[23] ).
Читается DATA[7:0] = {ECC[3:0], CFGx[3:0]}, где: - CFG0 = Режим запуска (8, 16, 32, 64); - CFG1 = Режим ЕСС (нет, послед., параллельн.); - CFG2 = ECCBASE[3:0]; - CFG3 = ECCBASE[7:4]; … - CFG9 = ECCBASE[31:28] с включенным интерфейсом отладки через выводы JTAG_A.
|
Дополнение в конце названия режимов EXTBUS_8_ECC и EXTBUS_CFG: «+JA» или «+JB» определяет, через какие выводы: JTAG_A или JTAG_B будет доступен интерфейс отладки.
Описание запуска отладки в режимах EXTBUS_8_ECC и EXTBUS_CFG в среде Keil приведено в статье «[i] Настройка проекта в IDE Keil для запуска К1986ВЕ8Т из внешней ОЗУ К1645РУ5У на отладочной плате».
Режим работы EXTBUS_8_ECC+JA(JB) используется для старта МК из внешней 8-разрядной памяти с использованием последовательного режима ECC.
В данном режиме работы загрузочная программа выполняет настройку контроллера внешней шины и портов ввода-вывода для работы с внешней 8-разрядной памятью.
В контроллере внешней шины настраивается регион 0 (0x1000_0000 - 0x17FF_FFFF) в режим работы с использованием 8-разрядной шины данных D[7:0] и проверкой ECC по коду Хэмминга (72, 64). Сигнал готовности READY и синхросигнал OCLK не используются. Проверочные биты ECC располагаются последовательно в самой памяти (последовательная организация ECC), начиная с базового адреса 0x1000_9000.
Временные параметры транзакции на шине устанавливаются в следующие значения: WS_HOLD[3:0] = 0x4, WS_SETUP[3:0] = 0x4, WS_ACTIVE[7:0] = 0x7F. При необходимости временные параметры могут быть изменены в ходе выполнения программы, подробнее об этом описано в пункте «4. Изменение параметров работы внешней шины».
В контроллере портов ввода-вывода настраивается минимальный набор выводов МК для работы с внешней памятью:
- шина данных D[7:0] ( {PE[5:0], PD[31:30]} );
- шина адреса A[15:0] ( {PD[13:0], PC[31:30]} );
- сигнал чтения данных OEn[0] ( PD[23] ).
Остальные выводы портов ввода-вывода МК, например, сигналы управления CSn[0], CS[0] (разрешение региона) и WEn[0] (запись данных), сигналы шины адреса A[31:16], не инициализируются и находятся по сбросу в режиме аналоговой функции в высокоимпедансном состоянии. Входы микросхемы памяти, которые не подключены к набору выводов МК, инициализируемых загрузочной программой, должны быть доопределены на плате до допустимых логических уровней напряжения с помощью резисторов доопределения.
Так как сигнал чтения данных OEn[0] при запуске МК до конфигурирования находится в высокоимпедансном состоянии, то рекомендуется доопределить сигнал OEn[0] до уровня логической единицы с помощью резистора доопределения во избежание наводок, которые могут привести к ложной выдаче данных микросхемой памяти.
Загрузочная программа конфигурирует только минимальный набор внешней шины, чтобы не ограничивать использование других выводов МК. При необходимости требуемые сигналы внешней шины могут быть сконфигурированы в программе после запуска МК. Подключение микросхемы памяти к МК в режиме EXTBUS_8_ECC+JA(JB) приведено в пункте «5. Подключение внешней памяти к МК».
После окончания инициализации контроллера внешней шины и контроллера портов ввода-вывода загрузочная программа выполняет следующие действия:
- устанавливает адрес указателя стека в значение, считанное из ячейки с адресом 0x1000_0000 (SP);
- устанавливает адрес таблицы векторов в значение 0x1000_0000 (VTOR);
- осуществляет безусловный переход по адресу, считанному из ячейки 0x1000_0004 (RESET_HANDLER).
При выполнении загрузочной программы в специальную структуру, которая располагается в ОЗУ по адресу 0x2000_7FF0, записывается информация об ошибках, которые возникли в процессе загрузки.
Режим работы EXTBUS_CFG+JA(JB) используется для старта МК из внешней памяти, при этом разрядность шины данных (8, 16, 32, 64) и режим ECC (без ECC, последовательный, параллельный) определяются значениями конфигурационных данных CFGx, которые МК считывает в процессе инициализации из внешней памяти по адресам 0x1000_0400, 0x1000_0408, … 0x1000_0448.
В данном режиме работы загрузочная программа выполняет настройку контроллера внешней шины и портов ввода-вывода в два этапа:
1) первоначальная инициализация для считывания конфигурационных значений CFGx;
2) итоговая инициализация в зависимости от считанных конфигурационных значений CFGx.
При первоначальной инициализации загрузочная программа настраивает в контроллере внешней шины регион 0 (0x1000_0000 - 0x17FF_FFFF) для работы с использованием 8-разрядной шины данных D[7:0]. Аппаратная проверка ECC по коду Хэмминга (72, 64), а также сигнал готовности READY и синхросигнал OCLK не используются. Временные параметры транзакции на шине устанавливаются в следующие значения: WS_HOLD[3:0] = 0x4, WS_SETUP[3:0] = 0x4, WS_ACTIVE[7:0] = 0x7F.
В контроллере портов ввода-вывода настраивается минимальный набор выводов МК для работы с внешней памятью:
- шина данных D[7:0] ( {PE[5:0], PD[31:30]} );
- шина адреса A[10:3] ( {PD[8:1]} );
- сигнал OEn[0] ( PD[23] );
- сигнал WEn[0] ( PD[24] ).
Остальные выводы портов ввода-вывода МК, например, сигналы управления CSn[0], CS[0] (разрешение региона) и WEn[0] (запись данных), сигналы шины адреса A[31:11] и A[2:0], не инициализируются и находятся по сбросу в режиме аналоговой функции в высокоимпедансном состоянии. Входы микросхемы памяти, которые не подключены к набору выводов МК, инициализируемых загрузочной программой, должны быть доопределены на плате до допустимых логических уровней напряжения с помощью резисторов доопределения.
Так как сигнал чтения данных OEn[0] при запуске МК до конфигурирования находится в высокоимпедансном состоянии, то рекомендуется доопределить сигнал OEn[0] до уровня логической единицы с помощью резистора доопределения во избежание наводок, которые могут привести к ложной выдаче данных микросхемой памяти.
Загрузочная программа конфигурирует только минимальный набор внешней шины, чтобы не ограничивать использование других выводов МК. При необходимости требуемые сигналы внешней шины могут быть сконфигурированы в программе после запуска МК. Подключение микросхемы памяти к МК в режиме EXTBUS_CFG+JA(JB) приведено в пункте «5. Подключение внешней памяти к МК».
После настройки контроллера внешней шины и портов ввода-вывода из ячеек памяти по адресам 0x1000_0400, 0x1000_0408, … 0x1000_0448 считываются конфигурационные значения с ECC: DATA[7:0] = {ECC[3:0], CFGx[3:0]}, после чего выполняется программный контроль ЕСС. При обнаружении одиночной ошибки загрузочная программа исправляет её, при обнаружении двойной ошибки - формирует программный сигнал сброса, и МК заново начинает выполнение загрузочной программы.
В зависимости от считанных конфигурационных значений CFGx загрузочная программа выполняет итоговую инициализацию контроллера внешней шины и портов ввода-вывода. Конфигурационные значения CFGx имеют следующее назначение:
CFG0 - разрядность шины данных:
- CFG0 = 1 - 8-ми битная шина;
- CFG0 = 2 - 16-ти битная шина;
- CFG0 = 3 - 32-x битная шина;
- CFG0 = 4 - 64-x битная шина.
CFG1 - режим ЕСС:
- CFG1 = 1 - без проверки ECC.
- CFG1 = 2 - последовательная организация ECC. При последовательной организации проверочные биты ECC располагаются непосредственно в самой памяти, начиная с базового адреса расположения ECC. Базовый адрес ECC задаётся значениями CFG9-CFG2.
- CFG1 = 3 - параллельная организация ECC. Допускается только для 32-х и 64-х разрядной шины данных. При параллельной организации проверочные биты ECC располагаются в дополнительных разрядах шины данных: 32 данные + 8 ECC, 64 данные + 16 ECC.
|
DATA[7:0] |
ECC[3:0] |
CFGx[3:0] |
|
0x00 |
0000 |
0000 |
|
0x71 |
0111 |
0001 |
|
0xB2 |
1011 |
0010 |
|
0xC3 |
1100 |
0011 |
|
0xD4 |
1101 |
0100 |
|
0xA5 |
1010 |
0101 |
|
0x66 |
0110 |
0110 |
|
0x17 |
0001 |
0111 |
|
0xE8 |
1110 |
1000 |
|
0x99 |
1001 |
1001 |
|
0x5A |
0101 |
1010 |
|
0x2B |
0010 |
1011 |
|
0x3C |
0011 |
1100 |
|
0x4D |
0100 |
1101 |
|
0x8E |
1000 |
1110 |
|
0xFF |
1111 |
1111 |
Для расположения конфигурационных значений CFGx по требуемым адресам в среде Keil может использоваться атрибут переменной __attribute__((section(".ARM.__at_ADDR"))). В фрагменте кода 1 приведены примеры объявления конфигурационных констант.
Фрагмент кода 1 - Объявления конфигурационных констант в среде Keil
/************************************************************/
#define __ATTR_ADDR(ADDR) __attribute__((section(".ARM.__at_"#ADDR)))
/* 8-ми разрядная шина данных, последовательная организация ECC */
const uint8_t Cfg_0 __ATTR_ADDR(0x10000400) = 0x71; //1 - 8-ми разрядная шина данных
const uint8_t Cfg_1 __ATTR_ADDR(0x10000408) = 0xB2; //2 - последовательная организация ECC
/* Базовый адрес ECC 0x1006_0000 */
const uint8_t Cfg_2 __ATTR_ADDR(0x10000410) = 0x00;
const uint8_t Cfg_3 __ATTR_ADDR(0x10000418) = 0x00;
const uint8_t Cfg_4 __ATTR_ADDR(0x10000420) = 0x00;
const uint8_t Cfg_5 __ATTR_ADDR(0x10000428) = 0x00;
const uint8_t Cfg_6 __ATTR_ADDR(0x10000430) = 0x66;
const uint8_t Cfg_7 __ATTR_ADDR(0x10000438) = 0x00;
const uint8_t Cfg_8 __ATTR_ADDR(0x10000440) = 0x00;
const uint8_t Cfg_9 __ATTR_ADDR(0x10000448) = 0x71;
/************************************************************/
/* 32-х разрядная шина данных, параллельная организация ECC */
const uint8_t Cfg_0 __ATTR_ADDR(0x10000400) = 0xC3; //3 - 32-х разрядная шина данных
const uint8_t Cfg_1 __ATTR_ADDR(0x10000408) = 0xC3; //3 - параллельная организация ECC
/************************************************************/
/* 16-ти разрядная шина данных, без проверки ECC */
const uint8_t Cfg_0 __ATTR_ADDR(0x10000400) = 0xB2; //2 - 16-ти разрядная шина данных
const uint8_t Cfg_1 __ATTR_ADDR(0x10000408) = 0x71; //1 - без ECC
Для расположения конфигурационных значений CFGx по требуемым адресам в среде IAR может использоваться оператор @ совместно с ключевым словом __root. В фрагменте кода 2 приведены примеры объявления конфигурационных констант.
Фрагмент кода 2 - Объявление конфигурационных констант в среде IAR
/************************************************************/
/* 8-ми разрядная шина данных, последовательная организация ECC */
_root const uint8_t Cfg_0 @ 0x10000400 = 0x71; //1 - 8-ми разрядная шина данных
_root const uint8_t Cfg_1 @ 0x10000408 = 0xB2; //2 - последовательная организация ECC
/* Базовый адрес ECC 0x1006_0000 */
_root const uint8_t Cfg_2 @ 0x10000410 = 0x00;
_root const uint8_t Cfg_3 @ 0x10000418 = 0x00;
_root const uint8_t Cfg_4 @ 0x10000420 = 0x00;
_root const uint8_t Cfg_5 @ 0x10000428 = 0x00;
_root const uint8_t Cfg_6 @ 0x10000430 = 0x66;
_root const uint8_t Cfg_7 @ 0x10000438 = 0x00;
_root const uint8_t Cfg_8 @ 0x10000440 = 0x00;
_root const uint8_t Cfg_9 @ 0x10000448 = 0x71;
/************************************************************/
/* 32-х разрядная шина данных, параллельная организация ECC */
_root const uint8_t Cfg_0 @ 0x10000400 = 0xC3; //3 - 32-х разрядная шина данных
_root const uint8_t Cfg_1 @ 0x10000408 = 0xC3; //3 - параллельная организация ECC
/************************************************************/
/* 16-ти разрядная шина данных, без проверки ECC */
_root const uint8_t Cfg_0 @ 0x10000400 = 0xB2; //2 - 16-ти разрядная шина данных
_root const uint8_t Cfg_1 @ 0x10000408 = 0x71; //1 - без ECC
В ходе работы загрузочной программы в контроллере внешней шины устанавливаются следующие временные параметры транзакции на шине: WS_HOLD[3:0] = 0x4, WS_SETUP[3:0] = 0x4, WS_ACTIVE[7:0] = 0x7F. При необходимости в пользовательской программе данные параметры могут быть изменены. Для этого требуется разместить код функции, осуществляющей настройку контроллера внешней шины, во внутреннем ОЗУ, чтобы на момент внесения изменений исполнение программы происходило не из внешней памяти. Пример такой функции приведён во фрагменте кода 3.
Фрагмент кода 3 - Функция настройки временных параметров контроллера внешней шины
void EBC_RGNx_WSConfig(uint32_t RGNx, uint32_t RGN_WS_SETUP, uint32_t RGN_WS_ACTIVE, uint32_t RGN_WS_HOLD)
{
uint32_t tmpreg_CNTRL, *EBC_RGNx_CNTRL_ptr;
/* Check the parameters */
assert_param(IS_EBC_RGNx(RGNx));
assert_param(IS_EBC_RGNx_WS_SETUP(RGN_WS_SETUP));
assert_param(IS_EBC_RGNx_WS_ACTIVE(RGN_WS_ACTIVE));
assert_param(IS_EBC_RGNx_WS_HOLD(RGN_WS_HOLD));
EBC_RGNx_CNTRL_ptr = (uint32_t *)(&EXT_BUS_CNTR->RGN0_CNTRL) + RGNx;
/* Clear WS bits */
tmpreg_CNTRL = *EBC_RGNx_CNTRL_ptr & (~(EBC_WS_SETUP_MSK | EBC_WS_ACTIVE_MSK | EBC_WS_HOLD_MSK));
/* Form new value */
tmpreg_CNTRL |= RGN_WS_SETUP<<EBC_WS_SETUP_pos | RGN_WS_ACTIVE<<EBC_WS_ACTIVE_pos | RGN_WS_HOLD<<EBC_WS_HOLD_pos;
/* Configure CNTRL register with new value */
*EBC_RGNx_CNTRL_ptr = tmpreg_CNTRL;
/* Data Synchronization Barrier */
__DSB();
}
В среде Keil для расположения функции в памяти ОЗУ может использоваться атрибут __attribute__((section(«…»))), который задаётся при объявлении функции. В фрагменте кода 4 приведён пример объявления функции EBC_RGNx_WSConfig() с атрибутом «section» для размещения функции в секции «EXECUTABLE_MEMORY_SECTION».
Фрагмент кода 4 - Объявление функции с атрибутом «section»
void EBC_RGNx_WSConfig(uint32_t RGNx, uint32_t RGN_WS_SETUP, uint32_t RGN_WS_ACTIVE, uint32_t RGN_WS_HOLD) __attribute__((section("EXECUTABLE_MEMORY_SECTION")));
Чтобы секция «EXECUTABLE_MEMORY_SECTION» размещалась в памяти ОЗУ, необходимо отредактировать scatter-файл (конфигурационный файл компоновщика). В scatter-файлы необходимо указать, что секция «EXECUTABLE_MEMORY_SECTION» должна размещаться в ОЗУ, область RW_IRAM1, как показано во фрагменте кода 5.
Фрагмент кода 5 - Scatter-файл. Размещение секции «EXECUTABLE_MEMORY_SECTION» в RW_IRAM1
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x20000000 0x00001000 { ; load region size_region
ER_IROM1 0x20000000 0x00001000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20001000 0x00001000 { ; RW data
*.o (EXECUTABLE_MEMORY_SECTION)
.ANY (+RW +ZI)
}
}
Подробное описание по размещению функций в ОЗУ в среде Keil приведено в статье «[i] Расположение функций в ОЗУ в IDE Keil».
В среде IAR для расположения функции в памяти ОЗУ может использоваться ключевое слово __ramfunc, которое задаётся при объявлении функции. В фрагменте кода 6 приведён пример объявления функции EBC_RGNx_WSConfig() с ключевым словом __ramfunc.
Фрагмент кода 6 - Объявление функции с ключевым словом __ramfunc
__ramfunc void EBC_RGNx_WSConfig(uint32_t RGNx, uint32_t RGN_WS_SETUP, uint32_t RGN_WS_ACTIVE, uint32_t RGN_WS_HOLD);


|
Смещение адресной шины МК, количество разрядов |
Адресация внешней шины (разрядность шины данных) |
|
Нет смещения |
8-ми битная |
|
1 |
16-ти битная |
|
2 |
32-х битная |
|
3 |
64-х битная |
| Сайт: | https://support.milandr.ru |
| E-mail: | support@milandr.ru |
| Телефон: | +7 495 221-13-55 |