PWM定时器

       4412时钟为我们提供了PWM定时器,在4412中共有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。

当时钟被使能后,定时器计数缓冲寄存器(TCNTBn)把计数器初始值下载到递减计数器中。定时器比较缓冲寄存器(TCMPBn)把其初始值下载到比较寄存器中,并将该值与递减计数器的值进行比较。当递减计数器和比较寄存器值相同时,输出电平翻转。递减计数器减至0后,输出电平再次翻转,完成一个输出周期。这种基于TCNTBn和TCMPBn的双缓冲特性使定时器在频率和占空比变化时能产生稳定的输出。

每个定时器都有一个专用的由定时器时钟驱动的16位递减计数器。当递减计数器的计数值达到0时,就会产生定时器中断请求来通知CPU定时器操作完成。当定时器递减计数器达到0的时候,如果设置了Auto-Reload 功能,相应的TCNTBn的值会自动重载到递减计数器中以继续下次操作。然而,如果定时器停止了,比如在定时器运行时清除TCON中定时器使能位,TCNTBn的值不会被重载到递减计数器中。

TCMPBn 的值用于脉冲宽度调制(PWM)。当定时器的递减计数器的值和比较寄存器的值相匹配的时候,定时器控制逻辑将改变输出电平。因此,比较寄存器决定了PWM 输出的开关时间。

PWM定时器的特点

  1. 5个32位定时器;
  2. 2个8位PCLK分频器提供一级预分,5个2级分频器用来预分外部时钟;
  3. 可编程选择PWM独立通道。
  4. 4个独立的可编程的控制及支持校验的PWM通道。
  5. 静态配置:PWM停止;
  6. 动态配置:PWM启动;
  7. 支持自动重装模式及触发脉冲模式;
  8. 一个外部启动引脚。
  9. 两个PWM输出可带Dead-Zone 发生器。
  10. 中断发生器。

相关寄存器

1、定时器配置寄存器0(TFCG0)

 电平变化死区及预分频设置

2、定时器配置寄存器1(TCFG1)

主要用于PWM定时器的MUX输入(二级分频)

 3、定时时间以及栈空比设置

4412的PWM定时器具有双缓冲功能,能在不停止当前定时器运行的情况下,重载定时器下次运行的参数。所以尽管新的定时器的值被设置好了,但是当前操作仍能成功完成。

定时器的值可以被写入定时器n 计数缓冲寄存器(TCNTBn),当前的计数器的值可以从定时器计数观察寄存器(TCNTOn)读出。读出的TCNTBn值并不是当前的计数值,而是下次将重载的计数值。

TCNTn的值等于0的时候,自动重载操作把TCNTBn的值装入TCNTn,只有当自动重载功能被使能并且TCNTn 的值等于0的时候才会自动重载。如果TCNTn等于0,自动重载控制位为0,则定时器停止运行。

使用手动更新位(Manual Update)和反转位(Inverter)完成定时器的初始化。当递减计数器的值达到0的时候会发生定时器自动重载操作,所以TCNTn的初始值必须由用户提前定义好,在这种情况下就需要手动更新位重载初始值。一下几个步骤给出如何启动定时器。

  1. 向TCNTBn 和 TCMPBn写入初始值。
  2. 置位相应定时器的手动更新为,不管是否使用翻转功能,推荐设置反转位。
  3. 置位相应定时器的启动位启动定时器,清除手动更新位。

如果定时器被强制停止,TCNTn保持原来的值而不是TCNTBn的重载值。如果要设置一个新的值,必须执行手动更新操作。

下面是一个实例:

原理图

