【Embedded System】定时器的原理与应用

💘ARM Embedded System,欢迎关注我的Gitee

💦定时器的原理

  在S5PV210中,一共有5个32位的定时器,这些定时器可发送中断信号给ARM子系统。另外,定 时器0、1、2、3包含了脉冲宽度调制(PWM),并可驱动其拓展的I/O。PWM对定时器0有可选的dead-zone 功能,以支持大电流设备。要注意的是定时器4是内置不接外部引脚的。
  定时器0与定时器1共用一个8位预分频器,定时器2、定时器3与定时器4共用另一个8位预分 频器,每个定时器都有一个时钟分频器,时钟分频器有5种分频输出(1/2、1/4、1/8、1/16和外部时钟 TCLK)。另外,定时器可选择时钟源,定时器0〜4都可选择外部的时钟源,如PWM_TCLK。
在这里插入图片描述

💦脉宽调制- PWM

  脉宽调制(PWM)就是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
  脉宽调制(PWM)就是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
  PWM从处理器到被控系统信号都是数字式的,无需进行数模转换。让信号保持为数字形式可将噪声影响降到最小。
  PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。
  PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。
  电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。
在这里插入图片描述

💦接通时间、周期、占空比和调制频率

  以上页例子为例,接通时间为灯泡点亮时间
  周期为一次通断的时间
  占空比是接通时间与周期之比
  调制频率为周期的倒数。要想取得调光灯(保持点亮)的效果,必须提高调制频率。通常调制频率为1kHz到200kHz之间。

💦PWM硬件控制器

  许多微控制器内部都包含PWM控制器。一般都可以选择接通时间和周期。占空比是接通时间与周期之比;调制频率为周期的倒数。具体的PWM控制器在编程细节上会有所不同,但它们的基本思想通常是相同的。执行PWM操作之前,微处理器要求在软件中完成以下工作:
  设置提供调制方波的片上定时器/计数器的周期;
  在PWM控制寄存器中设置接通时间;
  启动定时器。

💦定时器基本操作

  一个定时器(定时器4除外)都包含TCNTBn、TCNTn、TCMPBn和TCMPn几个寄存器。在定时器计数缓冲寄存器(TCNTBn)中有一个初始值,当定时器使能后,这个值就被装载到递减计数器( TCNTn )中。而在定时器比较缓冲寄存器(TCMPBn)中也有一个初始值,这一值被装载到比较寄存器( TCMPn )中,用来与递减计数器的值进行比较。这两个缓冲器使得在频率和占空比发生改变时仍能产生一个稳定的输出。当TCNTn到0且中断使能时,定时器将产生一个中断请求。
  自动加载和双缓冲模式脉宽调制定时器有一个双缓冲功能,在这种情况下,改变下次加载值的同时不影响当前定时周期。因此,尽管设置一个新的定时器值,当前定时器的操作将会继续完成而不受影响。定时器的值可以写入定时器计数值缓冲寄存器(TCNTBn)中,而当前计数器的值可以通过读定时器计数值观测寄存器(TCNTOn)得到。当TCNTn的值到0时,自动加载操作复制TCNTBn的值到TCNTn中。

💦用手动更新位和反转位位对定时器进行初始化

  当递减计数器的值到0时,自动加载操作才能进行。所以,用户必须预先对TCNTn定义一个起始值。因此,起始值必须由手动更新位载入。以下步骤描述了怎么起始一个定时器。
  ① 将初始值写入到TCNTBn和TCMPBn中。
  ② 设置相应定时器的手动更新位。推荐配置反转位位开或关(不管反转位用与否)。
  ③ 设置相应定时器的起始位从而启动一个定时器(同时清除手动更新位)。

💦定时器操作步骤

  ① 使能自动加载功能。设置TCNTBn为160,TCMPBn 为110。设置手动更新位并配置反转位位。手动更新位设置TCNTn 和 TCMPn 的值与 TCNTBn 和TCMPBn 相同。然后设置 TCNTBn 和TCMPBn的值分别为80和40,确定下一个周期的值。
  ② 如果手动更新位为0、反转位关且自动加载开,则设置起始位,在定时器的延迟时间后定时器开始递减计数。
