15.2、定时器中断方式
上面采用轮训的方法是比较占资源的,类似我们按键那节中介绍的,除了轮训我们还可以用中断方式!在黄色初始化部分比采用轮训方式多了使能T1中断和总中断的部分(35、36行代码)。我之前没有加这两句代码,结果橙色部分的定时器1中断回调函数无法被触发!查datasheet发现Interrupt Overview:如果想触发回调函数,需要将EA开关和T1IE开关打开才行!
- /****************************************************************************
- * 文 件 名: main.c
- * 版 本: 1.0
- * 描 述: 定时器T1通过查询方式控制LED1周期性闪烁
- ****************************************************************************/
- #include <ioCC2530.h>
- typedef unsigned char uchar;
- typedef unsigned int uint;
- #define LED1 P1_0 // P1.0口控制LED1
- /****************************************************************************
- * 名 称: InitLed()
- * 功 能: 设置LED灯相应的IO口
- * 入口参数: 无
- * 出口参数: 无
- ****************************************************************************/
- void InitLed(void)
- {
- P1DIR |= 0x01; //P1.0定义为输出
- LED1 = 1; //使LED1灯上电默认为熄灭
- }
- /****************************************************************************
- * 名 称: InitT1()
- * 功 能: 定时器初始化,系统不配置工作时钟时默认是2分频,即16MHz
- * 入口参数: 无
- * 出口参数: 无
- ****************************************************************************/
- void InitT1()
- {
- T1CTL = 0x0d; //128分频,自动重装 0x0000-0xFFFF
- T1STAT= 0x21; //通道0,中断有效
- T1IE = 1; //开总中断和T1中断
- EA = 1; //开总中断
- }
- //定时器T1中断处理函数
- #pragma vector = T1_VECTOR
- __interrupt void T1_ISR(void)
- {
- static uchar count=0;
- IRCON = 0x00; //清中断标志, 也可由硬件自动完成
- if(count++ >= 1) //约1s周期性闪烁,示波器测大约为1025MS
- {
- count=0;
- LED1 = !LED1; //LED1闪烁
- }
- }
- /****************************************************************************
- * 程序入口函数
- ****************************************************************************/
- void main(void)
- {
- InitLed(); //调用初始化函数
- InitT1();
-
- while(1){}
- }
|