freetech

低功耗定时器LPTMR

0
阅读(9406)

低功耗定时器可以在各种低功耗模式下工作,并且可以选择在中断时唤醒MCU。下面介绍相关寄存器:

LPTMRx_CSR - 低功耗定时器控制状态寄存器。

第0位定时器使能,为0时禁止并且复位内部逻辑,为1时开启定时器。

第1位是定时器模式选择,为0时工作在时间计数器模式;为1时工作在脉冲计数器模式。

第2位是定时器自由运行计数器,当为0时,每当定时器比较标志被置1时,LPTMR计数器寄存器复位。当为1时,溢出时LPTMR计数器寄存器复位。

第3位是定时器引脚极性,当为0时,脉冲计数器输入源高有效,并且LPTMR计数器寄存器在上升沿时增加;当为1时,脉冲计数器输入源低有效,并且LPTMR计数器寄存器在下降沿时增加。

第4~5位是定时器引脚选择,00 选择CMP0输出;01 选择LPTMR_ALT1;10选择LPTMR_ALT2;11选择LPTMR_ALT3

第6位是定时器中断使能,为0时,禁止定时器中断。为1时,开启定时器中断。

第7位是定时器比较标志,当LPTMR开启并且LPTMR计数寄存器等于LPTMR比较寄存器,再增加时,定时器比较标志被置1。

LPTMRx_PSR - 低功耗定时器预分频寄存器。

第0~1位是预分频器时钟选择,见下表:

image

第2位是预分频旁路控制,为0时,预分频/干扰滤波器使能;为1时预分频/干扰滤波器被旁路。

第3~6位是预分频值,最大可到65,536分频,详见参考手册。

LPTMRx_CMR - 低功耗定时器比较寄存器。低16位为比较值,当LPTMR开启并且LPTMR计数寄存器的值等于LPTMR比较寄存器的值,再增加时,定时器比较标志被置1。

LPTMRx_CNR - 低功耗定时器计数寄存器。低16位为当前计数值。

本例程仍然是跑马灯的现象,只是是用LPTMR来实现的,下面是完整代码:

/*
* main implementation: use this 'C' sample to create your own application
*
*/

#define GPIO_PIN_MASK            0x3C000000
#define GPIO_PIN(x)                ((1<<x)&GPIO_PIN_MASK)

#include <stdio.h>
#include "derivative.h" /* include peripheral declarations */

void delay()
{
    int i =0;
    int j=0;
    for(i=0;i<3000;i++)
      for(j=0;j<1000;j++)
          asm("nop");
}
void GPIO_Init()
{
    SIM_SCGC5 |= SIM_SCGC5_PORTA_MASK | SIM_SCGC5_PORTB_MASK | SIM_SCGC5_PORTC_MASK | SIM_SCGC5_PORTD_MASK | SIM_SCGC5_PORTE_MASK;
    /* Set GPIOA pin26~29 as GPIO*/
    PORTA_PCR26=(PORT_PCR_MUX(1));
    PORTA_PCR27=(PORT_PCR_MUX(1));
    PORTA_PCR28=(PORT_PCR_MUX(1));
    PORTA_PCR29=(PORT_PCR_MUX(1));
    //set GPIOA pin26~29 to be output
    GPIOA_PDDR=GPIO_PDDR_PDD(GPIO_PIN(26))
         | GPIO_PDDR_PDD(GPIO_PIN(27))
         | GPIO_PDDR_PDD(GPIO_PIN(28))
         | GPIO_PDDR_PDD(GPIO_PIN(29));
    GPIOA_PDOR = 0;//所有LED灭
}
void LPTMR_Init_LPO()
{
    SIM_SCGC5 |= (uint32_t)0x01;//开LPTMR时钟
    LPTMR0_CSR = (uint32_t)0x80;//清中断标志,关LPTMR
    LPTMR0_CMR = 320;//比较值
    LPTMR0_PSR = (uint32_t)0x1;//2分频,PCS=0外部参考时钟
    NVICISER2 |= (uint32_t)0x00200000;//允许中断
    LPTMR0_CSR = (uint32_t)0x41; //LPTMR使能,中断允许
}

void LPTMR_Init_IREF()
{
    SIM_SCGC5 |= 0x01UL;//开LPTMR时钟
    MCG_C1 |= 2;//使能IREF时钟
    //MCG_C2 |= 1;//IRCS=0时为32kHz,为1时为2MHz
    LPTMR0_CSR = 0x80;//清中断标志,关LPTMR
    LPTMR0_CMR = 20;//比较值
    LPTMR0_PSR = 0x40;//512分频,PCS=0外部参考时钟
    NVICISER2 |= 0x00200000;//允许中断
    LPTMR0_CSR = 0x41; //LPTMR使能,中断允许
}
int main(void)
{
    GPIO_Init();
    LPTMR_Init_IREF();   
    printf("Hello (Kinetis) World in 'C' from PK60X256 derivative! \n\r");
    for(;;)
    {

    }
    return 0;
}

void LPTMR_ISR(void)
{
    static int counter = 26;
    LPTMR0_CSR |= 0x80;       
    GPIOA_PDOR = GPIO_PDOR_PDO(GPIO_PIN(counter));
    counter++;
    if(counter > 29)
    {
        counter = 26;
    }
}

把kinetis_sysinit.c的__vect_table{}的101号中断的(tIsrFunc)UNASSIGNED_ISR   换成 (tIsrFunc)LPTMR_ISR。