|
Информационный портал технической поддержки Центра проектирования интегральных микросхем |
Основное отличие между микросхемами MDR1206FI и MDR1206AFI заключается в контроллере FLASH-памяти и влечет за собой использование разных алгоритмов для работы с FLASH. Микросхемы MDR1206FI и MDR1206AFI могут быть различены программно с помощью поля CHIP_ID в регистре FLASH_CNTRL->CHIP_ID_CTRL - значение 215 соответствует MDR1206AFI, значение 217 соответствует MDR1206FI.
Исходные файлы проектов ("MDR32VF0xI_Template"/"MDR1206_Template"/"MDR1206FI_Template"/"MDR1206AFI_Template" и т.д.) доступны в составе Standard Peripherals Library на официальном сайте.Микросхемы MDR1206FI, MDR1206AFI являются усовершенствованной версией К1986ВК025 (MDR32F02) с некоторыми отличиями. Поскольку МК MDR1206(A)FI функционально близки к К1986ВК025, программная поддержка уровня CMSIS и SPL для микроконтроллеров К1986ВК025 (MDR32F02), MDR1206FI и MDR1206AFI реализована в общей библиотеке - MDR32VF0xI. Поэтому информация из данной статьи по большей части также применима для К1986ВК025 (MDR32F02).
В свою очередь шаблоны проектов (а также примеры) для микроконтроллеров реализованы как один общий для всех, так и раздельные индивидуально под МК. Помимо этого, для микроконтроллеров MDR1206FI и MDR1206AFI разработаны общие проекты MDR1206, поскольку функциональные отличия минимальны.
Для выбора конкретного МК необходимо задать соответствующий макрос USE_MDR... в файле MDR32VF0xI_config.h на уровне SPL или, если уровень SPL не используется и используется только уровень CMSIS, в файле system_MDR32VF0xI_config.h на уровне поддержки устройства (DeviceSupport) в CMSIS. После выбора конкретного МК с помощью макроса при сборке проекта необходимо также установить соответствующую микроконтроллеру конфигурацию сборки.
Примеры проектов с общим для микроконтроллеров MDR32F02, MDR1206FI, MDR1206AFI функционалом реализованы в едином для всех примере. Например, проект MDR32VF0xI_Template является общим для всех этих МК. Проекты для Eclipse реализованы как шаблоны со всеми необходимыми настройками, но без функционального кода конечной программы.
Далее рекомендуется обновить установленные пакеты: sudo apt update && sudo apt upgrade
Скачать IDE Eclipse (Eclipse IDE for Embedded C/C++ Developers) можно по следующей ссылке: https://projects.eclipse.org/projects/iot.embed-cdt/downloads.
Помимо самой среды Eclipse также понадобятся следующие программные средства:
1. GNU RISC-V Embedded GCC – набор программ (компилятор, ассемблер, компоновщик, библиотеки, отладчик GDB), которые необходимы для разработки ПО на устройствах с ядром RISC-V.
GNU RISC-V Embedded GCC доступен для скачивания по ссылке: https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases.
2. OpenOCD - ПО для программирования и отладки устройств. При использовании ОС Linux версию OpenOCD с поддержкой микросхем компании Миландр (требуется патч, доступный на официальном сайте компании Миландр) нужно собрать, например, по инструкции "[i] Компиляция OpenOCD из исходных данных".
При первом запуске среды Eclipse необходимо выбрать директорию, в которой будет создан workspace, рисунок 1, после чего нажать кнопку "Launch".

Для подключения программных средств для работы с МК MDR1206FI, MDR1206AFI в среде Eclipse необходимо указать соответствующие пути. Для этого необходимо открыть окно "Window->Preferences" и перейти во вкладку "MCU".
Во вкладке "MCU->Global OpenOCD Path" необходимо прописать путь к папке с исполняемым файлом OpenOCD (xPack OpenOCD), рисунок 2. Данный путь используется в отладочных конфигурациях.

