Урок 1. Кнопка, светодиод. Функции управления вводом/выводом. Первая программа

В этом уроке напишем первую программу, научимся считывать значение цифровых входов и устанавливать состояние выходов. Реализуем управление такими простыми элементами, как кнопка и светодиод на платформе Maixduino.

Что нужно знать

Существует 3 фреймворка для разработки приложений для процессора К210:

  • Standalone SDK для Kendryte K210;
  • Kendryte FreeRTOS SDK — Этот SDK предназначен для Kendryte K210, который содержит поддержку FreeRTOS;
  • Arduino (на основе Standalone SDK).

Для работы с периферийными устройствами на Maixduino существует 3 основных компонента: GPIO, GPIOHS и FPIOA.

  • GPIO (General Purpose Input Output / Интерфейс ввода/вывода общего назначения) — чип имеет 8 GPIO общего назначения.
  • GPIOHS (General Purpose Input Output High Speed / Высокоскоростной интерфейс ввода/вывода общего назначения) – чип имеет 32 высокоскоростных GPIO. Похоже на обычный GPIO, но быстрее.
  • FPIOA (Field Programmable I/O Array / Программируемый массив ввода/вывода) позволяет пользователю соотносить 256 внутренних функций с 48 физическими входами / выходами на чипе.

Из этого следует, что Maixduino более гибок, чем простой Arduino на базе микроконтроллеров AVR. Мы можем сопоставить любое устройство с любым физическим контактом (контактами), например, кнопки, светодиоды, устройства I2C и SPI, и т. д.

Создание нового проекта

  1. Открываем PlatformIO: Home и выбираем New Project, чтобы создать новый проект;
    Урок 1. Управление I/O. Кнопка, светодиод - PIO Home
  2. Задаём название проекта в поле Name;
  3. В Boards ищем плату Sipeed MAIXDUINO;
    Урок 1. Управление I/O. Кнопка, светодиод - Board
  4. Выбираем Фреймворк Kendryte FreeRTOS SDK;
  5. В Location можно указать путь, где будет храниться проект, но можно оставить по умолчанию.
    Урок 1. Управление I/O. Кнопка, светодиод - Finish

При создании первого проекта, все необходимые файлы и библиотеки будут загружены и установлены автоматически, и это может занять больше времени, чем обычно.

Настройка проекта

В папке src необходимо создать два файла: main.cpp и project_cfg.h. В первом файле мы напишем программу, а во втором мы определим макросы и настроим функции выводов.

Урок 1. Управление I/O. Кнопка, светодиод - Проект

В корневом каталоге есть файл platformio.ini — файл конфигурации проекта PlatformIO. По умолчанию PlatformIO автоматически определяет порт загрузки. Но Вы можете настроить собственный порт, используя параметр upload_port. Список портов вы можете найти в Диспетчер Устройств или во вкладке Devices в PIO Home.

В platformio.ini вы также можете изменить скорость загрузки, используя параметр upload_speed, порт монитора, параметр monitor_port, и скорость монитора порта, параметр monitor_speed. Порт загрузки и порт монитора должны совпадать.

Пример файла platformio.ini

; PlatformIO Project Configuration File
;
;   Build options: build flags, source filter
;   Upload options: custom upload port, speed and extra flags
;   Library options: dependencies, extra library storages
;   Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html

[env:sipeed-maixduino]
platform = kendryte210
board = sipeed-maixduino
framework = kendryte-freertos-sdk

upload_port = COM3
upload_speed = 1500000

monitor_port = COM3
monitor_speed = 115200

Как работать с GPIO

Если мы хотим записывать или читать данные из GPIO, мы должны сначала его настроить. Как упоминалось выше, K210 имеет 48 контактов и 256 функций для них. Но поскольку на плате формфактора Arduino количество контактов ограничено, используются не все 48 контактов.

Сначала, чтобы определить, какие контакты и где они назначены, мы должны открыть схему платы — Maixduino-4.30(schematic).pdf. Тут нужно найти разъемы (Connector).Урок 1. Управление I/O. Кнопка, светодиод - Connector

Все контакты разъема P3 (HEADER-1X6) подключены к ESP-32, поэтому его нельзя использовать с K210. Но разъемы P2 и P5 идут на K210, и их можно использовать в качестве контактов ввода-вывода общего назначения.

Настройка порта

Перед настройкой вывода на выход или на вход ему необходимо назначить одну функцию из 32 GPIOHS или 8 GPIO. Это можно сделать двумя способами:

  1. с использованием функции int fpioa_set_function (int number, fpioa_function_t function);
  2. с конфигурацией объекта g_fpioa_cfg.

Первый вариант можно использовать в небольших проектах с небольшим количеством конфигураций или в проектах, которые требуют изменения функции вывода во время работы программы (runtime).
Второй вариант более предпочтителен, поскольку за настройку всех выводов отвечает только один файл, таким образом проект становится более структурированным и читаемым.

