一、概述
1. 功能原理和应用场景
Timer(定时器/计数器)以一定的频率计数;到规定数值后,产生中断标志Timer任务的完成。(如:Timer为子系统产生内部中断,实现精准有效的系统时间管理。)定时器控制器组成部分
-
可编程的分频器(一级、二级…)
- Timer的时钟源一般为芯片内部时钟,可使用分频器分频
-
数值缓冲器(TCNTBx)
- 数值缓冲器的工作模式:
- 自动装载模式。减法计数器减为零时,计数缓冲器自动装载数值到减法计数器中;
- 手动装载模式。
- 提示:
- 一般每个Timer对应两个数值缓冲器结构,这是为了可以在一个周期内更新Timer的值。但需在当前周期结束后,更新的值才会生效。
- 数值缓冲器的工作模式:
-
减法计数器(down-counter)
- 计数器由Timer的时钟来驱动
- 当在“数值缓冲器”中的值被减到零时,如果设置了中断使能位,Timer将会在对应信号线上产生中断,同时置位相关寄存器的中断标志位;
2. 典型电路
a. 执行逻辑图(Allwinner - H8)
b. 使用步骤
使用步骤 + 目的 | 操作对象(所属寄存器+位域) | 功能描述 |
---|---|---|
FunctionA01 暂停Timer | CTRL -> bit0 | (0: 停止/暂定, 1:开始) *. 当计数器被启动后,它会重新装载数值缓冲器的值到减法计数器中; *. 当在减法计数器的值减到零之前,暂停的计数器需要等到两个周期以后才能再次启动; *. 在暂停状态,数值缓冲器的值可以被修改,如果需要在再次启动计数器的时候使用新的数值缓冲器的值,则需要在启动计数器之前,设置Reload位 |
FunctionA02 设置Timer1的时钟源 | CTRL -> bit[3:2] | 00: 32K 01: OSC24M. 10: / 11: /. |
FunctionA03 设置Timer1分频 | CTRL -> bit[6:4] | 000: /1 001: /2 010: /4 011: /8 100: /16 101: /32 110: /64 111: /128 |
FunctionA04 设置Timer1单触发模式 | CTRL -> bit7 | 当减法计数器完成工作,定时器自动停止 |
FunctionA05 使能Timer IRQ | IRQ -> bit1 | (0: 无影响; 1: 减法计数器完成后中断使能) |
FunctionB01 设置计数值 | INTV -> bit[31:0] | 需要考虑系统和计数器的时钟 |
FunctionB02 重新装在计数缓冲器的数值到减法计数器中 | CTRL -> bit1 | (0: 无影响, 1: 重新装载减法计数器的数值 *. 在该位被设置并完成任务自动归位后,才能再次设置该位为1 |
FunctionB03 启动计数器 | CTRL -> bit0 | (0: 停止/暂停, 1: 启动.) |
二、Linux应用和驱动Demo程序示例
github链接: interfaceDriver-Timer(by Henry)
三、注意:
- 不足之处还望指正,多多留言
- 如需转载,请注明出处,谢谢~