1. 前期预备知识

1.1 定时器中断触发

本次实验需关注的中断寄存器。

在本次实验中,分别会使用T1和T3定时器完成功能,所以我们需要注意上图中标注出的中断寄存器。

T1定时器:16位定时器(065535)。T3定时器:8位定时器(0255)

1.2 相关寄存器

注:一下只给出实验中新出现的寄存器,并不是本次实验需用到的所有寄存器;想了解其它寄存器作用及功能请看之前的基础实验文档,或查看CC2530中文数据手册。
寄存器名称 作用 寄存器描述
T1CTL (0xE4) 定时器1的控制和状态 T1CTL (bit 3~2) 为分频器划分值,具体值如下:
00:标记频率/1
01:标记频率/8
10:标记频率/32
11:标记频率/128
T1CTL (bit 1~0) 为选择定时器1模式
00:暂停运行
01:自由运行
10:模,从0x0000到T1CC0反计数
11:正计数/倒计数,从0x0000到T1CC0反复计数并且从T1CCO倒计数到0x000
T1STAT (0xAF) 定时器1 状态 bit5:定时器 计数器溢出中断标志
bit4:定时器1通道4中断标志
bit3:定时器1通道3中断标志
bit2:定时器1通道2中断标志
bit1:定时器1通道1中断标志
bit0:定时器1通道0中断标志
IEN1 (0xB8) 中断使能 1 IEN1寄存器中我们只使用了bit1,bit3所在的功能,
bit1 : T1计时器中断使能
bit3 : T3计时器中断使能
TIMIF (0xD8) 定时器1/3/4中断屏蔽/标志 TIMIF我们这一次实验只用到了bit6为定时器1溢出中断屏蔽
IRCON (0xC0) 中断标志4 bit1:定时器1中断标志。当定时器1中断发生时设为1并且当CPU向量指向中断服务例程时清除。
0:无中断未决
1:中断未决
T3CTL (0xCB) 定时器3的控制和状态 bit[7:5] : 定时器时钟分频倍数选择:
000:不分频; 001:2分频; 010:4分频
011:8分频; 100:16分频; 101:32分频
110:64分频; 111:128 分频.

bit4 : T3 起止控制位
bit3 : 溢出中断掩码 0:关溢出中断 1:开溢出中断
bit2 : 清计数值 高电平有效
Bit[1:0]T3模式选择
00:自动重装 0x00-0xFF
01:DOWN (从T3CC0 到0X00计数一次)
10:模计数(反复从 0X00到T3CC0 计数)
11:UP/DOWN(反复从0X00到T3CC0 计数再到0X00)
T3CCTL0(0xCC) T3 通道 0 捕获/比较控制寄存器 bit6: 通道0中断屏蔽 0:中断禁止 1:中断使能
bit5~3: T3 通道0 比较输出模式选择
bit2: T3 通道0模式选择: 0:捕获 1:比较
bit1~0 T3 通道 0 捕获模式选择
00 没有捕获 01 上升沿捕获10 下降沿捕获 11 边沿捕获
T3CC0(0xCD) 定时器 3 通道0捕获/比较值 定时器捕获/比较值通道 0。当 T3CCTL0.MODE=1(比较模式)时写该寄存器会导致 T3CC0.VAL[7:0]更新到写入值延迟到 T3CNT.CNT[7:0]=0x00。
T3CCTL1(0xCE) T3 通道 1 捕获/比较控制寄存器 bit6: 通道1中断屏蔽 0:中断禁止 1:中断使能
bit5~3: T3 通道1 比较输出模式选择
bit2: T3 通道 1 模式选择: 0:捕获 1 :比较
Bit[1:0] T3 通道 1 捕获模式选择
00 没有捕获01 上升沿捕获10 下降沿捕获 11 边沿捕获
T3CC1(0xCF) 定时器 3 通道1捕获/比较值 定时器捕获/比较值通道 1。当 T3CCTL1.MODE=1(比较模式)时写该寄存器会导致 T3CC1.VAL[7:0]更新写入值延迟到 T3CNT.CNT[7:0]=0x00。

1.3 寄存器相关问题

1.什么是标记频率,什么是分频?

标记频率可以理解为是外部晶振的频率,在新大陆CC2530模块中,外部晶振频率是32MHz。分频的意思就是通过模块将高频率信号降低值原来的X分之一。这里举个例子,如将32MHz进行2分频,那就是32Mhz/X=16MHz的信号;将32MHz进行4分频就是32Mhz/X=8Mhz。在CC2530中会对51内核进行默认的2分频,也就是说51内核实际标记频率为16Mhz;如果不使用CLKCONCMD寄存器对晶振频率进行设定,那么51内核实际频率为16Mhz.