Во вкладке "MCU->Global RISC-V Toolchains Paths", необходимо выбрать toolchain по умолчанию "xPack GNU RISC-V Embedded GCC (riscv-none-elf-gcc)" и прописать путь к папке bin GNU RISC-V (xPack GNU RISC-V Embedded GCC), рисунок 3.

После указания всех путей необходимо нажать кнопку "Apply and Close".
На этом подготовка среды Eclipse завершена.
Для быстрого старта можно использовать один из шаблонов проектов "MDR32VF0xI_Template"/"MDR1206_Template"/"MDR1206FI_Template"/"MDR1206AFI_Template", в которых уже помимо готовых настроек проектов подключена библиотека SPL (проекты доступны в составе Standard Peripherals Library на официальном сайте).
Далее по статье для примера используются проект "MDR32VF0xI_Template" с кодом примера MDR32VF0xI_PORT_Led (в SPL расположен в папке Examples/MDR32VF0xI/common/PORT - при обновлениях SPL путь может меняться).
Чтобы добавить проект в Workspace, необходимо выполнить процедуру импорта проекта. Для этого требуется выбрать "File->Import". В открывшемся окне выбрать "General->Existing Projects into Workspace" и нажать "Next >", как показано на рисунке 4.

В пункте "Select root directory" необходимо указать папку с проектом "MDR32VF0xI_Template". В поле "Projects" установить галочку напротив выбранного проекта, а также установить пункт "Copy projects into workspace", чтобы проект был скопирован в workspace, если проект расположен не в папке workspace. Далее следует нажать "Finish". При появлении окна "Overwrite '.settings' in folder ..." - нажать "Not To All".

Чтобы отобразилось основное окно проекта, необходимо закрыть стартовое окно "Welcome". Слева в поле "Project Explorer" должен отобразиться добавленный проект, рисунок 6.

Добавленный проект можно переименовать. Для это следует нажать ПКМ на имя проекта и выбрать пункт "Rename" (или нажать F2). После переименования следует изменить папку ресурсов. Для этого необходимо перейти в свойства проекта (ПКМ на имя проекта -> Properties или нажать "Alt+Enter"). В открывшемся окне необходимо перейти в "C/C++ Build -> Refresh Policy" и удалить папку со старым названием проекта, как показано на рисунке 7. Следует учитывать, что переименование проекта вызовет необходимость изменения предварительно сохраненных конфигураций отладки (см. Использование предварительно сохраненных файлов отладочных конфигураций).

Теперь необходимо нажать "Add Resourse…" и выбрать папку с новым названием проекта, рисунок 8. Далее следует нажать "ОК" и "Apply and Close".

Добавление проекта в IDE Eclipse завершено.
Примечание: В рамках предоставляемых проектов все необходимые настройки, включая настройку расширений, уже сделаны и дополнительно производить настройку не требуется.
Начиная с версии 2.1 системы команд RV32I инструкции FENCE.I и CSR-инструкции вынесены в отдельные расширения - Zifencei и Zicsr соответственно. В то же время ядро BM-310S0 реализует систему команд RV32I версии 2.0, когда данные инструкции являлись частью базовой системы команд. В связи с этим в настройках GNU RISC-V Embedded GCC проекта необходимо указать использование расширений Zicsr и Zifencei. Помимо этого, согласно п.11 "Система команд" спецификации, поддерживаются расширения команд для битовых манипуляций и для скалярной криптографии.
Настройка расширений осуществляется в настройках проекта (ПКМ по названию проект в Workspace -> Properties -> C/C++ Build -> Settings -> Tool Settings -> Target Processor), в поле "Other extensions" нужна записать "_zicsr_zifencei_zicntr_zba_zbb_zbc_zbs_zbkb_zbkc_zbkx_zknd_zkne_zknh_zksed_zksh" (рисунок 9).

Инструкции работы с CSR-регистрами используются на уровне CMSIS. Без указания использования расширений Zifencei и Zicsr сборка проекта будет завершаться, например, с ошибками вида "Error: unrecognized opcode `csrr s10,mhartid'" и аналогичными ошибками.

