1. 前期预备知识

1.1 定时器中断触发

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

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

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

1.2 相关寄存器

  1. 注:一下只给出实验中新出现的寄存器,并不是本次实验需用到的所有寄存器;想了解其它寄存器作用及功能请看之前的基础实验文档,或查看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?

  1. /* Interrupt Enable 1 */
  2. 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 程序及代码

  1. #include <ioCC2530.h>
  2. typedef unsigned int uint;
  3. typedef unsigned char uchar;
  4. uint t1_count = 0;
  5. uint t3_count = 0;
  6. void init_gpio(void)
  7. {
  8. P1SEL &=~ 0x03;
  9. P1DIR |= 0x03;
  10. P1 = 0x00;
  11. P1_0 = 0;
  12. P1_1 = 1;
  13. }
  14. void init_timer3()
  15. {
  16. T3CTL |= 0xC0; // 设置64分频,自动重装,每次溢出时间 1/(16mhz/64)*256 = 0.001s(几乎1ms)
  17. T3CTL |= 0x04; // 打开T3溢出中断使能
  18. EA = 1; // 打开总开关
  19. T3IE = 1; // 打开T3中断使能
  20. T3CTL |= 0x10; // 启动定时器
  21. }
  22. void init_timer1()
  23. {
  24. T1CTL |= 0x0d; // 设置128分频,自由运行; 每次溢出时间 1/(16mhz/128)*65535 = 0.524s
  25. TIMIF |= 0x40; //打开T1溢出中断
  26. EA = 1; // 打开总开关
  27. IEN1 |= 0x02; // 打开t1中断使能
  28. }
  29. #pragma vector = T3_VECTOR
  30. __interrupt void T3_ISR(void)
  31. {
  32. t3_count ++;
  33. if(t3_count % 2000 == 0) // 2S翻转一次
  34. {
  35. P1_0 = ~P1_0;
  36. P1_1 = ~P1_1;
  37. }
  38. }
  39. #pragma vector = T1_VECTOR
  40. __interrupt void T1_ISR(void)
  41. {
  42. t1_count++;
  43. if(t1_count%2 == 0) // 1S翻转一次状态
  44. {
  45. P1_0 = ~P1_0;
  46. P1_1 = ~P1_1;
  47. }
  48. }
  49. void main(void)
  50. {
  51. init_gpio();
  52. //init_timer1();
  53. init_timer3();
  54. while(1)
  55. {
  56. ;
  57. }
  58. }
  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. Linux符号连接的层数过多

    转:http://blog.csdn.net/ta893115871/article/details/7458869 创建符号链接的时候一定要使用绝对路径,例如:/usr/local/cxxt/con ...

  2. WCF生成客户端代理对象的两种方法的解释

    最近在封装WCF,有一些很好的实践就记录下来,大家可以放心使用,所有代码都已经调试过.如果有高手可以大家探讨一下. 在WCF中有两种不同的方法可以用于创建客户端服务对象,他们分别为: 1. 代理构造法 ...

  3. Judy Array - Example

    “ In computer science and software engineering, a Judy array is a data structure that has high perfo ...

  4. hg 添加用户

    .hg目录下hgrc文件 [ui] username = lyd

  5. [ Laravel 5.5 文档 ] 底层原理 —— 一次 Laravel 请求的生命周期

     Posted on 2018年3月5日 by  学院君 简介 当我们使用现实世界中的任何工具时,如果理解了该工具的工作原理,那么用起来就会得心应手,应用开发也是如此.当你理解了开发工具如何工作,用起 ...

  6. vue.js项目打包上线

    最近一直坚持每个月写一个小的vue.js 开发的项目,最后开发完成后想到很久之前给别人回答的一个问题:vue的项目如何上线,当时有千奇百怪的回答,我在想,这些人都是肿了么,vue的官方都说了,这个框架 ...

  7. Java 8 可重复注解与类型注解

    Java 8 可重复注解与类型注解 Java 8 对注解处理提供了两点改进:可重复的注解及可用于类型的注解. // 首先要提供一个容器,MyAnnotation 才能用于可重复注解 @Target({ ...

  8. part1:4-linux快速体验

    1.Linux部分目录结构介绍 /:根目录,一般根目录下只存放目录,尽量不要存放文件:/etc./bin./dev./lib./sbin应该和根目录放置在一个分区中. /bin:可执行二进制文件目录, ...

  9. oracle常用函数速记

    1.截断中文字符串 CREATE OR REPLACE function cn_cutstr(v_str varchar2,v_len number) return varchar2 IS v_i n ...

  10. 处理No CPU/ABI system image for target的方法

    处理No CPU/ABI system image for target的方法 最近菩提搭建完成Android开发环境后,在创建安卓模拟器的时候遇到了问题.这个问题就是图片中显示的no CPU/ABI ...