2.什么是无中断未决,什么是中断未决?

英文手册中是Interrupt not pending(中断未挂起)和Interrupt pending(中断挂起)。所谓无中断未决就是说中断都进入其中断处理函数进行处理了;而中断未决就是中断被挂起目前没有进入对应的中断处理函数进行处理。

3.为什么有写书籍上T1中断使能是IEN1|=0x02,而有些直接是T1IE=1?

/*  Interrupt Enable 1                                                              */
SFRBIT( IEN1 , 0xB8, _IEN17, _IEN16, P0IE, T4IE, T3IE, T2IE, T1IE, DMAIE )

我们查看IEN1在ioCC2530.h中的定义,其中针对其bit位的定义(高位在前),我么可以发现T1IE就是IEN1的bit1,所以T1中断使能操作IEN1|=0x02和T1IE=1是一样的效果。

4.如何根据标记频率和分频计算溢出所需要的时间?

这是有一个公式的 溢出时间 = 1S/(标记频率/分频)*2^定时器位数.

如果我们使用的是16Mhz标记频率,64分频,T3定时器,它的位数是8位.那么结果就是 1/(16mhz/64)*256 = 0.001s

在比如我们使用的是16Mhz标记频率,128分频,T1定时器,它的位数是16位.那么结果就是 1/(16mhz/128)*65535 = 0.524s

1.4 T1、T3定时器初始化流程


1.4.1 T1定时器初始化流程

首先我们来看T1定时器的初始化流程图,T1定时器是一个16位的定时器,我们实现简单的功能。

1.4.2 T3定时器初始化流程

T3定时器初始化流程和T1定时器初始化流程基本一致.

T3寄存器多了一个步骤,就是启动定时器。当然同样可以暂停寄存器。

2 程序及代码

#include <ioCC2530.h>
typedef unsigned int uint;
typedef unsigned char uchar; uint t1_count = 0;
uint t3_count = 0; void init_gpio(void)
{
P1SEL &=~ 0x03;
P1DIR |= 0x03;
P1 = 0x00; P1_0 = 0;
P1_1 = 1;
} void init_timer3()
{
T3CTL |= 0xC0; // 设置64分频,自动重装,每次溢出时间 1/(16mhz/64)*256 = 0.001s(几乎1ms)
T3CTL |= 0x04; // 打开T3溢出中断使能
EA = 1; // 打开总开关
T3IE = 1; // 打开T3中断使能
T3CTL |= 0x10; // 启动定时器
} void init_timer1()
{
T1CTL |= 0x0d; // 设置128分频,自由运行; 每次溢出时间 1/(16mhz/128)*65535 = 0.524s
TIMIF |= 0x40; //打开T1溢出中断
EA = 1; // 打开总开关
IEN1 |= 0x02; // 打开t1中断使能
} #pragma vector = T3_VECTOR
__interrupt void T3_ISR(void)
{
t3_count ++;
if(t3_count % 2000 == 0) // 2S翻转一次
{
P1_0 = ~P1_0;
P1_1 = ~P1_1;
}
} #pragma vector = T1_VECTOR
__interrupt void T1_ISR(void)
{
t1_count++;
if(t1_count%2 == 0) // 1S翻转一次状态
{
P1_0 = ~P1_0;
P1_1 = ~P1_1;
}
} void main(void)
{
init_gpio();
//init_timer1();
init_timer3();
while(1)
{
;
}
}
通过注释init_timer1();或init_timer3()可以分别看到使用两个定时器实现不同延时的效果。

THE END

