对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匹配时要产生定时器复位*/