В микроконтролле W801 имеется некоторое колличество таймеров. Попробуем настроить и запустить один из них. А также сделаем светодиодную мигалку на таймере. Чтобы убедиться в том что мигалка работает на прерывании от таймера. Оставим в коде мигалку на задержках. Благо на плате много встроенных светодиодов. Рассмотрим код:
Для настройки таймера инициализируем идентификатор и структуру таймера.
u8 timer_id; // идентификатор таймера
struct tls_timer_cfg timer_cfg; // структура конфигурации таймера
Передадим туда константу указывающую на счет в миллисекундах.
timer_cfg.unit = TLS_TIMER_UNIT_MS; // таймер считает миллисекунды
Далее указывается задержка в миллисекундах:
timer_cfg.timeout = 2000; // задержка в миллисекундах
Установим неоднократное срабатывание по прерыванию.
timer_cfg.is_repeat = 1; // таймер срабатывает неоднократно
Присвоим обработчик прерывания. Это функция которая будет вызываться при возникновении прерывания и в теле которой будет происходить изменение состояния светодиода т.е. там будет код мигалки.
// присвоение функции-обработчика прерывания по таймеру
Далее одна непонятная настройка, просто скопирована из примера.
timer_cfg.arg = NULL;
После происходит создание таймера а затем его запуск.
timer_id = tls_timer_create(&timer_cfg); // создание таймера
tls_timer_start(timer_id); // запуск таймера
В основном цикле остается мигалка на задержках но другим светодиодом. В обработчике прерывания по таймеру происходит инверсия состояния пина на котором светодиод который мигает по таймеру. + настройка пина и вывод на этот пин.
Для компиляции кода, нужно запустить из корня проекта команду
Также я решил проверить ещё один способ сделать задержку. функцией tls_os_time_delay. В качестве параметра ей передается число которое нужно умножить на 2 чтобы получить задержку которую дает данная функция. С виду она работает не плохо. По крайней мере кажеться что она делает достаточно хорошую точность. Результат можно посмотреть на видео
Адрес биткоин кошелька для поддержки блога - bc1qlhrmmkh77x2lzhqe4lt9qwkglswj64tsqt2l5g
Популярная отладочная плата с микроконтроллером w801 имеет достаточно много пинов ввода вывода общего назначения (GPIO). Пины общего назначения могут работать как выходы или как входны. Напр. можно выбрать нин PB8.
Рисунок 1 - Подключение кнопки к плате с микроконтроллером W801
Пин PB8 не имеет альтернативных функций поэтому его можно использовать как GPIO не боясь упустить какую либо интересную функцию имеющуюся у данного микроконтроллера помимо GPIO. Также ряддом с ним располагаются пины питания для организации подтяжки и собственно подключения самой кнопки.
рассмотрим код:
Для настройки какого либо пина общего назначения, используется функция
tls_gpio_cfg();
чтобы настроить данный пин на вход, надо передать константу WM_GPIO_DIR_INPUT вторым параметром в данную функцию. Первым параметром передается константа с номером пина. Последним параметром передается тип подтяжки (если я правильно понял). Читается состояние пина функцией
ret = tls_gpio_read(WM_IO_PB_08);
у которой только один параметр это номер пина и которая возвращает его состояние. Если на пине лог. 0 то функция возвратит 0. Далее на основе этого имеется ветвление. Если на пине лог. 0 то светодиод будет мигать. Если нет то не будет. Для компиляции кода, нужно запустить из корня проекта команду
По традиции любой микроконтроллер следует начинать изучать со светодиодной мигалки. В данном блоге уже есть предыдущие две статьи по мигалке на ардуино и работе с SDK. Создание мигалки не в среде Ардуино можно считать следующим этапом изучения. Чтобы можно было загружать прошивку на ОС Linux, нужно добавить настройку в menuconfig. Переходим в корневую папку SDK, открываем терминал и запускаем menuconfig, командой
sudo make menuconfig
выбираем
Download Configuration
и вписываем такую строку ttyUSB0
после чего сохраняем под дефолтным названием и выходим (как в предыдущем уроке по W801). Теперь можно изменить код примера, превратив его в код мигалки, откомпилировать и загрузить в плату. Открываем main.c в папке app и теперь чтобы мигнуть светодиодом надо выбрать пин. На плате есть 7 встроенных светодиодов, например можно выбрать крайний PB5
Исходный код светодиодной мигалки будет выглядеть так:
чтобы сконфигурировать пин используется функция tls_gpio_cfg() первый параметр у неё это название пина (в данном случае PB5), второй это вход или выход (здесь настроен на выход)
и последний похоже на внутреннюю подтяжку или режим выхода, Чтобы вывести на пин единицу или ноль используется функция tls_gpio_write() первый параметр данной функции это название пина а второй это логический уровень на выходе. Встроенные на плату светодиоды зажигаются нулем а гаснут единицей. Вместо задержки будет цикл в котором пин будет конфигурироваться и управляться если сделать миллион итераций то светодиод будет мигать редко если сделать 100 000 то чаще. Мигание повторяется в цикле 100 раз и может быть запущено заново нажатием кнопки reset на плате. Если компиляция выполнилась успешно то можно подключиь плату к компьютеру и загрузить прошивку вписав, из корня SDK, команду
Нажимть кнопку reset не нужно, после успешной загрузки плата начнет мигать светодиодом. Посмотреть результат весь процесс в видео формате можно на видео:
Адрес биткоин кошелька для поддержки блога - bc1qlhrmmkh77x2lzhqe4lt9qwkglswj64tsqt2l5g
Для работы с одним интересным, производительным и недорогим (на момент написания данной статьи) микроконтроллером W801 существует специальный SDK https://github.com/cjacker/wm_sdk_w80x. Программировать данный микроконтроллер можно и через arduino IDE (о чем есть отдельная статья - https://electe.blogspot.com/2023/12/w801.html) но SDK предоставляет больше возможностей для использования данного микроконтроллера. Данный SDK можно использовать на операционных системах семейства Linux. Процесс компиляции и загрузки программы в плату, на самом деле, не очень сложный если разобраться. Использовать можно как какой нибудь иммитатор Linux так и реально установленную на диск операционную систему. Наиболее простой для пользователя операционной системой, из линуксообразных, возможно является Ubuntu. Которую можно установить на отдельный диск либо даже можно записать её на USB флеш накопитель и использовать в тестовом режиме. Чтобы начать работу система естественно должна быть настроена, на ней д.б. интернет и прочие вещи. Также необходимо установить некоторые зависимости для работы с SDK. После перехода в терминал нужно ввести команду
sudo apt-get update
после важно установить пакет build-essential который содержит много необходимых утилит. Напр. компиляторы gcc, g++, утилита make для сборки и многое другое. Чтобы установить данный пакет нужно вписать команду
sudo apt-get install build-essential
или специальный вариант чтобы не вводить "y" в процессе установки
sudo apt-get install build-essential -y
можно также установить git командой
sudo apt-get install git
И libcurses5-dev, для запуска конфигурационного меню, командой
разархивировать его, создать папку toolchain в папке opt, в созданной папке toolchain создать ещё одну папку в которую поместить разархивированный toolchain. Далее нужно перейти в папку toolchain и склонировать в неё SDK командой
Но только если папка в которую был помещё тулчейн была так названа csky-elfabiv2-tools-x86_64-minilibc-20210423. Если она названа по другому то и название в команду нужно вписать соответствующее. Далее нужно перейти в корень папки с SDK командой
cd wm-sdk-w80x
И запустить меню конфигурации командой
make menuconfig
В терминале откроется меню как на картинке
Здесь интересует пункт "toolchain configuration" который следует выбрать.
Далее появиться меню с двумя пунктами
Нужно выбрать пункт "toolchain path" и в появившемся новом окне вписать путь до до папки bin
которая располагается в папке с распакованным тулчайном, в начале и конце пути д.б. слеши.
После нужно выйти в основное меню и выбрать "save". После появиться окно в котором будет нужно нажать "OK" для того чтобы сохранить конфигурацию под названием по умолчанию.
Дальше можно выйти из конфигуратора меню, перейдя по пункту "Exit".
И теперь всё готово для компиляции кода. Сам код располагается в папке app с SDK. Внутри есть просто вывод строки "user task" по uartу. Чтобы откомпилировать этот код и получить прошивку, нужно перейти папку wm_w80x_sdk т.е. в корень SDK и ввести команду
sudo make
Если компиляция пройдет успешно то вывод в терминале будет примерно таким
В папке w800 папки bin появится прошивка в формате .fls. Загрузить прошивку можно в микроконтроллер, утилитой wm_tools которая располагается в папке tools для ОС linux. Или утилитой wm_tools.exe для ОС windows. Чтобы использовать утилиту для linux нужно в пункте "Download confifuration" конфигуратора меню дописать "ttyUSB0". Использовать утилиту wm_tools.exe можно без дополнительных настроек. Можно поместить прошивку в папку где располагается данная утилита и загрузить её в микроконтроллер командой
wm_tools.exe -dl w800.fls -c COM3
Где вместо COM3 нужно указать название своего COM порта который появился после подключения платы. Номер порта можно посмотреть например в Arduino IDE, диспетчере устройств или просто методом перебора. Во время процесса, в консоли появиться сообщение с просьбой перезагрузить плату. Для этого нужно нажать кнопку reset на плате и после, прошивка в неё загрузиться.
Если прошивка удачно загрузилась то при подключенной плате можно видеть в мониторе последовательного порта сообщение "user tasks".
Адрес биткоин кошелька для поддержки блога - bc1qlhrmmkh77x2lzhqe4lt9qwkglswj64tsqt2l5g
На момент написания данной статьи в продаже существует множество разных плат с микроконтроллерами например Arduino, Blue pill, ESP32 и т.д. Наиболее интересными являются те из них которые имеют низкую цену и большие возможности, поэтому перечисленные Arduino, Blue pill, ESP32 являются самыми популярными. Однако, на момент написания данной статьи, есть ещё одна недорогая и имеющая большие возможности плата с микроконтроллером W801. Данный микроконтроллер 32х разрядный и имеет высокую тактовую частоту 240 МГц а также большое количество пинов GPIO и 2 МГб встроенной флеш памяти. Также есть много интересной и сложной периферии которой обычно нет в простых и дешевых микроконтроллерах. Например WIFI, bluetooth, DCMI. Нет USB и CAN шины поэтому если нужна аппаратная поддержка USB или CAN то нужно выбирать другой микроконтроллер например STM32 или ESP32. Также для W801, на момент написания данной статьи, нет нормальной документации и большого количества примеров в интернете как например для Blue Pill. В остальном это весьма неплохой микроконтроллер особенно с учетом его невысокой цены. W801 может быть интересен не только на готовой плате но и ввиде отдельного чипа т.к. встроенной flash памяти а также ОЗУ достаточно для того чтобы не разводить дорожки для отдельной микросхемы. Поскольку память работает на большой частоте то важно делать разводку платы по правилам разводки для высокочастотных схем а также иметь некоторый опыт в данной области т.к. простые рекомендации всё таки не могут охватить весь спектр возможных проблем. По традиции, изучение нового микроконтроллера следует изучать с блинка т.е. светодиодной мигалки. Проще всего это сделать через среду Arduino IDE. Которую нужно сначала настроить. Для настройки среды Arduino, откроем её, в верхнем меню выберем "файл" -> "настройки"
далее откроется уже знакомое окно с текстовым полем для добавления ссылки
Если данное поле пустое то в него можно сразудобавить ссылку если нет
то нужно кликнуть по кнопке справа от данного поля и вписать одну из ссылок