CC2530学习笔记之定时器T1模计数模式中断实现LED闪烁程序

定时器在我们写代码是经常使用的,它不仅能够实现精确的定时,加上中断使用后,还可以提高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=(T1CC0H258+T1CC0L)T1

先看代码

#include 
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);
}

你可能感兴趣的:(CC2530学习笔记)