В приведенных ниже примерах показано, как соотносить функцию GPIOHS0 на вывод под номером 3 (это вывод IO3 на разъеме P5). Обратите внимание, что перечисление выполняется относительно FUNC_GPIOHS0. В дальнейшем будут использоваться только значения от 0 до 31. Поэтому желательно использовать макросы (#define).

Пример 1:

fpioa_set_function(3, static_cast<fpioa_function_t>(FUNC_GPIOHS0 + 0));

Пример 2:

#ifndef PROJECT_CFG_H
#define PROJECT_CFG_H

#include <pin_cfg.h>

const fpioa_cfg_t g_fpioa_cfg = {
    /* Версия */
    .version = PIN_CFG_VERSION,
    /* Число функций */
    .functions_count = 1,
    /* Офисание функций */
    .functions = {
        /*  */
        {3, static_cast<fpioa_function_t>(FUNC_GPIOHS0 + 0)},
    },
};
#endif

После этого необходимо открыть устройство gpio0 с помощью функции io_open.

/* Открываем GPIO0 устройство */
gpio = io_open("/dev/gpio0");

И наконец настраиваем режим работы вывода (пина) – на вход или выход.

/* Устанавливаем режим работы пина 0 на вход. */
gpio_set_drive_mode(gpio, 0, GPIO_DM_INPUT);
/* Устанавливаем режим работы пина 0 на выход. */
gpio_set_drive_mode(gpio, 0, GPIO_DM_OUTPUT);
/* Устанавливаем режим работы пина 0 на вход с подтягивающим резистором (pull-up resistor). */
gpio_set_drive_mode(gpio, 0, GPIO_DM_INPUT_PULL_UP);
/* Устанавливаем режим работы пина 0 на вход с стягивающим резистором (pull-down resistor). */
gpio_set_drive_mode(gpio, 0, GPIO_DM_INPUT_PULL_DOWN);

Примеры программ

Чтобы лучше понять, как всё это работает, приведу два примера программ. Комментарии также будут добавлены в код для более подробного описания.

Пример 1 — мигаем светодиод

В первом примере будем мигать светодиодом, подключенным к одному из выводов платы. В файле project_cfg.h настроим функцию вывода, используемый для мигания светодиода. В файле main.cpp настроим вывод на выход и создадим задачу blinkLedTask, которая будет вызываться с интервалом 100 мс, и при каждом вызове светодиод будет менять свое состояние с ВКЛ на ВЫКЛ и наоборот.

Схема подключения

Светодиод подключается на 13-й контакт Maixduino/Arduino через резистор, ограничивающий ток.

Урок 1. Управление I/O. Схема подключения светодиода - Maixduino+LED

Файл project_cfg.h

#ifndef PROJECT_CFG_H
#define PROJECT_CFG_H

#include <pin_cfg.h>

/**
 * Номер внутреннего пина
 */
#define LED_IO (0)

/**
 * Номер физического пина
 */
#define LED_PIN (3)

const fpioa_cfg_t g_fpioa_cfg = {
    /* Версия */
    .version = PIN_CFG_VERSION,
    /* Число функций */
    .functions_count = 1,
    /* Офисание функций */
    .functions = {
        /*  */
        {LED_PIN, static_cast<fpioa_function_t>(FUNC_GPIOHS0 + LED_IO)},
    },
};
#endif

Файл main.cpp

#include "project_cfg.h"
#include <FreeRTOS.h>
#include <devices.h>
#include <syslog.h>
#include <task.h>

/**
 * Указатель на устройство GPIO
 */
static handle_t gpio;

/**
 * Текущее состояние светодиода
 */
static gpio_pin_value_t ledState;

/**
 * Прототип задачи включения/выключения светодиода
 * 
 * @param pvParameters Функции задач принимают параметр, имеющий тип указателя на void (т. е. void*). Значение, указанное в pvParameters, будет передано в задачу.
 */
static void blinkLedTask(void *pvParameters);

/**
 * 
 */
int main() {
  BaseType_t retCode;

  /* Открываем GPIO0 устройство */
  gpio = io_open("/dev/gpio0");
  /* Перехват ошибок в процессе разработки */
  configASSERT(gpio);
  /* Устанавливаем режим работы LED_IO пина на выход. */
  gpio_set_drive_mode(gpio, LED_IO, GPIO_DM_OUTPUT);
  /* Задаём начальное состояние светодиода (выключаем) */
  ledState = GPIO_PV_LOW;
  /* Пишем состояние в пин */
  gpio_set_pin_value(gpio, LED_IO, ledState);

  /* Создаём задачу с мигающим светодиодом */
  retCode = xTaskCreateAtProcessor(1, &blinkLedTask, "Blink Led task", 512, nullptr, 3, nullptr);
  /* Проверяем, если задача была успешно создана */
  if (retCode == pdPASS) {
    /* В случае успеха выводим информационное сообщение */
    LOGI("MFRB", "Blink Led task is running");
  } else {
    /* В случае неудачи выводим предупреждающее сообщение */
    LOGW("MFRB", "Blink Led task start problems");
  }

  for (;;) {
  }

  return 0;
}

static void blinkLedTask(void *pvParameters) {
  while (1) {
    /* Меняем состояние в 1/0 */
    if (GPIO_PV_HIGH == ledState) {
      ledState = GPIO_PV_LOW;
    } else {
      ledState = GPIO_PV_HIGH;
    }
    /* Пишем новое состояние в пин */
    gpio_set_pin_value(gpio, LED_IO, ledState);

    /* Помещаем задачу в состояние Blocked на фиксированное количество тиков прерываний.
    Находясь в состоянии Blocked, задача не использует процессорное время, 
    поэтому процессор загружен только полезной работой.
    С помощью макроса pdMS_TO_TICKS мы конвертируем миллисекунды в тики */
    vTaskDelay(pdMS_TO_TICKS(100));
  }
}

Пример 2 — кнопка и светодиод

Во втором примере помимо светодиода подключим еще и кнопку. Если кнопка не нажата, светодиод будет менять свое состояние (мигать) каждые 500 мс, а при нажатии — каждые 100 мс. Вывод, подключенный к кнопке, настроен на вход с подтягивающим резистором gpio_set_drive_mode(gpio, BTN_IO, GPIO_DM_INPUT_PULL_UP);.

Схема подключения

Светодиод подключается на 13-й контакт Maixduino/Arduino через резистор, ограничивающий ток, а кнопка на 12-й контакт и GND.

Урок 1. Управление I/O. Схема подключения светодиода - Maixduino+LED+Button

Файл project_cfg.h

#ifndef PROJECT_CFG_H
#define PROJECT_CFG_H

#include <pin_cfg.h>

/**
 * Номер внутреннего пина
 */
#define LED_IO (0)
#define BTN_IO (1)

/**
 * Номер физического пина
 */
#define LED_PIN (3)
#define BTN_PIN (10)

const fpioa_cfg_t g_fpioa_cfg = {
    /* Версия */
    .version = PIN_CFG_VERSION,
    /* Число функций */
    .functions_count = 2,
    /* Офисание функций */
    .functions = {
        /*  */
        {LED_PIN, static_cast<fpioa_function_t>(FUNC_GPIOHS0 + LED_IO)},
        {BTN_PIN, static_cast<fpioa_function_t>(FUNC_GPIOHS0 + BTN_IO)},
    },
};
#endif

Файл main.cpp

#include "project_cfg.h"
#include <FreeRTOS.h>
#include <devices.h>
#include <syslog.h>
#include <task.h>

/**
 * Указатель на устройство GPIO
 */
static handle_t gpio;

/**
 * Текущее состояние светодиода
 */
static gpio_pin_value_t ledState;

/**
 * Прототип задачи включения/выключения светодиода
 * 
 * @param pvParameters Функции задач принимают параметр, имеющий тип указателя на void (т. е. void*). Значение, указанное в pvParameters, будет передано в задачу.
 */
static void blinkLedTask(void *pvParameters);

/**
 * 
 */
int main() {
  BaseType_t retCode;

  /* Открываем GPIO0 устройство */
  gpio = io_open("/dev/gpio0");
  /* Перехват ошибок в процессе разработки */
  configASSERT(gpio);
  /* Устанавливаем режим работы LED_IO пина на выход. */
  gpio_set_drive_mode(gpio, LED_IO, GPIO_DM_OUTPUT);
  /* Устанавливаем режим работы BTN_IO пина на вход с подтягивающим резистором. */
  gpio_set_drive_mode(gpio, BTN_IO, GPIO_DM_INPUT_PULL_UP);
  /* Задаём начальное состояние светодиода (выключаем) */
  ledState = GPIO_PV_LOW;
  /* Пишем состояние в пин */
  gpio_set_pin_value(gpio, LED_IO, ledState);

  /* Создаём задачу с мигающим светодиодом */
  retCode = xTaskCreateAtProcessor(1, &blinkLedTask, "Blink Led task", 512, nullptr, 3, nullptr);
  /* Проверяем, если задача была успешно создана */
  if (retCode == pdPASS) {
    /* В случае успеха выводим информационное сообщение */
    LOGI("MFRB", "Blink Led task is running");
  } else {
    /* В случае неудачи выводим предупреждающее сообщение */
    LOGW("MFRB", "Blink Led task start problems");
  }

  for (;;) {
  }

  return 0;
}

static void blinkLedTask(void *pvParameters) {
  /* Состояние кнопки */
  gpio_pin_value_t btnState;
  /* Время повторения */
  unsigned int timeInMs;
  while (1) {
    /* Считываетм состояние кнопки. */
    btnState = gpio_get_pin_value(gpio, BTN_IO);
    if (btnState == GPIO_PV_LOW) {
      /* Если кнопка нажата, мы меняем повторяемость задачи на 100 мс. */
      timeInMs = 100;
    } else {
      /* Если нет - 500 мс. */
      timeInMs = 500;
    }

    /* Меняем состояние в 1/0 */
    if (GPIO_PV_HIGH == ledState) {
      ledState = GPIO_PV_LOW;
    } else {
      ledState = GPIO_PV_HIGH;
    }
    /* Пишем новое состояние в пин */
    gpio_set_pin_value(gpio, LED_IO, ledState);

    /* Помещаем задачу в состояние Blocked на фиксированное количество тиков прерываний.
    Находясь в состоянии Blocked, задача не использует процессорное время, 
    поэтому процессор загружен только полезной работой.
    С помощью макроса pdMS_TO_TICKS мы конвертируем миллисекунды в тики */
    vTaskDelay(pdMS_TO_TICKS(timeInMs));
  }
}

Материалы

Kendryte · GitHub
Maixduino-4.30(schematic)
Maixduino — одноплатный компьютер с ускорителем AI, RISC-V AI, форм-фактор Arduino и беспроводной модуль ESP32

Похожие записи

Комментарии 85

  • Взять инструмент в Красноярске у нас — легко и удобно
    аренда инструмента в красноярске https://www.prokat888.ru.

  • It’s a shame you don’t have a donate button! I’d certainly donate to this superb blog!
    I guess for now i’ll settle for bookmarking and adding your
    RSS feed to my Google account. I look forward to brand new
    updates and will talk about this blog with my
    Facebook group. Chat soon!

  • Every weekend i used to pay a quick visit this site,
    as i want enjoyment, as this this website conations truly nice funny data too.

  • First of all I want to say awesome blog! I had a quick question that I’d like to
    ask if you do not mind. I was interested to find out how you center yourself and clear your head
    before writing. I have had difficulty clearing my thoughts in getting my ideas out there.
    I truly do take pleasure in writing but it just
    seems like the first 10 to 15 minutes are wasted simply just
    trying to figure out how to begin. Any suggestions or hints?
    Many thanks!

  • This text is invaluable. How can I find out more?

  • Hey! This is kind of off topic but I need some advice from an established blog.
    Is it very hard to set up your own blog? I’m not very techincal but
    I can figure things out pretty quick. I’m thinking about setting up my own but I’m
    not sure where to begin. Do you have any points or suggestions?

    Thank you

  • Very good write-up. I absolutely appreciate this
    website. Keep it up!

  • Highly energetic post, I liked that bit. Will there be
    a part 2?

  • Wow! After all I got a webpage from where I can truly get helpful information concerning my study and knowledge.

  • آخرین اخبار و گزارش های
    جدید را در goodlibrary.іr مشاهده کنید

    Alѕо visit mу websiute — ,Stay informed ԝith Урок 1.
    Кнопка, светодиод. Функции
    управления вводом/выводом. Первая программа
    Karma

  • Hi everyone, it’s my first pay a visit at this web page, and post is actually fruitful
    in favor of me, keep up posting such posts.

  • I was extremely pleased to find this great site. I need to to thank you for ones
    time for this particularly fantastic read!!

    I definitely really liked every bit of it and I have you book-marked to see new stuff in your blog.

  • Simply want to say your article is as surprising. The clarity in your post is
    simply great and i can assume you’re an expert on this subject.
    Fine with your permission let me to grab your feed to keep up to date with forthcoming post.
    Thanks a million and please continue the rewarding work.

  • Hello, i think that i saw you visited my site thus i came to “return the favor”.I am attempting to find things
    to improve my website!I suppose its ok to use some of your ideas!!

  • I do not know whether it’s just me or if everybody elze experiencing problems with your site.
    It appears as if some of the written text on your content are running off the screen. Can someone else
    please provide feedback andd let me know if this is happening to them too?

    This mmay bee a problem with my internet browser because I’ve
    had this happen before. Cheers

    My website :: http://www.investorsics.net

  • I read this post fully concerning the resemblance of newest
    and preceding technologies, it’s awesome article.

    Feel free to surf to my webpage — http://stargardzki.stargard.pl/

  • I love it when individuals come together and share views.

    Great site, keep it up!

  • Very good article. I certainly love this site. Continue the good work!

    Look at my blog post: kttc.marketminute.com

  • These are in fact enormous ideas in regarding blogging. You have touched some fastidious factors here.
    Any way keep up wrinting.

  • It’s enormous that you are getting ideas from this article as
    well as from our dialogue made at this time.

  • I do not know whether it’s just me or if perhaps everyone else encountering issues
    with your website. It appears as though some of the text on your posts
    are running off the screen. Can someone else please provide feedback and let
    me know if this is happening to them too? This might be a problem with my web browser because I’ve had this happen previously.
    Thank you

  • It is appropriate time to make a few plans for the long
    run and it is time to be happy. I’ve learn this put up and if I may just I want to suggest you some interesting
    things or tips. Perhaps you could write subsequent articles relating to this article.
    I wish to learn more things about it!

  • I blog frequently and I seriously thank you for
    your information. Your article has really peaked my interest.
    I will take a note of your blog and keep checking for new information about once per week.
    I subscribed to your Feed as well.

  • Are you looking for a trustworthy solution to extend the life of your roof?
    Shingle Magic Roof Sealer is your solution. The exceptional product delivers a unique standard of maintenance for your
    asphalt shingles, guaranteeing they stay in top
    condition.

    By choosing Shingle Magic Roof Sealer, you’re not just
    applying any ordinary product. You’re selecting a premium roof rejuvenation solution designed to significantly prolong the life of your roof for decades.
    It’s a smart choice for those seeking to protect their investment.

    Why choose Shingle Magic Roof Sealer? For starters, its proprietary formula penetrates
    the asphalt shingles, restoring their original strength and appearance.
    Furthermore, it is extremely straightforward to install, demanding minimal work for top results.

    In addition to Shingle Magic Roof Sealer extend the life of your roof, but it delivers superior
    resistance to the elements. Be it intense UV rays, heavy rain, or snow and
    ice, it is well-protected.

    Additionally, choosing Shingle Magic Roof Sealer signifies you
    are selecting an environmentally friendly option. The safe formula guarantees minimal environmental impact, making it a thoughtful
    choice for the planet.

    In conclusion, Shingle Magic Roof Sealer excels as the best roof
    rejuvenation solution. Not only does it prolong the
    life of your roof while delivering outstanding protection and a green option makes it as the wise choice for
    homeowners seeking to care for their property’s
    future.

    Furthermore, an important feature of Shingle Magic Roof Sealer is its affordability.
    In lieu of investing a fortune on frequent repairs
    or a full roof replacement, using Shingle Magic
    saves you costs in the long run. It’s a financially savvy choice that provides top-notch
    results.

    Moreover, the ease of application of Shingle Magic
    Roof Sealer stands out. It doesn’t require specialized knowledge to apply it.
    If you enjoy DIY projects or prefer for expert application, Shingle Magic ensures a
    smooth process with remarkable results.

    The product’s longevity also serves as a compelling reason to choose it.
    When applied, it forms a layer that keeps the integrity of your shingles for many years.
    That means less worry about weather damage and more peace of mind about the state
    of your roof.

    When it comes to appearance, Shingle Magic Roof Sealer also excels.

    Besides protecting your roof but also enhances its appearance.
    Your shingles will look refreshed, adding to the
    attractiveness and worth to your property.

    Client satisfaction with Shingle Magic Roof Sealer is another testament to its efficacy.
    Countless customers have experienced remarkable improvements in their roof’s health after using the product.

    Feedback emphasize its ease of use, durability, and superior protective qualities.

    Finally, selecting Shingle Magic Roof Sealer is choosing a reliable solution for roof rejuvenation. With its blend of sturdiness, aesthetic enhancement, economic efficiency, and user-friendliness positions it as the ideal choice for homeowners seeking to prolong
    the life and appearance of their roof. Don’t
    wait to revitalize your roof with Shingle Magic Roof Sealer.

  • Sehr präzise Informationen! Die Tipps sind sehr praktisch und leicht umsetzbar.
    Danke für Ihren Beitrag!

  • My family every time say that I am wasting my time here at
    web, however I know I am getting familiarity all the time by reading such
    pleasant articles.

  • magnificent publish, very informative. I’m wondering why the other experts of this sector don’t understand
    this. You must proceed your writing. I am sure, you’ve a huge readers’ base already!

  • Undeniably consider that which you said. Your favourite reason seemed to be on the internet the easiest
    thing to take into accout of. I say to you, I definitely get irked at the same time as folks think about issues that they just
    do not understand about. You managed to hit the nail upon the top
    and outlined out the entire thing with no need
    side effect , people can take a signal. Will likely be back
    to get more. Thanks

  • Whether you intend to purchase automobile financial online, you have to limit all the possible offers and also prices that suit
    your budget. As frequently with the situation of
    numerous, they tend to ignore the value of matching up
    finance quotes that they usually tend to devote three
    times as long as they can have in fact conserved,
    view source.

  • Pastilla Cialis Precio
    Cialis 5 mg prezzo tadalafil 5 mg prezzo tadalafil 5 mg prezzo

  • This site was… how do you say it? Relevant!! Finally I’ve found something that
    helped me. Thank you!

  • I have read so many articles on the topic of the blogger lovers but
    this piece of writing is truly a good article, keep it
    up.

  • Helⅼo, yedah thiss paraqgraph iss iin faact fastidiou aand I hve learnmed lott off thinfs fdom
    itt oon tthe topoc оff blogging. tһanks.

    My webb blo — 1 (Bart)

  • Excellent way of explaining, and good article to get facts regarding my presentation focus, which i am going to present in academy.

  • My partner and I stumbled over here different website and thought I
    should check things out. I like what I see so i am just following
    you. Look forward to looking into your web page yet again.

  • Heolo friends, fastidioous piwce ߋff writfing
    annd fastidious argument commented һere, I aam actjally enjpying bby tһese.

    Herre iis mmy websige :: 1 (Royce)

  • Hi there, every time i used to check web site posts here
    early in the daylight, as i love to find out more
    and more.

  • Hi there to every one, the contents existing at this site are actually remarkable for people
    knowledge, well, keep up the good work fellows.

  • If you wish for to grow your knowledge simply keep visiting this web page and be
    updated with the hottest news update posted here.

  • I was extremely pleased to discover this great site.
    I need to to thank you for ones time for this particularly fantastic read!!
    I definitely enjoyed every little bit of it and I have you book marked to see new stuff on your blog.

    Feel free to visit my homepage … http://warszawski.waw.pl/

  • Grsat post.

    Herre iss myy рage :: 1

  • Its such as you read my thoughts! You appear to know a lot approximately
    this, such as you wrote the book in it or something.

    I think that you just could do with a few p.c.
    to power the message house a bit, but instead of that, that is fantastic
    blog. A great read. I’ll certainly be back.

    My web site — http://elblaski.elblag.pl/

  • һi!,I llove yoour writinng sso mսch! percntage wwe
    communicate mоre approximateely yoyr artiicle onn AOL?

    Ӏ requuire а specialist iin tis housse tto resolve myy ρroblem.
    Maye thɑt iss yߋu! Taҝing a ⅼo᧐k orward tto lkok үоu.

    mү homepaage …1 (Glenn)

  • I know this site gives quality based articles and extra
    data, is there any other site which gives these kinds of information in quality?

  • I’d liike too thhank youu ffor tthe efcorts үou’ve puut iin pnning this
    website. I’m hopinng tto seee thee samе high-grade cotent bby yoou latfer oon aas ѡell.
    In truth, yolur creatie wriuting abilitgies haas ispired mee tto gget myy oown siite noww 😉

    Feeel freee tto viksit myy blog: 1 (Daniel)

  • It’s a shame you don’t have a donate button! I’d certainly donate to this excellent blog!
    I suppose for now i’ll settle for book-marking and adding your RSS feed to my Google account.
    I look forward to fresh updates and will share this site
    with my Facebook group. Talk soon!

    Here is my web-site; http://wroclawski.wroclaw.pl/

  • I’m gone to tell my little brother, that he should also visit this blog on regular
    basis to get updated from latest news.

  • I always spent my half an hour to read this webpage’s articles every day
    along with a mug of coffee.

    Here is my web-site — خرید بک لینک

  • list japanese orgasmic
    free 3gp hot alexis breeze videos for download
    real school girls porn sleepover
    xvideos southindian porn clip mobile down
    cuckold deepthroat eyes outdoor blowjob very young

    https://groups.iese.edu/click?uid=2870c4c4-d486-11e5-9b8f-0a3ff9056b97&r=http://exoticpornsexfuck.top/index101.html

    movie sex irani 3gp
    xxvideod pono gratis
    highschooler tits
    tamil nude pornoskeezy
    videos clips mini
    brazzers orgasm free porn
    aunty sucks deepthroat xnxx com

  • Hi! Would you mind if I share your blog with my twitter group?
    There’s a lot of folks that I think would really appreciate your content.

    Please let me know. Cheers

    My webpage … http://myspace.com/7gabriellac123xdyN7

  • Thanks for your personal marvelous posting! I seriously
    enjoyed reading it, you can be a great author.I will remember to bookmark your blog and
    definitely will come back from now on. I want
    to encourage you to ultimately continue your great job, have a nice morning!

    Here is my web blog https://deneyapkart.org/wiki/index.php?title=Finnedok101

  • In today’s modern age, typing is more crucial than in the past. Whether you’re a student, a specialist, or even merely somebody who enjoys spending quality time online, possessing swiftly and also correct typing skill-sets can take you a very long way. That’s why on the internet key-board training has come to be such a preferred knowing resource recently, https://peatix.com/user/20970569.

  • There’s certainly a great deal to know about this
    subject. I really like all of the points you have made.

  • Hello, I check your blog on a regular basis.

    Your writing style is witty, keep it up!

    Look into my homepage; 메이저놀이터

  • I know this web site presents quality depending posts and other data, is there any other website which gives these kinds of data in quality?

    My web-site: http://top.warszawski.waw.pl

  • according to information According to the American Society of Addiction Medicine, some psychological and behavioral changes in detailed consultation to developing addiction include addictive cravings, impulsivity, impaired executive function,.

    My page … https://xxxbf.tv/tags

  • Do you mind if I quote a few of your articles as long as I provide
    credit and sources back to your blog? My blog site is in the exact same niche as yours and my users would definitely
    benefit from a lot of the information you provide here.
    Please let me know if this okay with you. Thank you!

    my page :: http://top.elblaski.elblag.pl

  • Thank you, I’ve recently been looking for information about this
    topic for ages and yours is the best I have
    found out till now. However, what about the bottom line?
    Are you sure concerning the supply?

    Here is my web site: http://new.warszawski.waw.pl

  • Incredible quest there. What occurred after? Thanks!

    my homepage … http://top.stargardzki.stargard.pl

  • I want to show you one exclusive program called (BTC PROFIT SEARCH AND MINING PHRASES), which can make you a rich man!

    This program searches for Bitcoin wallets with a balance, and tries to find a secret phrase for them to get full access to the lost wallet!

    Run the program and wait, and in order to increase your chances, install the program on all computers available to you, at work, with your friends, with your relatives, you can also ask your classmates to use the program, so your chances will increase tenfold!
    Remember the more computers you use, the higher your chances of getting the treasure!

    DOWNLOAD FOR FREE

    Telegram:
    https://t.me/btc_profit_search

  • It’s the best time to make some plans for the longer term and it’s time to be happy.

    I have read this put up and if I may I want to suggest you
    few attention-grabbing issues or advice. Maybe you could write subsequent
    articles relating to this article. I want to read more things about it!

    Also visit my web-site :: http://new.stargardzki.stargard.pl

  • Very good blog! Do you have any suggestions for aspiring writers?
    I’m hoping to start my own blog soon but I’m a little lost on everything.
    Would you propose starting with a free platform
    like WordPress or go for a paid option? There are so
    many choices out there that I’m completely overwhelmed ..
    Any ideas? Thanks!

    my webpage; http://new.wroclawski.wroclaw.pl

  • I’m not sure exactly why but this weblog is loading incredibly slow for me.

    Is anyone else having this problem or is it a problem on my end?
    I’ll check back later on and see if the problem still exists.

    Here is my site; http://new.szczecinski.szczecin.pl

  • We absolutely love your blog and find nearly all
    of your post’s to be exactly what I’m looking for.
    Do you offer guest writers to write content in your case?

    I wouldn’t mind publishing a post or elaborating on many of the
    subjects you write in relation to here. Again, awesome blog!

    My page; http://top.mielecki.mielec.pl

  • Greetings! Quick question that’s completely off topic.
    Do you know how to make your site mobile friendly?
    My weblog looks weird when viewing from my iphone.
    I’m trying to find a theme or plugin that might be able to resolve this issue.
    If you have any recommendations, please share. Many
    thanks!

    Take a look at my homepage http://new.radomski.radom.pl

  • If you desire to take a good deal from this article then you have to apply these strategies to your won website.

    Stop by my blog post; http://top.wroclawski.wroclaw.pl

  • Hello my friend! I want to say that this post is awesome,
    nice written and come with almost all important infos.
    I would like to see more posts like this .

  • Представьте себе сайт, который захватывает дух, но и приносит результаты. В PSS-Studio мы проектируем сайты, которые сочетают в себе уникальное оформление и безупречную функциональность, гарантируя, что ваш бренд будет бросаться в глаза в Интернете.

    Почему стоит выбрать нас?

    — Эксклюзивный дизайн: Отразите характер вашего бренда.
    — Мобильная адаптация: Оптимальный просмотр на любом устройстве.
    — Повышение видимости в поиске: Увеличьте вашу видимость в результатах поиска.
    — Непрерывная помощь: Мы всегда к вашим услугам помочь вам на каждой ступени.

    Специальное предложение: Воспользуйтесь бесплатной консультацией и особую скидку на наши услуги по разработке сайтов, если свяжетесь с нами в течение следующих 48 часов.

    Трансформируйте ваше цифровое присутствие сегодня. Приглашаем вас на наш сайт на https://pss-studio.ru/, чтобы начать ваше путешествие к замечательному сайту.

    С сердечными пожеланиями, PSS.

  • Introducing Tyler Wagner: Allstate Insurance, the leading insurance
    agency located in Las Vegas, NV. Boasting extensive expertise in the insurance industry,
    Tyler Wagner and his team are dedicated to providing exceptional customer service and tailored
    insurance solutions.

    From auto insurance to home insurance, to life and business insurance,
    we’ve got you covered. Our wide range of coverage options
    ensures that you can find the right policy to protect what matters most.

    Understanding the importance of risk assessment, our team strives to provide personalized insurance quotes that reflect your unique situation. By utilizing our
    deep knowledge of the insurance market and state-of-the-art underwriting processes, Tyler Wagner ensures
    that you receive the most competitive premium calculations.

    Navigating insurance claims can be challenging, but our agency by your
    side, you’ll have a smooth process. Our streamlined
    claims processing system and dedicated customer service team make sure that your claims
    are processed efficiently and with the utmost care.

    Moreover, we are well-versed in insurance law and regulation, guaranteeing that our policies is always
    in compliance with current legal standards. Our knowledge
    offers an added layer of security to our policyholders,
    knowing that their insurance is sound and dependable.

    At Tyler Wagner: Allstate Insurance, we believe that a good insurance policy is a key part of financial planning.
    It’s an essential aspect for safeguarding your future and ensuring the well-being of your
    loved ones. That’s why, we make it our mission to understand your individual
    needs and help you navigate through the choice among insurance options,
    making sure that you have all the information you need and confident in your decisions.

    Selecting Tyler Wagner: Allstate Insurance means partnering with a trusted insurance broker in Las Vegas,
    NV, who values your peace of mind and excellence. Our team isn’t just here to sell policies;
    we’re here to support you in creating a protected future.

    Don’t wait to reach out today and learn how Tyler Wagner:
    Allstate Insurance can transform your insurance experience
    in Las Vegas, NV. Experience the difference that comes
    from having an insurance agency that genuinely cares
    about you and works tirelessly to securing your peace of mind.

  • It’s difficult to find knowledgeable people in this particular subject, but
    you seem like you know what you’re talking about! Thanks

  • Every weekend i used to pay a quick visit this web site, forr the reason that i
    want enjoyment, since this this web site conations genuinely pleasant funny
    data too.

    Also visit my site :: christopher Quintela

  • Are you in need of a dependable solution to enhance the life of your roof?
    Shingle Magic Roof Sealer is the answer. Our unique product delivers
    a unique degree of care for your asphalt shingles, guaranteeing they last longer.

    By choosing Shingle Magic Roof Sealer, you’re not just choosing any ordinary product.
    You’re opting for a top-quality roof rejuvenation solution designed to dramatically prolong the life of your roof by up to 30 years.
    This is a wise decision for anyone seeking to preserve their investment.

    What makes Shingle Magic Roof Sealer? For starters, its
    unique formula gets into the asphalt shingles, restoring their initial condition and look.
    Moreover, it is incredibly simple to use, needing minimal
    work for maximum results.

    In addition to Shingle Magic Roof Sealer increase the life of
    your roof, it also delivers superior protection against the
    elements. Whether it’s intense UV rays, heavy rain, or freezing temperatures, it is shielded.

    Moreover, opting for Shingle Magic Roof Sealer indicates you are
    selecting an green option. Its safe composition ensures little environmental impact, making it a conscious choice for
    eco-conscious homeowners.

    In conclusion, Shingle Magic Roof Sealer excels as the premier roof rejuvenation solution. Its
    ability to prolong the life of your roof while delivering exceptional protection and an environmentally friendly
    option makes it as the ideal choice for homeowners seeking
    to care for their property’s future.

    Furthermore, a significant advantage of Shingle Magic Roof Sealer is its
    affordability. Rather than investing heaps of money on frequent repairs or
    a full roof replacement, applying Shingle Magic can save you costs in the long
    run. It’s an economical solution that provides premium
    results.

    Moreover, the user-friendly nature of Shingle Magic Roof Sealer stands out.
    It doesn’t require professional expertise to apply it.
    If you enjoy DIY projects or prefer for a professional to do the job, Shingle Magic guarantees a seamless process with outstanding results.

    The product’s durability also serves as a strong reason to choose
    it. Once applied, it develops a shield that keeps the integrity of your shingles
    for many years. This means reduced worries about damage from the
    elements and more peace of mind about the state
    of your roof.

    When it comes to visual appeal, Shingle Magic Roof Sealer
    is also superior. It not only protects your
    roof but also boosts its look. Shingles will seem more vibrant, adding
    to the curb appeal and worth to your property.

    Client satisfaction with Shingle Magic Roof Sealer is additional proof to its
    efficacy. Countless homeowners have seen notable improvements in their
    roof’s health after using the product. Reviews highlight its simplicity, lasting effects, and superior protection.

    Finally, opting for Shingle Magic Roof Sealer represents opting for a trusted solution for roof rejuvenation. Its combination of sturdiness, aesthetic enhancement, affordability,
    and user-friendliness makes it the optimal choice for homeowners looking to extend the
    life and beauty of their roof. Don’t hesitate to give your roof the care it deserves
    with Shingle Magic Roof Sealer.

  • You actually explained it terrifically.

    Feel free to visit my web-site :: https://y2matee.co/

  • Gama Casino: Погрузитесь в мир азартных наслаждений казино гама

  • Fantastic site. A lot of useful information here. I’m sending it to some friends
    ans additionally sharing in delicious. And certainly, thanks on your effort!

    Here is my page — Water Damage Restoration

  • Nice post. I used to be checking continuously this blog and I’m inspired!

    Extremely helpful information particularly the closing section 🙂 I care for such info a lot.
    I was seeking this certain information for a long time.
    Thank you and good luck.

    Here is my web blog: informational purposes

  • I truly prize your work, Great post.

    Here is my web blog … real estate agency Phoenix

  • Пополнить и забрать сумму в 2023 году с https://unioncityhvacpros.com/ Покерок вы сможете просто. в него и предстоит вписать бонусный код.

  • I am sure this post has touched all the internet users, its really really fastidious post on building up new weblog.

    My site: https://Wiki.Evil-Admin.com/index.php?title=Serviced_Apartments_-_Good_To_Corporate_And_Long_Terms_Stays

  • This site really has all of the information I wanted about this subject and didn’t know who to ask.

Добавить комментарий для HLesetSopesb Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *