#include // Прототип функции задержки, реализованной ниже 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, в котором определены все системные регистры процессоров 1967ВНхх. Этот файл идёт в составе стандартной библиотеки для 1967ВНхх, и поэтому путь к нему уже прописан в настройках проекта. Чтобы подключить библиотеки периферии, необходимо зайти в тулбаре во вкладку Project->Properties. В открывшемся окне переходим C/C++ Build->Setting->Tool Settings->Compiler->Preprocessor и в поле Include directories прописываем путь к папке с подключаемыми файлами. {{prog:cmlynx:include.png}} // Прототип функции задержки, реализованной ниже 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. На отладочной плате соединение светодиода, процессора и кнопки выглядит следующим образом {{prog:cmlynx:otl_plata.png}} Светодиод подключен к питанию 2.5 В. Чтобы его зажечь, необходимо замкнуть цепь, нажав на кнопку и соединив светодиод с землёй. Тоже самое происходит, когда мы, настраивая FLAG0 на выход, подаём логический 0, т.е. соединяем выход вывода с землёй. {{prog:cmlynx:otl_plata1.png}}