在这里插入图片描述
  ③ 当TCNTn的值和TCMPn相等时,则TOUTn的逻辑电平将发生改变,由低到高。
  ④ 当TCNTn的值到0时,产生一个中断并且将TCNTBn的值加载到一个临时寄存器。在下一个时钟周期,TCNTn由临时寄存器加载到TCNTn中。
  ⑤ 在中断服务程序中,TCNTBn和TCMPBn分别设置成80和60。
  ⑥ 当TCNTn的值和TCMPn相等时,则TOUTn的逻辑电平将发生改变,由低到高。
  ⑦ 当TCNTn到0时,TCNTn自动重新加载,并出发一个中断请求。
  ⑧ 在中断服务子程序,自动加载和中断请求都被禁止,从而将停止定时器。
  ⑨ 当TCNTn的值和TCMPn相等时,则TOUTn的逻辑电平将发生改变,由低到高。
  ⑩ 当TCNTn的值为0时,TCNTn将不再重新加载新的值,从而定时器停止。
  由于中断请求被禁止,不再产生中断请求。

💦脉宽调制

  脉宽调制功能可以通过改变TCMPBn的值实现。寄存器TCMPBn的作用是:当计数器TCNTn中的值减到与TCMPBn的值相同时,TOUT的输出值取反。PWM的频率由TCNTBn决定,改变TCMPB的值,便改变了输出方波的占空比。

💦配置寄存器的值

  预定标器和分频器
  一个8位预定标器和一个4位分频器作用下的输出频率。8位预定标器是可编程的,它根据TCFG0和TCFG1中的数值分割PCLK。设PCLK的频率为50MHz,经过预标定和分频器后,计算送给定时器的计数时钟频率。
  计数时钟和输出计算:
  (1)定时器输入时钟频率fTclk(即计数时钟频率)
  fTclk=[fpclk/(Prescaler+1)] × 分频值
  式中:Prescaler为预标定值,其值为0~255;分频值为1/2、1/4、1/8、1/16。
  (2)PWM输出时钟频率
  PWM输出时钟频率 = fTclk/TCNTBn
  (3)PWM输出信号占空比(即高电平持续时间所占信号周期的比例)
  PWM输出信号占空比 = TCMPBn/TCNTBn
  定时器专用寄存器
  定时器专用寄存器共有6种、17个寄存器,如表所示。
在这里插入图片描述
  TCNTBn为Timern计数初值寄存器(计数缓冲寄存器,16位);
  TCMPBn为Timern比较寄存器(比较缓冲寄存器,16位);
  TCNTOn为Timern计数读出寄存器(16位)。

💦PWM蜂鸣器实验

  定时器3的输出引脚TOUT3和蜂鸣器的三极管相连,此电路的三极管是PNP性,当TOUT3是高电平时,此三极管处于饱和状态,电路导通,电流流过蜂鸣器,此时蜂鸣器发声;反之,当TOUT3 是低电平时,此三极管处于截止状态,电路关断时,蜂鸣器停止发声。蜂鸣器发声的长短和频率,完全有TOUT控制导通时间,一般都是设定一段延时就可以了,长短可以自己实验。
在这里插入图片描述

💦寄存器设置

  1、将PWMTOUT1对应的引脚配置成PWM输出模式
  2、 配置分频值和设置计数缓冲器和比较缓冲器的值
  3、 启动对应的定时器,产生PWM波
  4、 不断的改变占空比和PWM波的频率可以让蜂鸣器发出不同的声音

💦主要程序

GPD0.GPD0CON = (GPD0.GPD0CON & (~0xF000) | (0x2 << 12));                  //设置Tout3输出
TIMER.TCFG0 = (TIMER.TCFG0 & ~0xFF00) | 0xFF00;   //配置预分频值为256
TIMER.TCFG1 = (TIMER.TCFG1 & ~0xF000) | 4 <<12;//配置分频的值为1/16分频
TIMER.TCNTB3 = 1280;               //设置基数缓冲器的值
TIMER.TCMPB3 = 1280/4;             //设置比较缓冲器的值
TIMER.TCON = 0x0e << 16;           //手动更新,是缓冲器的值到计数器里面,双缓冲机制
TIMER.TCON = 0x0d << 16;           //清除手动更新位,并启动定时器3

💦系统初始化

  系统初始化有两个阶段:首先初始化运行环境,如异常向量表、中断向量表、堆栈、I/O等;其次初始化应用程序,如C语言变量初始化等。对有操作系统的应用系统,运行环境在操作系统启动时初始化,然后通过main()函数自动进入应用程序,C运行时库中的main()函数初始化应用程序。对于没有操作系统的应用系统,ROM中的代码必须提供一种应用程序初始化自身和开始执行的方法。
  通常初始化代码位于复位后执行的代码,完成下面的内容:标识初始化代码的入口;设置异常向量表、中断向量表;初始化存储器系统;初始化堆栈指针;初始化一些关键的I/O口;初始化中断系统需要的RAM变量;使能中断;如果需要,切换处理器模式;如果需要,切换处理器状态。
  运行环境初始化后,接下来就是应用程序初始化,然后进入C程序。
  1)设置初始入口地址。一命可执行映像必须有一个入口。一个嵌入式ROM映像入口地址通常在0,入口可以通过汇编语言ENTRY来定义。系统中可能有多个入口,当系统中有多个入口时,其中某个入口必须通过_entry来指定为初始入口。如果包含C程序的系统程序中有main()函数,在C运行时库初始化代码中也有一个入口。
  2)设置异常向量表。异常向量表包含一系列不能修改的指令,用以跳转到各异常的响立程序。
  3)初始化存储器系统。如果系统中有内存管理或保护单元,必须在初始化前做两件事情:其一是中断禁止;其二是没有进行依赖于RAM的程序调用。
  4)初始化堆栈。用来初始化代码、初始化堆栈指针寄存器,可以初始化部分或所有的堆栈指针,这取决于系统中用到的中断和异常。通常,SP_abt和SP_und在简单系统中没有用到,当然也可以初始化它们以用于调试。在处理器切换到用户模式,开始执行应用程序前设置SP_und。
  5)初始化一些关键的I/O口设备。关键的I/O设备是使能中断前必须初始化的I/O设备。通常系统在此处初始化这些设备,如果没有初始化,当中断使能时,这些设备可能导致不期望的中断。
  6)初始化中断系统需要的RAM变量。如果中断系统有缓冲区指针用来读取数据到内存缓冲器,该指针必须在中断使能前被初始化。
  7)中断使能。如果需要,初始化代码现在能通过清除CPSR寄存器的中断禁止位来使能中断了,这是安全使能中断的最简单的方法。
  8)切换处理器模式。程序执行到这仍然处于Svc模式,如果应用程序运行在USR模式,在此处切换到USR模式并初始化USR模式堆栈寄存器SP_Usr。
  9)切换处理器状态。所有的RAM棱包括有Thumb功能的处理器,复位时都处于ARM状态,初始化代码都会是ARM状态。如果应用程序编译成Thumb代码,链接器会自动添加ARM状态到Thumb状态的小代码段,以实现由ARM状态到Thumb状态的切换。当然,也可以手动写初始化代码来完成切换。

  .text
  .global _start
    _start:
    ldr r0, =0xE2700000
    mov rl, #0
    str rl,[r0]
    ldr sp,= 0xD0037D80    ;设置栈,以便调用c函数
    ldr r0, =main
    ldr r1, =0xD0030000    ;0xd0030000目标地址
    ldr r2, =redirt_end
    cmp r0, r1
    beq run_on_dram
    copy_loop:
    ldr r3, [r0], #4    ;源
    str r3, [r1], #4    ;目的
    cmp r0,r2
    bne copy_loop
  run_on_dram:
           ldr pc, =0xD0030008    ;跳转
    halt:
             b halt

在这里插入图片描述
  S5 PV210上电将从IROM处执行固化的启动代码BL0,它对时钟等初始化、对启动设备进行判断,并从启动设备中复制BL1(最大16KB)到IRAM(地址0xD0020000处,其中0xD0020010之前的16个字节存储BL1的校验信息和BL1的尺寸)中,并对BL1进行校验,校验成功后转入BL1进行执行。
  •BL0:是指S5PV210微处理器的IROM中固化的启动代码。
  •BL1:是指在IRAM自动从外存储器(nand/sd/usb)中复制的uboot. bin二进制文件 的头16 KB代码。
  •BL2:是指在代码重定向后在内存中执行的UBOOT的完整代码。
  上述三者之间的关系是:BL0将BL1加载到IRAM,然后BL1在IRAM中运行并将BL2加载到SDRAM,BL2加载嵌入式操作系统内核。BL是bootloader的简称。
  S5PV210微处理器的IRAM的地址范围是0xD0020000 - 0xD003FFF,上电后执行完固化的 BL0,并将启动设备的代码复制到IRAM中,并跳转到0xD0020010处执行。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZoomToday

给作者倒一杯卡布奇诺

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值