天天看点

CC2530学习(三)定时器定时(轮询)

文章目录

      • 一、硬件连接
      • 二、寄存器描述
        • (一)、定时器模式配置
        • (二)、分频值
        • (三)、定时器比较模式配置
        • (四)、计数值配置
        • (五)、定时值的计算公式
        • (六)、中断标志位
      • 三、示例代码
      • 四、实验现象

一、硬件连接

LED灯阴极接地,通过三极管控制阳极导通状态。采用定时器1进行定时器中断实验。

二、寄存器描述

配置定时器主要修改定时器的分频值、模式和计数值。

(一)、定时器模式配置

当定时器设置为比较模式(compare mode)时才能通过设置的比较值产生溢出中断。主要通过寄存器T1CCTL0的MODE来配置,此处应设置为1。

CC2530学习(三)定时器定时(轮询)

(二)、分频值

通过配置T1CTL的DIV[1:0]来选择,由于CC2530主频为32MHz,如果不配置的话默认是2分频即16MHz。当这里的分频值DIV选择11的话则分频的结果是16MHz/128即125KHz。

CC2530学习(三)定时器定时(轮询)

(三)、定时器比较模式配置

如果选择的模式是自动重装载,则对应T1CTL的MODE[1:0]需要设置为01,计数值从0上升到0xFFFF,计数溢出会进入中断且清空计数值。而如果MODE[1:0]设置为10,则定时器会计数到用户自定义的计数值,同样是计数溢出则进入中断。具体寄存器如上图所示。

(四)、计数值配置

如果定时器配置的模式为10的话则需要进行计数值的配置,主要配置寄存器T1CC0H和T1CC0L,它们两者分别存储定时器计数比较值的高八位和低八位。

CC2530学习(三)定时器定时(轮询)

(五)、定时值的计算公式

T = 1/(f/DIV)*CC0

其中T是定时器产生溢出中断的定时值,f为CC2530主频(在配置了系统主频分频为1时是32MHz,默认主频为2分频,即16MHz),DIV由T1CTL[3:2]决定,CC0由T1CC0H和T1CC0L决定。

(六)、中断标志位

定时器1是否产生溢出中断(定时器计数值是否到达CC0)可通过IRCON的第1位定时器1中断标志位T1IF来判断。

CC2530学习(三)定时器定时(轮询)

三、示例代码

#include <ioCC2530.h>

#define LED P0_1

void LED_Init(void)
{
  P0SEL &= ~0X02;//设置P0.1为普通IO口,~代表按位取反,~0x01==0xFE,将最低位设置为0
  P0DIR |= 0X02;//设置P0.1为输出模式
  P0INP &= ~0X02;//设置最低位为0,即配置P0.1为上拉模式
  LED = 0;
}

void TIM_Init(void)
{
  T1CTL = 0X0E;//从0x0000计数到T1CC0
  T1CCTL0 |= 0X04;
  T1CC0H = 0XF4;
  T1CC0L = 0X24;//12500 精确的0.5s
}

void main(void)
{
  LED_Init();
  TIM_Init();
  while(1)
  {
    if(IRCON&0X02)//判断是否产生
    {
      IRCON &= ~0X02;
      LED = ~LED;
    }
  }
}
           

四、实验现象

LED灯间隔1s亮一次。

继续阅读