CC2530学习路线-基础实验-定时器控制LED灯亮灭(3)的更多相关文章

  1. CC2530学习路线-基础实验-GPIO 控制LED灯亮灭(1)

    目录 1.前期预备知识 1.1 新大陆ZigBee模块LED灯电路 1.2 CC2530相关寄存器 1.3 寄存器操作技巧 1.4 CPU空转延时 1.4 操作流程图 2.程序代码 The End 1 ...

  2. CC2530学习路线-基础实验-GPIO 按键控制LED灯亮灭(2)

    目录 1.前期预备知识 1.1 新大陆Zigbee模块按键电路图 1.2 CC2530相关寄存器 1.3 CC2530中断走向图 1.4 使用C语言为51单片机编写中断程序 1.5 *函数指针 2. ...

  3. CC2530学习路线-基础实验-串口通讯发送字符串(4 未完待续)

    目录 1. 前期预备知识 1.1 串口通讯电路图 1.2 实验相关寄存器 1.2 常用波特率设置 本章未完待续..... 原来写的文章已经丢失了,只能找到这一小部分,看什么时候有时间再补上. 1. 前 ...

  4. 10-ESP8266 SDK开发基础入门篇--上位机通过串口控制ESP8266灯亮灭

    https://www.cnblogs.com/yangfengwu/p/11087618.html 其实这一节就是对上三节的综合测试 https://www.cnblogs.com/yangfeng ...

  5. 嵌入式Linux学习入门:控制LED灯

    记录自己linux学习过程,让自己能够一直坚持下去 1.原理图分析: nLED_1, nLED_2, nLED_4, 给低电平则对应LED灯亮,高电平则对应LED灯灭, S3C2440芯片GPF4-G ...

  6. 单片机与android手机通信(控制LED小灯亮灭)

    1.单片机实验板功能设计 为验证数据通信内容,让单片机板上的四个按键与android手机客户端上的四个LED灯相互控制:为达到上述基本实验要求,采用单字符传输数据即可,硬件需设计两块相同的单片机电路板 ...

  7. arduino入门学习实现语音控制LED灯

    需要的准备的硬件arduino+PC+麦克风实现语音命令控制LED灯的亮灭. 首先需要将写好的arduino程序烧录到arduino uno主板中,下面是代码如下: int val;//定义变量val ...

  8. K1 K2作为中断源控制红色LED灯,实现任意键按一下LED灯亮或者灭

    #include "stm32f10x.h" // 相当于51单片机中的 #include <reg51.h> #include "stm32f10x_gpi ...

  9. (三)开关检测来控制LED灯的亮灭

    开关检测案例一: 具体电路图如下: K1--K4闭合,控制 D1—D4 亮灭 产生的问题: 1.关于 R8 R9 R7 R10 的阻值选择问题,倘若太大的话,  比如10K 不管开关断开还是闭合,好像 ...

随机推荐

  1. 10-多写一个@Autowired导致程序崩了

    再是javaweb实验六中,是让我们改代码,让它跑起来,结果我少注释了一个,导致一直报错,检查许久没有找到,最后通过代码替换逐步查找,才发现问题.

  2. mysql优化概述2

    一.索引的概念 利用关键字,就是记录的部分数据(某个字段,某些字段,某个字段的一部份),建立与记录位置的对应关系,就是索引.索引的关键字一定是排序的. 二.索引的类型 mysql支持四种索引: 1.主 ...

  3. vue-cli启动本地服务,局域网下通过ip访问不到的原因

    1.问题描述: 新开发了一个vue-cli项目,想通过手机查看效果,发现访问不到,ip地址和端口号都没错但是手机访问不到,在本机电脑浏览器输入ip端口号一样访问不到,只能通过localhost:808 ...

  4. 原生JS获取地址了参数

    方法一:采用正则表达式获取地址栏参数:( 强烈推荐,既实用又方便!) function GetQueryString(name) {      var reg = new RegExp("( ...

  5. Java 检查异常(checked exception)和未检查异常(unchecked exception)区别理解

    所有异常类型都是 Throwable 类的子类,它包含Exception类和Error类,Exception又包括checked exception和unchecked exception. unch ...

  6. 【hh】我胡汉三又回来了

    hh 差不多半年没来机房了,高一的都已经碾压我100题了 开始得比较晚,估计比高一的早两三个月吧,停了这半年落下了不少. 但是没有关系啊,学OI纯粹是好玩嘛,一开始报名的时候根本不知道有联赛这回事(其 ...

  7. 低配NOSQL

    东西写的太简单了 都不好意思说是NOSQL 其实就是STL 的map容器记录了写入的信息 解析了下数据仅此. 分析的时候想了很多 比如学习redis的自写hash,动态调整hash表容量. 比如右值或 ...

  8. vue组件介绍

    https://www.cnblogs.com/Leo_wl/p/5863185.html vue.js说说组件   什么是组件:组件是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可重 ...

  9. Windows游戏找不到了怎么办?

         大家有的时候,可能是不慎操作,或是某些新装的Windows,会发现那些经典的游戏不见了,那它们去哪了呢?是长腿跑了?还是Windows偷工减料?都不是,让巩固来教你们把他们找出来! 1.在开 ...

  10. 2018.08.09 bzoj4719: [Noip2016]天天爱跑步(树链剖分)

    传送门 话说开始上文化课之后写题时间好少啊. 这道题将一个人的跑步路线拆成s->lca,lca->t,然后对于第一段上坡路径要经过的点,当前这个人能对它产生贡献当且仅当dep[s]-dep ...