对cortex –M0芯片LPC11C14XX中的32位定时器使用的一点认识

作者:杨老师,华清远见嵌入式学院讲师。

在LPC11CXX系列的芯片中有2个32位的定时器,可以用来定时或者计数使用。具有1路32位的捕获通
道,当输入信号发生跳变时可以捕获定时器当前的值,也可以产生中断。具有4路外部匹配寄存器和4路外部输出寄存器。而且每个寄存器可以最大允许3个匹配输
出用来作为单边沿PWM输出。

一、定时器初始化时需要配置的寄存器。

IOCONFIG:通过配置对应的引脚寄存器来设置和定时器相关的引脚。

SYSAHBCLKCTRL:该寄存器用来开启选择的定时器的时钟。

TMR32B0TCR:控制 定时器和计数器 使能和复位控制。该寄存器一般放到最后来设置。

TMR32B0MR0:用来设置匹配寄存器0的匹配值。

TMR32B0CCR: 用来设置外部捕获发生的条件和捕获之后是否要产生中断。

TMR32B0CR0:当发生外部捕获时,用来装载TC寄存器的值。

TMR32B0EMR:用来获得匹配寄存器和对应的引脚的电平(引脚关联,在IOCONFIG中设置),用
来控制当匹配寄存器的值和TC匹配时对应的引脚要做什么动作(电平拉高、拉低、反转)。不管对应的引脚有没有和该寄存器中的0-3位中的某位关联,当发生
匹配时0-3位中的某位的值都会根据设置来发生改变(拉高、拉低、反转)。如果引脚和该位设置了关联,那么对应的引脚的电平也会变化。

TMR32B0CTCR:用来开启用来选择工作模式(定时器/计数器),并且如果选择计数器模式,那么TMR32B0CCR寄存器的前三位都必须为0。

TMR32B0PWMC:用来设置PWM模式,通常用MAT[0:2]来设置pwm的输出模式,而用MAT[3]来设置PWM的周期,因为MAT[3]没有引脚输出。

所有被单边沿控制的PWM的输出在每个周期的开始都是低电平(定时器的值为0),除非匹配值为0。当任何一
个匹配寄存器的MR值匹配TC(定时器的值)时,该PWM的输出电平都被拉为高电平。可以设置MR3的值为PWM的周期,并且设置匹配MR3的值时要将定
时器复位,定时器复位后会将TC的值清零。当定时器复位之后,所有PWM输出的高电平都被清空。

如果设置成pwm输出,那么外部匹配寄存器EMR中的设置就不再起作用。

二、定时器初始化的具体示例

1.作为定时器使用的初始化:

LPC_SYSCON->SYSAHBCLKCTRL |= (1<<9); 用来开启定时器的时钟。

/*设置对应的引脚*/
             LPC_IOCON->PIO1_5 &= ~0x07; /*  Timer0_32 I/O config */
              LPC_IOCON->PIO1_5 |= 0x02; /* Timer0_32 CAP0 */
              LPC_IOCON->PIO1_6 &= ~0x07;
              LPC_IOCON->PIO1_6 |= 0x02; /* Timer0_32 MAT0 */
              LPC_IOCON->PIO1_7 &= ~0x07;
              LPC_IOCON->PIO1_7 |= 0x02; /* Timer0_32 MAT1 */
              LPC_IOCON->PIO0_1 &= ~0x07;
              LPC_IOCON->PIO0_1 |= 0x02; /* Timer0_32 MAT2 */

/*设置外部匹配寄存器0的值*/
                                          LPC_TMR32B0->MR0 = TimerInterval;

/*设置发生匹配时要做的动作*/
        LPC_TMR32B0->EMR &= ~(0xFF<<4);
        LPC_TMR32B0->EMR |= ((0x3<<4)|(0x3<<6)|(0x3<<8)|(0x3<<10));

/*用来设置外部捕获的条件*/
        LPC_TMR32B0->CCR = (0x1<<0)|(0x1<<2);

/*设置外部匹配寄存器3值*/
        LPC_TMR32B0->MCR = 3;

/*使能定时器中断*/
        NVIC_EnableIRQ(TIMER_32_0_IRQn);

2.作为pwm输出时的初始化:

LPC_SYSCON->SYSAHBCLKCTRL |= (1<<10);

/*设置外部匹配寄存器0的引脚。*/
        LPC_IOCON->R_PIO1_1  &= ~0x07;
        LPC_IOCON->R_PIO1_1  |= 0x03; /* Timer1_32 MAT0 */

/*设置外部匹配寄存器3引脚。*/
        LPC_IOCON->PIO1_4   &= ~0x07;
        LPC_IOCON->PIO1_4   |= 0x02; /* Timer1_32 MAT3 */

/* 设置为PWM输出模式*/
        LPC_TMR32B1->PWMC = (1<<3)|(1 << 0);

/*设置匹配值*/
        LPC_TMR32B1->MR3 = period;
        LPC_TMR32B1->MR0 = period/2;
        LPC_TMR32B1->MCR = 1<<10; /* MR3匹配时要产生定时器复位*/

