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

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


prog:spec:proj_codemaster-lynx:vn034

Подключаем библиотеки HAL в среде CM-LYNX

Эта статья будет посвящена тому, как начать работать c библиотеками HAL в среде CM-LYNX. О том, как создать проект описано в статье Создаем проект в среде CM-LYNX. Здесь же мы рассмотрим, как подключить библиотеки в уже созданный проект, и запустим пример "HelloWorld". Для этих целей воспользуемся отладочным комплектом для процессора цифровой обработки сигналов 1967ВН044 (он же 1967ВН034).

Подключение библиотек HAL

После создания проекта приступим к подключению библиотек HAL. Необходимо добавить библиотечные файлы в наш проект, для этого в окне Project Explorer кликаем правой кнопкой мыши на HelloWorld и выбираем New→Folder.

В открывшемся окне укажем путь к библиотекам. Однако, чтобы в дальнейшем мы смогли переносить наши проекты, необходимо указать относительный путь. Для это воспользуемся встроенным функционалом среды. На рисунке ниже показана последовательность действий для добавления папки src библиотеки 1967VN044. После выбора папки src кликаем во всех окнах OK и Finish. Таким же образом добавляем папку inc библиотеки 1967VN044.

После добавления библиотек в окне Project Explorer должны появиться папки src и inc.

Теперь, чтобы среда CM-LYNX cмогла найти библиотечные файлы, необходимо указать ей пути для поиска при сборке. В дереве проекта выбираем самый верхний пункт "HelloWorld" - просто кликаем на нем левой мышкой, чтобы он был активен, и открываем опции проекта (в тулбаре Project→Properties либо Alt+Enter). В открывшемся окне переходим C/C++ Build→Settings→Tool Settings→Compiler→Includes и в поле Include paths кликаем на значок "плюсика".

Здесь, чтобы снова указать относительные пути, выбираем пункт "Workspace…". В открывшемся окне выбираем папку HelloWorld→inc, после чего жмём OK.

На этом процесс добавления библиотечных файлов в среду CM-LYNX закончен. Перейдём к рассмотрению примера HelloWorld.

Hello World

Во время компиляции, а также при запуске режима отладки могут возникать разнообразные ошибки, поэтому рекомендуем ознакомиться с разделом Возможные трудности

В отличие от процессора 1967ВН028, в котором флаги FLAG0-FLAG3 являются отдельными выводами процессора, в 1967ВН044 таких выводов нет. Функции FLAG0-FLAG3 в данном процессоре реализованы в качестве альтернативной функции порта C. Поэтому наша задача для запуска диодов на отладочной плате 1967ВН044 сводится к тому, чтобы для бит с 0-го по 3-й порта PC задать альтернативную функцию. Сделать переопределение первых 4 бит порта PC можно двумя способами. Рассмотрим каждый из них. Первый способ, более простой, но менее очевидный. Оказывается, именно для переопределения порта PC для функций флагов FLAG0-FLAG3 можно воспользоваться библиотечной функцией:

HAL_SYS_FlagEnable();

Функция включает FLAG3-0, путем включения альтернативных функций (установка в единицу соответствующих бит регистра GPx_ALT) в регистре GPC для 0-3 бит.

Таким образом Hello World для 1967ВН044 получится в таком виде:

#include <sysreg.h>
#include <hal_1967VN044.h>

// Прототип функции задержки, реализованной ниже
void Delay(int waitTicks);

int main(void)
{
   HAL_SYS_FlagEnable();

   // Основной цикл
   while(1)
   {
     __builtin_sysreg_write(__FLAGREGST, 0x01); // зажигаем светодиод FLAG0
     Delay (500000);
     __builtin_sysreg_write(__FLAGREGCL, 0x00); // гасим светодиод FLAG0

     __builtin_sysreg_write(__FLAGREGST, 0x02); // зажигаем светодиод FLAG1
     Delay (500000);
     __builtin_sysreg_write(__FLAGREGCL, 0x00);

     __builtin_sysreg_write(__FLAGREGST, 0x04); // зажигаем светодиод FLAG2
     Delay (500000);
     __builtin_sysreg_write(__FLAGREGCL, 0x00);

     __builtin_sysreg_write(__FLAGREGST, 0x08); // зажигаем светодиод FLAG3
     Delay (500000);
     __builtin_sysreg_write(__FLAGREGCL, 0x00);
   }
}

