Инструменты пользователя

Инструменты сайта


prog:spec:proj_elpower

Создаем проект “Hello, World” на микроконтроллер для управления электроприводами “Электросила”. Запуск из ОЗУ и внутренней памяти.

Перспективный микроконтроллер поддерживает современные методы управления электроприводами и криптографическими алгоритмами. Содержит два ядра Cortex-M4F и обладает широким набором цифро-аналоговых устройств и интерфейсных контроллеров. Достоинством данного процессора является большая надежность и эффективность в решении специализированных задач, требующих бессбойный ход выполнения программы и высокую точность наряду с высокой производительностью.

К нам в руки попала отладочная плата «Электросилы». Проект, рассмотренный в статье, предназначен для простого вывода сообщения “Hello, World!” с помощью функции printf и мигания светодиодами, расположенных на порту С.

Проект из статьи для запуска из ОЗУ и ПЗУ доступен на GitHub

Сообщение “Hello” будет выводиться в отладочную консоль с помощью ITM интерфейса. Подробнее о нём можно прочитать в этой статье, однако, настройки ITM будут затронуты и здесь.

Обратите внимание, что ITM работает только в режиме SWD.
В проекте для стабильности работы используется резонатор HSE0, и в силу особенностей платы при запуске проекта как из ОЗУ, так и из ПЗУ необходимо сбрасывать аналоговое питание кнопкой S5.

Настройка и запуск проекта из ОЗУ

В проекте содержится два набора настроек: для запуска из оперативной памяти и из ПЗУ. Убедимся, что в Select Target выбран параметр RAM (Оперативная память). Показано на рисунке ниже. Выбор любого из параметров автоматически задаёт адреса и прочие настройки, позволяющие запуститься микроконтроллеру из нужной памяти. Однако, в статье мы всё равно рассмотрим особенность выставления всех параметров.

Перейдем в настройки "Options for Target", далее "Device", и выберем поднастройку для ядра нашего микроконтроллера - ARMCM4. Настройка показана на рисунке ниже. Отметим, что ARMCM4_FP отвечает за работу микроконтроллера в режиме обработки данных с плавающей точкой: по умолчанию поддержка инструкций отключена.

Без необходимости не меняйте параметр на ARMCM4_FP, ведь в таком случае потребуется не только настройка поддержки инструкций ядром, но и перенастройка всех адресов и настроек проекта, поскольку они меняют своё значение. Подробнее о настройке режима "FLOAT POINT" описано в этой статье

Убедимся так же в том, что в "Options for Target", вкладка Target, выставлены правильные адреса для ОЗУ. 128 Кбайт ОЗУ разбиты на два банка по 64 Кбайт: первый банк начинается с адреса 0x20000000, второй с 0x20010000 (см. рис. ниже).

Для подключения средств отладки будем использовать 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". Показано на рисунке ниже.

Не забыв при этом настроить встроенный серийный порт отладки (ITM), чтобы микроконтроллер смог выводить данные в среде отладки. Пункты 1-7 на рисунке ниже.

Из важного, что следует отметить в настроенном проекте, так это файл инициализации, который описан в папке с проектом под названием “0x20000000.ini” – его подключение видно на рисунке выше (выделено синим цветом). Данный файл позволяет запускать наш проект в режиме отладки из ОЗУ (именно с адреса 0x20000000 в микроконтроллере расположена ОЗУ).

Подробнее о запуске кода из ОЗУ написано в этой статье

Согласно спецификации на данный микроконтроллер, при записи в регистр 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), чтобы увидеть наше сообщение, которое было прописано в коде. Вывести окошко очень просто, показано на рисунке ниже.

Запускаем проект кнопкой F5. Видим в окне вывода Debug(printf) наше сообщение, при этом по системному таймеру начинают переключаться пины порта А.

Настройка и запуск проекта из ПЗУ

Теперь рассмотрим запуск данного проекта из внутренней памяти микроконтроллера, которая составляет 1 Мбайт.

В состав проекта входит файл MLDR149.FLM, который отвечает за корректность записи кода во внутреннюю память микроконтроллера.

Файл MLDR149.FLM нужно расположить в папке с установленной Keil по адресу Keil/ARM/Flash

Не забудем переключить кластер настроек в Select Target на FLASH. Это настроит Keil на работу с внутренней памятью. Показано на рисунке ниже.

В Manage Run-Time Environment необходимо снова включить поддержку STDOUT с Variant "ITM", как это сделано при описании запуска из ОЗУ

Согласно спецификации на данный микроконтроллер, FLASH-память расположена по адресу 0х01000000. Это значение и диапазон (1 Мбайт = 0х100000) нужно указать в Options for Target во вкладке Target для значений ROM, значения RAM выставляем в соответствии со вторым банком статического ОЗУ в размере 64 Кбайт, находящимся по адресу 0х20010000. Настройка показана на рисунке ниже.

Теперь перейдем во вкладку Debug. Здесь важно присутствие файла инициализации, который помогает запустить проект из внутренней FLASH памяти. В настройках программатора выставим в настройке "Connect and Reset Pin" параметры, которые показаны на рисунке ниже.

Важной особенностью настроек, представленных на рисунке ниже является следующее: в синих рамках выделены параметры, которые влияют на возможность вести отладку по точкам останова, и если данные параметры выставлены не так, как на картинке, при запуске с внутренней памяти FLASH, то в режиме отладки невозможно будет выставлять точки останова. Важно отсутствие галочки именно на опции "Download to Flash".

В красной рамке выделен режим отладки SWD, чтобы обеспечить корректную работу ITM, о чем было сказано в начале статьи.

Под цифрой 2 выделена настройка, для которой в первоначальном проекте был подключен файл инициализации с адресом, начинающимся с 0х01000000, что соответствует адресу внутренней памяти. Подключен этот файл или нет - на работоспособность это не влияет, так как всю работу выполняет файл FLM.

Теперь следует в настройках программатора, вкладка "Flash Download" выставить параметры, представленные на рисунке ниже.

Именно здесь задается файл MLDR149.FLM, добавленный в папку с Keil. Если этого не сделать, то поле окажется пустым, и программирование внутренней памяти FLASH окажется невозможным. Будьте внимательны.

Параметры во вкладке Trace задаём так же, как это сделано при запуске из оперативной памяти (выделено голубым).

Важно так же соблюдать достаточное для алгоритма FLM значение Size 0хF000 (на рисунке под цифрой 5).

Во вкладке Utilities важно выбрать Use Target Driver for Flash Programming, поскольку теперь программа будет выполняться из FLASH-памяти.

Проект готов к тому, чтобы его прошить в наш микроконтроллер. Надпись "Hello, World!" можно так же вывести в режиме отладки, а диоды будут моргать всегда.

prog/spec/proj_elpower.txt · Последнее изменение: 2022/04/03 23:09 (внешнее изменение)