定时器在我们写代码是经常使用的,它不仅能够实现精确的定时,加上中断使用后,还可以提高MCU运行速度。
目的
主要使用CC2530的T1的模计数功能,5s定时并产生中断,LED 5S 间隔闪烁。
时间计算公式
定
时
器
每
计
数
一
次
的
时
间
T
1
=
分
频
系
数
(
T
1
C
T
L
.
D
I
V
)
定
时
器
t
i
c
k
输
出
设
置
(
C
L
K
C
O
N
C
M
D
.
T
I
C
K
S
P
D
)
(
u
s
)
定时器每计数一次的时间 \ \ \ \ \ \ T1=\frac { 分频系数(T1CTL.DIV)} { 定时器tick输出设置(CLKCONCMD.TICKSPD)} (us)
定时器每计数一次的时间 T1=定时器tick输出设置(CLKCONCMD.TICKSPD)分频系数(T1CTL.DIV)(us)
中
断
一
次
的
时
间
T
=
(
T
1
C
C
0
H
∗
258
+
T
1
C
C
0
L
)
∗
T
1
中断一次的时间\ \ \ T=(T1CC0H*258+T1CC0L)*T1
中断一次的时间 T=(T1CC0H∗258+T1CC0L)∗T1
先看代码
#include <iocc2530.h>
unsigned char temp,temp1;
#define LED1 P0_4
void T1_init()
{
T1CTL |= 0x0E;//128分频 11 模计数模式10
T1CCTL0 |=0X04; //使用模计数时,必须使能 T1CCTL0.MODE =1
// C353为十进制50000
T1CC0H =0X0C3;
T1CC0L =0X53;
IEN0 |=0X80;//EA总中断 7位为1
IEN1 |=0X02;//T0中断使能 1位为1
T1IF=0; //清标志位
}
void Oclk_init()
{
CLKCONCMD &= ~0x40; // 设置系统时钟源为 32MHZ晶振
while(!(SLEEPSTA & 0x40)); // 等待晶振稳定
CLKCONCMD &= ~0x3f; // 定时器tick输出设置 设置系统主时钟频率为 32MHZ
SLEEPCMD |=0X04;
}
//每中断一次时间为4us*50000=200ms
#pragma vector=T1_VECTOR
__interrupt void TI_VEC()
{
T1IF=0;//中断标志位 T1IF
if(++temp ==25) //200ms*25=5s
{
LED1 =~LED1;//led亮度取反
temp1=1;
temp=0;
}
}
void main()
{
temp=0;
temp1=0;
T1_init();
Oclk_init();
P0SEL &=~0x10;//LED引脚为通用口
P0DIR |= 0x10; //输出模式
LED1 =1;
while(1);
}