Lpcxpresso урок 4
Ние продължаваме да се развиват в среда на LPC13xx CodeRed в курса. Въведение в системния часовник. Научете светодиод мига на часовника.
забавяне обратно отброяване
Естествено отстъпка в цикъл-броенето е най-лесният и най-бързият вариант. Това е напълно възможно да се използва не "първата двойка", тъй като не изисква никакви по-задълбочени познания. Но аз вече казах, че не ми харесва. Да направим функцията забавяне малко по-точен, предполагам.
Както вероятно си спомняте от първата си урок. за обратното броене тук се използва таймер за 16-битов. Аз ще отида в малко по-различен начин. Ще взема като база за системния таймер, известен още като SYSTICK.
таймер система
Обикновено системния таймер се позиционира като услуга за операционни системи. Според него, има превключване на контекста на многонишковите системи, тя се актуализира денонощно. Всъщност, за да изпълнява различни функции на услуги.
LPC13xx фиша на блок-схемата на таймера не се проверява, а текстът е написан за невероятно количество информация:
7.15 Система таймер тик
В ARM Cortex-M3 включва таймер система тик (SYSTICK), който е предназначен да генерира
специален SYSTICK изключение при определен интервал от време, обикновено определен за 10 м. Той казва SYSTICK ви позволява да генерира прекъсване на всеки 10ms. Попитайте: "Какво искаш да ни измъкне зад глупости."
И това нещо е, че таймерът е всъщност присъства дори и в блок-схемата. И не само навсякъде, но в елемента на ARM Cortex-M3. Фактът, че системния таймер е "стандарт" за ядрото на Cortex. Не може да има ARM Cortex-контролер до мозъка на костите, но без системния таймер. Така че можете да бъдете сигурни, че ще бъде глупости за всеки контролер.
И ако отворите Ръководството на потребителя за LPC13xx, ще откриете цял раздел, посветен на този таймер. И ако това е изрично, UM10375 Глава 16. В действителност тя казва, че това е 24-битов брояч преброяване с стартиране или е с тактова честота от системата генератор (CPU часовник) на, или по своя собствена. отделна прекъсване вектор се разпределя към системния таймер.
Всъщност таймерът не е задължително да произвежда 10 интервала милисекунда, тя може да се настрои на друг интервал (това, което ние използваме).
Инструменти за работа с системния таймер
CMSIS библиотека ни осигурява средства, за да работят с таймера.
В библиотеката в core_cm3.h файл има следното определение:
Същността му е проста. За да започнете проверка на допустимостта на заявения период от време, и ако той няма да позволи на индикацията за връщане на грешка. В регистъра на натоварване се съхранява стойността на забавянето. След това задайте най-нисък приоритет прекъсване за прекъсванията на контролера. Нулира брояча, таймер и да позволи работа на системата за генериране.
Персонализиране Controller NVIC прекъсне вектори заслужава отделна история, ние няма да се справят с това точно сега. Помислете само, че един начин, по който да се определи кои от всяко прекъсване трябва да се сервира веднага, но някои от тях могат да се отложи до приключване на обработката на други прекъсва.
Какво е за прекъсване? Боб е ваш приятел ви е призовал да се пие бира, докато сте били ангажирани в изследването на този курс. Ти беше в основната линия на програмата - проучването на урок. Но Вася "поиска" от прекъснете от тази дейност и да отидете една бира с него - отидете до прекъсване на лечението. След приключване на алкохол, ще се върне в изучаването на материала, от мястото, където сте спрели преди да се присъедини Vasey - връща към основната програма. Да, малко по-реалистичен пример, но в близост).
Съгласно предложения модел NVIC може да действа като решението си, ако изведнъж освен Vasey ви отмине още и Wick. В съответствие с приоритетите, освен да отидеш да пиеш бира или Вася, или да отидете с Vika.
В проекта следващите редове присъстват в cr_startup_lpc13.c на файла
набира
Така че, във файла Стартиране delay_ms заменят функцията със следния код:
Тук сме определили контра милисекунди. Тази променлива ще бъде увеличен само в манипулатори случай на системния таймер. Функция delay_ms чака контур до промяната на брояч стойност на предадените на параметрите ДЧ. Необходимо е да се отбележи наличието на летливата ключова дума в определянето на тезгяха от време е необходимо, че оптимизатор или променена в безкраен цикъл на изчакване.
Основната функция на светодиода след настройки на портовете, добавете код за настройка на таймер:
Тук SystemCoreClock променлива е определена в CMSIS и съдържаща системно осцилатор честота. разделянето през 1000, ние изчислява колко часовник цикъла е необходимо да се забави в 1ms. Това е всъщност всичко таймера и работи.
Бих искала да отбележа, че този метод на закъснения по прилагането също не е точна. Като цяло, забавянето може да се окаже, до 1 милисекунда и по-малко, отколкото се изисква, ако извикването на функция е на границата милисекунда интервал. Ако в последния цикъл <заменить на <= то задержка будет гарантированно не меньше запрошенной, но может быть и на 1 миллисекунду больше. Обычно используется именно последний вариант.
Поставянето на проекта
Всичко е както обикновено. Събрани започнахме отстраняване на грешки, и се възхищавам на постиженията. Въпреки, че се измерва с хронометър.
точки на прекъсване
Понякога напредък знания не е достатъчно, но се изисква и по-анализираме защо програмата е отишло в тази посока. За да направите това, ние трябва да знаем каква стойност има тази или онази променлива. За да направите това, ние трябва само да направите пауза курсора на мишката да се променливата на интереси, и неговата стойност се показва в подсказка:
Разбира се, има и други начини, но ние все още не се притеснява и да ги отмени.
статистика
Debug версия е 3376 байта.
версия Release взе 2560 байта.
Да, ATtiny2113 този код няма да се побере, но на кого му пука, ние 32kBayta код с тактова честота от близо 4 пъти цената и само 2 пъти. И тогава, ние просто ще се справят с мигащи светодиоди?
Коментари по проекта от архива
Представям като "бонус" функция getUptime.
То просто връща броя милисекунди след стартиране на системата (или последния ресет). Ние не го използвате в момента, или когато, но ги остави да лежи наоколо.
Таймер зададеният код е малко по-сложно:
Очевидно за противодействие случай на преливник, която се среща в около 49 дни и 17 часа. Разликата не е критично, но за да го премахнете от проекта се нуждае от повече време, но не си струва, толкова съжалявам.
да кажем, че ние се създаде функция система таймер SysTick_Config, използван няколко пъти забавянето, а след това изпълнение на код, без забавяне. но прекъсва от SysTick ще се случи?
Да. По същество таймер прекъсване за целите непрекъснато образуване на предварително определен период от време и е предназначен (необходима за различни операционни системи). Но трябва никой забранява това за прекъсване на връзката.
Ако имате нужда от само 1-2 пъти в определени места, за да се направи незабавно, можете директно да в тези места да се инициализират с таймер и периода инсталация за период на възвращаемост, забавяне и след употреба да се забрани работата.
Можете дори да прекъсне откаже, но само в една линия се очаква да се създаде подходящата флаг.
По същество използвате SysTick подобно на други таймери (Kojima, само ограничаване на функционалността, това е по принцип).
за да не се прекъсва zadalbyvat микрона, аз написах тук е: