本帖最后由 lonerzf 于 2015-8-26 07:17 编辑
这几天空闲的时候看了看中断这块。首先就是了解有哪些中断源。
可能这里要注意的就是定时器T0-T3中,T1、T3定时器是能单独配置高8位定时及中断的。
定时器的相关寄存器如下图所示
DEMO板上的实例已经用了T0、T1,那就拿T2来做定时器,定时中断,然后切换LED灯亮灭吧。
从用户手册P108开始,逐个配置即可。
1 外围允许寄存器 0 ( PER0)的
TAU0EN 位打开,为定时器模块提供时钟输入。
2
定时器模式寄存器 TMR02H TMR02L 进行配置,我使用的是 运行时钟 CK00 (需配置PRS000 - PRS003为定时器配置时钟频率), CKS0n1 位指定运行时钟,软件触发开始有效,所以直接配置为00H即可。
3
定时器时钟选择寄存器 0 ( TPS0)的配置这里就跟别人一样,选16分频好了,那就是1.25MHz。
4
中断屏蔽标志寄存器 ( MK0L、 MK0H、 MK1L)关闭定时器2的中断屏蔽TMMK02 = 0;
5
配置定时器通道开始寄存器 0 ( TS0、 TSH0 ( 8 位模式))启动定时器T2 TS0 |= 0x04;
6
向TDR02H和TDR02L写入初值。我这里定时10ms,100次处理一次,达到1S的效果,所示初值就是TDR02H = 0x30; TDR02L = 0xD4;
7
写定时器中断服务程序
具体格式呢,源码文件中最上面一行(开始)加中断宏定义
#pragma interrupt INTTM02 INTTM02_IRS
中断服务函数就随便找个地方补充
__interrupt void INTTM02_IRS(void)
{
TMIF02 = 0; /*清中断*/
TDR02H = 0x30; /*更新初值*/
TDR02L = 0xD4;
if(CNT++ == 100)
{
CNT = 0;
flag = (flag == 0) ? 2 : 0;
P0 &= 0xFD;
P0 |= flag;
}
}
就这么7步。定时器2配置完成。
DEMO工程
LED_T2.rar
(805.26 KB, 下载次数: 22)