#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}}