时间: 2024-10-12 23:24:25

对cortex –M0芯片LPC11C14XX中的32位定时器使用的一点认识的相关文章

微软的操作系统中让 32 位支持大于 4GB 的内存。

先给一个参考文献:The RAM reported by the System Properties dialog box and the System Information tool is less than you expect in Windows Vista or in Windows XP Service Pack 2 or later version 先说结论: 1.PAE允许操作系统在32位模式下使用大于4G的物理内存. 2.不管是否使用PAE,对于单个进程而言,32位系统下可见

将float类型中的32位二进制数用union表示出来

用十六进制表示出来的代码,考虑到联合体的一些特性.计算机组成原理中反码补码原码的特性浮点数表示的IEEE754标准.对于32位,S(符号位(1)),E(阶码位(8)),M(尾数(23)).对于64位,S(符号位(1)),E(阶码位11)),M(尾数(52)).计算方法,符号位,0正1负.阶码位,计算出值减去127为真正的阶码(小数点在数据中的位置).尾数不操作.如:0 10000010 10010000000000000000000,step1.0->整数step2.10000010 ,算得为1

在64位的linux中运行32位的应用程序

常规做法,先添加32bit架构: sudo dpkg --add-architecture i386 sudo apt-get update sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 然后,你再安装或者直接运行你的32位程序.

64位系统中开启32位应用,特别是OLEDB

IIS7 - Running 32-bit and 64-bit ASP.NET versions at the same time on different worker processes IIS7 - Running 32-bit and 64-bit ASP.NET versions at the same time on different worker processes Rate This  RakkiMK 3 Nov 2007 7:00 AM 24 In IIS6, this w

arm32位固定指令中怎么容纳32位变量

在ARM指令集汇编码中,32位有效立即数是通过______偶数位而间接得到的 A.循环左移 B.循环右移. C.逻辑左移. D.逻辑右移 答案为循环左移,为什么?还有最好解释一下逻辑移动和循环移动的概念 在ARM指令中,有三个操作数,目的操作数,第一原操作数,第二原操作数,其中最有意思的就是第二原操作数了,在ARM 指令中,第二原操作数共有12位,分成两个部分,一个部分占8位,能表示0-255,另外一个部分占4位,表示第一个部分8位数零扩展成32位的右循环移位,0001右循环移位2位,0010右

32位平台代码向64位平台移植

1背景描述 从苹果A7处理器开始,就支持着两种不同的指令集:第一种为原有处理器所支持的32-bit ARM指令集,第二种为崭新的64-bit ARM体系结构.这种64-bit体系结构拥有更大的地址空间,最大支持16GB内存,同时它一次性可提取64位数据,比32-bit体系提高了一倍.现如今,苹果的LLVM编译器已经能够充分支持64-bit指令集. 正如苹果A7处理器一样,支持64-bit指令集的处理器已经很普遍了,如AMD公司的AMD-64.Intel公司的EM64T及IA-64.处理器属于硬件

怎样打开64位 Ubuntu 的32位支持功能?

大多数使用基于 Ubuntu/Debian 的发行版的人都更倾向于选择64位的系统,对吧?这是因为64位的系统能够充分发挥你的硬件的全部性能, 它使你能够在更紧张的内存资源下使用更复杂的软件,而且是真的快速使用,不必每次做一件小事都要等上许久.现在,32位仅有一个优点,那就是没有太多兼容 性上的问题.每次JAVA更新都很让人很困惑,因为大多数用户都不能获得需要的库文件.在过去,很多别的软件和驱动也没有64位版. 因此, 如果现在你有一个64位架构的系统,而且你可以使用之前的支持:包括驱动.64位

32位Windows7上8G内存使用感受+xp 32位下使用8G内存 (转)

32位Windows7上8G内存使用感受+xp 32位下使用8G内存 博客分类: Windows XPWindowsIE企业应用软件测试 我推荐做开发的朋友:赶快加入8G的行列吧....呵呵..超爽...速度超快...基本没有等待的概念...深有体会... 为什么要使用8G内存?在国内外各大论坛上,这都是一个有争议的问题.问题的反方论据非常充分: 除了少数专业领域,大多数应用程序不会需要超过1G的内存. 游戏使用的内存最多也是2G而已. 8G内存不便宜,不如花在显卡上. 升级到8G后没有什么明显

win8.1 安装virtualBox 只有32位选项的解决

安装好virtualBox 之后准备在虚拟机中装系统,发现虚拟机系统选项中只有32位选项没有64位选项,这是怎么回事?难道是电脑的问题.同一个软件在以前电脑里安装就不是这样. 问题解决: 查询了相关资料后了解到虚拟机64位选项需要满足以下几个条件:1.CPU是否支持虚拟化技术:2.bios 中虚拟化技术支持有没有开: 3.是否有其他软件占用了虚拟化支持,这样也会使virtualbox 没有64位选项. 首先我的cpu 虚拟化肯定是支持的,所以我就进入bios 查看虚拟化支持是否未开启:重启电脑