(1)时钟源
1、内部RC震荡器(32KHz、16MHz)
2、外部石英晶振(32.768KHz、32MHz)
(资料图片)
注意:外部石英晶振比较稳定,在无线收发中采用外部石英晶振
(2)时钟源的切换
用于判断时钟源是否切换成功
第二章 定时/技术器的基本原理定时/计数器,是一种能够对内部时钟信号或外部输入信号进行计数,当计数值达到设定要求时,向CPU提出中断处理请求,从而实现定时或者计数功能的外设。
定时/计数器的最基本工作原理是进行计数。不管是定时器还是计数器,本质上都是计数器,可以进行加1(减1)计数,每出现一个计数信号,计数器就会自动加1(自动减1),当计数值从0变成最大值(或从最大值变成0)溢出时,定时/计数器就会向CPU提出中断请求。
第三章 CC2530的定时/计数器CC2530共有5个定时/计数器,其中定时器1是一个16位的定时器,为CC2530中功能最全的一个定时/计数器,在 应用中应优先选用。
定时器1的工作模式有三种:
<1> 自由运行模式:计数器从0x0000开始,在每个活动 时钟边沿增加1,当计数器达到0xFFFF时溢出,计数器重新载入0x0000并开始新一轮的递增计数。该模式的计数周期是固定值0xFFFF,当达到最终计数 值0xFFFF时,标志位T1IF和OVFIF被设置。
<2> 模模式:计数器从0x0000开始,在每个活动时钟边 沿增加1,当计数器达到T1CC0寄存器保存的值时 溢出,计数器又将从0x0000开始新一轮的递增计数, 模模式的计数周期可由用户自行设定。
<3> 正计数/倒计数模式:计数器反复从0x0000 开始,正计数到TICC0保存的最终计数值,然后再倒计数回0x0000,当达到最终计数值时,标志位T1IF和OVFIF被设置。
第四章 CC2530的定时/计数器中断系统定时器有3种情况能产生中断请求:
<1> 计数器达到最终计数值(溢出或回到零)。
<2> 输入捕获事件。
<3> 输出比较事件。
使用模模式要特别注意,需要开启通道0的输出比较模式,否则计数器的 值达到T1CC0后,是不会产生溢出中断的。
第五章 应用定时器1实现1秒定时【1】设置定时器1的最大计数值
定时器1共有5对T1CCxH和T1CCxL寄存器,分别对应通道0到通道4。在使用定时器1的定时功能时,使用T1CC0H和T1CC0L两个寄存器存放最大计数值的高8位和低8位。
在系统中,系统时钟为16MHz,分频系数为128,要定时0.1秒,最大计数值为:
【2】定时器初始化函数设计
<1> 将定时器1的最大计数值写入T1CC0。
<2> 通过T1CCTL0寄存器开启定时器1通道0的输出比较模式。
<3> 设置定时器1的相关中断控制位。
<4> 设置分频系数和工作模式并启动定时器。
【3】定时器中断服务函数设计
<1> 清除T1STAT的中断标志位。
<2> 累加全局变量count。
<3> count被10整除即1秒的定时到了。
<4> 10秒定时到将count清零。
示例代码:
#include < ioCC2530.h > //定义LED灯的端口#define LED1 P1_2 #define LED2 P1_3 /* 函数功能:LED灯IO口初始化 硬件连接:LED1-- >P1_2 , LED2-- >P1_3 */ void LED_Init(void) { P1DIR |=0x3< <2; //配置P1_2、P1_3为输出模式 LED1 = 1; LED2 = 1; } /*延时200毫秒*/ void delay200ms(void) //误差 -0.125us { unsigned char a,b,c; for(c=95;c >0;c--) for(b=181;b >0;b--) for(a=14;a >0;a--); } /*===============定时器1初始化函数==================*/ void Init_Timer1() { T1CC0L = 0xd4; //设置最大计数值的低8位 T1CC0H = 0x30; //设置最大计数值的高8位 T1CCTL0 |= 0x04; //开启通道0的输出比较模式 T1IE = 1; //使能定时器1中断 T1OVFIM = 1; //使能定时器1溢出中断 EA = 1; //使能总中断 T1CTL = 0x0e; //分频系数是128,模模式 } unsigned char count = 0; /*================定时器1服务函数====================*/ #pragma vector = T1_VECTOR __interrupt void Timer1_Sevice() { T1STAT &= ~0x01; //清除定时器1通道0中断标志 count++; if(count%10 == 0) //定时1秒到 { LED1 = !LED1; } if(count == 100) //定时10秒到 { LED2 = !LED2; count = 0; } } /*主函数*/ void main(void) { LED_Init();//初始化LED灯控制IO口 Init_Timer1(); while(1) { } }
第六章 相关寄存器第七章 示例代码(1)无中断配置定时器#include < ioCC2530.h > //定义LED灯的端口 #define LED1 P1_2 #define LED2 P1_3 /* 函数功能:LED灯IO口初始化 硬件连接:LED1-- >P1_2 , LED2-- >P1_3 */ void LED_Init(void) { P1DIR |=0x3< <2; //配置P1_2、P1_3为输出模式 LED1 = 1; LED2 = 1; } /*===============定时器1初始化函数==================*/ void Init_Timer1() { //初始化计数器1 T1CTL = 0x05; T1STAT= 0x21; //通道0,中断有效,8分频;自动重装模式(0x0000- >0xffff) } unsigned int counter=0; //统计溢出次数 unsigned int LEDFlag; //标志是否要闪烁 /*主函数*/ void main(void) { LED_Init();//初始化LED灯控制IO口 Init_Timer1(); while(1) { if(IRCON > 0) { IRCON = 0; //清溢出标志 counter++; if(counter==15) //中断计数,约0.25s { counter =0; LEDFlag = !LEDFlag; } } if(LEDFlag) { LED1 = !LED1; LED2 = !LED2; // 每 1s LED灯闪烁一下 LEDFlag = !LEDFlag; // 闪烁标志变量置0 } } }
(2)开中断配置定时器#include < ioCC2530.h > //定义LED灯的端口 #define LED1 P1_2 #define LED2 P1_3 /* 函数功能:LED灯IO口初始化 硬件连接:LED1-- >P1_2 , LED2-- >P1_3 */ void LED_Init(void) { P1DIR |=0x3< <2; //配置P1_2、P1_3为输出模式 LED1 = 1; LED2 = 1; } /*延时200毫秒*/ void delay200ms(void) //误差 -0.125us { unsigned char a,b,c; for(c=95;c >0;c--) for(b=181;b >0;b--) for(a=14;a >0;a--); } /*===============定时器1初始化函数==================*/ void Init_Timer1() { T1CC0L = 0xd4; //设置最大计数值的低8位 T1CC0H = 0x30; //设置最大计数值的高8位 T1CCTL0 |= 0x04; //开启通道0的输出比较模式 T1IE = 1; //使能定时器1中断 T1OVFIM = 1; //使能定时器1溢出中断 EA = 1; //使能总中断 T1CTL = 0x0e; //分频系数是128,模模式 } unsigned char count = 0; /*================定时器1服务函数====================*/ #pragma vector = T1_VECTOR __interrupt void Timer1_Sevice() { T1STAT &= ~0x01; //清除定时器1通道0中断标志 count++; if(count%10 == 0) //定时1秒到 { LED1 = !LED1; } if(count == 100) //定时10秒到 { LED2 = !LED2; count = 0; } } /*主函数*/ void main(void) { LED_Init();//初始化LED灯控制IO口 Init_Timer1(); while(1) { } }
标签: