1、 定时器的原理 定时器之所以能够定时,就是系统里有个能根据脉冲进行加一的寄存器,每来一个脉冲这个寄存器里的值就能加一,用这个寄存器里的值乘以脉冲频率的倒数就是经过了多长时间,当然这个寄存器加到最大数后又会从0开始增加,而且这个寄存器里的初始值可以设定,从设定值到最大值乘以定时器时钟频率的倒数就是这一段经过的时间,实现定时。到了最大值后,系统会产生一个中断告诉使用者时间到了,你可以处理你想处理的事了。 2、 定时器的配置 手册中虽然有例子来演示如何进行配置,但是你还必须学会设置的这些到底是干啥用的,不然以后自己根本不会变通。 至于先设置哪个寄存器后设置哪个寄存器,可能会有些迷糊,但是手册里有相关的定时器的结构图,根据结构图一步步的设置,你自己也能完成例子里的定时,而且还能据此进行变通,编程设置成自己想要定时的时间。 配置步骤: 以STC32G的定时器0为例,系统给的结构图如下图11.1所示(图中的不同颜色的方框和数字是我自己加的,便于理解配置的先后顺序): 图11.1 (1) 定时器的模式配置(绿色框所示) 如图中绿颜色方框所示的配置,是在寄存器TMOD中,这个八位的寄存器中的位代表了要设置的内容,详细内容见手册中该寄存器的介绍。其中T0_C/T是设置T0是当做定时器还是计数器来使用。T0_C/T=0就是定时器,T0_C/T=1就是计数器,记录T0引脚上输入的脉冲数。GATE位用来设置定时器如何配合TR0来进行启动,如果GATE=0,那么只要TR0=1就能启动定时器,可以从图中的逻辑关系进行判断。如果GATE=1,那么启动定时器不仅需要TR0=1,还需要INT0引脚位高电平才可以。 T0M1和T0M0是设置定时器计数器TH0和TL0里的初始值是自动装载还是手动装载以及是寄存器是想使用8位还是16位。 (2) 配置定时器的时钟(如果被用来计数,那么这一步就不需要配置了)(紫色框所示) 基础时钟SYSclk,经过预分频与否和12分频与否后作为定时器的时钟。定时器时钟=SYSclk/(TM0PS+T0x12)。 (3) 设置计数寄存器TH0和TL0的初始值(蓝色框所示) 设置初始值的目的就是让计数寄存器从初始值开始增加一直到加满后溢出产生中断告诉定时时间到了。 (4) 启动定时器(红色框所示) TR0=1定时器就开始启动,意思就是计数器里的值就开始按照设定的脉冲开始计数了。 (5) 启动中断(黄色框所示) 之所以要用中断是为了让系统告诉我们定时时间到了,不然计数器满了又从初始值开始增加,我们不知道啥时候定时时间到了,定时中断的意义就在这。 ET0和EA分别是中断控制寄存器中的一个位,ET0=1、EA=1分别表示打开定时器中断和总中断,设置一个总中断的目的在于系统有好多个中断,如果某个时刻向关闭所有的中断,处理完成后再打开所需要的每个中断,单独的中断一个个的关闭再打开,太麻烦了,有个总中断就轻松解决这个问题了。
|