//Функция задержки
void Delay(int waitTicks)
{
  int i;
  for (i = 0; i < waitTicks; i++);
}

Второй способ. Более сложный. Воспользуемся функцией для работы с портами ввода/вывода GPIO. Изучив библиотечные функции, находим необходимую нам:

void HAL_GPIO_Init (GPIO_PortPi * const GPIO_Pi, const uint Pins, const GPIO_PinMode Mode) -функция выбора режима работы пинов порта (PA, PB или PC).

Перейдем к её описанию:

Входной аргумент порта GPIO_PortPi * const GPIO_Pi может принимать следующие значения:

LX_GPIO_PA – порт PA,

LX_GPIO_PB – порт PB,

LX_GPIO_PC – порт PC.

Нас интересует порт PC. Входной аргумент const uint Pins представляет собой набор из 32 бит. Каждому биту Pins соответствует один пин порта по порядку, т.е. пину GPIO_Pi[0] соответствует бит 0, GPIO_Pi [1] – бит 1, а пину GPIO_Pi[31] – бит 31. Для удобства заведено перечисление пинов:

typedef enum {
	GPIO_PIN_0 	= ((ushort) (1 <<  0)),
	GPIO_PIN_1 	= ((ushort) (1 <<  1)),
	…
	GPIO_PIN_31 = ((ushort) (1 << 31)),
} GPIO_PIN;

Нам необходимо набрать пины с 0 по 3: GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3.

Для всех пинов порта, соответствующих битам аргумента Pins, установленных в «1», будет назначен режим работы, заданный входным аргументом const GPIO_PinMode Mode. Входной аргумент const GPIO_PinMode Mode может принимать следующие значения:

	GPIO_PinMode_In 		- вход,
	GPIO_PinMode_InPU		- вход с подтяжкой к высокому уровню (лог «1»),
	GPIO_PinMode_Out		- выход,
	GPIO_PinMode_OutPU 	        - выход с подтяжной к высокому уровню (лог «1»),
        GPIO_PinMode_Alt 		- альтернативная функция. Она как раз то нам и нужна.

Таким образом у нас получилась следующая конструкция:

HAL_GPIO_Init(LX_GPIO_PC, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2| GPIO_PIN_3, GPIO_PinMode_Alt);

И добавляем её в Hello World

#include <sysreg.h>
#include <hal_1967VN044.h>

// Прототип функции задержки, реализованной ниже
void Delay(int waitTicks);

int main(void)
{
   HAL_GPIO_Init(LX_GPIO_PC, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2| GPIO_PIN_3, GPIO_PinMode_Alt);

   // Основной цикл
   while(1)
   {
     __builtin_sysreg_write(__FLAGREGST, 0x01); // зажигаем светодиод FLAG0
     Delay (500000);
     __builtin_sysreg_write(__FLAGREGCL, 0x00); // гасим светодиод FLAG0

     __builtin_sysreg_write(__FLAGREGST, 0x02); // зажигаем светодиод FLAG1
     Delay (500000);
     __builtin_sysreg_write(__FLAGREGCL, 0x00);

     __builtin_sysreg_write(__FLAGREGST, 0x04); // зажигаем светодиод FLAG2
     Delay (500000);
     __builtin_sysreg_write(__FLAGREGCL, 0x00);

     __builtin_sysreg_write(__FLAGREGST, 0x08); // зажигаем светодиод FLAG3
     Delay (500000);
     __builtin_sysreg_write(__FLAGREGCL, 0x00);
   }
}

//Функция задержки
void Delay(int waitTicks)
{
  int i;
  for (i = 0; i < waitTicks; i++);
}
prog/spec/proj_codemaster-lynx/vn034.txt · Последнее изменение: 2022/04/03 23:09 (внешнее изменение)