[i] Проект "Hello, World" для МК К1901ВЦ1QI

ID статьи: 49498
Дата последнего изменения: 17.10.2022 15:55:57

В этой статье будет разобрано создание проекта для микроконтроллера К1901ВЦ1QI в среде Keil uVision с помощью SPL из состава установочного пака.

Микропроцессор К1901ВЦ1QI состоит из двух ядер - RISC и DSP. RISC-ядро аналогично ядру микроконтроллера К1986ВЕ92QI и является аналогом ядра ARM Cortex-M3. Поэтому всё, что написано для К1986ВЕ92QI, должно с некоторыми изменениями также работать и в К1901ВЦ1QI. Именно о программировании этого ядра в среде Keil говорится в этой статье.

DSP-ядро является аналогом TMS320C546 и для его программирования необходима среда "Code Composer Studio" версий 2 или 3.3. Собранный с помощью данной среды hex-файл можно загрузить через RISC-ядро в DSP.

Создаем проект

Для создания нового проекта нужно в меню Project выбрать пункт New uVision Project, затем выбрать папку и назвать проект. В статье он назван "HelloWorld". После этого открывается окно с выбором микроконтроллера. В дереве "Milandr" нужно открыть пункт “Cortex-M3 with DSP” и выбрать "MDR32FG16S1QI", затем нажать кнопку "ОК".



Рисунок 1 - Окно "Device" (выбор устройства)

Далее открывается окно “Manage Run-Time Environment”. Здесь выбираются необходимые компоненты, с которыми будет работать программа. Нужно выбрать необходимые в работе компоненты и нажать кнопку “OK”. В рамках статьи выбраны компоненты Startup в дереве Device, а в дереве Drivers ­­­– PORT и RST_CLK, так как они понадобятся для написания проекта HelloWorld.

При необходимости можно будет изменить выбор, вызвав это окно нажатием кнопки “Manage Run-Time Environment” на тулбаре или через меню Project – Manage – Run-Time Environment.


Рисунок 2 - Manage Run-Time Environment

Создался пустой проект. При создании нового проекта Keil создает папку Source Group 1, где будет лежать код. Далее добавим файл main.c в эту папку. По нажатию правой кнопки мыши по папке Source Group 1 появляется контекстное меню, в котором нужно выбрать пункт “ Add New Item to Group ' Source Group 1'”.


Рисунок 3 - Добавление файла к проекту

В дереве проекта появился файл main.c, и он же открылся в окне редактирования. Реализуем в нем пустую функцию main и скомпилируем проект. Окно Build Output сообщает об успешной компиляции.


Рисунок 4 - Успешная компиляция проекта

Настройки проекта

Перед загрузкой программы в микроконтроллер, необходимо указать специфику микропроцессора в опциях проекта. В микропроцессоре К1901ВЦ1QI используется RISC-ядро, аналогичное К1986ВЕ92QI, поэтому все настройки необходимо выставить как в статье - "Настройки проекта IDE Keil на примере К1986ВЕ92QI", за исключением вкладки "Device".

Пишем “Hello World

Если сравнить спецификации на К1901ВЦ1QI и К1986ВЕ92QI, то видно, что порты ввода-вывода располагаются в одинаковых адресах и с одинаковыми смещениями (раздел "Описание регистров портов ввода-вывода"). Также наблюдается полная аналогия в тактировании для CPU_CLK (раздел "Сигналы тактовой частоты" - схема тактирования и описание регистров). По этой причине пример "Проект "Hello, World" для МК К1986ВЕ92QI и К1986ВЕ1QI" не требует дополнительных доработок. Тактирование и переключение вывода порта будут работать и в данном микроконтроллере К1901ВЦ1QI. Копируем код из примера в текущий файл main.c.

Для работы примера требуется два файла - MDR32FxQI_port.c и MDR32FxQI_rst_clk.c. Они должны быть скомпилированы средой Keil. Эти файлы уже были подключены при создании проекта, поэтому дополнительно ничего добавлять не нужно.

