低功耗定时器LPTMR
0赞低功耗定时器可以在各种低功耗模式下工作,并且可以选择在中断时唤醒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位是预分频器时钟选择,见下表:
第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。

