В этом уроке напишем первую программу, научимся считывать значение цифровых входов и устанавливать состояние выходов. Реализуем управление такими простыми элементами, как кнопка и светодиод на платформе 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
Appreciating the dedication you put into your blog and in depth information you present.
It’s good to come across a blog every once in a while that
isn’t the same outdated rehashed information. Great read!
I’ve bookmarked your site and I’m adding your RSS feeds to
my Google account.
medicine in mexico pharmacies: reputable mexican pharmacies online — mexican rx online
Great stuff. With thanks.
Heli snow skiing in Canada gives an unparalleled journey for thrill-seekers and particle enthusiasts equally. Along with extensive breadths of excellent wild as well as towering range of mountains, Canada delivers the ideal scenery for a remarkable heli snowboarding experience, https://numberfields.asu.edu/NumberFields/show_user.php?userid=3597294.
medication from mexico pharmacy: mexico pharmacy — buying prescription drugs in mexico
pharmacies in canada that ship to the us is canadian pharmacy legit reputable canadian online pharmacy
http://mexicoph24.life/# medicine in mexico pharmacies
https://ciprofloxacin.tech/# purchase cipro
buy cytotec Misoprostol 200 mg buy online buy cytotec online
http://ciprofloxacin.tech/# п»їcipro generic
zestoretic coupon: buying lisinopril in mexico — zestril 10 mg in india
cheap propecia pills generic propecia pills get generic propecia price
http://ciprofloxacin.tech/# ciprofloxacin order online
cytotec pills buy online п»їcytotec pills online Abortion pills online
cost cheap propecia without prescription: propecia online — generic propecia no prescription
https://finasteride.store/# cost propecia for sale
This site was… how do I say it? Relevant!! Finally I have found something that helped me.
Thanks!
prinivil 2.5 mg zestril 10 mg in india zestril 2.5 mg tablets
cheap propecia pill: cost of cheap propecia online — get generic propecia online
http://ciprofloxacin.tech/# ciprofloxacin over the counter
buy cytotec online buy cytotec pills buy cytotec over the counter
buy ciprofloxacin over the counter: buy ciprofloxacin over the counter — buy cipro online
https://finasteride.store/# cost generic propecia pill
Misoprostol 200 mg buy online buy cytotec pills cytotec buy online usa
cost propecia without rx: order generic propecia without prescription — cost of generic propecia without prescription
buy cytotec over the counter cytotec online buy cytotec pills online cheap
http://nolvadex.life/# tamoxifen mechanism of action
prinivil coupon: lisinopril 125 mg — lisinopril tab 5 mg price
http://cytotec.club/# purchase cytotec
generic propecia prices buy generic propecia without prescription propecia pills
buy lisinopril 20 mg online: lisinopril 2019 — lisinopril 20 mg mexico
http://nolvadex.life/# tamoxifen cost
buy ciprofloxacin cipro pharmacy ciprofloxacin order online
https://lisinopril.network/# prinivil tabs
Wow, incredible weblog structure! How long have you ever
been blogging for? you make blogging look easy. The entire glance of your site
is magnificent, as neatly as the content!
lisinopril 20 mg tablet zestoretic 10 mg buy zestoretic
ciprofloxacin over the counter: ciprofloxacin mail online — buy cipro online without prescription
https://lisinopril.network/# buy lisinopril 20 mg no prescription
cipro buy ciprofloxacin where can i buy cipro online
https://kamagra.win/# Kamagra tablets
Hmm is anyone else encountering problems with the pictures on this blog loading?
I’m trying to figure out if its a problem on my end or
if it’s the blog. Any feed-back would be greatly appreciated.
Cenforce 100mg tablets for sale cenforce for sale Cenforce 150 mg online
Great post however I was wanting to know if you could write a litte more on this topic?
I’d be very thankful if you could elaborate a little bit further.
Appreciate it!
Spot on with this write-up, I honestly believe this amazing
site needs much more attention. I’ll probably be back again to see more, thanks for the information!
Wow, this post is fastidious, my sister is analyzing these things, thus I am going to convey her.
I loved as much as you’ll receive carried out right here.
The sketch is tasteful, your authored material stylish.
nonetheless, you command get got an edginess over that you wish
be delivering the following. unwell unquestionably come further
formerly again since exactly the same nearly very often inside case
you shield this increase.
I really like it when people get together and share ideas.
Great website, keep it up!
We’re a group of volunteers and starting a new scheme in our community.
Your site offered us with valuable info to work on. You’ve done a formidable
job and our whole community will be thankful to you.
Hey very nice web site!! Man .. Excellent .. Amazing ..
I will bookmark your site and take the feeds also?
I’m happy to search out numerous useful information right here within the put up,
we want work out more techniques in this regard, thanks for sharing.
. . . . .
https://viagras.online/# Cheap generic Viagra
Cialis without a doctor prescription buy cialis overseas cheapest cialis
Write more, thats all I have to say. Literally, it seems as though you relied on the video to
make your point. You obviously know what youre
talking about, why throw away your intelligence on just posting videos to your weblog when you could be giving us something
informative to read?
I visited several websites however the audio feature for audio songs present at this website
is really fabulous.
I have read so many posts concerning the blogger lovers except this post is really a
fastidious paragraph, keep it up.
Thanks for finally talking about > Урок 1.
Управление I/O. Кнопка/светодиод — MicroPi < Loved it!
Kamagra tablets: buy kamagra online — buy kamagra online usa
Just want to say your article is as astounding.
The clarity in your post is simply great and i can assume you are an expert on this subject.
Well with your permission let me to grab your RSS feed to keep
up to date with forthcoming post. Thanks a million and please carry on the
rewarding work.
Hey there are using WordPress for your blog platform? I’m new to the blog world but I’m trying to get started and create my
own. Do you need any html coding expertise to make your
own blog? Any help would be really appreciated!
Your means of explaining the whole thing in this
article is actually nice, every one be capable of without difficulty be aware of
it, Thanks a lot.
viagra without prescription Cheapest place to buy Viagra Generic Viagra for sale
http://kamagra.win/# buy kamagra online usa
I used to be able to find good information from your articles.
Do you mind if I quote a couple of your posts as long as I provide credit and sources back to your site?
My blog is in the very same area of interest as yours and my visitors would
truly benefit from some of the information you provide here.
Please let me know if this ok with you. Many thanks!
I’m gone to say to my little brother, that he should also go to see this website on regular basis to get updated
from most up-to-date reports.
You could certainly see your skills within the work you write.
The world hopes for even more passionate writers such as
you who aren’t afraid to mention how they believe.
At all times follow your heart.
You ought to be a part of a contest for one of the best sites on the net.
I most certainly will recommend this blog!
cenforce.pro: Cenforce 150 mg online — order cenforce
Oh my goodness! Incredible article dude!
Thank you, However I am encountering issues with your RSS.
I don’t know why I am unable to subscribe to it. Is there
anybody else getting similar RSS issues? Anybody who knows the answer will you
kindly respond? Thanx!!
We are a group of volunteers and opening a new scheme in our community.
Your site offered us with valuable information to work on. You’ve done an impressive job and our whole community will be grateful to you.
excellent publish, very informative. I’m wondering why the opposite specialists of this sector
don’t notice this. You should proceed your writing.
I’m sure, you’ve a great readers’ base already!
I’m curious to find out what blog platform you are using?
I’m experiencing some small security problems with my
latest blog and I’d like to find something more risk-free.
Do you have any suggestions?
cialis for sale Generic Tadalafil 20mg price Cheap Cialis
I know this if off topic but I’m looking into starting my
own weblog and was wondering what all is required to get setup?
I’m assuming having a blog like yours would cost a pretty penny?
I’m not very web smart so I’m not 100% sure.
Any recommendations or advice would be greatly appreciated.
Thanks
It is not my first time to visit this web page, i am visiting this site dailly and get nice data from here everyday.
What i do not understood is if truth be told how you are not really much more
neatly-liked than you may be now. You’re very intelligent.
You recognize thus considerably in the case of this topic,
made me individually consider it from a lot of various
angles. Its like men and women aren’t interested until it is something to do with Girl gaga!
Your individual stuffs excellent. All the time maintain it up!
Wonderful beat ! I would like to apprentice while you amend
your website, how can i subscribe for a blog web site?
The account aided me a acceptable deal. I had been tiny bit acquainted of this
your broadcast provided bright clear concept
https://cialist.pro/# Cialis 20mg price in USA
Greetings! Very helpful advice within this article!
It’s the little changes that make the biggest changes. Thanks a lot for
sharing!
You are so awesome! I don’t think I have read through something like
that before. So nice to discover someone with original
thoughts on this subject matter. Seriously.. many thanks for starting this up.
This web site is something that is required on the web, someone with a
little originality!
It’s hard to find knowledgeable people on this subject, but you sound like you know what you’re talking about!
Thanks
broporno.vip
It’s amazing for me to have a site, which is good in favor of my knowledge.
thanks admin
Touche. Sound arguments. Keep up the amazing spirit.
viagra canada Buy Viagra online Cheap generic Viagra
Levitra 20 mg for sale: Cheap Levitra online — Buy Vardenafil 20mg online
of course like your web site but you have to test the spelling on several of your posts.
Many of them are rife with spelling problems and I find it very bothersome to tell the
reality then again I’ll definitely come back again.
Unquestionably believe that which you stated. Your favorite justification appeared to be on the web the simplest thing to be aware of.
I say to you, I certainly get irked while people consider worries that they just do not know about.
You managed to hit the nail upon the top and also defined out the whole thing without having side effect ,
people could take a signal. Will likely be back to
get more. Thanks
Excellent post. Keep posting such kind of info on your page.
Im really impressed by your site.
Hi there, You’ve done a fantastic job. I’ll definitely digg it and in my opinion suggest to my friends.
I am confident they will be benefited from this site.
It’s an amazing paragraph for all the online users; they will
take benefit from it I am sure.
If some one wants expert view about blogging and site-building then i advise him/her to pay a visit this
weblog, Keep up the nice work.
Genuinely when someone doesn’t be aware of after that its up to other
users that they will assist, so here it takes place.
https://cenforce.pro/# Buy Cenforce 100mg Online
Hi there, this weekend is nice designed for me, since this occasion i am reading this fantastic informative
post here at my house.
I really like your blog.. very nice colors & theme. Did
you make this website yourself or did you hire someone to do it for you?
Plz answer back as I’m looking to construct my own blog
and would like to know where u got this from. thanks
order cenforce buy cenforce cheapest cenforce
Great items from you, man. I have take into account your stuff prior to
and you’re just extremely magnificent. I really
like what you’ve acquired here, really like what you are saying and the way during which you assert it.
You’re making it enjoyable and you continue to take care of to stay it
smart. I can not wait to learn far more from you.
That is really a terrific site.
Generic Levitra 20mg: Levitra generic best price — Levitra 20 mg for sale
My brother suggested I might like this web site. He was
totally right. This post truly made my day. You can not imagine just how much
time I had spent for this info! Thanks!
I love reading through an article that will make people think.
Also, thanks for allowing for me to comment!
https://kamagra.win/# super kamagra
I do believe all of the concepts you’ve offered to your post.
They’re really convincing and will certainly work. Nonetheless, the posts are too
short for starters. Could you please prolong them a little from subsequent time?
Thank you for the post.
What’s up mates, its impressive post regarding cultureand entirely defined,
keep it up all the time.
https://pharmcanada.shop/# canadian pharmacy mall
I every time spent my half an hour to read this blog’s content everyday along with a cup
of coffee.
world pharmacy india top 10 pharmacies in india п»їlegitimate online pharmacies india
I quite like reading through a post that can make men and women think.
Also, many thanks for permitting me to comment!
When I originally commented I appear to have clicked on the -Notify me
when new comments are added- checkbox and now every time a comment is added I recieve four emails with the same comment.
Is there an easy method you are able to remove me from that service?
Appreciate it!
This piece of writing will assist the internet people for setting up new web site or even a weblog from start to end.
I’m not that much of a internet reader to be
honest but your sites really nice, keep it up! I’ll go ahead and bookmark your website to come back
later. Cheers
https://pharmnoprescription.icu/# buy drugs without prescription
Wonderful blog! I found it while browsing on Yahoo News.
Do you have any tips on how to get listed in Yahoo News?
I’ve been trying for a while but I never seem to get there!
Cheers
It’s genuinely very complex in this full
of activity life to listen news on TV, therefore I just use world wide web for that purpose,
and take the hottest news.
foreign pharmacy no prescription cheapest pharmacy online canadian pharmacy coupon
Thank you for the good writeup. It in fact was a amusement account it.
Look advanced to far added agreeable from you!
However, how can we communicate?
It’s very simple to find out any matter on net as compared to books, as I found this piece of writing at
this web site.
Thank you for sharing your info. I truly appreciate your efforts and I will be waiting
for your next post thank you once again.
I’m not that much of a online reader to be honest but your sites really nice, keep it up!
I’ll go ahead and bookmark your site to come back down the road.
All the best
canadian pharmacy coupon: cheapest pharmacy — no prescription needed canadian pharmacy
I visited many web sites but the audio feature for audio songs present at this site is actually
marvelous.
no prescription medication prescription from canada can i buy prescription drugs in canada
http://pharmcanada.shop/# canadian pharmacy phone number
legitimate online pharmacies india: Online medicine home delivery — buy medicines online in india
canadian valley pharmacy the canadian pharmacy legit canadian pharmacy
When someone writes an post he/she retains the
plan of a user in his/her mind that how a user can know
it. So that’s why this article is great. Thanks!
top 10 online pharmacy in india: top online pharmacy india — indian pharmacy online
canadian online pharmacy no prescription online pharmacy pharmacy no prescription required
http://pharmcanada.shop/# canada drugs
canada prescription: how to get a prescription in canada — buying prescription medications online
indianpharmacy com indian pharmacies safe top 10 online pharmacy in india
http://pharmcanada.shop/# canadian mail order pharmacy
I am only writing to let you be aware of of the useful discovery my wife’s daughter went through using yuor web blog. She realized too many details, including how it is like to possess an amazing teaching nature to let the mediocre ones effortlessly thoroughly grasp a variety of tricky matters. You undoubtedly exceeded visitors’ expected results. Thanks for presenting the necessary, dependable, explanatory and in addition easy tips about your topic to Kate.
Also visit my site http://Mallds.com/bbs/board.php?bo_table=free&wr_id=110336
buy zithromax 1000 mg online: zithromax 250 mg australia — buy zithromax online cheap
neurontin 400 mg capsules gabapentin 300 neurontin 600 mg tablet
https://gabapentinneurontin.pro/# gabapentin medication