====== Создаем проект “Hello, World” на микроконтроллер для управления электроприводами “Электросила”. Запуск из ОЗУ и внутренней памяти. ====== Перспективный микроконтроллер поддерживает современные методы управления электроприводами и криптографическими алгоритмами. Содержит два ядра Cortex-M4F и обладает широким набором цифро-аналоговых устройств и интерфейсных контроллеров. Достоинством данного процессора является большая надежность и эффективность в решении специализированных задач, требующих бессбойный ход выполнения программы и высокую точность наряду с высокой производительностью. К нам в руки попала отладочная плата «Электросилы». Проект, рассмотренный в статье, предназначен для простого вывода сообщения //“Hello, World!”// с помощью функции //printf// и мигания светодиодами, расположенных на порту С. **Проект из статьи для запуска из ОЗУ и ПЗУ доступен на [[https://github.com/StartMilandr/Examples/tree/master/ESila_Hello |GitHub]]** Сообщение //“Hello”// будет выводиться в отладочную консоль с помощью **ITM** интерфейса. Подробнее о нём можно прочитать в [[https://startmilandr.ru/doku.php/prog:debug:printfitm|этой статье]], однако, настройки ITM будут затронуты и здесь. **Обратите внимание, что ITM работает только в режиме SWD**. **В проекте для стабильности работы используется резонатор HSE0, и в силу особенностей платы при запуске проекта как из ОЗУ, так и из ПЗУ необходимо сбрасывать аналоговое питание кнопкой S5**. ===== Настройка и запуск проекта из ОЗУ ===== //В проекте содержится два набора настроек: для запуска из оперативной памяти и из ПЗУ. Убедимся, что в //Select Target// выбран параметр //RAM// (Оперативная память). Показано на рисунке ниже. Выбор любого из параметров автоматически задаёт адреса и прочие настройки, позволяющие запуститься микроконтроллеру из нужной памяти. Однако, в статье мы всё равно рассмотрим особенность выставления всех параметров.// {{doc:mk:mkee:elpower_ram.png}} Перейдем в настройки //"Options for Target"//, далее //"Device"//, и выберем поднастройку для ядра нашего микроконтроллера - **ARMCM4**. Настройка показана на рисунке ниже. Отметим, что **ARMCM4_FP** отвечает за работу микроконтроллера в режиме обработки данных с плавающей точкой: по умолчанию поддержка инструкций отключена. **Без необходимости не меняйте параметр на **ARMCM4_FP**, ведь в таком случае потребуется не только настройка поддержки инструкций ядром, но и //перенастройка всех адресов и настроек проекта//, поскольку они меняют своё значение. Подробнее о настройке режима "FLOAT POINT" описано в этой [[https://startmilandr.ru/doku.php/prog:spec:fpu_ve8 |статье]]** {{doc:mk:mkee:elpowerset.png}} Убедимся так же в том, что в //"Options for Target"//, вкладка //Target//, выставлены правильные адреса для ОЗУ. 128 Кбайт ОЗУ разбиты на два банка по 64 Кбайт: первый банк начинается с адреса //0x20000000//, второй с //0x20010000// (см. рис. ниже). {{doc:mk:mkee:elpower_target.png}} Для подключения средств отладки будем использовать //JTAG-B//, чтобы избежать переназначения выводов, поскольку код программы использует порт А, на котором разведены выводы //JTAG-A//. **Режим загрузки JTAG-B “10001110”** **Для программирования/отладки используется J-Link** Для корректного вывода нашего сообщения в отладочную консоль Keil с помощью функции //printf// следует в указанной ранее статье посмотреть раздел //“Вывод Printf через ITM средствами Keil”//. Поскольку заголовочный файл stdio.h подключен в коде, а так же описана функция //fputc()//, то остаётся активировать в Manage Run-Time Environment по адресу //Compiler / I/O// галочку напротив **STDOUT**, а так же параметр **Variant** - //"ITM"//. Показано на рисунке ниже. {{doc:mk:mkee:elpower1.png}} Не забыв при этом настроить встроенный серийный порт отладки **(ITM)**, чтобы микроконтроллер смог выводить данные в среде отладки. Пункты 1-7 на рисунке ниже. {{doc:mk:mkee:elpower2.png}} Из важного, что следует отметить в настроенном проекте, так это файл инициализации, который описан в папке с проектом под названием “//0x20000000.ini//” – его подключение видно на рисунке выше **(выделено синим цветом)**. Данный файл позволяет запускать наш проект в режиме отладки из ОЗУ (именно с адреса //0x20000000// в микроконтроллере расположена ОЗУ). **Подробнее о запуске кода из ОЗУ написано в [[https://startmilandr.ru/doku.php/prog:start:run_ram_keil|этой статье]]** Согласно спецификации на данный микроконтроллер, при записи в регистр **KEY** конкретного блока значения //0x8555AAA1//, мы разрешаем запись других регистров данного блока: CLK_CNTR->KEY = 0x8555AAA1; // разрешаем запись регистров CNTR (Clock Control) // Настройка регистров разрешения тактирования шин периферийных блоков CLK_CNTR->PER0_CLK = 0xFFFFFFFF; CLK_CNTR->PER1_CLK = 0xFFFFFFFF; Рассмотрим отдельные регистры при конфигурации порта С для работы со светодиодами: * Регистр **SANALOG** позволяет установить тип вывода порта. В нашем случае выставлены настройки для цифровых выводов. * Регистр **SPWR** позволяет задать скорость драйвера. Поскольку значение должно быть выставлено двумя битами, то используется два блока **SPWR[0]** и **SPWR[1]**, чтобы была возможность сконфигурировать все 32 вывода. В нашем коде выставлено значение через библиотеку SPL //PORT_SPWR_300//, что говорит о том, что наши порты работают с медленным фронтом в 300 нс. * Регистр **SFUNC** задаёт функцию вывода. * Регистр **SOE** задаёт направление порта. В нашем случае выводы должны работать на выход. После компиляции проекта переходим в режим отладки комбинацией //Ctrl+F5//, и перед запуском выведем окошко **Debug(printf)**, чтобы увидеть наше сообщение, которое было прописано в коде. Вывести окошко очень просто, показано на рисунке ниже. {{doc:mk:mkee:elpower3.png}} Запускаем проект кнопкой F5. Видим в окне вывода **Debug(printf)** наше сообщение, при этом по системному таймеру начинают переключаться пины порта А. {{doc:mk:mkee:elpower4.png}} ===== Настройка и запуск проекта из ПЗУ ===== Теперь рассмотрим запуск данного проекта из внутренней памяти микроконтроллера, которая составляет 1 Мбайт. В состав проекта входит файл //MLDR149.FLM//, который отвечает за корректность записи кода во внутреннюю память микроконтроллера. //Файл MLDR149.FLM нужно расположить в папке с установленной Keil по адресу Keil/ARM/Flash// Не забудем переключить кластер настроек в //Select Target// на //FLASH//. Это настроит Keil на работу с внутренней памятью. Показано на рисунке ниже. {{doc:mk:mkee:elpower_rom.png}} **В Manage Run-Time Environment необходимо снова включить поддержку STDOUT с Variant "ITM", как это сделано при описании запуска из ОЗУ** Согласно спецификации на данный микроконтроллер, FLASH-память расположена по адресу //0х01000000//. Это значение и диапазон (//1 Мбайт = 0х100000//) нужно указать в //Options for Target// во вкладке //Target// для значений ROM, значения RAM выставляем в соответствии со вторым банком статического ОЗУ в размере 64 Кбайт, находящимся по адресу //0х20010000//. Настройка показана на рисунке ниже. {{doc:mk:mkee:elpowerrom.png}} Теперь перейдем во вкладку //Debug//. Здесь важно присутствие файла инициализации, который помогает запустить проект из внутренней FLASH памяти. В настройках программатора выставим в настройке //"Connect and Reset Pin"// параметры, которые показаны на рисунке ниже. **Важной особенностью настроек, представленных на рисунке ниже является следующее: в синих рамках выделены параметры, которые влияют на возможность вести отладку по точкам останова, и если данные параметры выставлены не так, как на картинке, при запуске с внутренней памяти FLASH, то в режиме отладки невозможно будет выставлять точки останова. Важно отсутствие галочки именно на опции "Download to Flash".** //В красной рамке выделен режим отладки **SWD**, чтобы обеспечить корректную работу **ITM**, о чем было сказано в начале статьи.// **Под цифрой 2 выделена настройка, для которой в первоначальном проекте был подключен файл инициализации с адресом, начинающимся с 0х01000000, что соответствует адресу внутренней памяти. Подключен этот файл или нет - на работоспособность это не влияет, так как всю работу выполняет файл FLM.** {{doc:mk:mkee:elpowerdebug.png}} Теперь следует в настройках программатора, вкладка // "Flash Download"// выставить параметры, представленные на рисунке ниже. **Именно здесь задается файл MLDR149.FLM, добавленный в папку с Keil. Если этого не сделать, то поле окажется пустым, и программирование внутренней памяти FLASH окажется невозможным. Будьте внимательны.** Параметры во вкладке //Trace// задаём так же, как это сделано при запуске из оперативной памяти (выделено голубым). Важно так же соблюдать достаточное для алгоритма FLM значение //Size// //0хF000// (на рисунке под цифрой 5). {{doc:mk:mkee:elpowerdebug3.png}} Во вкладке //Utilities// важно выбрать //Use Target Driver for Flash Programming//, поскольку теперь программа будет выполняться из FLASH-памяти. {{doc:mk:mkee:elpowerdebug2.png}} Проект готов к тому, чтобы его прошить в наш микроконтроллер. Надпись //"Hello, World!"// можно так же вывести в режиме отладки, а диоды будут моргать всегда.