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

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


doc:mk:1967vn028
#include <sysreg.h>

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

int main(void)
{

   // Основной цикл
   while(1)
   {
     __builtin_sysreg_write(__FLAGREGST, 0x1); // зажигаем диод FLAG0
     Delay (5000000);
     __builtin_sysreg_write(__FLAGREGCL, 0x0); // гасим диод FLAG0
     
     __builtin_sysreg_write(__FLAGREGST, 0x2); // зажигаем диод FLAG1
     Delay (5000000);
     __builtin_sysreg_write(__FLAGREGCL, 0x0); 
     
     __builtin_sysreg_write(__FLAGREGST, 0x4); // зажигаем диод FLAG2
     Delay (5000000);
     __builtin_sysreg_write(__FLAGREGCL, 0x0); 
     
     __builtin_sysreg_write(__FLAGREGST, 0x8); // зажигаем диод FLAG3
     Delay (5000000);
     __builtin_sysreg_write(__FLAGREGCL, 0x0); 
   }
   return 0;
}

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

Разбор кода программы

#include <sysreg.h>

Подключаем заголовочный файл sysreg.h, в котором определены все системные регистры процессоров 1967ВНхх. Этот файл идёт в составе стандартной библиотеки для 1967ВНхх, и поэтому путь к нему уже прописан в настройках проекта.

Чтобы подключить библиотеки периферии, необходимо зайти в тулбаре во вкладку Project→Properties. В открывшемся окне переходим C/C++ Build→Setting→Tool Settings→Compiler→Preprocessor и в поле Include directories прописываем путь к папке с подключаемыми файлами.

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

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

Delay() - простейшая реализация функции задержки на цикле. Значение задержки здесь необходимо подобрать экспериментально.

В основном цикле чтобы мигнуть светодиодом используется такой код:

__builtin_sysreg_write(__FLAGREGST, 0x1); // зажигаем светодиод FLAG0
Delay (5000000);
__builtin_sysreg_write(__FLAGREGCL, 0x0); // гасим диод FLAG0

Доступ к системным регистрам осуществляется с помощью функций

__builtin_sysreg_read(int reg); // чтение
__builtin_sysreg_write(int reg, unsigned int value); // запись

Здесь значение int reg берётся из библиотеки sysreg.h. Unsigned int value, как понятно из названия, - беззнаковое целое число, записываемое в выбранный регистр.

Регистр FLAGREG – 32-битный регистр, который контролирует направление вывода флага (вход (0) или выход (1)) и обеспечивает значение (1 или 0), когда вывод сконфигурирован как выход. Направление вывода задаётся в первых 4 битах регистра (3:0), за значение флага при выдаче отвечают биты 7:4. Таким образом, чтобы настроить FLAG0 на выход, при этом чтобы он выдавал логическую 1, в регистр FLAGREG необходимо прописать значение 0x11 (00010001b). Однако непосредственно в регистре FLAGREG записывать значения нельзя! Для этого существуют два отдельных регистра FLAGREGST и FLAGREGCL. FLAGREGST позволяет записывать 1 (установка бит) в регистр FLAGREG. FLAGREGCL позволяет записывать 0 (сброс бит) в регистр FLAGREG.

Стоит также обратить внимание, что для зажигания светодиода мы используем код, который устанавливает вывод FLAG0 на выход, подавая на него логический 0!

__builtin_sysreg_write(__FLAGREGST, 0x1); // зажигаем светодиод FLAG0

PS: Записывая в регистр FLAGREGST значение 0х1, мы устанавливаем в 1 только первый бит регистра FLAGREG, остальные же остаются такими же, как и были. (После сброса FLAGREG = 0x0000_0000).

Итак, подав логический 0 на вывод FLAG0 мы всё же зажжём светодиод, но как это происходит? Всё дело в схемотехнике отладочной платы и вывода порта GPIO. На отладочной плате соединение светодиода, процессора и кнопки выглядит следующим образом

Светодиод подключен к питанию 2.5 В. Чтобы его зажечь, необходимо замкнуть цепь, нажав на кнопку и соединив светодиод с землёй. Тоже самое происходит, когда мы, настраивая FLAG0 на выход, подаём логический 0, т.е. соединяем выход вывода с землёй.

doc/mk/1967vn028.txt · Последнее изменение: 2022/04/03 23:09 (внешнее изменение)