В этом уроке напишем первую программу, научимся считывать значение цифровых входов и устанавливать состояние выходов. Реализуем управление такими простыми элементами, как кнопка и светодиод на платформе 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, и т. д.
Создание нового проекта
- Открываем PlatformIO: Home и выбираем New Project, чтобы создать новый проект;
- Задаём название проекта в поле Name;
- В Boards ищем плату Sipeed MAIXDUINO;
- Выбираем Фреймворк Kendryte FreeRTOS SDK;
- В Location можно указать путь, где будет храниться проект, но можно оставить по умолчанию.
При создании первого проекта, все необходимые файлы и библиотеки будут загружены и установлены автоматически, и это может занять больше времени, чем обычно.
Настройка проекта
В папке src необходимо создать два файла: main.cpp и project_cfg.h. В первом файле мы напишем программу, а во втором мы определим макросы и настроим функции выводов.
В корневом каталоге есть файл 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).
Все контакты разъема P3 (HEADER-1X6) подключены к ESP-32, поэтому его нельзя использовать с K210. Но разъемы P2 и P5 идут на K210, и их можно использовать в качестве контактов ввода-вывода общего назначения.
Настройка порта
Перед настройкой вывода на выход или на вход ему необходимо назначить одну функцию из 32 GPIOHS или 8 GPIO. Это можно сделать двумя способами:
- с использованием функции
int fpioa_set_function (int number, fpioa_function_t function)
; - с конфигурацией объекта
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 через резистор, ограничивающий ток.
Файл 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.
Файл 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
порно фото
Оборудование в аренду для строительства в Красноярске
аренда инструмента в красноярске без залога https://prokat888.ru/.
Взять инструмент в Красноярске у нас — легко и удобно
аренда инструмента в красноярске https://www.prokat888.ru.
Онлайн Займы на карту
https://mikrozaimy-na-kartu.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.
Good site you have got here.
https://www.tvsudecka.pl
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.
%%
Feel free to surf to my page https://gatesofolympusoyna1.com/
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