Отличия между Debug/Release конфигурациями для сборки под области RAM заключается в том, что для конфигурации Debug код изначально располагается сразу в ОЗУ (в связи с этим существует особенность с отладкой в части опции "Debug in RAM", описанная далее) и его загрузка в память возможна только отладчиком-программатором (при штатном запуске МК после сброса или подачи питания программа не будет исполняться, т.к. не записана в энергонезависимую память). В то же время в конфигурации Release код изначально располагается в Flash-памяти и копируется в ОЗУ с помощью startup-файла, в связи с чем исполнение загруженного ПО при штатном запуске МК возможно.
Для каждой конфигурации сборки используется свой конфигурационный файл компоновщика link_*.ld. Отличие данных link_*.ld файлов заключается в различном описании регионов памяти (блоки REGION_ALIAS для разных конфигураций).
Для частных проектов под конкретный МК неиспользуемые конфигурации сборки убраны - например, из MDR1206_Template удалены конфигурации сборки для MDR32F02 (К1986ВК025), а из MDR32F02_Template убраны конфигурации сборки для MDR1206FI и MDR1206AFI.Примечание: В приложенных проектах созданы готовые для использования шаблоны файлов конфигурации (см. "Использование предварительно сохраненных файлов отладочных конфигураций"). Приведенные в текущем пункте настройки нужны для создания новых или модификации имеющихся отладочных конфигураций.
После сборки проекта для создания конфигурации отладки необходимо нажать на стрелку у значка "жука" и выбрать пункт "Debug Configurations…", рисунок 11.

В открывшемся окне слева необходимо выбрать пункт "GDB OpenOCD Debugging" и нажать кнопку "New", как показано на рисунке 12.

Во вкладке "Main" необходимо выбрать требуемый проект, при этом также можно изменить название отладочной конфигурации. Для выбора проекта необходимо нажать кнопку "Search Project" и выбрать соответствующий elf-файл (рисунок 13).

Во вкладке "Debugger" в поле "Config options" необходимо указать файлы конфигурации отладчика (рисунок 14):
| MDR1206AFI | MDR1206FI | |
|---|---|---|
| On-board FTDI2232HL |
-f interface/ftdi/mdr-ft2232hl.cfg -f target/MDR1206AFI.cfg
|
-f interface/ftdi/mdr-ft2232hl.cfg -f target/MDR1206FI.cfg
|
| J-Link |
-f interface/jlink.cfg -f target/MDR1206AFI.cfg
|
-f interface/jlink.cfg -f target/MDR1206FI.cfg
|
-c "program bootloader/MDR1206_Bootloader.hex preverify verify"
Данная команда запрограммирует образ типовой загрузочной программы MDR1206_Bootloader.hex (описание типовой загрузочной программы приведено в спецификации) в область BOOT.
В поле "Commands" необходимо указать следующие команды:
set mem inaccessible-by-default off
set arch riscv:rv32
set remotetimeout 250 
Во вкладке "Startup" необходимо убрать галочку с пункта "Enable Arm semihosting".
Опция "Debug in RAM" указывает отладчику при каждом запуске отладки выполнять загрузку программы, а также принудительно устанавливать начальный адрес программы (функция _start из файла startup). Данную опцию необходимо устанавливать в двух случаях:
Когда галочка убрана с "Debug in RAM", то после загрузки программы отладчик установит точку останова на функцию main() и сбросит МК. МК стартует с загрузочной программы, которая передаёт управление во Flash-память (режим MODE[1:0] = 00 для стандартной загрузочной программы). Когда выполнение программы дойдёт до точки останова в main(), то МК остановится, а в окне отладки появится синяя стрелочка напротив main(), указывающая, что МК остановлен.

Во вкладке "SVD Path" необходимо указать путь к SVD-файлу, описывающему периферию МК, рисунок 16. SVD-файл также расположен локально в приложенных проектах, в папке svd, выбирается в зависимости от микросхемы, MDR1206FI.svd или MDR1206AFI.svd.