头文件:

  1. /* Exynos4412.h */
    typedef struct {  
  2.     unsigned int    TCFG0;  
  3.     unsigned int    TCFG1;  
  4.     unsigned int    TCON;  
  5.     unsigned int    TCNTB0;  
  6.     unsigned int    TCMPB0;  
  7.     unsigned int    TCNTO0;  
  8.     unsigned int    TCNTB1;  
  9.     unsigned int    TCMPB1;  
  10.     unsigned int    TCNTO1;  
  11.     unsigned int    TCNTB2;  
  12.     unsigned int    TCMPB2;  
  13.     unsigned int    TCNTO2;  
  14.     unsigned int    TCNTB3;  
  15.     unsigned int    TCMPB3;  
  16.     unsigned int    TCNTO3;  
  17.     unsigned int    TCNTB4;  
  18.     unsigned int    TCNTO4;  
  19.     unsigned int    TINT_CSTAT;  
  20. }pwm;  
  21. #define PWM (* (volatile pwm *)0x139D0000)
  1. #include"exynos_4412.h"
  2.  
  3. /*占空比 = 高电平时间 / 周期*/
  4.  
  5. void delay_ms(unsigned int Time)
  6. {
  7. unsigned int i,j;
  8. for(i=;i<Time;i++)
  9. for(j=;j<;j++);
  10. }
  11.  
  12. int main()
  13. {
  14. /*1.将GPD0_0设置成PWM(TOUT0)功能 GPD0CON[3:0]*/
  15. GPD0.CON = GPD0.CON & (~(0xF)) | (0x2);
  16. /*2.设置Timer0的一级预分频 TCFG0[7:0] 频率 = 100M/(99+1)=1M*/
  17. PWM.TCFG0 = PWM.TCFG0 & (~(0xFF)) | ();
  18. /*3.设置Timer0的二级预分频 TCFG1[3:0] 递减计数器频率 = 100M/(99+1)/1=1M*/
  19. PWM.TCFG1 = PWM.TCFG1 & (~(0xF));
  20. /*4.设置Timer0的为自动重装载 TCON[3]*/
  21. PWM.TCON = PWM.TCON | (<<);
  22. /*5.设置Timer0的周期 TCNTB0*/
  23. PWM.TCNTB0 = ;
  24. /*6.设置Timer0的高电平时间 TCMPB0*/
  25. PWM.TCMPB0 = ;
  26. /*7.手动的将TCNTB0中的值更新到递减计数器 TCON[1]*/
  27. PWM.TCON = PWM.TCON | (<<);
  28. /*8.关闭手动更新 TCON[1]*/
  29. PWM.TCON = PWM.TCON & (~(<<));
  30. /*9.使能递减计数器开始倒计时 TCON[0]*/
  31. PWM.TCON = PWM.TCON | ;
  32. while()
  33. {
  34. PWM.TCNTB0 = ;
  35. PWM.TCMPB0 = ;
  36. delay_ms();
  37. PWM.TCNTB0 = ;
  38. PWM.TCMPB0 = ;
  39. delay_ms();
  40. }
  41. return ;
  42. }

