九齐单片机配置篇—定时器配置
摘要:本文详细介绍了九齐单片机NY8B062F的定时器配置方法。该芯片提供4个定时器(1个8位上数定时器0和3个10位下数定时器1-3)及4组10位PWM输出。重点阐述了定时器0的寄存器配置(PCON1、TMR0、T0MD)及分频比计算方法,给出了4ms定时周期的实现示例。对定时器1-3的10位寄存器配置、分频设置和中断控制也进行了说明,并提供了完整的初始化代码。文章强调定时器与PWM功能复用关系
一、简介
九齐单片机NY8B062F 有四组定时器,可用系统时钟当作一般的计时应用或者从外部讯号触发来计数。另外 NY8B062F 提供 4 组 10 位的 PWM 输出,3 组蜂鸣器输出,可用来驱动马达、LED、或蜂鸣器等等。PWM与定时器功能是复用的,如果选择某一个为定时器,那么就不可以再配置为PWM输出了,同理,如果选择为PWM输出,就不可以用作定时器了。值得注意的是,NY8B062F定时器0为上数定时器,定时器1,2,3,为下数定时器。
二、定时器0
定时器 0 是 8 位上数定时器,由寄存器T0EN(PCON1[0])开启/关闭。写入定时器 0 将会设定其初始值,读取定时器 0 时则会显示目前的计数数值。与定时器0配置有关的寄存器有PCON1,TMR0,T0MD,此外如果要用定时器中断的话还有中断使能寄存器INTE和中断标志位寄存器INTF。
2.1 PCON1寄存器
PCON1中的最低位 Bit0 :T0EN 控制定时器0的开关,可以直接单独对这一位操作,所以用定时器0的话这个寄存器只需要直接操作T0EN就行了。
T0EN = 0; // 关闭定时器0
T0EN = 1; // 开启定时器0

图2.1 T0EN
2.2 TMR0(定时器 0 寄存器)
TMR0寄存器用于读写定时器0的初值,当计算好每数一个数值的时间后,就可以给一个初值,来得到你想要的计数值,如果不赋初值的话,一个定时器周期就会直接溢出。定时器0是8位上数,即最大赋值256,从0数到初值就会溢出然后从0重新上数,我们先赋初值125,后面会用到。
TMR0 = 0x7C; // 赋初值124,从0开始数0-124即为125个计数

图2.2 TMR0
2.3 T0MD(定时器0控制寄存器)
T0MD的八位控制定时器0的功能,定时器具体的计数周期也是由这个寄存器控制,具体的作用如图2.3所示。
预分频比是对定时器时钟源频率进行分频来作为定时器的频率,比如我们选择系统指令时钟作为定时器0的时钟源,那么T0MD的Bit7与Bit5都选择为0。
系统的指令时钟在配置字节表中选择,比如说我们选择4MHZ,4T,那么指令时钟就等于4MHZ/4T = 1MHZ。
Bit4是选择外部时钟源时才有作用,这里我们没有选择外部时钟源就不用管,默认值即可。
Bit3是选择将分频器分配给看门狗WDT还是定时器0,这里我们分配给定时器0,WDT我们后面会在低功耗中去讲解。
Bit2到Bit0控制分频比,具体分频多少取决于你要的计时周期,比如我选择1:32即32分频,那么定时器0的时钟频率就是1MHZ / 32 = 31250HZ,时钟周期就为32us。这里结合刚才2.2中的初值,我们赋初值125,那么定时器每溢出一次的时间就为32us * 125 = 4000us = 4ms,我们就得到了定时器0每溢出一次的周期。我们以4ms为基准时基,那么就可以计时1s,1min,1hour等,定时器0就可以当做计时器用在我们的系统当中了。当然如果需要更小的计时周期,比如100us,1ms,那么就自己计算合适的分频比与初值即可,有时不一定能得到正好的整数,就会有误差,这个要注意。
T0MD = 0x04; // 0000 0100 选择指令周期为时钟源,预分频器分到定时器0,32分频