В приложенных проектах файлы отладочных конфигураций под все конфигурации сборок для отладки с помощью FTDI2232HL уже реализованы (рисунок 17). Отладочные конфигурации сохранены в проектах в папке launch_cfg и автоматически добавляются в список отладочных конфигураций в окне "Debug Configurations" после импорта проекта (изменять имя проекта при этом не рекомендуется - иначе руководствоваться примечанием ниже). При необходимости настройки могут быть скорректированы (например, при использовании другого отладчика и образа собранной программы для загрузки) согласно инструкциям, приведенным в пункте выше.
Дополнительно следует отметить, что в отладочных конфигурациях для FLASH-памяти в них прописана команда программирования образа загрузочной программы MDR1206_Bootloader.hex из папки bootloader. При каждом запуске отладки с командой программирования образа MDR1206_Bootloader.hex осуществляется проверка на наличие загрузочной программы в памяти и ее запись, если контрольная сумма не совпадает (загрузочная программа не запрограммирована или в памяти по этим адресам другие данные).

Для запуска отладки необходимо включить питание отладочной платы, подключить кабель USB A-B от платы к ПК, после чего нажать кнопку "Debug" в окне "Debug Configuraions" при выбранной отладочной конфигурации.
После запуска отладки на отладочном комплекте для микросхем MLDR1206FI ТСКЯ.468998.140 будут мигать светодиоды LED4-LED1, подключенным к выводам PD[8:5] микроконтроллера.
Поле CHIP_ID для определения микросхемы MDR1206FI или MDR1206AFI может быть прочитано в режиме отладки с помощью файла периферии SVD в окне "Memory". Для этого достаточно запустить любую отладочную конфигурацию RAM_TCM_Debug - при отладке только в ОЗУ различия в алгоритме программирования не влияют на возможность запуска отладки, поскольку механизм доступа к памяти ОЗУ одинаков, и используемый SVD-файл также не влияет, поскольку регистр FLASH_CNTRL->CHIP_ID_CTRL расположен по одинаковым адресам в MDR1206FI и MDR1206AFI. После перехода в отладку через окно Memory необходимо открыть просмотр регистров блока RST_CLK и установить в "1" бит PCLK[3] – FLASH в регистре RST_CLK->PER2_CLOCK для дальнейшего доступа к регистрам блока FLASH_CNTRL. Затем открыть регистры FLASH_CNTRL. В регистре FLASH_CNTRL->CHIP_ID_CTRL поле CHIP_ID указывает на версию микросхемы - значение 215 соответствует MDR1206AFI, значение 217 соответствует MDR1206FI (рисунок 18).

Рисунок 18 – Определение номера версии микросхемы по полю CHIP_ID в режиме отладки из ОЗУ
__RAM_TEXT_NOINLINE void foo(void);МК MDR1206FI, MDR1206AFI имеют три области ОЗУ: TCMA RAM, TCMB RAM и AHB RAM. Ядро имеет доступ ко всем трём областям ОЗУ, контроллер DMA получает доступ к памяти TCM RAM по шине AHB-Lite (рисунок 19) через арбитр доступа к блокам памяти TCM в ядре.

Интенсивный обмен данными в TCM RAM с помощью DMA может значительно замедлить работу как программы, так и DMA, поскольку ядро и DMA будут работать по одной шине. Поэтому данные, используемые контроллером DMA, предпочтительней размещать в области памяти AHB RAM. Для этого добавлены секции, доступные через определения __RAM_AHB_DATA и __RAM_AHB_BSS, которые предназначены для размещения инициализированных и неинициализированных данных соответственно. В startup-файл добавлен код инициализации данных.
Пример размещения массивов данных в памяти AHB RAM приведён во фрагменте кода 2.
__RAM_AHB_BSS int array[100]; // Данные инициализируются нулями, при старте не хранятся в Flash-памяти.
__RAM_AHB_DATA char init_message[] = "Hello World from MDR1206FI!"; // Данные при старте заполняются из Flash в ОЗУ.
| Сайт: | https://support.milandr.ru |
| E-mail: | support@milandr.ru |
| Телефон: | +7 495 221-13-55 |