其他分享
首页 > 其他分享> > S32K144(9)LPIT

S32K144(9)LPIT

作者:互联网

1、简介

开发板S32K144+S32DS+JLINK,裸机版的程序编写

2、原理图

3、寄存器

3.1、VERID:Version ID Register

版本寄存器

3.2、Parameter Register

参数寄存器:

Field

Name

Description

0-7

CHANNEL

定时器通道数

8-15

EXT_TRIG

外部触发输入数

3.3、MCR:Module Control Register

Field

Name

Description

0

M_CEN

时钟模块使能,将外部时钟设置为模块定时器

1

SW_RST

软件复位

2

DOZE_EN

睡眠模式继续运行定时器

3

DBG_EN

调试模式继续运行定时器

3.4、MSR:Module Status Register

Field

Name

Description

0-3

TIFn

定时器通道n中断标志

3.5、MIER:Module Interrupt Enable Register

Field

Name

Description

0-3

TIEn

定时器通道n中断使能

3.6、SETTEN:Set Timer Enable Register

Field

Name

Description

0-3

SET_T_EN_n

设置定时器通道n使能

3.7、CLRTEN:Clear Timer Enable Register

Field

Name

Description

0-3

CLR_T_EN_n

设置定时器通道n禁止启用

3.8、TVAL0 - TVAL3:Timer Value Register

0-31

TMR_VAL

在比较模式下:

TMR_VAL是定时器通道的起始值,定时器会一直倒数直到为0,定时器会产生一个中断,并再次加载计数器值到寄存器中。

中止当前的计数器周期,并开启一个新的计数器周期,计时器通道必须重新禁用和使用

在捕获模式下:加载值

3.9、CVAL0 - CVAL3:Current Timer Value

Field

Name

Description

0-31

TMR_CUR_VAL

当前定时器的值

3.10、TCTRL0 - TCTRL3:Timer Control Register

Field

Name

Description

0

T_EN

定时器使能

1

CHAIN

通道链接使能

2-3

MODE

定时器操作模式

16

TSOT

定时器触发期待,控制计数器何时开始递减

17

TSOI

中断时定时器停止,控制通道计数器在超时后是否停止

18

TROT

触发时重新加载计数器

23

TRG_SRC

选择内部或外部触发源

24-27

TRG_SET

触发选择,选择用于启动或者重新加载LPIT计数器

 4、代码编程

跟定时器相关的最千篇一律了

其中SPLLDIV2_CLOCK定义为:

 #define SPLLDIV2_CLOCK            (((SCG->SPLLDIV & SCG_SPLLDIV_SPLLDIV2_MASK)!=0) ? (CPU_SPLL_CLOCK/(1<<(((SCG->SPLLDIV & SCG_SPLLDIV_SPLLDIV2_MASK)>>SCG_SPLLDIV_SPLLDIV2_SHIFT)-1))) : 0)    //由SCG_SPLLDIV[SPLLDIV2]确定

4.1、lpit.h


#ifndef LPIT_H_
#define LPIT_H_

#include "S32K144.h"
#include "common.h"

void lpit_ch_init(uint_8 Lpit_CHn,uint32_t init_ms);


#endif /* CLOCKS_AND_MODES_H_ */

4.2、lpit.c

#include "lptmr.h"
#include "led.h"
#include "common.h"
void lpit_ch_init(uint_8 Lpit_CHn,uint32_t init_ms)
{
	PCC->PCCn[PCC_LPIT_INDEX] |= PCC_PCCn_PCS(6) | PCC_PCCn_CGC_MASK;	/* Enable LPIT Clock 		*/

    LPIT0->MCR = LPIT_MCR_M_CEN(1);		// DBG_EN-0: 当设备进入调试模式停止计时器
    									// DOZE_EN=0: 当设备进入睡眠模式停止计时器
    									// SW_RST=0: 计时器通道和寄存器未重置
    									// M_CEN=1: 启用外围时钟定时器
    //这里我犯了一个小错误,因为我一开始只使用了一个通道,所以直接赋值,当初始化多个通道时,就将之前的通道使能清空来
    //LPIT0->MIER = 1 << Lpit_CHn;   
    LPIT0->MIER |= 1 << Lpit_CHn;   // TIE0=1: 定时器LPIT 通道启动中断
    LPIT0->TMR[Lpit_CHn].TVAL = (init_ms/1000.0)*SPLLDIV2_CLOCK;
    LPIT0->TMR[Lpit_CHn].TCTRL = LPIT_TMR_TCTRL_T_EN(1);

    S32_NVIC_EnableIRQ(LPIT0_Ch0_IRQn+Lpit_CHn,10);
}

void LPIT0_Ch0_IRQHandler(void)
{
    if(LPIT0->MSR & LPIT_MSR_TIF0_MASK)
    {
    	//清中断标志位
    	LPIT0->MSR |= LPIT_MSR_TIF0_MASK;
    	LED2_TOGGLE;
    }
}

void LPIT0_Ch1_IRQHandler(void)
{
    if(LPIT0->MSR & LPIT_MSR_TIF1_MASK)
    {
    	//清中断标志位
    	LPIT0->MSR |= LPIT_MSR_TIF1_MASK;
    	LED3_TOGGLE;
    }
}

4.3、main.c


#include "S32K144.h"
#include "led.h"
#include "key.h"
#include "uart.h"
#include "clocks.h"
#include "lptmr.h"
#include "lpit.h"

int main(void)
{
	unsigned long i;
	WDOG_disable();        /* Disable WDOG */
	SOSC_init_8MHz();      /* Initialize system oscilator for 8 MHz xtal */
	SPLL_init_160MHz();    /* Initialize SPLL to 160 MHz with 8 MHz SOSC */
	NormalRUNmode_80MHz(); /* Init clocks: 80 MHz sysclk & core, 40 MHz bus, 20 MHz flash */
	bsp_led_init();
	bsp_key_init();

	uart_init(UART_Debug,19200);
    uart_enable_re_int(UART_Debug);

    lptmr_init(1000);

    lpit_ch_init(1,1000);
    lpit_ch_init(0,1000);

	uart_send_string(UART_Debug,"Running LPUART example\r\n");     /* Transmit char string */
	u1_printf("u1_printf Running LPUART example\r\n");     /* Transmit char string */
	while(1){
		for(i = 10000000;i>0;i--);
		LED4_ON;
		for(i = 10000000;i>0;i--);
		LED_OFF;
		uart_send_string(UART_Debug,"The LED light is flashing\r\n");     /* Transmit char string */
	}
    return 0;
}

 

标签:定时器,计数器,LPIT,init,S32K144,LPIT0,include
来源: https://blog.csdn.net/qq_41399894/article/details/113732109