图2.3 T0MD
2.4 定时器0完整代码
一般定时器都会作为定时器中断去使用,这样每一次中断时间就是4ms,中断250次就是1s。
DISI(); // 关中断
T0EN = 0; // 关闭定时器0
TMR0 = 0x7C; // 赋初值124,从0开始数0-124即为125个计数
T0MD = 0x04; // 0000 0100 选择指令周期为时钟源,预分频器分到定时器0,32分频
T0EN = 1; // 开启定时器0
T0IE = 1; // 定时器0中断使能
T0IF = 0; // 定时器0中断标志初始清零
ENI(); // 开总中断
三、定时器1 2 3
定时器 1,2 ,3是具有预分频器 1,2,3 的 10 位下数定时器,其预分频比是可编程的。定时器 1,2,3 的输出可以被用于产生PWM1,2,3 输出与蜂鸣器 1,2,3 输出。这三个定时器可以说是复制粘贴的定时器,略有不同的就是一些数据,控制寄存器的地址不一样。因为他们都是十位寄存器,所以最大初值可以是11 1111 1111,即0x3FF。
3.1 定时器1 2 3 高字节寄存器
定时器 1,2的高字节存储在一个寄存器TMRH中,如图3.1.1,TMRH Bit7 Bit6 是定时器2的两个高字节,Bit5 Bit4是定时器1的两个高字节,如果用到的话要记得配置这四个高字节。TMRH低四位是PWM占空比寄存器,这个后面讲PWM时会讲,目前暂时用不到,默认为0000。
TMRH = 0x00; // 00 00 0000,定时器2跟定时器1高字节都设置为00,用到哪个设置哪个

图3.1.1 TMRH
定时器 3的高字节存储在TM3RH中,同理定时器1,2,不再赘述,如图3.1.2所示。
TM3RH = 0x00; // 0000 0000

图3.1.2 TM3RH
3.2 定时器1 2 3低八位字节寄存器与控制寄存器
定时器 1,2,3 都是三个功能相同的寄存器,TMR1,2,3 寄存器,T1 / 2 / 3 CR1寄存器,T1 / 2 / 3 CR2寄存器,不再重复赘述,只以定时器1为例,其他两个同理 。忽略PWM有关,默认为0,选择连续计数模式重载值下数 ,指令时钟为时钟源,开启分频器,分频比为1:32,开启定时器 。配置代码如下,寄存器如图 3.2 所示,以定时器1为例,其他两个完全一样。
TMR1 = 0x7C; // 定时器1 初值125
T1CR1 = 0x03; // 0000 0011 开启定时器1,连续下数重载值模式
T1CR2 = 0x04; // 0000 0100 指令时钟源,开启分频器,分频比1:32
TMR2 = 0x7C; // 定时器2 初值125
T2CR1 = 0x03; // 0000 0011 开启定时器2,连续下数重载值模式
T2CR2 = 0x04; // 0000 0100 指令时钟源,开启分频器,分频比1:32
TMR3 = 0x7C; // 定时器3 初值125
T3CR1 = 0x03; // 0000 0011 开启定时器3,连续下数重载值模式
T3CR2 = 0x04; // 0000 0100 指令时钟源,开启分频器,分频比1:32




图3.2 三个寄存器合集
四、总结
定时器0,1,2,3完整代码(开启定时器中断功能)如下:
DISI(); // 关中断
// 定时器0 配置
T0EN = 0; // 关闭定时器0
TMR0 = 0x7C; // 赋初值124,从0开始数0-124即为125个计数
T0MD = 0x04; // 0000 0100 选择指令周期为时钟源,预分频器分到定时器0,32分频
T0EN = 1; // 开启定时器0
T0IE = 1; // 定时器0中断使能
T0IF = 0; // 定时器0中断标志初始清零
// 定时器1 配置
TMRH = 0x00; // 定时器1 高字节设置
TMR1 = 0x7C; // 定时器1 初值125
T1CR1 = 0x03; // 0000 0011 开启定时器1,连续下数重载值模式
T1CR2 = 0x04; // 0000 0100 指令时钟源,开启分频器,分频比1:32
T1IE = 1; // 定时器1中断使能
T1IF = 0; // 定时器1中断标志初始清零
// 定时器2 配置
TMRH = 0x00; // 定时器2 高字节设置
TMR2 = 0x7C; // 定时器2 初值125
T2CR1 = 0x03; // 0000 0011 开启定时器2,连续下数重载值模式
T2CR2 = 0x04; // 0000 0100 指令时钟源,开启分频器,分频比1:32
T2IE = 1; // 定时器1中断使能
T2IF = 0; // 定时器1中断标志初始清零
// 定时器3 配置
TM3RH = 0x00; // 定时器3 高字节设置
TMR3 = 0x7C; // 定时器3 初值125
T3CR1 = 0x03; // 0000 0011 开启定时器3,连续下数重载值模式
T3CR2 = 0x04; // 0000 0100 指令时钟源,开启分频器,分频比1:32
INTE2 = 0x01; // 定时器3 中断使能,中断标志初始清零 T3IE = 1; T3IF = 0;
ENI(); // 开总中断
// 定时器0,1,2的中断使能位在INTE寄存器中,标志位在INTF寄存器中,而定时器3的中断使能与标志都在IMTE2寄存器中,故配置中断时略有差异,因为此单片机有的支持位操作,有的不支持,如果定时器3也支持位操作的话,就没什么区别了
更多推荐



所有评论(0)