Сайт angel5a lpcxpresso урок 4

LPCXpresso Урок 4. Systick. Използване на таймера за обратно броене.

Ние продължаваме да се развиват в среда на LPC13xx CodeRed в курса. Въведение в системния часовник. Научете светодиод мига на часовника.

забавяне обратно отброяване

Естествено отстъпка в цикъл-броенето е най-лесният и най-бързият вариант. Това е напълно възможно да се използва не "първата двойка", тъй като не изисква никакви по-задълбочени познания. Но аз вече казах, че не ми харесва. Да направим функцията забавяне малко по-точен, предполагам.

Както вероятно си спомняте от първата си урок. за обратното броене тук се използва таймер за 16-битов. Аз ще отида в малко по-различен начин. Ще взема като база за системния таймер, известен още като SYSTICK.

таймер система

Обикновено системния таймер се позиционира като услуга за операционни системи. Според него, има превключване на контекста на многонишковите системи, тя се актуализира денонощно. Всъщност, за да изпълнява различни функции на услуги. Фиш LPC13xx на блок-схемата на таймера не се проверява, а текстът е написан за невероятно количество информация: 7.15 System таймер тик
В 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 на файла

Е, записа в масива прекъсне вектори, известен още като g_pfnVectors. Долната линия е също толкова лесно: вектор системния таймер прекъсват се поставя функция SysTick_Handler като манипулатор, който в момента е само контролерът ще карам в един безкраен цикъл. Безкраен цикъл ще ви позволи да се определи наличието на суровина се мотае на контролера (това е удобно или не, ние няма да се помисли за сега) да прекъсне.

Но. Необходимо е да се отбележи наличието в дефиницията на думата слаб. Тази "свободно свързване." По същество това означава, че тази функция може да бъде "стриктно" предефинирани никъде другаде в проекта, и се даде ново определение на по-строг, функцията трябва да се използва вместо "слаб". "Строг режим" е прост определянето на функциите без никакви допълнителни ключови думи.

набира

Така че, във файла Стартиране delay_ms заменят функцията със следния код:

Тук сме определили контра милисекунди. Тази променлива ще бъде увеличен само в манипулатори случай на системния таймер. Функция delay_ms чака контур до промяната на брояч стойност на предадените на параметрите ДЧ. Необходимо е да се отбележи наличието на летливата ключова дума в определянето на тезгяха от време е необходимо, че оптимизатор или променена в безкраен цикъл на изчакване.

Основната функция на светодиода след настройки на портовете, добавете код за настройка на таймер:

Тук SystemCoreClock променлива е определена в CMSIS и съдържаща системно осцилатор честота. разделянето през 1000, ние изчислява колко часовник цикъла е необходимо да се забави в 1ms. Това е всъщност всичко таймера и работи.

Бих искала да отбележа, че този метод на закъснения по прилагането също не е точна. Като цяло, забавянето може да се окаже, до 1 милисекунда и по-малко, отколкото се изисква, ако извикването на функция е на границата милисекунда интервал. Ако в последния цикъл <заменить на <= то задержка будет гарантированно не меньше запрошенной, но может быть и на 1 миллисекунду больше. Обычно используется именно последний вариант.

Поставянето на проекта

Всичко е както обикновено. Събрани започнахме отстраняване на грешки, и се възхищавам на постиженията. Въпреки, че се измерва с хронометър.

точки на прекъсване

Искам да ви разкажа за такова съоръжение, както и отстраняване на грешки прекъсване - Breakpoint.

В тези случаи, за да ни помогне и да се breakpointy. За да инсталирате и да го премахнете, като кликнете с мишката в ляво (в номерата на редовете) от линията ние се интересуваме. Се показва в едно и също място, син кръг (кръг, ако не синьо, тогава нещо не е наред):

Когато уреда е в режим на отстраняване на грешки достига даден ред, но тя ще спре, преди неговото изпълнение и средата подходящо да промени външния му вид, като поставите курсора върху този ред:

След това можете да продължите отстраняване на грешки, стъпка по стъпка, или да пристъпи към изпълнение на.

Понякога напредък знания не е достатъчно, но се изисква и по-анализираме защо програмата е отишло в тази посока. За да направите това, ние трябва да знаем каква стойност има тази или онази променлива. За да направите това, ние трябва само да направите пауза курсора на мишката да се променливата на интереси, и неговата стойност се показва в подсказка:

Разбира се, има и други начини, но ние все още не се притеснява и да ги отмени.

статистика

Debug версия е 3376 байта.
версия Release взе 2560 байта.

Да, ATtiny2113 този код няма да се побере, но на кого му пука, ние 32kBayta код с тактова честота от близо 4 пъти цената и само 2 пъти. И тогава, ние просто ще се справят с мигащи светодиоди?

Коментари по проекта от архива

Представям като "бонус" функция getUptime. То просто връща броя милисекунди след стартиране на системата (или последния ресет). Ние не го използвате в момента, или когато, но ги остави да лежи наоколо.

На следващо място, аз добавих на повикване NVIC_SetPriority. Тя може и да хвърлят. Този таймер пренасочване система за прекъсване на най-висок приоритет. Това е просто, че съм имал случай, в който времето е продължена по време на обработката на други прекъсва. И в библиотеката, както беше споменато по-рано, прекъсване на таймера система вдигна най-нисък приоритет, която не му позволи да измести други манипулатори прекъсване. I остави тази линия, която ще демонстрира приложимостта на такъв разтвор.

Е, последния клон на условията в този пример може да се изхвърли. Низът нужда, по времето на вътрешния осцилатор. И защо, можете да прочетете в Потребителя Manual'e. И в библиотеката, както си спомняме, времето става системния таймер.

Просто delay_ms функция ме гледа като се предполага, че в случай на преливане контра, която се среща в около 49 дни и 17 часа. Разликата не е критично, но за да го премахнете от проекта се нуждае от повече време, но не си струва, толкова съжалявам.

Категория Навигация