|
1. Свързване на горния и долния етаж В предишната статия заедно научихме за прилагането на прости външни прекъсвания. Сега, когато имаме практически опит с прекъсванията, нека поговорим за таймерните прекъсвания в този раздел. CC2430 има общо 4 таймера, които могат да се разделят на 3 категории: таймер 1, таймер 2, таймер 3/4 (използването на 3 и 4 е едно и също). Тъй като авторът също е нов в CC2430 и практически няма практически опит в проекти, свързани с таймери, не възнамерявам (и не мога да направя нищо) да анализирам таймера в дълбочина. Тази статия предоставя само кратко експериментално изследване на използването на таймер 1 при прекъсвания при препълване на броя и не споменава функциите му за улавяне/изход/PWM функции. Таймер 2 и Таймер 3/4 са само прости въведения на функции. След като уменията на автора достигнат определено ниво на напрежение, ще застана на върха на практическия опит на Зигби, за да подобря това есе. 2. Таймер 1Таймер 1 е 16-битов таймер с модулация таймер/брояч/ширина на импулса. Той има 3 индивидуално програмируеми канала за сравнение на улавяне/изход на входа, всеки от които може да се използва като PWM изход или като гранично време за улавяне на входния сигнал (за информация какво представлява сравнение на улавяне/изход и как да се реализира PWM изход, четците могат да се обърнат към китайското ръководство CC2430). Таймерите имат много важна концепция:Начин на работа。 Режимите на работа включват: Свободен режим на работа (Свободно бягане), режим на форма (Модуло) и режим положително броене/обратно броене (нагоре-надолу)。 Следва откъс от китайското ръководство CC2430 за въвеждане на трите режима:
Сравнявайки трите режима, може да се види, че стойността на препълване на режима на свободна работа 0xFFFF е непроменлива; Останалите два режима позволяват прецизен контрол на стойността на препълването на таймера чрез присвояване на стойност на T1CC0. Този експеримент използва тази функция, за да задейства прекъсване на всеки 1 секунди чрез таймера през специфичен T1CC0, с цел прецизен контрол на интервала на мигане на LED светлината до 1s. (1) Въведение в експериментаВ модулния режим на таймера, интервалът на мигане на LED светлината се контролира прецизно чрез 1s, а именно: ярки 0.5s → тъмни 0.5s → ярки 0.5s → слаби 0.5s ...... → Светло 0.5s → Тъмно 0.5s (т.е. времевият интервал от тъмно към светло е 1s). Инверсия между светло/тъмно се постига чрез препълващи се прекъсвания. (2) Схема на потока на програмата
(3) Релевантни изчисленияКакто беше споменато по-рано, състоянието на LED светлината е: ярко 0.5s → тъмно 0.5s → ярко 0.5s → приглушено 0.5s ...... → 0.5s светло → 0.5s тъмно, и трябва да се реализира с препълващи прекъсвания, така че периодът на препълване на таймера трябва да е 0.5s. За да се постигне това, трябва да се изчисли съответната стойност на препълване (временно зададена на N). Честотата на системната тактова честота се избира като 32MHz, а зададената тактова честота по подразбиране е 16MHz (и двете се определят от специални регистри на функциите).CLKCONЗа подробности, моля, вижте китайското ръководство CC2430). За Таймер 1 задайте кросоувъра на 128 дивизии. В обобщение, списъкът е следният:
За да намерите N=62500, неговото шестнадесетично число е 0xF424, тоест трябва да зададете T1CC0H=0xF4, T1CC0L=0x24 . (4) Експериментален изходен код и анализ/*
Описание на експеримента: Timer Timer1 експеримент, преливане на броя на таймерите, LED1 мигане
*/
#include
#define led1 P1_0
#define led2 P1_1
#define led3 P1_2
#define led4 P1_3
/*系统时钟初始化
-------------------------------------------------------*/
Празнотаxtal_init(Празнота)
{ СЪН &= ~0x04; //都上电
докато(! (СЪН &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; Изберете кристален осцилатор с честота 32MHz СЪН |=0x04;
}
/*LED初始化
-------------------------------------------------------*/
Празнотаled_init(Празнота)
{ P1SEL =0x00; P1 е нормалният I/O порт P1DIR |=0x0F; P1.0 P1.1 P1.2 P1.3 изход
led1 =1; //关闭所有LED led2 =1; led3 =1; LED4 =1;
}
/*T1初始化
-------------------------------------------------------*/
Празнотаtimer1_init(Празнота)
{ EA=1; //开总中断 T1IE=1; //开T1中断 OVFIM=1; //开T1溢出中断
T1CC0L=0x24; //溢出值低8位 T1CC0H=0xF4; //溢出值高8位
T1CTL =0x0e; 128 кросоувър; модуло режим (0x0000->T1CC0); Започнете да бягате; T1IF=0; Изчистете знака за прекъсване
}
/*主函数
-------------------------------------------------------*/
Празнотаосновно(Празнота)
{ xtal_init(); led_init(); timer1_init();
докато(1); //等待溢出中断
}
/*T1终端服务子程序
-------------------------------------------------------*/
#pragma вектор=T1_VECTOR __interruptПразнотаT1_ISR(Празнота)
{ EA=0; //关中断
led1 = !led1; //LED灯反转
EA=1; //开中断
T1CTL &= ~0x10; //清中断标志
}
Добре, компилирам програмата и дебъгвам онлайн, LED1 на платката за разработка мига по график и се усеща, че интервалът на мигане е около 1 секунди. Но това не е достатъчно, за да се докаже успехът на експеримента – ако интервалът може строго да се определи като 1s, той ще бъде перфектен~ Затова включих часовника на WIN 7 (кликнете върху времето от дясната страна на лентата на задачите). Докато гледаше секундната стрелка, погледна мигането на LED1 от ъгъла на окото си. Резултатът: в рамките на две минути темпото на двете е почти същото (тази прецизност е поносима~). В този момент експериментът може да се каже, че е практически завършен, хехе~ 3. Таймер 2Таймер 2 се нарича ощеMAC таймер, е специално проектиран да поддържа протокола за проследяване на събития в IEEE 802.15.4 MAC. Таймерът има 8-цифрен брояч на препълване, който може да се използва за записване на броя на миналите цикли; Съществува 16-битов регистър за заснемане, който записва точното време, когато кадър започва да получава/изпраща или точното време на предаването е завършено. Той също така съдържа 16-битов изходен регистър за сравнение, който генерира различни командни гейтинг сигнали (започване на приемане, започване на изпращане и др.) към безжичния модул в определен момент. 4. Таймер 3/4Таймер 3/4 е 8-битов таймер с функция таймер/брояч/PWM. T3/T4 има 2 изходни сравнителни канала, всеки от които може да се използва като PWM изход. 5. ЗаключениеТози раздел основно изучава метода на прекъсването на преливане на броя на таймер 1 и реализира прецизното управление на интервала на мигане на LED светлината от 1s. Само няколко други таймера са просто инсулт, и ще се върна да ги добавя по-късно. В следващия раздел ще представим комуникацията на серийния порт CC2430.
|