Cortex-A9 PWM Timer的更多相关文章

  1. 灵动微电子ARM Cortex M0 MM32F0010 Timer定时器中断定时功能的配置

    灵动微电子ARM Cortex M0 MM32F0010 Timer定时器中断定时功能的配置 目录: 1.Timer1高级定时器Timer3通用定时器Timer14基本定时器简介 2.Timer1高级 ...

  2. Make a DAC with a microcontroller's PWM timer

    http://www.edn.com/design/analog/4337128/Make-a-DAC-with-a-microcontroller-s-PWM-timer Many embedded ...

  3. (转)关于三星cortex A9 Sate4412 开发板 uboot 启动的一些问题释疑

    说明:本文转载自:http://blog.csdn.net/gooogleman/article/details/17238079  作者:gooogleman                   日 ...

  4. 迅为I.MX6DL开发板飞思卡尔Freescale Cortex A9 迅为-iMX6双核核心板

    核心板参数 尺寸: 51mm*61mm CPU: Freescale Cortex-A9 双核精简版 i.MX6DL,主频 1.2 GHz 内存: 1GB DDR3 存储: 8GB EMMC 存储 E ...

  5. 嵌入式开发之zynq——赛灵思的一款两a9加一fpga芯片的开发板

    没办法,回家入职新公司,做通信的,用到这款zynq加ad9163射频架构的开发版,要我做驱动,这可是初次接触zynq,带fpga的集成芯片,心里还是有点惊喜和忧愁,忧愁怎么最快啃下这个硬骨头,好吧上网 ...

  6. Linux下timer延时的使用

    http://blog.csdn.net/hzpeterchen/article/details/8090385 因笔者工作在嵌入式平台上(非x386),下面给出的结论仅在arm平台上测试过. 1. ...

  7. 说说M451例程之PWM的寄存器讲解

    M451提供了两路PWM发生器.每路PWM支持6通道PWM输出或输入捕捉.有一个12位的预分频器把时钟源分频后输入给16位的计数器,另外还有一个16位的比较器.PWM计数器支持向上,向下,上下计数方式 ...

  8. pwm计时器

    1 PWM timer定时器与(watchdog差不多)2 5个16位的定时器,独立的,其中,NO PIN 没有输出.16表示ffff,和ADC中10表示3FF一样.而寄存器都是32位.(以后6410 ...

  9. Cortex-M7,A8,A9,A15与ADI的BlackFin以及SHARC的DSP性能PK

    说明:1.通过此贴让我们对M4和M7的DSP性能有个全面的认识.2.测试数据来源于DSP Concepts,对于这家公司的名字,大家可能比较陌生.我们现在用的CMSIS-DSP软件就是由ARM委托这家 ...

随机推荐

  1. Swift 变量、常量、数据类型

    import Foundation print("HelloSwift") // 声明变量 var a = var b = a = b = // 常量 let c = a+b va ...

  2. iOS9新特性之UIStackView

    同iOS以往每个迭代一样,iOS 9带来了很多新特性.UIKit框架每个版本都在改变,而在iOS 9比较特别的是UIStackView,它将从根本上改变开发者在iOS上创建用户界面的方式.本文将带你学 ...

  3. Asp.Net--下载文件

    实现方式1: protected void DownLoad_Click(object sender, EventArgs e) { //获取要下载的文件 string filename = Serv ...

  4. 在MVC中利用uploadify插件实现上传文件的功能

    趁着近段的空闲时间,开发任务不是很重,就一直想把以前在仓促时间里所写的多文件上传功能改一下,在网上找了很多例子,觉得uploadify还可以,就想用它来试试.实现自己想要的功能.根据官网的开发文档,同 ...

  5. C++ 基本数据结构整理

    Hash Map (Unordered_map) Insert #include <unordered_map> using namespace std; unordered_map &l ...

  6. Sql数据保存到Excel文件中

    public string ExportExcel( DataSet ds,string saveFileName) { try { if (ds == null) return "数据库为 ...

  7. Eclipse项目导入Android Stuio 配置出现 Timeout waiting to lock buildscript class cache for build file 'H:\studioproject\Generic_SN\build.gradle'

     Eclipse项目导入Android Stuio 配置出现 Error:Timeout waiting to lock buildscript class cache for build file  ...

  8. iOS应用崩溃日志分析-备用

    作为一名应用开发者,你是否有过如下经历?   为确保你的应用正确无误,在将其提交到应用商店之前,你必定进行了大量的测试工作.它在你的设备上也运行得很好,但是,上了应用商店后,还是有用户抱怨会闪退 ! ...

  9. 利用GPS获取行车速度和距离

    这几天项目中需要GPS计算汽车的速度和行驶距离,这里简单记录一下使用过程 1 和平常使用地图一样,在Info.plist中添加位置请求 2 在viewdidLoad中初始化locationManage ...

  10. cf B. Sereja and Suffixes

    http://codeforces.com/contest/368/problem/B 从后往前找一遍就可以. #include <cstdio> #include <cstring ...