【R7F0C809】DIY第八篇--定时器应用
[复制链接]
本帖最后由 youzizhile 于 2015-9-17 22:56 编辑
在USB电源电压电流检测仪应用中,需要记录每个间隔时刻的电流平均值,以计算USB输出的电量。 由于R7F0C809没有RTC,所以不能通过实时钟来作为一个固定间隔的信号源,只能采用定时器作为上电时间的统计,计划通过定时器设置1S间隔时间,然后计算一秒内的电流平均值并进行累加以计算电量。 1 定时器介绍R7F0C809的定时器阵列单元配置有 4 个 16 位定时器。 定时器功能如下所示: 定时器陈列单元结构 1.1 8位定时器运行功能的基本规则(只限于通道1和通道 3)8 位定时器运行功能是将 16 位定时器的通道用作 2 个 8 位定时器的通道的功能。 只有通道 1 和通道 3 才能使用 8 位定时器运行功能,使用时需要遵守几个规则。 8 位定时器运行功能的基本规则如下所示。 (1) 8位定时器运行功能只适用于通道1和通道3。 (2) 当用作8位定时器时,将定时器模式寄存器0nH(TMR0nH)的SPLIT位置“1”。 (3) 高8位定时器能用作间隔定时器功能。 (4) 在开始运行时,高8位定时器输出中断请求信号(INTTM01H、INTTM03H) (和MD0n0位为“1”的运行相同)。 (5) 高8位定时器的运行时钟的选择取决于低位TMR0nH寄存器的CKS0n1位的设定。 (6) 对于高8位定时器,通过操作TSH0n位来开始通道的运行,并且通过操作TTH0n位来停止通道的运行。 能通过TEH0n位确认通道的状态。 (7) 低8位定时器的运行取决于TMR0nH寄存器和TMR0nL寄存器的设定,低8位定时器支持以下定时器功能: • 间隔定时器 • 方波输出 • 外部事件计数器 • 延迟计数器 •PWM输出功能 • 多重PWM输出功能 (8) 对于低8位定时器,通过操作TS0n位来开始通道的运行,并且通过操作TT0n位来停止通道的运行。能通过TE0n位确认通道的状态。 (9) 在16位定时器运行时,TSH0n/TTH0n位的操作无效。通过操作TS0n位和TT0n位来控制通道n的运行。 TEH0n位不变。 1.2 1.21.2定时器间隔定时运行模式
1.2.1 间隔定时器模式的运行①通过给TS0n位写“1”,进入运行允许状态(TE0n=1)。定时器计数寄存器0n (TCR0n)保持初始值,直到产生计数时钟(fTCLK)为止。 ② 通过允许运行后的第1个计数时钟产生开始触发信号。 ③当MD0n0位为“1”时,通过开始触发信号产生INTTM0n。 ④ 通过允许运行后的第1个计数时钟将定时器数据寄存器0n(TDR0n)的值装入TCR0n寄存器,并且以间隔定时器模式开始计数。 ⑤如果TCR0n寄存器递减计数到“0000H”,就在下一个计数时钟,产生INTTM0n,并且在将定时器数据寄存器0n (TDR0n)的值装入TCR0n寄存器后继续进行计数。 1.2.2 运行时序
1.2.3 作为间隔定时器运行的框图
1.2.4 寄存器操作步骤2 需要用到的寄存器介绍2.1 外围允许寄存器 0(PER0)PER0寄存器是设定允许或者禁止给各外围硬件提供时钟的寄存器。通过停止给不使用的硬件提供时钟,降低功耗和噪声。 要使用定时器阵列单元时,必须将bit0 (TAU0EN)置 “1”。 2.2 2.
2.1定时器时钟选择寄存器 0(TPS0)TPS0 寄存器是选择从预分频器共同提供给各通道的 2 种运行时钟(CK00、 CK01)的 8 位寄存器。 2.3 2
2.2定时器模式寄存器 0n(TMR0n)TMR0n 寄存器由 2 个设定通道 n 的运行模式的 8 位寄存器 (TMR0nH、 TMR0nL)构成。进行运行时钟(fMCK)的选择、计数时钟(fTCLK)的选择、主控 / 从属的选择、16 位 /8 位定时器的选择(只限于通道 1 和通道 3)、开始触发和捕捉触发的设定、定时器输入有效边沿的选择以及运行模式(间隔、捕捉、事件计数器、单次计数、捕捉 & 单次计数)的设定。 禁止在运行中(TE0n=1)改写 TMR0nH 寄存器和 TMR0nL 寄存器。 通过 8 位存储器操作指令设定 TMR0nH 寄存器和 TMR0nL 寄存器。 2.4
2.3定时器输出寄存器由于不涉及到定时器输出,所以相关寄存器就不解释了。
3 程序设计3.1
3.1初始化voidTAU_Init(void) { TAU0EN =1; /* Suppliesinput clock */ TPS0 =0x05; /* CK00,fMCLK = fCLK/(2^5) = 625kHz */ TMR01H =0; /* TPS0setting available, only software trigger */ TMR01L =0; /* Fallingedge, Interval timer mode */ TDR01H =0xf4; /* Intervaltime = (0xf423+1)/625kHz = 100ms */ TDR01L =0x23; TMIF00 =0; /* ClearsINTTM00 and INTTM01 interrupt flag */ TMIF01 =0; TMMK01 =0; /* Enables INTTM01interrupt */ TMPR101 =1; /* SetsINTTM01 low priority */ TMPR001 =1; } 3.2
3.2
3
3.2
3.2中断服务程序voidTAU0_Channel1_Interrupt(void) { Cnt100ms++; if (Cnt100ms ==10) { time_count++; Flag1s =1; /* Sets 1sflag */ Cnt100ms =0; } }
我的其他帖子:
|