Также нужно проверить, какой вывод и от какого порта выведен на один из светодиодов на демоплате (в рамках данной статьи разбирается работа с отладочной платой производства компании Миландр, которая на данный момент недоступна для покупки, тем не менее, предоставленный пример может быть легко портирован под платы LDM-SYSTEMS). На отладочной плате рядом с микросхемой DD1 есть ряд перемычек к каждому светодиоду. При этом на плате также указана маркировка, какой порт используется на каждом светодиоде.


Рисунок 5 - Расположение светодиодов на отладочной плате

В качестве примера выбран крайний нижний светодиод, он подписан на плате как PB11. Далее код из примера "Проект "Hello, World" для МК К1986ВЕ92QI и К1986ВЕ1QI" модифицирован таким образом, чтобы оставался рабочим старый вариант. Для этого все определения, зависящие от конкретного микроконтроллера, вынесены в макроопределения. Получившийся итоговый код: 

// Содержимое файла main.c
 
// Заголовочные файлы
#include "MDR32FxQI_rst_clk.h"
#include "MDR32FxQI_port.h"
 
// Прототип функции задержки, реализованной ниже
void Delay(int waitTicks);
 
#define _test1901 // Выбираем секцию К1901ВЦ1QI для компиляции
#ifdef _testBE9x // Определения для К1986ВЕ92QI - неактивна при выбранном ключе
  #define PORT_LedClock RST_CLK_PCLK_PORTC
  #define PORT_Led MDR_PORTC
  #define PORT_LedPin PORT_Pin_0
  #define DELAY_Ticks 1000000
#endif
#ifdef _test1901 // Определения для К1901ВЦ1QI - активна
  #define PORT_LedClock RST_CLK_PCLK_PORTB
  #define PORT_Led MDR_PORTB
  #define PORT_LedPin PORT_Pin_11
  #define DELAY_Ticks 1000000
#endif
 
// Точка входа, отсюда начинается исполнение программы
int main() {
  // Заводим структуру конфигурации вывода(-ов) порта
  PORT_InitTypeDef GPIOInitStruct;
 
  // Включаем тактирование порта В (для К1901ВЦ1QI)
  RST_CLK_PCLKcmd (PORT_LedClock, ENABLE);
 
  // Инициализируем структуру конфигурации вывода(-ов) порта значениями по умолчанию
  PORT_StructInit(&GPIOInitStruct);
 
  // Изменяем значения по умолчанию на необходимые нам настройки
  GPIOInitStruct.PORT_Pin        = PORT_LedPin;
  GPIOInitStruct.PORT_OE         = PORT_OE_OUT;
  GPIOInitStruct.PORT_SPEED      = PORT_SPEED_SLOW;
  GPIOInitStruct.PORT_MODE       = PORT_MODE_DIGITAL;
 
  // Применяем заполненную нами структуру для PORTB
  PORT_Init(PORT_Led, &GPIOInitStruct);
 
  // Запускаем бесконечный цикл обработки - Основной цикл
  while (1){
    // Считываем состояние вывода PB11
    // Если на выводе логический "0", то выставляем вывод в логическую "1"
    if (PORT_ReadInputDataBit (PORT_Led, PORT_LedPin) == 0){
      PORT_SetBits(PORT_Led, PORT_LedPin); // LED
    }
   
    // Задержка
    Delay(1000000);
   
    // Считываем состояние вывода PB11
    // Если на выводе = "1", то выставляем "0"
    if (PORT_ReadInputDataBit (PORT_Led, PORT_LedPin) == 1){
      PORT_ResetBits(PORT_Led, PORT_LedPin);
    }
   
    // Задержка
    Delay(1000000);
  }
}
 
// Простейшая функция задержки, позднее мы заменим ее на реализацию через таймер
void Delay(int waitTicks){
  int i;
  for (i = 0; i < waitTicks; i++){
    __NOP();
  }
}

Фрагмент кода 1

После компиляции программы и прошивки микроконтроллера можно наблюдать мигание на выбранном светодиоде, что указывает на успешную сборку и запуск проекта. Подобным образом можно реализовывать управление прочей периферией RISC-ядра микроконтроллера К1901ВЦ1QI, схожей по реализации с К1986ВЕ92QI.

Контактная информация

Сайт:https://support.milandr.ru
E-mail:support@milandr.ru
Телефон: +7 495 221-13-55